You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by vi...@apache.org on 2020/10/28 08:30:54 UTC

[incubator-superset] branch 0.38 updated (248e914 -> c917e7d)

This is an automated email from the ASF dual-hosted git repository.

villebro pushed a change to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git.


 discard 248e914  fix: Disabling timezone of dataframe before passing Prophet (#11107)
 discard cf49446  chore: update version
 discard 0f089a9  fix(chart-data-api): ignore missing filters (#11112)
 discard eba85d5  fix(presto): default unknown types to string type (#10753)
 discard 8aceec3  fix: simply is_adhoc_metric (#10964)
 discard e11888c  fix(jinja): make context attrs private on SQL templates (#10934)
 discard d879944  fix(legacy-druid): undefined filter key (#10931)
 discard 18bd3ce  refactor: ASF only dependencies on base.txt (#10875)
 discard 9b53c55  chore: deprecate python 3.6 support (#10803)
 discard d98a099  chore: bump pyarrow (#10733)
 discard b6edf0c  chore: ci Initial hive support (#10593)
 discard 4f3fcfd  fix(db_engine_specs): improve Presto column type matching (#10658)
 discard f7e2dfa  fix(sql-lab): relax column name restrictions (#10816)
 discard d61ffb2  fix: ColorSchemeControl should not use CreatableSelect (#10814)
 discard 3d9eab5  Fix: Include RLS filters for cache keys (#10805)
 discard a30c02a  fix: MVC show saved query (#10781)
 discard c75823b  security: disallow uuid package on jinja2 (#10794)
 discard 67a8939  fix: can not type `0.05` in `TextControl` (#10778)
 discard 4dc269f  fix: pivot table timestamp grouping (#10774)
 discard d410b8b  More Label touchups (margins) (#10722)
 discard 5fbe751  fix: dashboard extra filters (#10692)
 discard cb5e650  feat(viz): add ECharts Timeseries chart (#10752)
 discard 5e76d71  moving all @types to dev dependencies (#10750)
 discard b6c1173  Fix: Rejiggering some dependencies, trying to get CI to pass (#10747)
 discard 7291d89  fix(db-engine-spec): execute oracle DML statement bug in sqllab (#10706)
 discard 4a6964f  fix(jinja): extract form_data from json body (#10684)
 discard 19db441  refactor(database): use SupersetResultSet on SqlaTable.get_df() (#10707)
 discard 4cb9cfd  fix: change public role like gamma procedure (#10674)
 discard da2f907  fix: shorten url with extra request parameters (#10693)
 discard 63ec3c2  feat(listview): set default view mode based on THUMBNAIL feature flag (#10691)
 discard 163f3ac  fix(filter-box): don't add empty filter to filtersChoices (#10687)
 discard f189570  chore: Fix indentation issue (#10690)
 discard b3c7740  refactor: useListViewResource hook for charts, dashboards, datasets (#10680)
 discard f8bdf5e  fix: SubMenu css (#10682)
 discard b85b277  fix: layout flexiness (#10681)
 discard 0034951  feat(row-level-security): add hook for customizing form dropdowns (#10683)
 discard f66a412  fix: only call signal if executing on the main thread (#10677)
 discard 5bf0ca4  Eslint error cleanup (#10657)
 discard 59af29e  fix(db_engine_specs): mysql longtext type should not be numeric (#10661)
 discard e288fb8  Remove incorrect comment (#10652)
 discard 25e4f4e  fix: remove FAB rendered menu in favor of react based one (#10401)
 discard c44ee37  feat: use shorten url in standalone iframe (#10651)
 discard cfd8691  feat(listview): skeleton loading states for table and card collections (#10606)
 discard 3e8249b  feat: Getting fancier with Storybook (#10647)
 discard 7d62a72  fix: dedup groupby in viz.py while preserving order (#10633)
 discard 604ac57  feat: bump superset-ui for certified tag (#10650)
     add cb1989a  feat: bump superset-ui for certified tag (#10650)
     add 82dda47  fix: dedup groupby in viz.py while preserving order (#10633)
     add 878f06d  feat: Getting fancier with Storybook (#10647)
     add b86c0e5  feat(listview): skeleton loading states for table and card collections (#10606)
     add aa8ff87  feat: use shorten url in standalone iframe (#10651)
     add 45fee60  fix: remove FAB rendered menu in favor of react based one (#10401)
     add 0f44d3e  Fix add chart page frontend i18n issue (#9321)
     add 52d7671  Remove incorrect comment (#10652)
     add 0177c2f  fix(db_engine_specs): mysql longtext type should not be numeric (#10661)
     add 9461f9c  fix(db_engine_specs): improve Presto column type matching (#10658)
     add fdfb7cd  Eslint error cleanup (#10657)
     add 4b40d44  style: Fancier menus, more SIP-34-ish (#10423)
     add fe574fd  fix(sqllab): log exceptions caused by the user as debug and not error (#10676)
     add 502f4db  feature: Adding extra_filters to warm_up_cache (#10675)
     add a6101f7  fix: only call signal if executing on the main thread (#10677)
     add 4251b4e  feat(row-level-security): add hook for customizing form dropdowns (#10683)
     add a95e5c9  fix: layout flexiness (#10681)
     add bc0fc4e  fix: SubMenu css (#10682)
     add 6ff96cf  refactor: useListViewResource hook for charts, dashboards, datasets (#10680)
     add 8581bda  chore: Fix indentation issue (#10690)
     add aaf04cc  fix(filter-box): don't add empty filter to filtersChoices (#10687)
     add bb92c1f  feat: chart and dashboard card list view e2e cypress test (#10669)
     add 81525c3  feat(listview): set default view mode based on THUMBNAIL feature flag (#10691)
     add 19a9bcc  chore: ci Initial hive support (#10593)
     add 7fc227c  fix: shorten url with extra request parameters (#10693)
     add 8d94534  style: Move security/manage navigation tabs into a settings dropdown (#10439)
     add 7abdf53  fix: card view failed cypress tests (#10699)
     add 6ed3655  Use test name for the custom macros testing: (#10695)
     add 937b868  style: add border between menu and submenu (#10698)
     add c715cad  feat: base tabbed modal for new database CRUD UI (#10668)
     add 3e374da  fix: change public role like gamma procedure (#10674)
     add dd0bc47  refactor(database): use SupersetResultSet on SqlaTable.get_df() (#10707)
     add 58b075b  fix(jinja): extract form_data from json body (#10684)
     add d3bdea3  fix: move menu reorg logic from crud app into Menu component (#10717)
     add 4e01f39  chore: update samesite config documentation (#10720)
     add 33fa9eb  Covert celery tests to the pytest (#10704)
     add 9fe30ab  style: Pass at propagating (and enhancing) Button component throughout Superset (#10649)
     add 3d8857e  style: rename 'Source' top nav item to 'Data' (#10715)
     add 234b6bb  fix(db-engine-spec): execute oracle DML statement bug in sqllab (#10706)
     add 4392c46  chore: bump pyarrow (#10733)
     add cd144b6  style: Tabs now support AntD compound components (+ basic stories) (#10728)
     add 807bd65  Fix: Rejiggering some dependencies, trying to get CI to pass (#10747)
     add 4572ebb  chore: log cache keys to the logs (#10678)
     add b59f6b1  feat: refractored SQL-based alerting framework (#10605)
     add 68d5a2b  docs: Updated Docker local install instructions (#10511)
     add 5a106eb  moving all @types to dev dependencies (#10750)
     add aeaee81  fix: local docker deployment (#10738)
     add c1f2214  merge db migrations (#10758)
     add e0ad993  chore: add logging for "dashboard" action (#10744)
     add 8c564fb  feat(viz): add ECharts Timeseries chart (#10752)
     add b5aecaf  docs: Update OAuth configuration in installation.rst (#10748)
     add 77a3167  feat(database): POST, PUT, DELETE API endpoints (#10741)
     add ff60e5c  Fix precommit hook for docs/installation.rst (#10759)
     add e0deaad  chore: removing fsevents dependency (#10751)
     add 5a43700  refactor: convert DatasetList schema filter to use new distinct api (#10746)
     add 7bccb38  feat: SIP-34 table list view for databases (#10705)
     add 45f4c68  fix: re-installing local superset in cache image (#10766)
     add 1ee87cc  fix: dashboard extra filters (#10692)
     add 824cea2  More Label touchups (margins) (#10722)
     add 54ae3b0  fix: add validator information to email/slack alerts (#10762)
     add 70c6764  fix: pivot table timestamp grouping (#10774)
     add 9bcb150  fix: can not type `0.05` in `TextControl` (#10778)
     add 5962005  fix: disable domain sharding on explore view (#10787)
     add 5199423  feat: CRUD REST API for saved queries (#10777)
     add f685825  security: disallow uuid package on jinja2 (#10794)
     add bc4f98e  added creator column and adjusted order columns (#10789)
     add c1ff1c5  fix: MVC show saved query (#10781)
     add 92f2353  feat: filters for database list view (#10772)
     add 702cfe9  Fix: Include RLS filters for cache keys (#10805)
     add 1d76c59  docs: Add a note to contributing.md on reporting security vulnerabilities (#10796)
     add 3ae80d3  test: add rls jinja extra cache key test (#10810)
     add cda232b  fix: ColorSchemeControl should not use CreatableSelect (#10814)
     add 50672bb  feat: database delete warning (#10800)
     add 9a66971  chore: deprecate python 3.6 support (#10803)
     add 782f678  fix: Database API missing allow none on fields (#10795)
     add 3b4a992  fix: bump node version on Dockerfile to be on par with docker-compose (#10813)
     add 9a59bdd  refactor: merge/upgrade superset-ui packages (#10790)
     add 8a3ac70  feat(databases): test connection api (#10723)
     add e4ffaec  Spanish translations (#10798)
     add c2216e0  Revert "chore: add logging for "dashboard" action (#10744)" (#10822)
     add e6a4808  fix(tests): export dataset tests fails with presto (#10818)
     add 8a9ae81  fix(sql-lab): relax column name restrictions (#10816)
     add dd7f3d5  build: split hive and presto tests to separate jobs (#10821)
     add ac2937a  fix: use nullpool in the celery workers (#10819)
     add f0545bf  fix(databases): test connection api endpoint (#10824)
     add d80f406  build: optimize webpack code split (#10831)
     add a3e2e65  fix: Making the database read-only (#10823)
     add 136f90f  feat: SavedQuery REST API for bulk delete and new API fields (#10793)
     add 7c11c9c  update all python version in the Dockerfile to 3.7 (#10841)
     add 7b22004  fix(test): missing auth on tests (#10842)
     add 7cd96ed  feat: add/edit database modal form sections UI (#10745)
     add 85a9160  docs(new docs site): removes old sphinx doc site with gatsby (#10784)
     add 6cb6701  style: white toolbar for SQL Lab (#10851)
     add 686c19a  Fix test_connection POST body (#10846)
     add 1f31e0e  feat: server side dashboard css for less repaint (#10850)
     add 8a774d5  Eslint dependencies versions updates (#10839)
     add b4df053  Improvement contributing.md (#10859)
     add a324fbd  Adding editorconfig setting for IDE hints (#10855)
     add c51168a  Re-enable no-confusing-arrow rule (#10874)
     add 352e8a1  Re-enable rule prefer-destructuring (only for objects) (#10867)
     add 906a629  Re-enable rule no-unused-state (#10871)
     add 7f10123  Re-enable no-useless-path-segments rule (#10860)
     add 1908a94  ESLint: Re-enable rule no-restricted-globals (#10863)
     add c5193ca  Re-enable rule no-non-null-assertion (#10864)
     add a75c362  Re-enable rule jsx-curly-brace-presence (#10869)
     add d93b2b9  Re-enable rule sort-comp (#10872)
     add 08ec509  docs(style): make more responsive for mobile (#10853)
     add 76275ec  Enable rule no-plusplus (#10876)
     add 2d8f4e3  Re-enable rule no-else-return (#10861)
     add 767044b  ESLint: Re-enable rule control-has-associated-label (#10866)
     add 91b8c8a  Re-enable rule state-in-constructor (#10873)
     add e28f3d6  Re-enable rule line-between-class-members (#10862)
     add 01f9010  ESLint: Re-enable rule no-unused-vars (#10865)
     add 4502690  chore: clean up aphrodite (#10883)
     add 38edb69  Feat: Adding table comment and columns comment for SQLLab (#10844)
     add 2a6bcbb  Reviewed and repaired disabled pylint in dashboard file (#10877)
     add 045335a  fix(cypress): wait for filterValues request (#10884)
     add 838a70e  docs: fix ubuntu 20.04 installation instructions (#10888)
     add 9c420d6  feat: implement cache invalidation api (#10761)
     add b48dd4b  chore: Using cache factory method (#10887)
     add 5d529fd  fixing broken links (#10885)
     add 0129c42  feat: move ace-editor and mathjs to async modules (#10837)
     add fe9f614  fix(cypress): prevent CI failure on codecov failure (#10892)
     add c43992b  feat: data menu routing (#10880)
     add 4eeee4c  chore: enable eslint-import-resolver-typescript (#10895)
     add 1f73010  correcting 2 steps in docs deployment readme (#10899)
     add 15fe04e  docs: add changelog entries for 0.37.1 (#10893)
     add 9246c9b  refactor: ASF only dependencies on base.txt (#10875)
     add 3b035d2  docs: redirect http -> https (#10900)
     add d4291ed  build: optimize eslint import resolver configs (#10901)
     add 0870d3a  docs: add back issue code links (#10903)
     add f9cfb3e  fix: spelling in docs homepage (#10912)
     add 87fc425  Fixing docs site home screen mobile layout issues (#10886)
     add d4ee073  simplifying/clarifying youtube video code/datastructures (#10882)
     add c3f1720  fix: superset alerting misc fixes (#10891)
     add 13cc1a3  fix:  front end CI tests and test runner (#10897)
     add d3e9c56  feat: use svg for checkbox component (#10799)
     add 0d90bc9  chore: update port that cypress runs on for local vs test (#10847)
     add 2a5946d  docs: Client side redirects (one POC) (#10898)
     add 281305e  Enable anchor-has-content rule (#10908)
     add d74044c  Update FOSSA configuration for new requirements layout (#10848)
     add 5099dbe  fix: babel script broken by format string (#10902)
     add a3519b4  fix lint errors (#10918)
     add af75bee  feat: adding dashboard toggle fullscreen button (#10840)
     add cd77797  Removed disabled linting redefined-outer-name. Url parameters are renamed where url was already defined in class attributes (#10911)
     add 5623cd6  feat: update saved query backend routing + add savedquery list (#10922)
     add 6908100  fix(legacy-druid): undefined filter key (#10931)
     add 8735a14  Removed global pylintrc rule: old-ne-operator. Which is not applicable in code anymore. (#10915)
     add d6be977  fix: address all disabled pylint checks in charts/api.py (#10932)
     add 213b772  chore: remove SIP_34_DATABASE_UI (#10926)
     add ed9b50b  chore: upgrade cypress to use retries (#10923)
     add 141ef4a  Updated `type: ignore` in model's helper: (#10906)
     add e21a354  fix: update pylint disabled checks in common/query_context.py (#10941)
     add e375ed4  fix(jinja): make context attrs private on SQL templates (#10934)
     add 2003442  fix: several disabled pylint rules in models/helpers.py (#10909)
     add ccfd293  ESLint: no-restricted-syntax (#10889)
     add 4f60737  fix: typo in prefer typescript (#10959)
     add d4f33cc  Ignore '/docs' on some GH actions, give docs its own action (#10949)
     add 4a4fdb1  docs: set up client-side redirects from previous era docs urls (#10921)
     add 91fd06e  ESLint: Remove ts-ignore (#10961)
     add 557a303  ESLint: Enable rule no-named-as-default (#10879)
     add 3d8f757  fix: simply is_adhoc_metric (#10964)
     add 4835d3b  ESLint: Re-enable rule no-access-state-in-setstate (#10870)
     add fd0f6e1  fix: removed disabled lint rule `too-many-locals` in connectors/base/models.py (#10958)
     add 9d7b353  fix: pylint disabled rules in dashboard/api.py (#10976)
     add 88a6711  Pylint disabled rule `pointless-string-statement` is not raising warining anymore - removing (#10975)
     add f01c488  fix: setting specific exceptions common/query_context.py (#10942)
     add 74a2270  fix: re-enabling several globally disabled lint rules (#10957)
     add 801fb40  Allow empty observations in alerting (#10939)
     add 56d0018  fix: use nullpool even for user lookup in the celery (#10938)
     add 4aa5324  fix: update the time filter for 'Last Year' option in explore (#10829)
     add 41dfcd4  fix: changed disabled rules in datasets module (#10979)
     add e4e78b6  style: fix checkbox color (#10970)
     add a8f5029  ESLint: Remove ts-ignore comments (#10933)
     add dc893fe  chore: selectors refactor in SQLLab test suite (Cypress) (#10944)
     add 193796c  adding filters back that caused issues (#10989)
     add 96a61e3  build: add PR lint action (#10990)
     add 8e4a1c8  docs: add a "Gallery" page (#10968)
     add 3be8bda  docs: add gallery screenshot & link in README (#10988)
     add 448a41a  feat(row-level-security): add base filter type and filter grouping (#10946)
     add bd140e0  fix(presto): default unknown types to string type (#10753)
     add 95ba8e1  fix: deprecation warnings due to invalid escape sequences. (#10710)
     add 0554c89  Enable subqueries in gsheetsdb (#10991)
     add a9eab33  feat: add ECharts Pie chart (#10966)
     add 9f01a7f  ESLint: Re-enable rule default-props-match-prop-types (#10868)
     add e93d92e  Replace reactable with DataTable from superset-ui in QueryTable (#10981)
     add a6f2587  fix: enable pylint rules in db_engine_specs module (#10998)
     add a491b6db4 fix: unbreak ci (#11003)
     add 220c410  build: add react-hooks linting (#11006)
     add 0d1f611  feat(listview): feature flag config to set default viewing mode (#10986)
     add d992c30  Bring back import menu (#11007)
     add 02ab5cc  fix: Add Item Overflow on Dataset Editor (#10983)
     add 50852df  chore: downgrade expected exception from error to info (#10994)
     add ba009b7  fix: query search low privileged user search access denied (#11017)
     add 345fe07  fix: menu shows a 0 when there are not settings (#11009)
     add a26f29e  fix: changes a pylint check in dashboard module (#10978)
     add 26fcc08  Enabled pylint rules in `db_engines` module: (#11016)
     add bade279  fix: reenable pylint rule `unused-import` in charts and connectors modules (#11014)
     add fb6f14c  fix: pylint checks in connectors/sqla/models.py (#10974)
     add af1e8e8  fix: enable several pylint rules partially in db_engines_specs module (#11000)
     add 7549dad  fix: timer component, fixes #10849, closes #11002 (#11004)
     add 0409393  fix: [dashboard] should not show edit button when user has no edit permit (#11024)
     add 8b68378  docs: add security vulnerability GH issue template (#11023)
     add dc76a26  style(explore): use tertiary button against gray background (#11011)
     add 8e9b0b3  fix: dashboard edit button (again) (#11029)
     add 6181994  chore: bump pandas to latest stable version (#11018)
     add b2fdf12  Support jinja templates (#11008)
     add eded51b  feat(saved_queries): add custom api filter for all string & text fields (#11031)
     add f99753a  Revert "ESLint: Re-enable rule default-props-match-prop-types (#10868)" (#11050)
     add 8bc05bd  Changed variable name from capitals to lowercase and changed lint rule (#11044)
     add 7ca4192  Enabled no-self-use pylint rule in security. Formatter (#11041)
     add eba1aa8  Enabled argument-differ for bulk_delete (#11039)
     add 6b318c4  Removed disable global pytlint rule `standarderror-builtin` which isn't appearing for Python3 (#11038)
     add 63d0e80  chore: updated lint rules in models module (#11036)
     add 92dd257  Changed `tags.py` and `helpers.py` in `models` module: removed disabled pylint rule `unused_import`, changed unused arguments to private and removed disabled rule `unused-argument. Removed redundant rules.` (#11037)
     add ea105bc  feat: add "created by" to dashboard CRUD view (#11030)
     add 3467d2d  Revert "style: fix checkbox color (#10970)" (#11051)
     add 66e4980  fixed routes for customer in docs (#11052)
     add d056e3d  clickable labels have outlines, storybook shows them (#11034)
     add 052d7a0  fix: sql lab autocomplete width (#11063)
     add eeeb210  feat: adding all icons from the design system to the codebase (#11033)
     add 374b06b  fix: database list checkboxes (#11068)
     add 8e6f7d6  style: remove unecessary padding (#11071)
     add 8cba1c8  changing to the correct hex color (#11073)
     add 23d62f3  removing unused component (#11072)
     add 1493450  fix(jest): using UTC mock date (#11079)
     add 7f1e4e4  fix: surface connection error messages on the client (#11077)
     add cff034e  chore: cleaning out unused code from utils (#11076)
     add 497d3f3  fix: Adding timeout to flaky cypress test, to wait for animation to complete (#11074)
     add 39cce71  docs: add changelog entries for 0.37.2 (#11086)
     add 046bd02  style: improve "Datasource & Chart Type" <Label>s (#10971)
     add 0f7e90f  feat: improve presto query perf (#11069)
     add a879622  refactor: Remove usages of reactable from AlteredSliceTag (#11012)
     add f01b8a3  refactor: Remove usages of reactable from TimeTable (#11046)
     add 2fd8fca  chore: Clean up some console warnings (#11061)
     add 1dc05d4  feat(charts): modify custom api filter to include more fields (#11054)
     add e52a399  Reorganize steps (#11015)
     add e337355  refactor: table selector on dataset editor (#10914)
     add 690e27e  chore: updated utils with pylint rules (#11062)
     add 3a08fd0  chore: pylint fixes in files in project's root (#11064)
     add 79de8f7  docs: Add Zeta to list of companies using Apache Superset (#11059)
     add 8b458ac  fix: double scroll bars on dataset editor (#11095)
     add 80e3955  fix: echarts timeseries groupby (#11103)
     add 5d08a42  fix(api): unable to delete virtual dataset, wrong permission name (#11019)
     add 89bf765  Updated lint in schedules.py in tasks: unused_import, ungrouped_import and changed argument name to remove unused-argument (#11045)
     add 6633409  feat: enable ETag header for dashboard GET requests (#10963)
     add 4ccba30  chore: Remove Obsolete WARNING_MSG from config (#10972)
     add b8d616a  feat: saved query list view + sort/filters (#11005)
     add 0409b12  style: fix secondary label border (#11100)
     add 03eebd3  fix: fix table existence validation function (#11066)
     add 94d4d55  Fix alembic migration (#11110)
     add fa5dab8  feat: more specific presto error messages (#11099)
     add ada66e3  fix(chart-data-api): ignore missing filters (#11112)
     add 0bcc9d7  fix: Disabling timezone of dataframe before passing Prophet (#11107)
     add 5b284e6  feat: add created by chart CRUD view (#11067)
     add e7a4265  feat: saved query list actions (#11109)
     add c4d96f6  fix: SpatialControl popover won't open (#11127)
     add fdb26f6  feat: CRUD REST API for CSS Templates (#11114)
     add 50d8040  fix: alembic migration error msg trying to delete constraint on tables (#11115)
     add 7a72082  fix: Revert "Replace reactable with DataTable from superset-ui in QueryTable (#10981)" (#11125)
     add 33906c6  fix: remove extra flash import (#11121)
     add 2a906bc  docs: use the Apache-Superset logo on README / pypi (#11132)
     add 07716ff  chore: refactor submenu's right nav to accept list of buttons (#11102)
     add 4c85d33  feat: custom favorite filter for dashboards, charts and saved queries (#11083)
     add 5f55d94  style: rename label 'table name'->'dataset name' (#11126)
     add 017e5ac  style(listview): dynamic card size and grid spacing (#11111)
     add a4e1dc9  add info about case sensitive search (#11124)
     add d578d81  docs: comply to ASF requirements (#11133)
     add 2cb2a00  docs: docs site footer link tweak (#11140)
     add e90c63f  fix: Alembic migration 18532d70ab98 (#11136)
     new 5db8682  fix(examples): missing expressions in birth_names (#11141)
     new 922b8aa  fix: disable jinja2 SQL templating
     new 9aba607  chore(sql-lab): catch PyArrow deserialization error (#11201)
     new 76f6e85  chore(sqla): assert query is single read-only statement (#11236)
     new c2e8f98  feat(datasets): REST API bulk delete (#11237)
     new f0cd671  fix(dataset): update user list endpoint (#11221)
     new 44b7e8e  fix(crud): set default extra value (#11262)
     new c917e7d  fix: Fix Time Column dropdown for date filter (#11149)

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (248e914)
            \
             N -- N -- N   refs/heads/0.38 (c917e7d)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 8 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .asf.yaml                                          |     2 +-
 .editorconfig                                      |    47 +
 .fossa.yml                                         |    10 +-
 .github/ISSUE_TEMPLATE/security_vulnerability.md   |    12 +
 .github/prlint.json                                |     8 -
 .github/workflows/bashlib.sh                       |    11 +-
 .github/workflows/license-check.yml                |     2 +-
 .github/workflows/pr-lint.yml                      |    22 +
 .github/workflows/prefer-typescript.yml            |    48 +
 .github/workflows/prefer_typescript.yml            |    45 -
 .github/workflows/superset-docker.yml              |    22 -
 .github/workflows/superset-docs.yml                |    30 +
 .github/workflows/superset-e2e.yml                 |    41 +-
 .github/workflows/superset-frontend.yml            |    11 +-
 .github/workflows/superset-python.yml              |    33 +-
 .github/workflows/superset-translations.yml        |    28 +-
 .github/workflows/test-docker.yml                  |    22 +
 .github/workflows/test-hive.yml                    |    67 +
 .github/workflows/test-presto.yml                  |    70 +
 .pre-commit-config.yaml                            |     2 +-
 .pylintrc                                          |     2 +-
 .rat-excludes                                      |     6 +-
 CHANGELOG.md                                       |    37 +
 CONTRIBUTING.md                                    |   101 +-
 Dockerfile                                         |     6 +-
 Dockerfile-dev                                     |     8 +-
 INTHEWILD.md                                       |     2 +
 README.md                                          |    16 +-
 RELEASING/Dockerfile.make_docs                     |     2 +-
 UPDATING.md                                        |     6 +-
 docker-compose.yml                                 |     4 +-
 docker/docker-init.sh                              |    26 +-
 docs/.eslintrc.js                                  |    48 +
 docs/.gitignore                                    |     3 +
 docs/.htaccess                                     |    23 +
 {superset-frontend => docs}/.prettierrc            |     0
 docs/Makefile                                      |   208 -
 docs/README.md                                     |    67 +
 docs/_static/docs.css                              |    77 -
 docs/_static/images                                |     1 -
 docs/admintutorial.rst                             |   325 -
 docs/build.sh                                      |    22 -
 docs/conf.py                                       |   307 -
 docs/doczrc.js                                     |    35 +
 docs/druid.rst                                     |    64 -
 docs/faq.rst                                       |   346 -
 docs/gallery.rst                                   |   206 -
 docs/gatsby-config.js                              |    76 +
 docs/gatsby-node.js                                |   637 +
 docs/import_export_datasources.rst                 |   124 -
 docs/index.rst                                     |   176 -
 docs/installation.rst                              |   116 +-
 docs/issue_code_reference.rst                      |    48 -
 docs/misc.rst                                      |    27 -
 docs/package-lock.json                             | 24072 +++++++++++++++++++
 docs/package.json                                  |    74 +
 docs/prettier.config.js                            |    21 +
 tests/util/__init__.py => docs/requirements.txt    |     0
 docs/security.rst                                  |   185 -
 docs/src/components/AnchorNavigator.tsx            |    62 +
 docs/src/components/DbImage.tsx                    |    49 +
 docs/src/components/DoczMenu.tsx                   |    57 +
 docs/src/components/MainMenu.tsx                   |   152 +
 docs/src/components/footer.tsx                     |   189 +
 docs/src/components/image.tsx                      |    90 +
 docs/src/components/layout.scss                    |   134 +
 docs/src/components/layout.tsx                     |   200 +
 docs/src/components/next.tsx                       |    42 +
 docs/src/components/select.tsx                     |    47 +
 docs/src/components/seo.js                         |   104 +
 docs/src/gatsby-theme-docz/index.tsx               |    58 +
 .../src/images/apacheSupersetHoriz.png             |   Bin
 docs/src/images/dashboard.png                      |   Bin 0 -> 453151 bytes
 docs/src/images/databases/apache-drill.png         |   Bin 0 -> 40173 bytes
 docs/src/images/databases/apache-druid.jpeg        |   Bin 0 -> 214904 bytes
 .../src/images/databases/apache-druid.png          |   Bin
 docs/src/images/databases/apache-hive.svg          |    69 +
 docs/src/images/databases/apache-impala.png        |   Bin 0 -> 5216 bytes
 .../src/images/databases}/apache-kylin.png         |   Bin
 .../src/images/databases/aws-redshift.png          |   Bin
 .../src/images/databases}/clickhouse.png           |   Bin
 docs/src/images/databases/druid.png                |   Bin 0 -> 121985 bytes
 .../src/images/databases}/exasol.png               |   Bin
 .../src/images/databases}/firebird.png             |   Bin
 .../src/images/databases/googleBQ.png              |   Bin
 docs/src/images/databases/greenplum.jpeg           |   Bin 0 -> 7559 bytes
 .../src/images/databases}/greenplum.png            |   Bin
 docs/src/images/databases/ibmdb2.png               |   Bin 0 -> 14127 bytes
 .../src/images/databases/monet.png                 |   Bin
 .../src/images/databases/msql.png                  |   Bin
 .../images => docs/src/images/databases}/mysql.png |   Bin
 docs/src/images/databases/oracle-logo.png          |   Bin 0 -> 10347 bytes
 .../src/images/databases}/oracle.png               |   Bin
 docs/src/images/databases/oraclelogo.png           |   Bin 0 -> 29864 bytes
 docs/src/images/databases/postgresql.jpg           |   Bin 0 -> 19019 bytes
 docs/src/images/databases/postsql.png              |   Bin 0 -> 44334 bytes
 .../src/images/databases/presto-og.png             |   Bin
 .../src/images/databases}/snowflake.png            |   Bin
 docs/src/images/databases/sqllite.jpg              |   Bin 0 -> 13006 bytes
 docs/src/images/databases/sqllite.png              |   Bin 0 -> 38063 bytes
 .../src/images/databases}/vertica.png              |   Bin
 docs/src/images/docker.png                         |   Bin 0 -> 24928 bytes
 docs/src/images/explorer.png                       |   Bin 0 -> 641441 bytes
 {superset-frontend => docs/src}/images/favicon.png |   Bin
 docs/src/images/gallery/bubble.png                 |   Bin 0 -> 238904 bytes
 docs/src/images/gallery/chord_diagram.png          |   Bin 0 -> 762878 bytes
 docs/src/images/gallery/community.png              |   Bin 0 -> 609567 bytes
 docs/src/images/gallery/dashboard_editor.png       |   Bin 0 -> 2255813 bytes
 docs/src/images/gallery/dashboard_list.png         |   Bin 0 -> 197656 bytes
 docs/src/images/gallery/dashboard_properties.png   |   Bin 0 -> 213069 bytes
 docs/src/images/gallery/deck_arc.png               |   Bin 0 -> 1351973 bytes
 docs/src/images/gallery/deck_hex.png               |   Bin 0 -> 1761791 bytes
 docs/src/images/gallery/deck_path.png              |   Bin 0 -> 1229563 bytes
 docs/src/images/gallery/deck_polygon.png           |   Bin 0 -> 1588761 bytes
 docs/src/images/gallery/deck_scatter.png           |   Bin 0 -> 1815849 bytes
 .../src/images/gallery}/deckgl_dash.png            |   Bin
 docs/src/images/gallery/explore.png                |   Bin 0 -> 530390 bytes
 docs/src/images/gallery/force_layout.png           |   Bin 0 -> 432443 bytes
 docs/src/images/gallery/france.png                 |   Bin 0 -> 431636 bytes
 docs/src/images/gallery/girl_names.png             |   Bin 0 -> 276784 bytes
 docs/src/images/gallery/heatmap.png                |   Bin 0 -> 629165 bytes
 docs/src/images/gallery/pino_geo.png               |   Bin 0 -> 3385639 bytes
 docs/src/images/gallery/sankey.png                 |   Bin 0 -> 529762 bytes
 docs/src/images/gallery/slack.png                  |   Bin 0 -> 471736 bytes
 docs/src/images/gallery/sqllab.png                 |   Bin 0 -> 375108 bytes
 docs/src/images/gallery/storm.png                  |   Bin 0 -> 2287707 bytes
 docs/src/images/gallery/stream.png                 |   Bin 0 -> 557506 bytes
 docs/src/images/gallery/table.png                  |   Bin 0 -> 447295 bytes
 docs/src/images/gallery/treemap.png                |   Bin 0 -> 456361 bytes
 .../src/images/gallery}/visualizations.png         |   Bin
 docs/src/images/gallery/worldbank_dashboard.png    |   Bin 0 -> 780010 bytes
 docs/src/images/incubator.png                      |   Bin 0 -> 17961 bytes
 docs/src/images/preset.png                         |   Bin 0 -> 39030 bytes
 docs/src/images/preset.svg                         |    33 +
 {superset-frontend => docs/src}/images/s.png       |   Bin
 docs/src/images/stack_overflow.png                 |   Bin 0 -> 30065 bytes
 .../src/images}/superset-logo-horiz-apache.svg     |     0
 docs/src/images/superset-logo-horiz.svg            |    45 +
 docs/src/pages/404.jsx                             |    32 +
 docs/src/pages/community.tsx                       |   145 +
 .../pages/docs/Connecting to Databases/athena.mdx  |    35 +
 .../docs/Connecting to Databases/clickhouse.mdx    |    18 +
 .../docs/Connecting to Databases/cockroachdb.mdx   |    18 +
 .../Connecting to Databases/docker-add-drivers.mdx |    86 +
 .../pages/docs/Connecting to Databases/dremio.mdx  |    21 +
 .../pages/docs/Connecting to Databases/drill.mdx   |    48 +
 .../pages/docs/Connecting to Databases/druid.mdx   |    64 +
 .../docs/Connecting to Databases/elasticsearch.mdx |    50 +
 .../pages/docs/Connecting to Databases/exasol.mdx  |    18 +
 .../Connecting to Databases/extra-settings.mdx     |    70 +
 .../Connecting to Databases/google-bigquery.mdx    |    57 +
 .../docs/Connecting to Databases/google-sheets.mdx |    17 +
 .../pages/docs/Connecting to Databases/hana.mdx    |    17 +
 .../pages/docs/Connecting to Databases/hive.mdx    |    17 +
 .../pages/docs/Connecting to Databases/ibm-db2.mdx |    18 +
 .../pages/docs/Connecting to Databases/impala.mdx  |    17 +
 .../pages/docs/Connecting to Databases/index.mdx   |    70 +
 .../pages/docs/Connecting to Databases/kylin.mdx   |    18 +
 .../pages/docs/Connecting to Databases/mysql.mdx   |    28 +
 .../pages/docs/Connecting to Databases/oracle.mdx  |    18 +
 .../pages/docs/Connecting to Databases/pinot.mdx   |    17 +
 .../docs/Connecting to Databases/postgres.mdx      |    40 +
 .../pages/docs/Connecting to Databases/presto.mdx  |    26 +
 .../docs/Connecting to Databases/redshift.mdx      |    26 +
 .../docs/Connecting to Databases/snowflake.mdx     |    32 +
 .../docs/Connecting to Databases/spark-sql.mdx     |    17 +
 .../docs/Connecting to Databases/sql-server.mdx    |    17 +
 .../docs/Connecting to Databases/teradata.mdx      |    29 +
 .../pages/docs/Connecting to Databases/vertica.mdx |    32 +
 .../exploring-data.mdx                             |   365 +
 .../docs/Creating Charts and Dashboards/index.mdx  |   277 +
 .../docs/Miscellaneous/importing-exporting.mdx     |   117 +
 docs/src/pages/docs/Miscellaneous/index.mdx        |    94 +
 docs/src/pages/docs/Miscellaneous/issue_codes.mdx  |    75 +
 docs/src/pages/docs/contributing-page.mdx          |    25 +
 .../pages/docs/frequently-asked-questions-page.mdx |   289 +
 .../docs/installation/async_queries_celery.mdx     |   118 +
 .../docs/installation/building-viz-plugins.mdx     |   209 +
 docs/src/pages/docs/installation/caching.mdx       |   120 +
 docs/src/pages/docs/installation/configuring.mdx   |   282 +
 docs/src/pages/docs/installation/email_reports.mdx |   174 +
 .../pages/docs/installation/event-logging-page.mdx |    59 +
 docs/src/pages/docs/installation/index.mdx         |    89 +
 .../pages/docs/installation/installing_scratch.mdx |   132 +
 .../docs/installation/networking_settings.mdx      |    45 +
 .../src/pages/docs/installation/sql_templating.mdx |    89 +
 .../pages/docs/installation/upgrading_superset.mdx |    44 +
 docs/src/pages/docs/introduction.mdx               |    49 +
 docs/src/pages/docs/roadmap-page.mdx               |     9 +
 docs/src/pages/docs/security-page.mdx              |    22 +
 docs/src/pages/gallery.tsx                         |   110 +
 docs/src/pages/index.tsx                           |   494 +
 docs/src/pages/resources.tsx                       |   213 +
 docs/src/resources/data.js                         |   218 +
 docs/src/utils.js                                  |   105 +
 .../static/images}/add_new_chart.png               |   Bin
 .../static/images}/advanced_analytics_base.png     |   Bin
 .../static/images}/annotation.png                  |   Bin
 .../static/images}/annotation_settings.png         |   Bin
 .../static/images}/average_aggregate_for_cost.png  |   Bin
 .../static/images}/blue_bar_insert_component.png   |   Bin
 .../static/images}/chose_a_datasource.png          |   Bin
 .../images}/csv_to_database_configuration.png      |   Bin
 docs/static/images/dashboard.png                   |   Bin 0 -> 746595 bytes
 docs/static/images/dashboard2.png                  |   Bin 0 -> 704237 bytes
 docs/static/images/dashboard3.png                  |   Bin 0 -> 728491 bytes
 docs/static/images/data-point.jpg                  |   Bin 0 -> 1795832 bytes
 .../static/images}/edit-record.png                 |   Bin
 .../static/images}/edit_annotation.png             |   Bin
 docs/static/images/explorer.png                    |   Bin 0 -> 641441 bytes
 docs/static/images/explorer2.png                   |   Bin 0 -> 938335 bytes
 docs/static/images/explorer3.png                   |   Bin 0 -> 5015944 bytes
 docs/static/images/explorer4.png                   |   Bin 0 -> 2672689 bytes
 .../static/images}/filter_on_origin_country.png    |   Bin
 docs/static/images/google-analytics.png            |   Bin 0 -> 689661 bytes
 .../static/images}/markdown.png                    |   Bin
 .../static/images}/no_filter_on_time_filter.png    |   Bin
 .../static/images}/parse_dates_column.png          |   Bin
 docs/static/images/pie-chart.png                   |   Bin 0 -> 1320888 bytes
 docs/static/images/plugin-1-yeoman-select.png      |   Bin 0 -> 73428 bytes
 docs/static/images/plugin-10-hello-thumbnail.png   |   Bin 0 -> 82000 bytes
 docs/static/images/plugin-11-explore-view.png      |   Bin 0 -> 260757 bytes
 docs/static/images/plugin-12-console-logs.png      |   Bin 0 -> 87031 bytes
 .../static/images/plugin-2-yeoman-package-name.png |   Bin 0 -> 22666 bytes
 docs/static/images/plugin-3-yeoman-description.png |   Bin 0 -> 29219 bytes
 .../images/plugin-4-yeoman-component-type.png      |   Bin 0 -> 26113 bytes
 docs/static/images/plugin-5-yeoman-timeseries.png  |   Bin 0 -> 21856 bytes
 docs/static/images/plugin-6-yeoman-badges.png      |   Bin 0 -> 14572 bytes
 docs/static/images/plugin-7-yeoman-files.png       |   Bin 0 -> 162570 bytes
 docs/static/images/plugin-8-package-json.png       |   Bin 0 -> 52915 bytes
 docs/static/images/plugin-9-mainpreset-import.png  |   Bin 0 -> 123027 bytes
 .../static/images/plugin-9-mainpreset-register.png |   Bin 0 -> 112575 bytes
 .../static/images}/publish_dashboard.png           |   Bin
 .../static/images}/resample.png                    |   Bin
 .../images}/resize_tutorial_table_on_dashboard.png |   Bin
 .../static/images}/rolling_mean.png                |   Bin
 docs/static/images/root-cert-example.png           |   Bin 0 -> 41232 bytes
 .../static/images}/save_tutorial_table.png         |   Bin
 .../static/images}/select_dates_pivot_table.png    |   Bin
 .../images}/select_table_visualization_type.png    |   Bin
 docs/static/images/so-icon.svg                     |    19 +
 docs/static/images/sqllab.png                      |   Bin 0 -> 393766 bytes
 docs/static/images/sqllab0.png                     |   Bin 0 -> 641865 bytes
 docs/static/images/sqllab1.png                     |   Bin 0 -> 556582 bytes
 docs/static/images/sqllab3.png                     |   Bin 0 -> 529043 bytes
 .../static/images}/sum_cost_column.png             |   Bin
 .../time_comparison_absolute_difference.png        |   Bin
 .../static/images}/time_comparison_two_series.png  |   Bin
 .../images}/tutorial_01_sources_database.png       |   Bin
 .../static/images}/tutorial_02_add_database.png    |   Bin
 .../static/images}/tutorial_03_database_name.png   |   Bin
 .../tutorial_04_sqlalchemy_connection_string.png   |   Bin
 .../images}/tutorial_05_connection_popup.png       |   Bin
 .../static/images}/tutorial_06_list_of_tables.png  |   Bin
 .../static/images/tutorial_07_save_button (1).png  |   Bin
 .../static/images}/tutorial_07_save_button.png     |   Bin
 .../static/images}/tutorial_08_sources_tables.png  |   Bin
 .../static/images}/tutorial_09_add_new_table.png   |   Bin
 .../static/images}/tutorial_10_table_name.png      |   Bin
 .../static/images}/tutorial_11_choose_db.png       |   Bin
 .../tutorial_12_table_creation_success_msg.png     |   Bin
 .../images}/tutorial_13_edit_table_config.png      |   Bin
 .../static/images}/tutorial_14_field_config.png    |   Bin
 .../images}/tutorial_15_click_table_name.png       |   Bin
 .../images}/tutorial_16_datasource_chart_type.png  |   Bin
 .../images}/tutorial_17_choose_time_range.png      |   Bin
 .../static/images}/tutorial_18_choose_metric.png   |   Bin
 .../static/images/tutorial_19_click_query (1).png  |   Bin
 .../static/images}/tutorial_19_click_query.png     |   Bin
 .../images}/tutorial_20_count_star_result.png      |   Bin
 .../static/images}/tutorial_21_group_by.png        |   Bin
 .../static/images}/tutorial_22_group_by_result.png |   Bin
 .../tutorial_23_group_by_more_dimensions.png       |   Bin
 .../static/images}/tutorial_24_max_metric.png      |   Bin
 .../static/images}/tutorial_25_max_temp_filter.png |   Bin
 .../static/images}/tutorial_26_row_limit.png       |   Bin
 .../images}/tutorial_27_top_10_max_temps.png       |   Bin
 .../static/images}/tutorial_28_bar_chart.png       |   Bin
 .../tutorial_29_bar_chart_series_metrics.png       |   Bin
 .../images}/tutorial_30_bar_chart_results.png      |   Bin
 .../tutorial_31_save_slice_to_dashboard.png        |   Bin
 .../tutorial_32_save_slice_confirmation.png        |   Bin
 .../static/images}/tutorial_33_dashboard.png       |   Bin
 .../images}/tutorial_34_weather_dashboard.png      |   Bin
 .../images}/tutorial_35_slice_on_dashboard.png     |   Bin
 .../images}/tutorial_36_adjust_dimensions.gif      |   Bin
 .../static/images}/tutorial_line_chart.png         |   Bin
 .../static/images}/tutorial_pivot_table.png        |   Bin
 .../static/images}/tutorial_table.png              |   Bin
 .../static/images}/upload_a_csv.png                |   Bin
 docs/static/images/youtube.png                     |   Bin 0 -> 20462 bytes
 docs/tutorials.rst                                 |    25 -
 docs/usertutorial.rst                              |   507 -
 docs/videos.rst                                    |    22 -
 docs/visualization.rst                             |  2016 --
 package-lock.json                                  |     3 +
 requirements/base.in                               |     2 +
 requirements/base.txt                              |    22 +-
 requirements/development.txt                       |     7 +-
 requirements/docker.txt                            |     6 +-
 requirements/documentation.in                      |    19 -
 requirements/documentation.txt                     |    24 -
 requirements/integration.txt                       |     4 +-
 requirements/testing.txt                           |    10 +-
 scripts/fossa.sh                                   |     4 +-
 scripts/pypi_push.sh                               |     2 +-
 setup.cfg                                          |    10 +-
 setup.py                                           |     2 +-
 superset-frontend/.eslintrc.js                     |    88 +-
 superset-frontend/.storybook/main.js               |     2 +-
 superset-frontend/.storybook/preview.jsx           |     2 +-
 superset-frontend/cypress-base/.eslintrc           |    21 +-
 superset-frontend/cypress-base/cypress.json        |     8 +-
 .../integration/chart_list/card_view.test.ts       |   107 +
 .../integration/chart_list/chart_list.helper.ts    |    19 +
 .../cypress/integration/chart_list/filter.test.ts  |   123 +
 .../integration/chart_list/list_view.test.ts       |    50 +
 .../integration/dashboard/dashboard.helper.js      |    23 -
 .../integration/dashboard/dashboard.helper.ts      |    47 +
 .../integration/dashboard/edit_mode.test.js        |    25 +-
 .../cypress/integration/dashboard/load.test.js     |     2 +-
 .../cypress/integration/dashboard/markdown.test.ts |    64 +
 .../cypress/integration/dashboard/save.test.js     |     4 +-
 .../integration/dashboard_list/card_view.test.ts   |   111 +
 .../dashboard_list/dashboard_list.helper.ts        |    19 +
 .../integration/dashboard_list/filter.test.ts      |    99 +
 .../integration/dashboard_list/list_view.test.ts   |    53 +
 .../integration/explore/AdhocFilters.test.ts       |    57 +-
 .../integration/explore/AdhocMetrics.test.ts       |    14 +-
 .../cypress/integration/explore/advanced.test.ts   |     4 +-
 .../cypress/integration/explore/chart.test.js      |     2 +-
 .../cypress/integration/explore/control.test.ts    |    73 +-
 .../explore/visualizations/big_number.test.js      |     2 +-
 .../explore/visualizations/line.test.ts            |     9 +
 .../integration/explore/visualizations/pie.test.js |     8 +-
 .../cypress/integration/sqllab/query.test.js       |   124 -
 .../cypress/integration/sqllab/query.test.ts       |   161 +
 .../cypress/integration/sqllab/tabs.test.js        |    43 +-
 .../cypress-base/cypress/support/index.d.ts        |     2 +-
 superset-frontend/cypress-base/package-lock.json   |   484 +-
 superset-frontend/cypress-base/package.json        |     2 +-
 superset-frontend/cypress-base/tsconfig.json       |     2 +-
 superset-frontend/cypress_build.sh                 |     4 +-
 superset-frontend/images/icons/alert.svg           |    21 +
 superset-frontend/images/icons/alert_solid.svg     |    22 +
 superset-frontend/images/icons/binoculars.svg      |    21 +
 superset-frontend/images/icons/bolt.svg            |    21 +
 superset-frontend/images/icons/bolt_small.svg      |    21 +
 superset-frontend/images/icons/bolt_small_run.svg  |    21 +
 superset-frontend/images/icons/calendar.svg        |    21 +
 superset-frontend/images/icons/cancel.svg          |    21 +
 superset-frontend/images/icons/cancel_solid.svg    |    22 +
 .../images/icons/{card-view.svg => card_view.svg}  |     0
 superset-frontend/images/icons/cards.svg           |    21 +
 superset-frontend/images/icons/cards_locked.svg    |    22 +
 superset-frontend/images/icons/caret_down.svg      |    21 +
 superset-frontend/images/icons/caret_left.svg      |    21 +
 superset-frontend/images/icons/caret_right.svg     |    21 +
 superset-frontend/images/icons/caret_up.svg        |    21 +
 superset-frontend/images/icons/checkbox-half.svg   |     2 +-
 superset-frontend/images/icons/checkbox-off.svg    |     2 +-
 superset-frontend/images/icons/checkbox-on.svg     |     2 +-
 superset-frontend/images/icons/circle-check.svg    |    22 -
 superset-frontend/images/icons/circle.svg          |    21 +
 superset-frontend/images/icons/circle_check.svg    |    21 +
 ...rcle-check-solid.svg => circle_check_solid.svg} |     0
 superset-frontend/images/icons/clock.svg           |    21 +
 superset-frontend/images/icons/code.svg            |    21 +
 superset-frontend/images/icons/cog.svg             |    22 +
 superset-frontend/images/icons/collapse.svg        |    21 +
 superset-frontend/images/icons/color_palette.svg   |    21 +
 superset-frontend/images/icons/components.svg      |    22 +
 superset-frontend/images/icons/copy.svg            |    21 +
 superset-frontend/images/icons/cursor_target.svg   |    21 +
 superset-frontend/images/icons/database.svg        |    21 +
 .../images/icons/dataset_virtual_greyscale.svg     |    22 +
 superset-frontend/images/icons/download.svg        |    21 +
 superset-frontend/images/icons/edit.svg            |    21 +
 .../images/icons/{pencil.svg => edit_alt.svg}      |     0
 superset-frontend/images/icons/email.svg           |    21 +
 superset-frontend/images/icons/error.svg           |    33 +-
 .../images/icons/{error.svg => error_solid.svg}    |     0
 .../images/icons/error_solid_small.svg             |    22 +
 superset-frontend/images/icons/expand.svg          |    21 +
 superset-frontend/images/icons/eye.svg             |    21 +
 superset-frontend/images/icons/eye_slash.svg       |    21 +
 .../images/icons/favorite-selected.svg             |     4 +-
 .../images/icons/favorite-unselected.svg           |     4 +-
 .../images/icons/favorite_small_selected.svg       |    21 +
 superset-frontend/images/icons/field_abc.svg       |    21 +
 superset-frontend/images/icons/field_boolean.svg   |    21 +
 superset-frontend/images/icons/field_date.svg      |    21 +
 superset-frontend/images/icons/field_derived.svg   |    21 +
 superset-frontend/images/icons/field_num.svg       |    21 +
 superset-frontend/images/icons/field_struct.svg    |    21 +
 superset-frontend/images/icons/file.svg            |    21 +
 superset-frontend/images/icons/filter.svg          |    21 +
 superset-frontend/images/icons/folder.svg          |    21 +
 superset-frontend/images/icons/full.svg            |    21 +
 superset-frontend/images/icons/gear.svg            |    21 +
 superset-frontend/images/icons/grid.svg            |    21 +
 superset-frontend/images/icons/image.svg           |    21 +
 superset-frontend/images/icons/info-solid.svg      |    22 +
 superset-frontend/images/icons/info.svg            |    21 +
 .../images/icons/info_solid_small.svg              |    22 +
 superset-frontend/images/icons/join.svg            |    21 +
 superset-frontend/images/icons/keyboard.svg        |    21 +
 superset-frontend/images/icons/layers.svg          |    21 +
 superset-frontend/images/icons/lightbulb.svg       |    21 +
 superset-frontend/images/icons/list.svg            |    21 +
 .../images/icons/{list-view.svg => list_view.svg}  |     0
 superset-frontend/images/icons/location.svg        |    21 +
 superset-frontend/images/icons/lock_locked.svg     |    21 +
 superset-frontend/images/icons/lock_unlocked.svg   |    21 +
 superset-frontend/images/icons/map.svg             |    21 +
 superset-frontend/images/icons/message.svg         |    21 +
 superset-frontend/images/icons/minus.svg           |    21 +
 superset-frontend/images/icons/minus_solid.svg     |    22 +
 .../images/icons/{more.svg => more_horiz.svg}      |     0
 superset-frontend/images/icons/move.svg            |    21 +
 superset-frontend/images/icons/nav_charts.svg      |    22 +
 superset-frontend/images/icons/nav_dashboard.svg   |    21 +
 superset-frontend/images/icons/nav_data.svg        |    21 +
 .../images/icons/{compass.svg => nav_explore.svg}  |     0
 superset-frontend/images/icons/nav_home.svg        |    21 +
 superset-frontend/images/icons/nav_lab.svg         |    21 +
 superset-frontend/images/icons/note.svg            |    21 +
 superset-frontend/images/icons/paperclip.svg       |    21 +
 superset-frontend/images/icons/placeholder.svg     |    21 +
 superset-frontend/images/icons/plus.svg            |    21 +
 superset-frontend/images/icons/plus_large.svg      |    21 +
 superset-frontend/images/icons/plus_small.svg      |    21 +
 superset-frontend/images/icons/plus_solid.svg      |    22 +
 superset-frontend/images/icons/refresh.svg         |    21 +
 superset-frontend/images/icons/server.svg          |    21 +
 .../images/icons/{sort-asc.svg => sort_asc.svg}    |     0
 .../images/icons/{sort-desc.svg => sort_desc.svg}  |     0
 superset-frontend/images/icons/sql.svg             |    22 +
 superset-frontend/images/icons/table.svg           |    22 +
 superset-frontend/images/icons/tag.svg             |    21 +
 superset-frontend/images/icons/triangle_change.svg |    21 +
 superset-frontend/images/icons/triangle_down.svg   |    21 +
 superset-frontend/images/icons/triangle_up.svg     |    21 +
 superset-frontend/images/icons/up-level.svg        |    21 +
 superset-frontend/images/icons/user.svg            |    21 +
 superset-frontend/images/icons/warning.svg         |    31 +-
 .../icons/{warning.svg => warning_solid.svg}       |     0
 superset-frontend/images/icons/x-large.svg         |    21 +
 superset-frontend/images/icons/x-small.svg         |    21 +
 superset-frontend/images/screenshots/gallery.png   |   Bin 0 -> 3542967 bytes
 superset-frontend/package-lock.json                |  4174 ++--
 superset-frontend/package.json                     |   117 +-
 superset-frontend/prettier.config.js               |    23 +
 superset-frontend/spec/.eslintrc                   |    21 +-
 .../spec/helpers/setupSupersetClient.js            |     2 +-
 superset-frontend/spec/helpers/shim.ts             |     4 +-
 superset-frontend/spec/helpers/theming.ts          |     4 +-
 .../spec/javascripts/CRUD/CollectionTable_spec.jsx |     2 +-
 .../addSlice/AddSliceContainer_spec.tsx            |    14 +-
 .../spec/javascripts/chart/ChartRenderer_spec.jsx  |     2 +-
 .../spec/javascripts/chart/chartActions_spec.js    |     2 +-
 .../components/AlteredSliceTag_spec.jsx            |   259 +-
 .../spec/javascripts/components/Checkbox_spec.jsx  |    55 -
 .../components/ConfirmStatusChange_spec.jsx        |     8 +-
 .../components/ListView/ListView_spec.jsx          |    13 +-
 .../spec/javascripts/components/Menu_spec.jsx      |    47 +-
 .../spec/javascripts/components/SubMenu_spec.jsx   |   108 +
 .../javascripts/components/TableSelector_spec.jsx  |   430 +-
 .../components/fixtures/AlteredSliceTag.js         |   166 +
 .../spec/javascripts/dashboard/.eslintrc           |     1 -
 .../dashboard/actions/dashboardState_spec.js       |     4 +-
 .../dashboard/components/CodeModal_spec.jsx        |     2 +-
 .../dashboard/components/DashboardBuilder_spec.jsx |     2 +-
 .../components/HeaderActionsDropdown_spec.jsx      |     8 +-
 .../dashboard/components/Header_spec.jsx           |     2 +-
 .../components/gridComponents/ChartHolder_spec.jsx |     2 +-
 .../components/gridComponents/Markdown_spec.jsx    |    14 +-
 .../components/gridComponents/Tab_spec.jsx         |     2 +-
 .../resizable/ResizableContainer_spec.jsx          |     2 +-
 .../dashboard/fixtures/mockDashboardLayout.js      |     2 +-
 .../dashboard/reducers/dashboardFilters_spec.js    |     2 +-
 .../dashboard/util/getDashboardUrl_spec.js         |    10 +
 .../datasource/ChangeDatasourceModal_spec.jsx      |     2 +-
 .../datasource/DatasourceModal_spec.jsx            |    17 +-
 .../components/AdhocFilterEditPopover_spec.jsx     |     7 +-
 .../explore/components/AdhocFilterOption_spec.jsx  |     4 +-
 .../components/AdhocMetricEditPopover_spec.jsx     |     7 +-
 .../explore/components/AdhocMetricOption_spec.jsx  |     4 +-
 .../explore/components/ColorPickerControl_spec.jsx |     2 +-
 .../explore/components/ColorScheme_spec.jsx        |     2 +-
 .../components/ControlPanelsContainer_spec.jsx     |     3 +-
 .../explore/components/ControlRow_spec.jsx         |     2 +
 .../explore/components/DatasourceControl_spec.jsx  |     2 +-
 .../explore/components/DateFilterControl_spec.jsx  |   117 +-
 .../components/ExploreViewContainer_spec.jsx       |     4 +-
 .../explore/components/QueryAndSaveBtns_spec.jsx   |     2 +-
 .../explore/components/SaveModal_spec.jsx          |    12 +-
 .../explore/components/TextArea_spec.jsx           |     4 +-
 .../explore/components/VizTypeControl_spec.jsx     |     2 +-
 .../spec/javascripts/explore/controlUtils_spec.jsx |   130 +-
 .../spec/javascripts/explore/fixtures.jsx          |   105 +
 .../spec/javascripts/explore/store_spec.jsx        |     2 +-
 .../spec/javascripts/explore/utils_spec.jsx        |     4 +-
 .../spec/javascripts/messageToasts/.eslintrc       |     1 -
 .../spec/javascripts/middleware/logger_spec.js     |     4 +-
 .../spec/javascripts/modules/utils_spec.jsx        |    18 +-
 .../spec/javascripts/sqllab/QuerySearch_spec.jsx   |     6 +-
 .../spec/javascripts/sqllab/SouthPane_spec.jsx     |     2 +-
 .../spec/javascripts/sqllab/SqlEditor_spec.jsx     |    10 +-
 .../javascripts/sqllab/TabbedSqlEditors_spec.jsx   |     2 +-
 .../spec/javascripts/sqllab/Timer_spec.jsx         |    10 +-
 .../utils/getControlsForVizType_spec.js            |     3 +-
 .../views/CRUD/chart/ChartList_spec.jsx            |     4 +-
 .../views/CRUD/dashboard/DashboardList_spec.jsx    |     6 +-
 .../views/CRUD/data/database/DatabaseList_spec.jsx |   126 +
 .../CRUD/data/database/DatabaseModal_spec.jsx      |    82 +
 .../views/CRUD/data/dataset/DatasetList_spec.jsx   |    16 +-
 .../CRUD/data/savedquery/SavedQueryList_spec.jsx   |   176 +
 .../views/CRUD/welcome/DashboardTable_spec.tsx     |     2 +-
 superset-frontend/src/CRUD/CollectionTable.tsx     |    67 +-
 superset-frontend/src/CRUD/Field.jsx               |     4 +-
 superset-frontend/src/CRUD/Fieldset.jsx            |     6 +-
 superset-frontend/src/SqlLab/App.jsx               |     2 +-
 superset-frontend/src/SqlLab/actions/sqlLab.js     |     3 +-
 .../src/SqlLab/components/AceEditorWrapper.tsx     |    97 +-
 superset-frontend/src/SqlLab/components/App.jsx    |    12 +-
 .../src/SqlLab/components/ColumnElement.tsx        |     6 +-
 .../SqlLab/components/EstimateQueryCostButton.jsx  |    11 +-
 .../SqlLab/components/ExploreCtasResultsButton.jsx |    10 +-
 .../src/SqlLab/components/ExploreResultsButton.jsx |    23 +-
 .../src/SqlLab/components/HighlightedSql.jsx       |    16 +-
 .../src/SqlLab/components/LimitControl.tsx         |    25 +-
 .../src/SqlLab/components/QueryAutoRefresh.jsx     |    10 +-
 .../src/SqlLab/components/QueryHistory.jsx         |     2 +-
 .../src/SqlLab/components/QuerySearch.jsx          |    15 +-
 .../src/SqlLab/components/QueryTable.jsx           |    45 +-
 .../src/SqlLab/components/ResultSet.tsx            |    65 +-
 .../src/SqlLab/components/RunQueryActionButton.tsx |    19 +-
 .../src/SqlLab/components/SaveQuery.jsx            |    22 +-
 .../src/SqlLab/components/ScheduleQueryButton.jsx  |    13 +-
 .../src/SqlLab/components/ShareSqlLabQuery.jsx     |     6 +-
 .../src/SqlLab/components/ShowSQL.tsx              |    13 +-
 .../src/SqlLab/components/SouthPane.jsx            |     8 +-
 .../src/SqlLab/components/SqlEditor.jsx            |    45 +-
 .../src/SqlLab/components/SqlEditorLeftBar.jsx     |    29 +-
 .../src/SqlLab/components/TabbedSqlEditors.jsx     |    44 +-
 .../src/SqlLab/components/TableElement.jsx         |    35 +-
 .../src/SqlLab/components/TemplateParamsEditor.jsx |    25 +-
 superset-frontend/src/SqlLab/main.less             |     6 +-
 .../src/SqlLab/reducers/getInitialState.js         |     4 +-
 superset-frontend/src/SqlLab/reducers/sqlLab.js    |    15 +-
 .../src/addSlice/AddSliceContainer.tsx             |    51 +-
 superset-frontend/src/addSlice/App.tsx             |     4 +-
 superset-frontend/src/addSlice/index.tsx           |     2 +-
 superset-frontend/src/chart/Chart.jsx              |     3 +-
 superset-frontend/src/chart/ChartRenderer.jsx      |     3 +-
 superset-frontend/src/chart/chartAction.js         |    13 +-
 superset-frontend/src/chart/chartReducer.js        |     5 +-
 superset-frontend/src/common/components/Modal.tsx  |   128 +
 superset-frontend/src/common/components/Tabs.tsx   |    62 +
 .../src/common/components/common.stories.tsx       |    61 +
 superset-frontend/src/common/components/index.ts   |     2 +-
 .../src/components/ActionMenuItem.jsx              |    83 -
 .../src/components/AlteredSliceTag.jsx             |   144 +-
 superset-frontend/src/components/AnchorLink.jsx    |     2 +-
 .../src/components/AsyncAceEditor.tsx              |   215 +
 .../src/components/AsyncEsmComponent.tsx           |   132 +
 superset-frontend/src/components/AsyncSelect.jsx   |     3 +-
 superset-frontend/src/components/AvatarIcon.tsx    |     2 +-
 .../src/components/Button/Button.stories.jsx       |   163 +
 .../src/components/Button/Button.test.tsx          |    68 +
 .../src/components/Button/button.stories.jsx       |   165 -
 superset-frontend/src/components/Button/index.tsx  |   238 +-
 superset-frontend/src/components/CachedLabel.jsx   |     2 +-
 .../src/components/CertifiedIconWithTooltip.tsx    |     3 +-
 superset-frontend/src/components/Checkbox.tsx      |    47 -
 .../src/components/Checkbox/Checkbox.stories.jsx   |    63 +
 .../src/components/Checkbox/Checkbox.test.tsx      |    75 +
 .../src/components/Checkbox/index.tsx              |    54 +
 superset-frontend/src/components/CheckboxIcons.tsx |     2 +-
 .../src/components/ConfirmStatusChange.tsx         |    17 +-
 .../src/components/CopyToClipboard.jsx             |     2 +-
 .../src/components/DatabaseSelector.tsx            |   283 +
 superset-frontend/src/components/DeleteModal.tsx   |    15 +-
 superset-frontend/src/components/EditableTitle.tsx |     2 +-
 superset-frontend/src/components/ErrorBoundary.jsx |     2 +-
 .../ErrorMessage/DatabaseErrorMessage.tsx          |     2 +-
 .../src/components/ErrorMessage/ErrorAlert.tsx     |    15 +-
 .../ErrorMessage/ErrorMessageWithStackTrace.tsx    |     2 +-
 .../src/components/ErrorMessage/IssueCode.tsx      |     2 +-
 .../ErrorMessage/TimeoutErrorMessage.tsx           |     2 +-
 .../src/components/ErrorMessage/types.ts           |     2 +
 .../src/components/ExpandableList.tsx              |     4 +-
 superset-frontend/src/components/FaveStar.tsx      |     4 +-
 .../components/FilterableTable/FilterableTable.tsx |    71 +-
 superset-frontend/src/components/FlashProvider.tsx |     1 +
 superset-frontend/src/components/FormLabel.tsx     |     2 +-
 superset-frontend/src/components/Hotkeys.jsx       |     2 +
 .../src/components/Icon/icon.stories.jsx           |     6 +-
 superset-frontend/src/components/Icon/index.tsx    |   318 +-
 .../src/components/IndeterminateCheckbox.tsx       |     2 +-
 .../src/components/Label/Label.stories.tsx         |    10 +-
 superset-frontend/src/components/Label/index.tsx   |    49 +-
 superset-frontend/src/components/Link.tsx          |     1 -
 .../src/components/ListView/ActionsBar.tsx         |    92 +
 .../src/components/ListView/CardCollection.tsx     |     5 +-
 .../src/components/ListView/CardSortSelect.tsx     |     2 +-
 .../src/components/ListView/Filters.tsx            |    20 +-
 .../src/components/ListView/ListView.tsx           |    78 +-
 .../src/components/ListView/TableCollection.tsx    |    14 +-
 superset-frontend/src/components/ListView/types.ts |     8 +-
 superset-frontend/src/components/ListView/utils.ts |    28 +-
 .../components/ListViewCard/ImageLoader.test.jsx   |    10 +-
 .../src/components/ListViewCard/ImageLoader.tsx    |    20 +-
 .../ListViewCard/ListViewCard.stories.tsx          |     6 +-
 .../src/components/ListViewCard/index.tsx          |    14 +-
 superset-frontend/src/components/Loading.tsx       |     2 +-
 .../src/components/Menu/LanguagePicker.tsx         |     3 +-
 superset-frontend/src/components/Menu/Menu.less    |    45 -
 superset-frontend/src/components/Menu/Menu.tsx     |   187 +-
 .../src/components/Menu/MenuObject.tsx             |    26 +-
 superset-frontend/src/components/Menu/NewMenu.tsx  |    15 +-
 superset-frontend/src/components/Menu/SubMenu.tsx  |   121 +-
 superset-frontend/src/components/Menu/UserMenu.tsx |    15 +-
 superset-frontend/src/components/Modal.tsx         |    15 +-
 superset-frontend/src/components/ModalTrigger.jsx  |    12 +-
 .../src/components/NavDropdown/index.tsx           |    72 +
 superset-frontend/src/components/OmniContainer.jsx |     5 +-
 superset-frontend/src/components/Pagination.tsx    |     6 +-
 superset-frontend/src/components/Popover/index.tsx |    23 +
 .../src/components/RefreshChartOverlay.tsx         |     5 +-
 superset-frontend/src/components/RefreshLabel.jsx  |     1 +
 superset-frontend/src/components/SearchInput.tsx   |    13 +-
 .../src/components/Select/SupersetStyledSelect.tsx |    18 +-
 .../Select/WindowedSelect/WindowedMenuList.tsx     |    26 +-
 .../components/Select/WindowedSelect/windowed.tsx  |     9 +-
 superset-frontend/src/components/Select/styles.tsx |    28 +-
 superset-frontend/src/components/TableLoader.jsx   |     5 +-
 superset-frontend/src/components/TableSelector.jsx |   445 -
 superset-frontend/src/components/TableSelector.tsx |   379 +
 superset-frontend/src/components/Timer.tsx         |    67 +-
 .../src/components/URLShortLinkButton.jsx          |     2 +-
 .../src/components/URLShortLinkModal.jsx           |     2 +-
 superset-frontend/src/dashboard/.eslintrc          |     3 +-
 superset-frontend/src/dashboard/App.jsx            |     2 +-
 .../src/dashboard/actions/dashboardLayout.js       |     2 +-
 .../src/dashboard/actions/dashboardState.js        |     9 +-
 .../src/dashboard/actions/datasources.js           |     2 +-
 .../src/dashboard/actions/sliceEntities.js         |    11 +-
 .../src/dashboard/components/AddSliceCard.jsx      |     2 +-
 .../dashboard/components/BuilderComponentPane.jsx  |     5 +-
 .../src/dashboard/components/CodeModal.jsx         |     4 +-
 .../components/ColorSchemeControlWrapper.jsx       |     4 +-
 .../src/dashboard/components/CssEditor.jsx         |    20 +-
 .../src/dashboard/components/Dashboard.jsx         |     6 +-
 .../dashboard/components/DeleteComponentModal.jsx  |     6 +-
 .../src/dashboard/components/FilterIndicator.jsx   |     2 +-
 .../dashboard/components/FilterIndicatorGroup.jsx  |     2 +-
 .../components/FilterIndicatorTooltip.jsx          |     3 +-
 .../components/FilterIndicatorsContainer.jsx       |     3 +-
 .../src/dashboard/components/Header.jsx            |    56 +-
 .../dashboard/components/HeaderActionsDropdown.jsx |    24 +-
 .../src/dashboard/components/MissingChart.jsx      |     2 +-
 .../src/dashboard/components/PropertiesModal.jsx   |    31 +-
 .../src/dashboard/components/PublishedStatus.jsx   |    27 +-
 .../dashboard/components/RefreshIntervalModal.jsx  |     9 +-
 .../src/dashboard/components/SaveModal.jsx         |    12 +-
 .../src/dashboard/components/SliceAdder.jsx        |    17 +-
 .../src/dashboard/components/SliceHeader.jsx       |     2 +-
 .../dashboard/components/SliceHeaderControls.jsx   |     8 +-
 .../components/filterscope/FilterScopeSelector.jsx |    10 +-
 .../dashboard/components/filterscope/treeIcons.jsx |     2 +-
 .../components/gridComponents/ChartHolder.jsx      |     2 +-
 .../dashboard/components/gridComponents/Header.jsx |     2 +-
 .../components/gridComponents/Markdown.jsx         |    19 +-
 .../dashboard/components/gridComponents/Tabs.jsx   |     2 +-
 .../components/gridComponents/new/NewColumn.jsx    |     2 +-
 .../components/gridComponents/new/NewDivider.jsx   |     2 +-
 .../components/gridComponents/new/NewHeader.jsx    |     2 +-
 .../components/gridComponents/new/NewRow.jsx       |     2 +-
 .../components/gridComponents/new/NewTabs.jsx      |     2 +-
 .../components/menu/MarkdownModeDropdown.jsx       |     2 +-
 .../components/resizable/ResizableContainer.jsx    |     2 +-
 .../src/dashboard/containers/FilterIndicators.jsx  |     4 +-
 .../src/dashboard/reducers/dashboardFilters.js     |     9 +-
 .../src/dashboard/reducers/dashboardState.js       |     4 +-
 .../src/dashboard/reducers/getInitialState.js      |    18 +-
 superset-frontend/src/dashboard/reducers/index.js  |     2 +-
 .../src/dashboard/reducers/sliceEntities.js        |     2 +-
 .../src/dashboard/stylesheets/buttons.less         |    11 -
 superset-frontend/src/dashboard/types.ts           |     2 +-
 .../src/dashboard/util/activeDashboardFilters.js   |     2 +-
 .../src/dashboard/util/backgroundStyleOptions.ts   |     2 +-
 .../util/charts/getEffectiveExtraFilters.ts        |     2 +-
 .../util/charts/getFormDataWithExtraFilters.ts     |     6 +-
 .../src/dashboard/util/findFirstParentContainer.js |     2 +-
 .../dashboard/util/getComponentWidthFromDrop.js    |    38 +-
 .../src/dashboard/util/getDashboardUrl.js          |    10 +-
 .../src/dashboard/util/getEmptyLayout.js           |     2 +-
 .../src/dashboard/util/getFilterFieldNodesTree.js  |     2 +-
 .../src/dashboard/util/getFilterScopeNodesTree.js  |    10 +-
 .../src/dashboard/util/headerStyleOptions.ts       |     2 +-
 .../util/logging/findNonTabChildChartIds.js        |     3 +-
 .../src/dashboard/util/propShapes.jsx              |     2 +-
 .../src/datasource/ChangeDatasourceModal.tsx       |    12 +-
 .../src/datasource/DatasourceEditor.jsx            |   364 +-
 .../src/datasource/DatasourceModal.tsx             |    59 +-
 superset-frontend/src/explore/AdhocFilter.js       |     5 +-
 superset-frontend/src/explore/AdhocMetric.js       |     6 +-
 superset-frontend/src/explore/App.jsx              |     2 +-
 .../src/explore/actions/exploreActions.js          |     3 +-
 .../src/explore/actions/saveModalActions.js        |     2 +-
 .../explore/components/AdhocFilterEditPopover.jsx  |   125 +-
 .../AdhocFilterEditPopoverSimpleTabContent.jsx     |    16 +-
 .../AdhocFilterEditPopoverSqlTabContent.jsx        |    60 +-
 .../src/explore/components/AdhocFilterOption.jsx   |    11 +-
 .../explore/components/AdhocMetricEditPopover.jsx  |   257 +-
 .../src/explore/components/AdhocMetricOption.jsx   |     9 +-
 .../src/explore/components/Control.jsx             |     3 +
 .../src/explore/components/ControlHeader.jsx       |    11 +-
 .../src/explore/components/ControlPanelSection.jsx |     5 +-
 .../explore/components/ControlPanelsContainer.jsx  |    10 +-
 .../src/explore/components/DisplayQueryButton.jsx  |    58 +-
 .../src/explore/components/EmbedCodeButton.jsx     |     6 +-
 .../explore/components/ExploreActionButtons.jsx    |     8 +-
 .../src/explore/components/ExploreChartHeader.jsx  |     3 +-
 .../src/explore/components/ExploreChartPanel.jsx   |     6 +-
 .../explore/components/ExploreViewContainer.jsx    |    49 +-
 .../explore/components/FilterDefinitionOption.jsx  |     6 +-
 .../explore/components/MetricDefinitionOption.jsx  |     6 +-
 .../src/explore/components/PropertiesModal.tsx     |    71 +-
 .../src/explore/components/QueryAndSaveBtns.jsx    |    33 +-
 .../src/explore/components/RowCountLabel.jsx       |     3 +-
 .../src/explore/components/SaveModal.jsx           |    38 +-
 .../components/controls/AdhocFilterControl.jsx     |     6 +-
 .../components/controls/AnnotationLayer.jsx        |    49 +-
 .../components/controls/AnnotationLayerControl.jsx |    25 +-
 .../explore/components/controls/BoundsControl.jsx  |    24 +-
 .../components/controls/CheckboxControl.jsx        |     2 +
 .../components/controls/CollectionControl.jsx      |     8 +-
 .../components/controls/ColorMapControl.jsx        |     2 +-
 .../components/controls/ColorPickerControl.jsx     |     5 +-
 .../components/controls/ColorSchemeControl.jsx     |     4 -
 .../components/controls/DatasourceControl.jsx      |    87 +-
 .../components/controls/DatasourceControl.less     |    19 +-
 .../components/controls/DateFilterControl.jsx      |    63 +-
 .../components/controls/FilterBoxItemControl.jsx   |    15 +-
 .../components/controls/FixedOrMetricControl.jsx   |    11 +-
 .../explore/components/controls/MetricsControl.jsx |    22 +-
 .../components/controls/SelectAsyncControl.jsx     |     4 +-
 .../explore/components/controls/SelectControl.jsx  |     8 +-
 .../explore/components/controls/SpatialControl.jsx |   153 +-
 .../components/controls/TextAreaControl.jsx        |    40 +-
 .../explore/components/controls/TextControl.tsx    |    48 +-
 .../controls/TimeSeriesColumnControl.jsx           |    18 +-
 .../components/controls/ViewportControl.jsx        |     5 +
 .../explore/components/controls/VizTypeControl.jsx |     7 +-
 .../components/controls/withVerification.jsx       |     3 +-
 superset-frontend/src/explore/constants.js         |     2 +-
 .../src/explore/controlPanels/DeckArc.js           |    12 +-
 .../src/explore/controlPanels/DeckGeojson.js       |    10 +-
 .../src/explore/controlPanels/DeckGrid.js          |     3 +-
 .../src/explore/controlPanels/DeckHex.js           |     4 +-
 .../src/explore/controlPanels/DeckMulti.js         |     3 +-
 .../src/explore/controlPanels/DeckPath.js          |     2 +-
 .../src/explore/controlPanels/DeckPolygon.js       |     4 +-
 .../src/explore/controlPanels/DeckScatter.js       |     3 +-
 .../src/explore/controlPanels/DeckScreengrid.js    |     3 +-
 .../src/explore/controlPanels/Separator.js         |     5 +-
 .../src/explore/controlPanels/Shared_DeckGL.jsx    |    13 +-
 .../src/explore/controlPanels/TimeTable.js         |     3 +-
 .../src/explore/controlPanels/sections.jsx         |     4 +-
 superset-frontend/src/explore/controlUtils.js      |    38 +-
 superset-frontend/src/explore/controls.jsx         |    14 +-
 superset-frontend/src/explore/dateFilterUtils.ts   |     2 +-
 superset-frontend/src/explore/exploreUtils.js      |    14 +-
 superset-frontend/src/explore/main.less            |     1 -
 .../src/explore/reducers/getInitialState.js        |     2 +-
 superset-frontend/src/explore/store.js             |     4 +-
 superset-frontend/src/featureFlags.ts              |     5 +
 .../src/messageToasts/components/Toast.tsx         |     4 +-
 .../messageToasts/components/ToastPresenter.tsx    |     2 +-
 .../src/middleware/loggerMiddleware.js             |     4 +-
 superset-frontend/src/modules/AnnotationTypes.js   |     2 -
 superset-frontend/src/modules/utils.js             |    37 +-
 superset-frontend/src/preamble.ts                  |     2 +-
 superset-frontend/src/profile/App.tsx              |     2 +-
 superset-frontend/src/profile/components/App.tsx   |     2 +-
 .../src/profile/components/CreatedContent.tsx      |     4 +-
 .../src/profile/components/Favorites.tsx           |     4 +-
 .../src/profile/components/Security.tsx            |     2 +-
 .../src/profile/components/UserInfo.tsx            |     2 +-
 superset-frontend/src/reduxUtils.ts                |     4 +-
 superset-frontend/src/setup/setupApp.ts            |     6 +-
 superset-frontend/src/setup/setupClient.js         |     3 +-
 superset-frontend/src/setup/setupColors.js         |    20 +-
 superset-frontend/src/setup/setupErrorMessages.ts  |     8 +
 superset-frontend/src/setup/setupFormatters.js     |     4 +-
 superset-frontend/src/setup/setupPlugins.ts        |     2 +-
 superset-frontend/src/showSavedQuery/index.jsx     |     2 +-
 superset-frontend/src/types/brace.d.ts             |    28 +
 .../src/utils/DebouncedMessageQueue.js             |     2 +
 superset-frontend/src/utils/common.js              |    29 +-
 superset-frontend/src/utils/downloadAsImage.ts     |     2 +-
 .../src/utils/getClientErrorObject.ts              |     3 +-
 .../src/utils/getControlsForVizType.js             |     4 +-
 superset-frontend/src/utils/hostNamesConfig.js     |     2 +-
 superset-frontend/src/views/App.tsx                |    24 +-
 .../src/views/CRUD/chart/ChartList.tsx             |    70 +-
 .../src/views/CRUD/dashboard/DashboardList.tsx     |    97 +-
 superset-frontend/src/views/CRUD/data/common.ts    |     8 +-
 .../src/views/CRUD/data/database/DatabaseList.tsx  |   348 +-
 .../src/views/CRUD/data/database/DatabaseModal.tsx |   648 +
 .../src/views/CRUD/data/database/types.ts          |    54 +
 .../views/CRUD/data/dataset/AddDatasetModal.tsx    |    17 +-
 .../src/views/CRUD/data/dataset/Button.tsx         |    72 -
 .../src/views/CRUD/data/dataset/DatasetList.tsx    |    90 +-
 .../views/CRUD/data/savedquery/SavedQueryList.tsx  |   452 +
 superset-frontend/src/views/CRUD/hooks.ts          |   132 +-
 superset-frontend/src/views/CRUD/utils.tsx         |    13 +-
 .../src/views/CRUD/welcome/DashboardTable.tsx      |    42 +-
 .../src/views/CRUD/welcome/Welcome.tsx             |    32 +-
 superset-frontend/src/views/menu.tsx               |     2 +-
 .../src/visualizations/FilterBox/FilterBox.jsx     |    55 +-
 .../FilterBox/FilterBoxChartPlugin.js              |     3 +-
 .../src/visualizations/FilterBox/controlPanel.jsx  |     2 +-
 .../visualizations/TimeTable/FormattedNumber.jsx   |     2 +-
 .../src/visualizations/TimeTable/SparklineCell.jsx |     3 +-
 .../src/visualizations/TimeTable/TimeTable.jsx     |   219 +-
 .../TimeTable/TimeTableChartPlugin.js              |     3 +-
 .../src/visualizations/presets/MainPreset.js       |     8 +-
 .../stylesheets/less/cosmo/bootswatch.less         |     2 +-
 .../stylesheets/less/cosmo/cosmoTheme.js           |    59 +-
 superset-frontend/stylesheets/superset.less        |    30 +-
 superset-frontend/webpack.config.js                |    78 +-
 superset/__init__.py                               |     2 +-
 superset/app.py                                    |    63 +-
 .../SqlLab/components/ExploreCtasResultsButton.jsx |     6 +-
 {tests/util => superset/cachekeys}/__init__.py     |     0
 superset/cachekeys/api.py                          |   123 +
 superset/cachekeys/schemas.py                      |    45 +
 superset/charts/api.py                             |    62 +-
 superset/charts/dao.py                             |     1 -
 superset/charts/filters.py                         |    22 +-
 superset/charts/schemas.py                         |    19 +-
 superset/cli.py                                    |    12 +-
 superset/common/query_context.py                   |    31 +-
 superset/config.py                                 |    21 +-
 superset/connectors/base/models.py                 |     2 +-
 superset/connectors/base/views.py                  |    15 +
 superset/connectors/connector_registry.py          |     1 -
 superset/connectors/druid/views.py                 |    17 +-
 superset/connectors/sqla/models.py                 |    39 +-
 superset/connectors/sqla/views.py                  |    66 +-
 {tests/util => superset/css_templates}/__init__.py |     0
 superset/css_templates/api.py                      |   133 +
 .../css_templates/commands}/__init__.py            |     0
 superset/css_templates/commands/bulk_delete.py     |    53 +
 superset/css_templates/commands/exceptions.py      |    27 +
 superset/css_templates/dao.py                      |    45 +
 superset/css_templates/filters.py                  |    40 +
 superset/css_templates/schemas.py                  |    33 +
 superset/dao/base.py                               |     4 +-
 superset/dashboards/api.py                         |    52 +-
 superset/dashboards/dao.py                         |     2 +-
 superset/dashboards/filters.py                     |    13 +
 superset/databases/api.py                          |   514 +-
 .../databases/commands}/__init__.py                |     0
 superset/databases/commands/create.py              |    84 +
 superset/databases/commands/delete.py              |    58 +
 superset/databases/commands/exceptions.py          |   116 +
 superset/databases/commands/test_connection.py     |    66 +
 superset/databases/commands/update.py              |    87 +
 superset/databases/dao.py                          |    90 +
 superset/{views/database => databases}/filters.py  |     0
 superset/databases/schemas.py                      |   324 +
 superset/databases/utils.py                        |   103 +
 superset/datasets/api.py                           |    83 +-
 superset/datasets/commands/bulk_delete.py          |    88 +
 superset/datasets/commands/create.py               |     4 +-
 superset/datasets/commands/delete.py               |    31 +-
 superset/datasets/commands/exceptions.py           |     4 +
 superset/datasets/dao.py                           |    38 +-
 superset/datasets/schemas.py                       |     1 +
 superset/db_engine_specs/athena.py                 |     3 +-
 superset/db_engine_specs/base.py                   |    30 +-
 superset/db_engine_specs/bigquery.py               |     1 -
 superset/db_engine_specs/drill.py                  |     3 +-
 superset/db_engine_specs/druid.py                  |     6 +-
 superset/db_engine_specs/gsheets.py                |     2 +-
 superset/db_engine_specs/hana.py                   |     3 +-
 superset/db_engine_specs/hive.py                   |     9 +-
 superset/db_engine_specs/kylin.py                  |     3 +-
 superset/db_engine_specs/mssql.py                  |     8 +-
 superset/db_engine_specs/mysql.py                  |     7 +-
 superset/db_engine_specs/oracle.py                 |     6 +-
 superset/db_engine_specs/pinot.py                  |     4 +-
 superset/db_engine_specs/postgres.py               |     4 +-
 superset/db_engine_specs/presto.py                 |    64 +-
 superset/db_engine_specs/snowflake.py              |     2 +-
 superset/db_engine_specs/sqlite.py                 |     2 +-
 superset/db_engines/hive.py                        |    10 +-
 superset/errors.py                                 |    32 +
 superset/examples/birth_names.py                   |     2 +-
 superset/exceptions.py                             |     4 +
 superset/extensions.py                             |     4 +-
 superset/jinja_context.py                          |    29 +-
 .../versions/175ea3592453_cache_lookup.py          |    53 +
 ...d70ab98_fix_table_unique_constraint_in_mysql.py |    50 +
 .../versions/2e5a0ee25ed4_refractor_alerting.py    |   125 +
 ...654_fix_data_access_permissions_for_virtual_.py |   224 +
 superset/migrations/versions/ae19b4ee3692_.py      |    35 +
 ...828ac4e_add_rls_filter_type_and_grouping_key.py |    58 +
 superset/models/alerts.py                          |   142 +-
 superset/models/cache.py                           |    32 +
 superset/models/core.py                            |    19 +-
 superset/models/dashboard.py                       |    50 +-
 superset/models/datasource_access_request.py       |     8 +-
 superset/models/helpers.py                         |    64 +-
 superset/models/slice.py                           |     8 +-
 superset/models/sql_lab.py                         |    11 +-
 superset/models/tags.py                            |    23 +-
 .../queries/saved_queries}/__init__.py             |     0
 superset/queries/saved_queries/api.py              |   181 +
 .../queries/saved_queries/commands}/__init__.py    |     0
 .../queries/saved_queries/commands/bulk_delete.py  |    53 +
 .../queries/saved_queries/commands/exceptions.py   |    27 +
 superset/queries/saved_queries/dao.py              |    47 +
 superset/queries/saved_queries/filters.py          |    70 +
 superset/queries/saved_queries/schemas.py          |    33 +
 superset/security/manager.py                       |    50 +-
 superset/sql_lab.py                                |    48 +-
 superset/sql_validators/presto_db.py               |     7 +-
 superset/stats_logger.py                           |     1 -
 superset/tasks/{ => alerts}/__init__.py            |     0
 superset/tasks/alerts/observer.py                  |   103 +
 superset/tasks/alerts/validator.py                 |   111 +
 superset/tasks/schedules.py                        |   403 +-
 superset/templates/email/alert.txt                 |     6 +-
 superset/templates/slack/alert.txt                 |     4 +-
 superset/templates/slack/alert_no_screenshot.txt   |     4 +-
 superset/templates/superset/add_slice.html         |     2 +-
 superset/templates/superset/dashboard.html         |     9 +
 superset/templates/superset/import_dashboards.html |     3 +-
 superset/templates/superset/models/rls/list.html   |    96 +
 superset/translations/babel.cfg                    |     2 +
 superset/translations/es/LC_MESSAGES/messages.json |  2359 +-
 superset/translations/es/LC_MESSAGES/messages.po   |  7973 ++++--
 superset/translations/messages.pot                 |  2172 +-
 superset/utils/cache.py                            |     3 +-
 superset/utils/cache_manager.py                    |    28 +-
 superset/utils/celery.py                           |    57 +
 superset/utils/core.py                             |     6 +-
 superset/utils/decorators.py                       |    28 +-
 superset/utils/log.py                              |     1 -
 superset/utils/logging_configurator.py             |     6 +-
 superset/utils/machine_auth.py                     |     1 -
 superset/utils/pandas_postprocessing.py            |    13 +-
 superset/utils/screenshots.py                      |     5 +-
 superset/utils/webdriver.py                        |     1 -
 superset/views/alerts.py                           |   225 +-
 superset/views/base_api.py                         |    66 +-
 superset/views/chart/views.py                      |    16 +-
 superset/views/core.py                             |   136 +-
 superset/views/database/mixins.py                  |     6 +-
 superset/views/database/validators.py              |    14 +-
 superset/views/database/views.py                   |     6 +-
 superset/views/sql_lab.py                          |    14 +-
 superset/views/utils.py                            |    75 +-
 superset/viz.py                                    |   114 +-
 superset/viz_sip38.py                              |    24 +-
 tests/alerts_tests.py                              |   375 +-
 tests/base_api_tests.py                            |     1 +
 tests/base_tests.py                                |    73 +-
 tests/{util => cachekeys}/__init__.py              |     0
 tests/cachekeys/api_tests.py                       |   163 +
 tests/celery_tests.py                              |   903 +-
 tests/charts/api_tests.py                          |   135 +-
 tests/core_tests.py                                |   102 +-
 tests/{util => css_templates}/__init__.py          |     0
 tests/css_templates/api_tests.py                   |   356 +
 tests/dashboards/api_tests.py                      |   151 +-
 tests/database_api_tests.py                        |   268 -
 tests/{util => databases}/__init__.py              |     0
 tests/databases/api_tests.py                       |   791 +
 tests/datasets/api_tests.py                        |   186 +-
 tests/pandas_postprocessing_tests.py               |    28 +-
 tests/{util => queries/saved_queries}/__init__.py  |     0
 tests/queries/saved_queries/api_tests.py           |   630 +
 tests/query_context_tests.py                       |     5 +-
 tests/schedules_test.py                            |     6 +-
 tests/security_tests.py                            |   190 +-
 tests/sqla_models_tests.py                         |    54 +-
 tests/sqllab_tests.py                              |    22 +
 tests/superset_test_config.py                      |    16 +-
 tests/superset_test_config_thumbnails.py           |    23 +-
 tests/superset_test_custom_template_processors.py  |     2 +-
 tests/utils_tests.py                               |    40 +-
 tests/viz_tests.py                                 |    57 -
 tox.ini                                            |     9 +-
 1000 files changed, 62905 insertions(+), 17704 deletions(-)
 create mode 100644 .editorconfig
 create mode 100644 .github/ISSUE_TEMPLATE/security_vulnerability.md
 delete mode 100644 .github/prlint.json
 create mode 100644 .github/workflows/pr-lint.yml
 create mode 100644 .github/workflows/prefer-typescript.yml
 delete mode 100644 .github/workflows/prefer_typescript.yml
 delete mode 100644 .github/workflows/superset-docker.yml
 create mode 100644 .github/workflows/superset-docs.yml
 create mode 100644 .github/workflows/test-docker.yml
 create mode 100644 .github/workflows/test-hive.yml
 create mode 100644 .github/workflows/test-presto.yml
 create mode 100644 docs/.eslintrc.js
 create mode 100644 docs/.gitignore
 create mode 100644 docs/.htaccess
 rename {superset-frontend => docs}/.prettierrc (100%)
 delete mode 100644 docs/Makefile
 create mode 100644 docs/README.md
 delete mode 100644 docs/_static/docs.css
 delete mode 120000 docs/_static/images
 delete mode 100644 docs/admintutorial.rst
 delete mode 100755 docs/build.sh
 delete mode 100644 docs/conf.py
 create mode 100644 docs/doczrc.js
 delete mode 100644 docs/druid.rst
 delete mode 100644 docs/faq.rst
 delete mode 100644 docs/gallery.rst
 create mode 100644 docs/gatsby-config.js
 create mode 100644 docs/gatsby-node.js
 delete mode 100644 docs/import_export_datasources.rst
 delete mode 100644 docs/index.rst
 delete mode 100644 docs/issue_code_reference.rst
 delete mode 100644 docs/misc.rst
 create mode 100644 docs/package-lock.json
 create mode 100644 docs/package.json
 create mode 100644 docs/prettier.config.js
 copy tests/util/__init__.py => docs/requirements.txt (100%)
 delete mode 100644 docs/security.rst
 create mode 100644 docs/src/components/AnchorNavigator.tsx
 create mode 100644 docs/src/components/DbImage.tsx
 create mode 100644 docs/src/components/DoczMenu.tsx
 create mode 100644 docs/src/components/MainMenu.tsx
 create mode 100644 docs/src/components/footer.tsx
 create mode 100644 docs/src/components/image.tsx
 create mode 100644 docs/src/components/layout.scss
 create mode 100644 docs/src/components/layout.tsx
 create mode 100644 docs/src/components/next.tsx
 create mode 100644 docs/src/components/select.tsx
 create mode 100644 docs/src/components/seo.js
 create mode 100644 docs/src/gatsby-theme-docz/index.tsx
 copy superset-frontend/branding/superset-logo-horiz-apache.png => docs/src/images/apacheSupersetHoriz.png (100%)
 create mode 100644 docs/src/images/dashboard.png
 create mode 100644 docs/src/images/databases/apache-drill.png
 create mode 100644 docs/src/images/databases/apache-druid.jpeg
 copy superset-frontend/images/druid.png => docs/src/images/databases/apache-druid.png (100%)
 create mode 100644 docs/src/images/databases/apache-hive.svg
 create mode 100644 docs/src/images/databases/apache-impala.png
 copy {superset-frontend/images => docs/src/images/databases}/apache-kylin.png (100%)
 copy superset-frontend/images/redshift.png => docs/src/images/databases/aws-redshift.png (100%)
 copy {superset-frontend/images => docs/src/images/databases}/clickhouse.png (100%)
 create mode 100644 docs/src/images/databases/druid.png
 copy {superset-frontend/images => docs/src/images/databases}/exasol.png (100%)
 copy {superset-frontend/images => docs/src/images/databases}/firebird.png (100%)
 copy superset-frontend/images/google-biquery.png => docs/src/images/databases/googleBQ.png (100%)
 create mode 100644 docs/src/images/databases/greenplum.jpeg
 copy {superset-frontend/images => docs/src/images/databases}/greenplum.png (100%)
 create mode 100644 docs/src/images/databases/ibmdb2.png
 copy superset-frontend/images/monet-db.png => docs/src/images/databases/monet.png (100%)
 copy superset-frontend/images/mssql-server.png => docs/src/images/databases/msql.png (100%)
 copy {superset-frontend/images => docs/src/images/databases}/mysql.png (100%)
 create mode 100644 docs/src/images/databases/oracle-logo.png
 copy {superset-frontend/images => docs/src/images/databases}/oracle.png (100%)
 create mode 100644 docs/src/images/databases/oraclelogo.png
 create mode 100644 docs/src/images/databases/postgresql.jpg
 create mode 100644 docs/src/images/databases/postsql.png
 copy superset-frontend/images/presto.png => docs/src/images/databases/presto-og.png (100%)
 copy {superset-frontend/images => docs/src/images/databases}/snowflake.png (100%)
 create mode 100644 docs/src/images/databases/sqllite.jpg
 create mode 100644 docs/src/images/databases/sqllite.png
 copy {superset-frontend/images => docs/src/images/databases}/vertica.png (100%)
 create mode 100644 docs/src/images/docker.png
 create mode 100644 docs/src/images/explorer.png
 copy {superset-frontend => docs/src}/images/favicon.png (100%)
 create mode 100644 docs/src/images/gallery/bubble.png
 create mode 100644 docs/src/images/gallery/chord_diagram.png
 create mode 100644 docs/src/images/gallery/community.png
 create mode 100644 docs/src/images/gallery/dashboard_editor.png
 create mode 100644 docs/src/images/gallery/dashboard_list.png
 create mode 100644 docs/src/images/gallery/dashboard_properties.png
 create mode 100644 docs/src/images/gallery/deck_arc.png
 create mode 100644 docs/src/images/gallery/deck_hex.png
 create mode 100644 docs/src/images/gallery/deck_path.png
 create mode 100644 docs/src/images/gallery/deck_polygon.png
 create mode 100644 docs/src/images/gallery/deck_scatter.png
 copy {superset-frontend/images/screenshots => docs/src/images/gallery}/deckgl_dash.png (100%)
 create mode 100644 docs/src/images/gallery/explore.png
 create mode 100644 docs/src/images/gallery/force_layout.png
 create mode 100644 docs/src/images/gallery/france.png
 create mode 100644 docs/src/images/gallery/girl_names.png
 create mode 100644 docs/src/images/gallery/heatmap.png
 create mode 100644 docs/src/images/gallery/pino_geo.png
 create mode 100644 docs/src/images/gallery/sankey.png
 create mode 100644 docs/src/images/gallery/slack.png
 create mode 100644 docs/src/images/gallery/sqllab.png
 create mode 100644 docs/src/images/gallery/storm.png
 create mode 100644 docs/src/images/gallery/stream.png
 create mode 100644 docs/src/images/gallery/table.png
 create mode 100644 docs/src/images/gallery/treemap.png
 copy {superset-frontend/images/screenshots => docs/src/images/gallery}/visualizations.png (100%)
 create mode 100644 docs/src/images/gallery/worldbank_dashboard.png
 create mode 100644 docs/src/images/incubator.png
 create mode 100644 docs/src/images/preset.png
 create mode 100644 docs/src/images/preset.svg
 copy {superset-frontend => docs/src}/images/s.png (100%)
 create mode 100644 docs/src/images/stack_overflow.png
 copy {superset-frontend/branding => docs/src/images}/superset-logo-horiz-apache.svg (100%)
 create mode 100644 docs/src/images/superset-logo-horiz.svg
 create mode 100644 docs/src/pages/404.jsx
 create mode 100644 docs/src/pages/community.tsx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/athena.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/clickhouse.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/cockroachdb.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/docker-add-drivers.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/dremio.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/drill.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/druid.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/elasticsearch.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/exasol.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/extra-settings.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/google-bigquery.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/google-sheets.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/hana.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/hive.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/ibm-db2.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/impala.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/index.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/kylin.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/mysql.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/oracle.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/pinot.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/postgres.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/presto.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/redshift.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/snowflake.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/spark-sql.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/sql-server.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/teradata.mdx
 create mode 100644 docs/src/pages/docs/Connecting to Databases/vertica.mdx
 create mode 100644 docs/src/pages/docs/Creating Charts and Dashboards/exploring-data.mdx
 create mode 100644 docs/src/pages/docs/Creating Charts and Dashboards/index.mdx
 create mode 100644 docs/src/pages/docs/Miscellaneous/importing-exporting.mdx
 create mode 100644 docs/src/pages/docs/Miscellaneous/index.mdx
 create mode 100644 docs/src/pages/docs/Miscellaneous/issue_codes.mdx
 create mode 100644 docs/src/pages/docs/contributing-page.mdx
 create mode 100644 docs/src/pages/docs/frequently-asked-questions-page.mdx
 create mode 100644 docs/src/pages/docs/installation/async_queries_celery.mdx
 create mode 100644 docs/src/pages/docs/installation/building-viz-plugins.mdx
 create mode 100644 docs/src/pages/docs/installation/caching.mdx
 create mode 100644 docs/src/pages/docs/installation/configuring.mdx
 create mode 100644 docs/src/pages/docs/installation/email_reports.mdx
 create mode 100644 docs/src/pages/docs/installation/event-logging-page.mdx
 create mode 100644 docs/src/pages/docs/installation/index.mdx
 create mode 100644 docs/src/pages/docs/installation/installing_scratch.mdx
 create mode 100644 docs/src/pages/docs/installation/networking_settings.mdx
 create mode 100644 docs/src/pages/docs/installation/sql_templating.mdx
 create mode 100644 docs/src/pages/docs/installation/upgrading_superset.mdx
 create mode 100644 docs/src/pages/docs/introduction.mdx
 create mode 100644 docs/src/pages/docs/roadmap-page.mdx
 create mode 100644 docs/src/pages/docs/security-page.mdx
 create mode 100644 docs/src/pages/gallery.tsx
 create mode 100644 docs/src/pages/index.tsx
 create mode 100644 docs/src/pages/resources.tsx
 create mode 100644 docs/src/resources/data.js
 create mode 100644 docs/src/utils.js
 copy {superset-frontend/images/usertutorial => docs/static/images}/add_new_chart.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/advanced_analytics_base.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/annotation.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/annotation_settings.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/average_aggregate_for_cost.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/blue_bar_insert_component.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/chose_a_datasource.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/csv_to_database_configuration.png (100%)
 create mode 100644 docs/static/images/dashboard.png
 create mode 100644 docs/static/images/dashboard2.png
 create mode 100644 docs/static/images/dashboard3.png
 create mode 100644 docs/static/images/data-point.jpg
 copy {superset-frontend/images/usertutorial => docs/static/images}/edit-record.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/edit_annotation.png (100%)
 create mode 100644 docs/static/images/explorer.png
 create mode 100644 docs/static/images/explorer2.png
 create mode 100644 docs/static/images/explorer3.png
 create mode 100644 docs/static/images/explorer4.png
 copy {superset-frontend/images/usertutorial => docs/static/images}/filter_on_origin_country.png (100%)
 create mode 100644 docs/static/images/google-analytics.png
 copy {superset-frontend/images/usertutorial => docs/static/images}/markdown.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/no_filter_on_time_filter.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/parse_dates_column.png (100%)
 create mode 100644 docs/static/images/pie-chart.png
 create mode 100644 docs/static/images/plugin-1-yeoman-select.png
 create mode 100644 docs/static/images/plugin-10-hello-thumbnail.png
 create mode 100644 docs/static/images/plugin-11-explore-view.png
 create mode 100644 docs/static/images/plugin-12-console-logs.png
 create mode 100644 docs/static/images/plugin-2-yeoman-package-name.png
 create mode 100644 docs/static/images/plugin-3-yeoman-description.png
 create mode 100644 docs/static/images/plugin-4-yeoman-component-type.png
 create mode 100644 docs/static/images/plugin-5-yeoman-timeseries.png
 create mode 100644 docs/static/images/plugin-6-yeoman-badges.png
 create mode 100644 docs/static/images/plugin-7-yeoman-files.png
 create mode 100644 docs/static/images/plugin-8-package-json.png
 create mode 100644 docs/static/images/plugin-9-mainpreset-import.png
 create mode 100644 docs/static/images/plugin-9-mainpreset-register.png
 copy {superset-frontend/images/usertutorial => docs/static/images}/publish_dashboard.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/resample.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/resize_tutorial_table_on_dashboard.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/rolling_mean.png (100%)
 create mode 100644 docs/static/images/root-cert-example.png
 copy {superset-frontend/images/usertutorial => docs/static/images}/save_tutorial_table.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/select_dates_pivot_table.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/select_table_visualization_type.png (100%)
 create mode 100644 docs/static/images/so-icon.svg
 create mode 100644 docs/static/images/sqllab.png
 create mode 100644 docs/static/images/sqllab0.png
 create mode 100644 docs/static/images/sqllab1.png
 create mode 100644 docs/static/images/sqllab3.png
 copy {superset-frontend/images/usertutorial => docs/static/images}/sum_cost_column.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/time_comparison_absolute_difference.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/time_comparison_two_series.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_01_sources_database.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_02_add_database.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_03_database_name.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_04_sqlalchemy_connection_string.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_05_connection_popup.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_06_list_of_tables.png (100%)
 copy superset-frontend/images/tutorial/tutorial_07_save_button.png => docs/static/images/tutorial_07_save_button (1).png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_07_save_button.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_08_sources_tables.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_09_add_new_table.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_10_table_name.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_11_choose_db.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_12_table_creation_success_msg.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_13_edit_table_config.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_14_field_config.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_15_click_table_name.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_16_datasource_chart_type.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_17_choose_time_range.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_18_choose_metric.png (100%)
 copy superset-frontend/images/tutorial/tutorial_19_click_query.png => docs/static/images/tutorial_19_click_query (1).png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_19_click_query.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_20_count_star_result.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_21_group_by.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_22_group_by_result.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_23_group_by_more_dimensions.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_24_max_metric.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_25_max_temp_filter.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_26_row_limit.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_27_top_10_max_temps.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_28_bar_chart.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_29_bar_chart_series_metrics.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_30_bar_chart_results.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_31_save_slice_to_dashboard.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_32_save_slice_confirmation.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_33_dashboard.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_34_weather_dashboard.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_35_slice_on_dashboard.png (100%)
 copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_36_adjust_dimensions.gif (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/tutorial_line_chart.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/tutorial_pivot_table.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/tutorial_table.png (100%)
 copy {superset-frontend/images/usertutorial => docs/static/images}/upload_a_csv.png (100%)
 create mode 100644 docs/static/images/youtube.png
 delete mode 100644 docs/tutorials.rst
 delete mode 100644 docs/usertutorial.rst
 delete mode 100644 docs/videos.rst
 delete mode 100644 docs/visualization.rst
 create mode 100644 package-lock.json
 delete mode 100644 requirements/documentation.in
 delete mode 100644 requirements/documentation.txt
 create mode 100644 superset-frontend/cypress-base/cypress/integration/chart_list/card_view.test.ts
 create mode 100644 superset-frontend/cypress-base/cypress/integration/chart_list/chart_list.helper.ts
 create mode 100644 superset-frontend/cypress-base/cypress/integration/chart_list/filter.test.ts
 create mode 100644 superset-frontend/cypress-base/cypress/integration/chart_list/list_view.test.ts
 delete mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/dashboard.helper.js
 create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/dashboard.helper.ts
 create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/markdown.test.ts
 create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard_list/card_view.test.ts
 create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard_list/dashboard_list.helper.ts
 create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard_list/filter.test.ts
 create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard_list/list_view.test.ts
 delete mode 100644 superset-frontend/cypress-base/cypress/integration/sqllab/query.test.js
 create mode 100644 superset-frontend/cypress-base/cypress/integration/sqllab/query.test.ts
 create mode 100644 superset-frontend/images/icons/alert.svg
 create mode 100644 superset-frontend/images/icons/alert_solid.svg
 create mode 100644 superset-frontend/images/icons/binoculars.svg
 create mode 100644 superset-frontend/images/icons/bolt.svg
 create mode 100644 superset-frontend/images/icons/bolt_small.svg
 create mode 100644 superset-frontend/images/icons/bolt_small_run.svg
 create mode 100644 superset-frontend/images/icons/calendar.svg
 create mode 100644 superset-frontend/images/icons/cancel.svg
 create mode 100644 superset-frontend/images/icons/cancel_solid.svg
 rename superset-frontend/images/icons/{card-view.svg => card_view.svg} (100%)
 create mode 100644 superset-frontend/images/icons/cards.svg
 create mode 100644 superset-frontend/images/icons/cards_locked.svg
 create mode 100644 superset-frontend/images/icons/caret_down.svg
 create mode 100644 superset-frontend/images/icons/caret_left.svg
 create mode 100644 superset-frontend/images/icons/caret_right.svg
 create mode 100644 superset-frontend/images/icons/caret_up.svg
 delete mode 100644 superset-frontend/images/icons/circle-check.svg
 create mode 100644 superset-frontend/images/icons/circle.svg
 create mode 100644 superset-frontend/images/icons/circle_check.svg
 rename superset-frontend/images/icons/{circle-check-solid.svg => circle_check_solid.svg} (100%)
 create mode 100644 superset-frontend/images/icons/clock.svg
 create mode 100644 superset-frontend/images/icons/code.svg
 create mode 100644 superset-frontend/images/icons/cog.svg
 create mode 100644 superset-frontend/images/icons/collapse.svg
 create mode 100644 superset-frontend/images/icons/color_palette.svg
 create mode 100644 superset-frontend/images/icons/components.svg
 create mode 100644 superset-frontend/images/icons/copy.svg
 create mode 100644 superset-frontend/images/icons/cursor_target.svg
 create mode 100644 superset-frontend/images/icons/database.svg
 create mode 100644 superset-frontend/images/icons/dataset_virtual_greyscale.svg
 create mode 100644 superset-frontend/images/icons/download.svg
 create mode 100644 superset-frontend/images/icons/edit.svg
 rename superset-frontend/images/icons/{pencil.svg => edit_alt.svg} (100%)
 create mode 100644 superset-frontend/images/icons/email.svg
 copy superset-frontend/images/icons/{error.svg => error_solid.svg} (100%)
 create mode 100644 superset-frontend/images/icons/error_solid_small.svg
 create mode 100644 superset-frontend/images/icons/expand.svg
 create mode 100644 superset-frontend/images/icons/eye.svg
 create mode 100644 superset-frontend/images/icons/eye_slash.svg
 create mode 100644 superset-frontend/images/icons/favorite_small_selected.svg
 create mode 100644 superset-frontend/images/icons/field_abc.svg
 create mode 100644 superset-frontend/images/icons/field_boolean.svg
 create mode 100644 superset-frontend/images/icons/field_date.svg
 create mode 100644 superset-frontend/images/icons/field_derived.svg
 create mode 100644 superset-frontend/images/icons/field_num.svg
 create mode 100644 superset-frontend/images/icons/field_struct.svg
 create mode 100644 superset-frontend/images/icons/file.svg
 create mode 100644 superset-frontend/images/icons/filter.svg
 create mode 100644 superset-frontend/images/icons/folder.svg
 create mode 100644 superset-frontend/images/icons/full.svg
 create mode 100644 superset-frontend/images/icons/gear.svg
 create mode 100644 superset-frontend/images/icons/grid.svg
 create mode 100644 superset-frontend/images/icons/image.svg
 create mode 100644 superset-frontend/images/icons/info-solid.svg
 create mode 100644 superset-frontend/images/icons/info.svg
 create mode 100644 superset-frontend/images/icons/info_solid_small.svg
 create mode 100644 superset-frontend/images/icons/join.svg
 create mode 100644 superset-frontend/images/icons/keyboard.svg
 create mode 100644 superset-frontend/images/icons/layers.svg
 create mode 100644 superset-frontend/images/icons/lightbulb.svg
 create mode 100644 superset-frontend/images/icons/list.svg
 rename superset-frontend/images/icons/{list-view.svg => list_view.svg} (100%)
 create mode 100644 superset-frontend/images/icons/location.svg
 create mode 100644 superset-frontend/images/icons/lock_locked.svg
 create mode 100644 superset-frontend/images/icons/lock_unlocked.svg
 create mode 100644 superset-frontend/images/icons/map.svg
 create mode 100644 superset-frontend/images/icons/message.svg
 create mode 100644 superset-frontend/images/icons/minus.svg
 create mode 100644 superset-frontend/images/icons/minus_solid.svg
 rename superset-frontend/images/icons/{more.svg => more_horiz.svg} (100%)
 create mode 100644 superset-frontend/images/icons/move.svg
 create mode 100644 superset-frontend/images/icons/nav_charts.svg
 create mode 100644 superset-frontend/images/icons/nav_dashboard.svg
 create mode 100644 superset-frontend/images/icons/nav_data.svg
 rename superset-frontend/images/icons/{compass.svg => nav_explore.svg} (100%)
 create mode 100644 superset-frontend/images/icons/nav_home.svg
 create mode 100644 superset-frontend/images/icons/nav_lab.svg
 create mode 100644 superset-frontend/images/icons/note.svg
 create mode 100644 superset-frontend/images/icons/paperclip.svg
 create mode 100644 superset-frontend/images/icons/placeholder.svg
 create mode 100644 superset-frontend/images/icons/plus.svg
 create mode 100644 superset-frontend/images/icons/plus_large.svg
 create mode 100644 superset-frontend/images/icons/plus_small.svg
 create mode 100644 superset-frontend/images/icons/plus_solid.svg
 create mode 100644 superset-frontend/images/icons/refresh.svg
 create mode 100644 superset-frontend/images/icons/server.svg
 rename superset-frontend/images/icons/{sort-asc.svg => sort_asc.svg} (100%)
 rename superset-frontend/images/icons/{sort-desc.svg => sort_desc.svg} (100%)
 create mode 100644 superset-frontend/images/icons/sql.svg
 create mode 100644 superset-frontend/images/icons/table.svg
 create mode 100644 superset-frontend/images/icons/tag.svg
 create mode 100644 superset-frontend/images/icons/triangle_change.svg
 create mode 100644 superset-frontend/images/icons/triangle_down.svg
 create mode 100644 superset-frontend/images/icons/triangle_up.svg
 create mode 100644 superset-frontend/images/icons/up-level.svg
 create mode 100644 superset-frontend/images/icons/user.svg
 copy superset-frontend/images/icons/{warning.svg => warning_solid.svg} (100%)
 create mode 100644 superset-frontend/images/icons/x-large.svg
 create mode 100644 superset-frontend/images/icons/x-small.svg
 create mode 100644 superset-frontend/images/screenshots/gallery.png
 create mode 100644 superset-frontend/prettier.config.js
 delete mode 100644 superset-frontend/spec/javascripts/components/Checkbox_spec.jsx
 create mode 100644 superset-frontend/spec/javascripts/components/SubMenu_spec.jsx
 create mode 100644 superset-frontend/spec/javascripts/components/fixtures/AlteredSliceTag.js
 create mode 100644 superset-frontend/spec/javascripts/explore/fixtures.jsx
 create mode 100644 superset-frontend/spec/javascripts/views/CRUD/data/database/DatabaseModal_spec.jsx
 create mode 100644 superset-frontend/spec/javascripts/views/CRUD/data/savedquery/SavedQueryList_spec.jsx
 create mode 100644 superset-frontend/src/common/components/Modal.tsx
 create mode 100644 superset-frontend/src/common/components/Tabs.tsx
 create mode 100644 superset-frontend/src/common/components/common.stories.tsx
 delete mode 100644 superset-frontend/src/components/ActionMenuItem.jsx
 create mode 100644 superset-frontend/src/components/AsyncAceEditor.tsx
 create mode 100644 superset-frontend/src/components/AsyncEsmComponent.tsx
 create mode 100644 superset-frontend/src/components/Button/Button.stories.jsx
 create mode 100644 superset-frontend/src/components/Button/Button.test.tsx
 delete mode 100644 superset-frontend/src/components/Button/button.stories.jsx
 delete mode 100644 superset-frontend/src/components/Checkbox.tsx
 create mode 100644 superset-frontend/src/components/Checkbox/Checkbox.stories.jsx
 create mode 100644 superset-frontend/src/components/Checkbox/Checkbox.test.tsx
 create mode 100644 superset-frontend/src/components/Checkbox/index.tsx
 create mode 100644 superset-frontend/src/components/DatabaseSelector.tsx
 create mode 100644 superset-frontend/src/components/ListView/ActionsBar.tsx
 delete mode 100644 superset-frontend/src/components/Menu/Menu.less
 create mode 100644 superset-frontend/src/components/NavDropdown/index.tsx
 create mode 100644 superset-frontend/src/components/Popover/index.tsx
 delete mode 100644 superset-frontend/src/components/TableSelector.jsx
 create mode 100644 superset-frontend/src/components/TableSelector.tsx
 create mode 100644 superset-frontend/src/types/brace.d.ts
 create mode 100644 superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx
 create mode 100644 superset-frontend/src/views/CRUD/data/database/types.ts
 delete mode 100644 superset-frontend/src/views/CRUD/data/dataset/Button.tsx
 create mode 100644 superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx
 copy {tests/util => superset/cachekeys}/__init__.py (100%)
 create mode 100644 superset/cachekeys/api.py
 create mode 100644 superset/cachekeys/schemas.py
 copy {tests/util => superset/css_templates}/__init__.py (100%)
 create mode 100644 superset/css_templates/api.py
 copy {tests/util => superset/css_templates/commands}/__init__.py (100%)
 create mode 100644 superset/css_templates/commands/bulk_delete.py
 create mode 100644 superset/css_templates/commands/exceptions.py
 create mode 100644 superset/css_templates/dao.py
 create mode 100644 superset/css_templates/filters.py
 create mode 100644 superset/css_templates/schemas.py
 copy {tests/util => superset/databases/commands}/__init__.py (100%)
 create mode 100644 superset/databases/commands/create.py
 create mode 100644 superset/databases/commands/delete.py
 create mode 100644 superset/databases/commands/exceptions.py
 create mode 100644 superset/databases/commands/test_connection.py
 create mode 100644 superset/databases/commands/update.py
 create mode 100644 superset/databases/dao.py
 rename superset/{views/database => databases}/filters.py (100%)
 create mode 100644 superset/databases/utils.py
 create mode 100644 superset/datasets/commands/bulk_delete.py
 create mode 100644 superset/migrations/versions/175ea3592453_cache_lookup.py
 create mode 100644 superset/migrations/versions/18532d70ab98_fix_table_unique_constraint_in_mysql.py
 create mode 100644 superset/migrations/versions/2e5a0ee25ed4_refractor_alerting.py
 create mode 100644 superset/migrations/versions/3fbbc6e8d654_fix_data_access_permissions_for_virtual_.py
 create mode 100644 superset/migrations/versions/ae19b4ee3692_.py
 create mode 100644 superset/migrations/versions/e5ef6828ac4e_add_rls_filter_type_and_grouping_key.py
 create mode 100755 superset/models/cache.py
 copy {tests/util => superset/queries/saved_queries}/__init__.py (100%)
 create mode 100644 superset/queries/saved_queries/api.py
 copy {tests/util => superset/queries/saved_queries/commands}/__init__.py (100%)
 create mode 100644 superset/queries/saved_queries/commands/bulk_delete.py
 create mode 100644 superset/queries/saved_queries/commands/exceptions.py
 create mode 100644 superset/queries/saved_queries/dao.py
 create mode 100644 superset/queries/saved_queries/filters.py
 create mode 100644 superset/queries/saved_queries/schemas.py
 copy superset/tasks/{ => alerts}/__init__.py (100%)
 create mode 100644 superset/tasks/alerts/observer.py
 create mode 100644 superset/tasks/alerts/validator.py
 create mode 100644 superset/templates/superset/models/rls/list.html
 create mode 100644 superset/utils/celery.py
 copy tests/{util => cachekeys}/__init__.py (100%)
 create mode 100644 tests/cachekeys/api_tests.py
 copy tests/{util => css_templates}/__init__.py (100%)
 create mode 100644 tests/css_templates/api_tests.py
 delete mode 100644 tests/database_api_tests.py
 copy tests/{util => databases}/__init__.py (100%)
 create mode 100644 tests/databases/api_tests.py
 copy tests/{util => queries/saved_queries}/__init__.py (100%)
 create mode 100644 tests/queries/saved_queries/api_tests.py


[incubator-superset] 04/08: chore(sqla): assert query is single read-only statement (#11236)

Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git

commit 76f6e85eb3e82bac7fc9e27c78ae37c0cec2ebb2
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Mon Oct 12 15:11:43 2020 +0300

    chore(sqla): assert query is single read-only statement (#11236)
---
 superset/connectors/sqla/models.py |  9 ++++++++
 tests/sqla_models_tests.py         | 42 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+)

diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py
index df07cca..934da17 100644
--- a/superset/connectors/sqla/models.py
+++ b/superset/connectors/sqla/models.py
@@ -64,6 +64,7 @@ from superset.jinja_context import (
 from superset.models.annotations import Annotation
 from superset.models.core import Database
 from superset.models.helpers import AuditMixinNullable, QueryResult
+from superset.sql_parse import ParsedQuery
 from superset.typing import Metric, QueryObjectDict
 from superset.utils import core as utils, import_datasource
 
@@ -755,6 +756,14 @@ class SqlaTable(  # pylint: disable=too-many-public-methods,too-many-instance-at
                     )
 
             from_sql = sqlparse.format(from_sql, strip_comments=True)
+            if len(sqlparse.split(from_sql)) > 1:
+                raise QueryObjectValidationError(
+                    _("Virtual dataset query cannot consist of multiple statements")
+                )
+            if not ParsedQuery(from_sql).is_readonly():
+                raise QueryObjectValidationError(
+                    _("Virtual dataset query must be read-only")
+                )
             return TextAsFrom(sa.text(from_sql), []).alias("expr_qry")
         return self.get_sqla_table()
 
diff --git a/tests/sqla_models_tests.py b/tests/sqla_models_tests.py
index 9e18845..de46e1c 100644
--- a/tests/sqla_models_tests.py
+++ b/tests/sqla_models_tests.py
@@ -187,3 +187,45 @@ class TestDatabaseModel(SupersetTestCase):
         if get_example_database().backend != "presto":
             with pytest.raises(QueryObjectValidationError):
                 table.get_sqla_query(**query_obj)
+
+    def test_multiple_sql_statements_raises_exception(self):
+        base_query_obj = {
+            "granularity": None,
+            "from_dttm": None,
+            "to_dttm": None,
+            "groupby": ["grp"],
+            "metrics": [],
+            "is_timeseries": False,
+            "filter": [],
+        }
+
+        table = SqlaTable(
+            table_name="test_has_extra_cache_keys_table",
+            sql="SELECT 'foo' as grp, 1 as num; SELECT 'bar' as grp, 2 as num",
+            database=get_example_database(),
+        )
+
+        query_obj = dict(**base_query_obj, extras={})
+        with pytest.raises(QueryObjectValidationError):
+            table.get_sqla_query(**query_obj)
+
+    def test_dml_statement_raises_exception(self):
+        base_query_obj = {
+            "granularity": None,
+            "from_dttm": None,
+            "to_dttm": None,
+            "groupby": ["grp"],
+            "metrics": [],
+            "is_timeseries": False,
+            "filter": [],
+        }
+
+        table = SqlaTable(
+            table_name="test_has_extra_cache_keys_table",
+            sql="DELETE FROM foo",
+            database=get_example_database(),
+        )
+
+        query_obj = dict(**base_query_obj, extras={})
+        with pytest.raises(QueryObjectValidationError):
+            table.get_sqla_query(**query_obj)


[incubator-superset] 05/08: feat(datasets): REST API bulk delete (#11237)

Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git

commit c2e8f98854d81ca2639cb66ee50114d18540c0a8
Author: Daniel Vaz Gaspar <da...@gmail.com>
AuthorDate: Mon Oct 12 13:40:05 2020 +0100

    feat(datasets): REST API bulk delete (#11237)
    
    * feat(datasets): REST API bulk delete
    
    * doc HTTP 400
---
 superset/datasets/api.py                  |  64 +++++++++++++++++
 superset/datasets/commands/bulk_delete.py |  88 +++++++++++++++++++++++
 superset/datasets/commands/exceptions.py  |   4 ++
 superset/datasets/dao.py                  |  26 +++++++
 superset/datasets/schemas.py              |   1 +
 tests/datasets/api_tests.py               | 112 +++++++++++++++++++++++++++++-
 6 files changed, 294 insertions(+), 1 deletion(-)

diff --git a/superset/datasets/api.py b/superset/datasets/api.py
index 40b8c5e..8c7f75e 100644
--- a/superset/datasets/api.py
+++ b/superset/datasets/api.py
@@ -21,14 +21,17 @@ import yaml
 from flask import g, request, Response
 from flask_appbuilder.api import expose, protect, rison, safe
 from flask_appbuilder.models.sqla.interface import SQLAInterface
+from flask_babel import ngettext
 from marshmallow import ValidationError
 
 from superset.connectors.sqla.models import SqlaTable
 from superset.constants import RouteMethod
 from superset.databases.filters import DatabaseFilter
+from superset.datasets.commands.bulk_delete import BulkDeleteDatasetCommand
 from superset.datasets.commands.create import CreateDatasetCommand
 from superset.datasets.commands.delete import DeleteDatasetCommand
 from superset.datasets.commands.exceptions import (
+    DatasetBulkDeleteFailedError,
     DatasetCreateFailedError,
     DatasetDeleteFailedError,
     DatasetForbiddenError,
@@ -44,6 +47,7 @@ from superset.datasets.schemas import (
     DatasetPostSchema,
     DatasetPutSchema,
     DatasetRelatedObjectsResponse,
+    get_delete_ids_schema,
     get_export_ids_schema,
 )
 from superset.views.base import DatasourceFilter, generate_download_headers
@@ -68,6 +72,7 @@ class DatasetRestApi(BaseSupersetModelRestApi):
         RouteMethod.EXPORT,
         RouteMethod.RELATED,
         RouteMethod.DISTINCT,
+        "bulk_delete",
         "refresh",
         "related_objects",
     }
@@ -489,3 +494,62 @@ class DatasetRestApi(BaseSupersetModelRestApi):
             charts={"count": len(charts), "result": charts},
             dashboards={"count": len(dashboards), "result": dashboards},
         )
+
+    @expose("/", methods=["DELETE"])
+    @protect()
+    @safe
+    @statsd_metrics
+    @rison(get_delete_ids_schema)
+    def bulk_delete(self, **kwargs: Any) -> Response:
+        """Delete bulk Datasets
+        ---
+        delete:
+          description: >-
+            Deletes multiple Datasets in a bulk operation.
+          parameters:
+          - in: query
+            name: q
+            content:
+              application/json:
+                schema:
+                  $ref: '#/components/schemas/get_delete_ids_schema'
+          responses:
+            200:
+              description: Dataset bulk delete
+              content:
+                application/json:
+                  schema:
+                    type: object
+                    properties:
+                      message:
+                        type: string
+            400:
+              $ref: '#/components/responses/400'
+            401:
+              $ref: '#/components/responses/401'
+            403:
+              $ref: '#/components/responses/403'
+            404:
+              $ref: '#/components/responses/404'
+            422:
+              $ref: '#/components/responses/422'
+            500:
+              $ref: '#/components/responses/500'
+        """
+        item_ids = kwargs["rison"]
+        try:
+            BulkDeleteDatasetCommand(g.user, item_ids).run()
+            return self.response(
+                200,
+                message=ngettext(
+                    "Deleted %(num)d dataset",
+                    "Deleted %(num)d datasets",
+                    num=len(item_ids),
+                ),
+            )
+        except DatasetNotFoundError:
+            return self.response_404()
+        except DatasetForbiddenError:
+            return self.response_403()
+        except DatasetBulkDeleteFailedError as ex:
+            return self.response_422(message=str(ex))
diff --git a/superset/datasets/commands/bulk_delete.py b/superset/datasets/commands/bulk_delete.py
new file mode 100644
index 0000000..49ad5e4
--- /dev/null
+++ b/superset/datasets/commands/bulk_delete.py
@@ -0,0 +1,88 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+import logging
+from typing import List, Optional
+
+from flask_appbuilder.security.sqla.models import User
+
+from superset.commands.base import BaseCommand
+from superset.commands.exceptions import DeleteFailedError
+from superset.connectors.sqla.models import SqlaTable
+from superset.datasets.commands.exceptions import (
+    DatasetBulkDeleteFailedError,
+    DatasetForbiddenError,
+    DatasetNotFoundError,
+)
+from superset.datasets.dao import DatasetDAO
+from superset.exceptions import SupersetSecurityException
+from superset.extensions import db, security_manager
+from superset.views.base import check_ownership
+
+logger = logging.getLogger(__name__)
+
+
+class BulkDeleteDatasetCommand(BaseCommand):
+    def __init__(self, user: User, model_ids: List[int]):
+        self._actor = user
+        self._model_ids = model_ids
+        self._models: Optional[List[SqlaTable]] = None
+
+    def run(self) -> None:
+        self.validate()
+        if not self._models:
+            return None
+        try:
+            DatasetDAO.bulk_delete(self._models)
+            for model in self._models:
+                view_menu = (
+                    security_manager.find_view_menu(model.get_perm()) if model else None
+                )
+
+                if view_menu:
+                    permission_views = (
+                        db.session.query(security_manager.permissionview_model)
+                        .filter_by(view_menu=view_menu)
+                        .all()
+                    )
+
+                    for permission_view in permission_views:
+                        db.session.delete(permission_view)
+                    if view_menu:
+                        db.session.delete(view_menu)
+                else:
+                    if not view_menu:
+                        logger.error(
+                            "Could not find the data access permission for the dataset"
+                        )
+            db.session.commit()
+
+            return None
+        except DeleteFailedError as ex:
+            logger.exception(ex.exception)
+            raise DatasetBulkDeleteFailedError()
+
+    def validate(self) -> None:
+        # Validate/populate model exists
+        self._models = DatasetDAO.find_by_ids(self._model_ids)
+        if not self._models or len(self._models) != len(self._model_ids):
+            raise DatasetNotFoundError()
+        # Check ownership
+        for model in self._models:
+            try:
+                check_ownership(model)
+            except SupersetSecurityException:
+                raise DatasetForbiddenError()
diff --git a/superset/datasets/commands/exceptions.py b/superset/datasets/commands/exceptions.py
index b651b6f..ee9d781 100644
--- a/superset/datasets/commands/exceptions.py
+++ b/superset/datasets/commands/exceptions.py
@@ -160,6 +160,10 @@ class DatasetDeleteFailedError(DeleteFailedError):
     message = _("Dataset could not be deleted.")
 
 
+class DatasetBulkDeleteFailedError(DeleteFailedError):
+    message = _("Dataset(s) could not be bulk deleted.")
+
+
 class DatasetRefreshFailedError(UpdateFailedError):
     message = _("Dataset could not be updated.")
 
diff --git a/superset/datasets/dao.py b/superset/datasets/dao.py
index b34b3ef..3b905f4 100644
--- a/superset/datasets/dao.py
+++ b/superset/datasets/dao.py
@@ -207,6 +207,32 @@ class DatasetDAO(BaseDAO):
         """
         return DatasetMetricDAO.create(properties, commit=commit)
 
+    @staticmethod
+    def bulk_delete(models: Optional[List[SqlaTable]], commit: bool = True) -> None:
+        item_ids = [model.id for model in models] if models else []
+        # bulk delete, first delete related data
+        if models:
+            for model in models:
+                model.owners = []
+                db.session.merge(model)
+            db.session.query(SqlMetric).filter(SqlMetric.table_id.in_(item_ids)).delete(
+                synchronize_session="fetch"
+            )
+            db.session.query(TableColumn).filter(
+                TableColumn.table_id.in_(item_ids)
+            ).delete(synchronize_session="fetch")
+        # bulk delete itself
+        try:
+            db.session.query(SqlaTable).filter(SqlaTable.id.in_(item_ids)).delete(
+                synchronize_session="fetch"
+            )
+            if commit:
+                db.session.commit()
+        except SQLAlchemyError as ex:
+            if commit:
+                db.session.rollback()
+            raise ex
+
 
 class DatasetColumnDAO(BaseDAO):
     model_cls = TableColumn
diff --git a/superset/datasets/schemas.py b/superset/datasets/schemas.py
index 46618d7..d4f6b2f 100644
--- a/superset/datasets/schemas.py
+++ b/superset/datasets/schemas.py
@@ -20,6 +20,7 @@ from flask_babel import lazy_gettext as _
 from marshmallow import fields, Schema, ValidationError
 from marshmallow.validate import Length
 
+get_delete_ids_schema = {"type": "array", "items": {"type": "integer"}}
 get_export_ids_schema = {"type": "array", "items": {"type": "integer"}}
 
 
diff --git a/tests/datasets/api_tests.py b/tests/datasets/api_tests.py
index d7d3471..f308c09 100644
--- a/tests/datasets/api_tests.py
+++ b/tests/datasets/api_tests.py
@@ -20,6 +20,7 @@ from typing import List
 from unittest.mock import patch
 
 import prison
+import pytest
 import yaml
 from sqlalchemy.sql import func
 
@@ -34,12 +35,14 @@ from superset.extensions import db, security_manager
 from superset.models.core import Database
 from superset.utils.core import backend, get_example_database, get_main_database
 from superset.utils.dict_import_export import export_to_dict
-from superset.views.base import generate_download_headers
 from tests.base_tests import SupersetTestCase
 from tests.conftest import CTAS_SCHEMA_NAME
 
 
 class TestDatasetApi(SupersetTestCase):
+
+    fixture_tables_names = ("ab_permission", "ab_permission_view", "ab_view_menu")
+
     @staticmethod
     def insert_dataset(
         table_name: str, schema: str, owners: List[int], database: Database
@@ -61,6 +64,30 @@ class TestDatasetApi(SupersetTestCase):
             "ab_permission", "", [self.get_user("admin").id], get_main_database()
         )
 
+    def get_fixture_datasets(self) -> List[SqlaTable]:
+        return (
+            db.session.query(SqlaTable)
+            .filter(SqlaTable.table_name.in_(self.fixture_tables_names))
+            .all()
+        )
+
+    @pytest.fixture()
+    def create_datasets(self):
+        with self.create_app().app_context():
+            datasets = []
+            admin = self.get_user("admin")
+            main_db = get_main_database()
+            for tables_name in self.fixture_tables_names:
+                datasets.append(
+                    self.insert_dataset(tables_name, "", [admin.id], main_db)
+                )
+            yield datasets
+
+            # rollback changes
+            for dataset in datasets:
+                db.session.delete(dataset)
+            db.session.commit()
+
     @staticmethod
     def get_energy_usage_dataset():
         example_db = get_example_database()
@@ -789,6 +816,89 @@ class TestDatasetApi(SupersetTestCase):
         db.session.delete(dataset)
         db.session.commit()
 
+    @pytest.mark.usefixtures("create_datasets")
+    def test_bulk_delete_dataset_items(self):
+        """
+        Dataset API: Test bulk delete dataset items
+        """
+        datasets = self.get_fixture_datasets()
+        dataset_ids = [dataset.id for dataset in datasets]
+
+        view_menu_names = []
+        for dataset in datasets:
+            view_menu_names.append(dataset.get_perm())
+
+        self.login(username="admin")
+        uri = f"api/v1/dataset/?q={prison.dumps(dataset_ids)}"
+        rv = self.delete_assert_metric(uri, "bulk_delete")
+        data = json.loads(rv.data.decode("utf-8"))
+        assert rv.status_code == 200
+        expected_response = {"message": f"Deleted {len(datasets)} datasets"}
+        assert data == expected_response
+        datasets = (
+            db.session.query(SqlaTable)
+            .filter(SqlaTable.table_name.in_(self.fixture_tables_names))
+            .all()
+        )
+        assert datasets == []
+        # Assert permissions get cleaned
+        for view_menu_name in view_menu_names:
+            assert security_manager.find_view_menu(view_menu_name) is None
+
+    @pytest.mark.usefixtures("create_datasets")
+    def test_bulk_delete_item_dataset_not_owned(self):
+        """
+        Dataset API: Test bulk delete item not owned
+        """
+        datasets = self.get_fixture_datasets()
+        dataset_ids = [dataset.id for dataset in datasets]
+
+        self.login(username="alpha")
+        uri = f"api/v1/dataset/?q={prison.dumps(dataset_ids)}"
+        rv = self.delete_assert_metric(uri, "bulk_delete")
+        assert rv.status_code == 403
+
+    @pytest.mark.usefixtures("create_datasets")
+    def test_bulk_delete_item_not_found(self):
+        """
+        Dataset API: Test bulk delete item not found
+        """
+        datasets = self.get_fixture_datasets()
+        dataset_ids = [dataset.id for dataset in datasets]
+        dataset_ids.append(db.session.query(func.max(SqlaTable.id)).scalar())
+
+        self.login(username="admin")
+        uri = f"api/v1/dataset/?q={prison.dumps(dataset_ids)}"
+        rv = self.delete_assert_metric(uri, "bulk_delete")
+        assert rv.status_code == 404
+
+    @pytest.mark.usefixtures("create_datasets")
+    def test_bulk_delete_dataset_item_not_authorized(self):
+        """
+        Dataset API: Test bulk delete item not authorized
+        """
+        datasets = self.get_fixture_datasets()
+        dataset_ids = [dataset.id for dataset in datasets]
+
+        self.login(username="gamma")
+        uri = f"api/v1/dataset/?q={prison.dumps(dataset_ids)}"
+        rv = self.client.delete(uri)
+        assert rv.status_code == 401
+
+    @pytest.mark.usefixtures("create_datasets")
+    def test_bulk_delete_dataset_item_incorrect(self):
+        """
+        Dataset API: Test bulk delete item incorrect request
+        """
+        datasets = self.get_fixture_datasets()
+        dataset_ids = [dataset.id for dataset in datasets]
+        dataset_ids.append("Wrong")
+
+        self.login(username="admin")
+        uri = f"api/v1/dataset/?q={prison.dumps(dataset_ids)}"
+        rv = self.client.delete(uri)
+        assert rv.status_code == 400
+
     def test_dataset_item_refresh(self):
         """
         Dataset API: Test item refresh


[incubator-superset] 06/08: fix(dataset): update user list endpoint (#11221)

Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git

commit f0cd671f4c4e6ddc7f0ba69ea77af00abd2d0322
Author: Lily Kuang <li...@preset.io>
AuthorDate: Mon Oct 12 09:11:00 2020 -0700

    fix(dataset): update user list endpoint (#11221)
---
 superset-frontend/src/datasource/DatasourceEditor.jsx | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/superset-frontend/src/datasource/DatasourceEditor.jsx b/superset-frontend/src/datasource/DatasourceEditor.jsx
index dd7cd72..88b68e0 100644
--- a/superset-frontend/src/datasource/DatasourceEditor.jsx
+++ b/superset-frontend/src/datasource/DatasourceEditor.jsx
@@ -527,12 +527,12 @@ class DatasourceEditor extends React.PureComponent {
           description={t('Owners of the datasource')}
           control={
             <SelectAsyncControl
-              dataEndpoint="/users/api/read"
+              dataEndpoint="api/v1/dataset/related/owners"
               multi
               mutator={data =>
-                data.pks.map((pk, i) => ({
-                  value: pk,
-                  label: `${data.result[i].first_name} ${data.result[i].last_name}`,
+                data.result.map(pk => ({
+                  value: pk.value,
+                  label: `${pk.text}`,
                 }))
               }
             />


[incubator-superset] 08/08: fix: Fix Time Column dropdown for date filter (#11149)

Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git

commit c917e7d102ec38ab225d67aea0c5e719298bef62
Author: Grace Guo <gr...@airbnb.com>
AuthorDate: Tue Oct 6 11:51:10 2020 -0700

    fix: Fix Time Column dropdown for date filter (#11149)
---
 superset-frontend/spec/javascripts/explore/fixtures.jsx | 3 ++-
 superset-frontend/src/explore/controls.jsx              | 3 +--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/superset-frontend/spec/javascripts/explore/fixtures.jsx b/superset-frontend/spec/javascripts/explore/fixtures.jsx
index a434085..420b73f 100644
--- a/superset-frontend/spec/javascripts/explore/fixtures.jsx
+++ b/superset-frontend/spec/javascripts/explore/fixtures.jsx
@@ -18,7 +18,8 @@
  */
 
 import React from 'react';
-import { ColumnOption, t } from '@superset-ui/core';
+import { t } from '@superset-ui/core';
+import { ColumnOption } from '@superset-ui/chart-controls';
 
 export const controlPanelSectionsChartOptions = [
   {
diff --git a/superset-frontend/src/explore/controls.jsx b/superset-frontend/src/explore/controls.jsx
index 145c326..0358161 100644
--- a/superset-frontend/src/explore/controls.jsx
+++ b/superset-frontend/src/explore/controls.jsx
@@ -63,9 +63,8 @@ import {
   getSequentialSchemeRegistry,
   legacyValidateInteger,
   validateNonEmpty,
-  ColumnOption,
 } from '@superset-ui/core';
-
+import { ColumnOption } from '@superset-ui/chart-controls';
 import { formatSelectOptions, mainMetric } from 'src/modules/utils';
 import { TIME_FILTER_LABELS } from './constants';
 


[incubator-superset] 01/08: fix(examples): missing expressions in birth_names (#11141)

Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git

commit 5db86822dff0196a834bf2b1e2292b24b5fcd824
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Fri Oct 2 23:47:38 2020 +0300

    fix(examples): missing expressions in birth_names (#11141)
    
    * fix(examples): missing expressions in birth_names
    
    * disable flaky tests
---
 .../cypress-base/cypress/integration/explore/AdhocMetrics.test.ts   | 6 +++---
 superset/examples/birth_names.py                                    | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/superset-frontend/cypress-base/cypress/integration/explore/AdhocMetrics.test.ts b/superset-frontend/cypress-base/cypress/integration/explore/AdhocMetrics.test.ts
index 5dfd741..b422673 100644
--- a/superset-frontend/cypress-base/cypress/integration/explore/AdhocMetrics.test.ts
+++ b/superset-frontend/cypress-base/cypress/integration/explore/AdhocMetrics.test.ts
@@ -56,7 +56,7 @@ describe('AdhocMetrics', () => {
     });
   });
 
-  it('Switch from simple to custom sql', () => {
+  xit('Switch from simple to custom sql', () => {
     cy.visitChartByName('Num Births Trend');
     cy.verifySliceSuccess({ waitAlias: '@postJson' });
 
@@ -87,7 +87,7 @@ describe('AdhocMetrics', () => {
     });
   });
 
-  it('Switch from custom sql tabs to simple', () => {
+  xit('Switch from custom sql tabs to simple', () => {
     cy.get('[data-test=metrics]').within(() => {
       cy.get('.Select__dropdown-indicator').click();
       cy.get('input[type=text]').type('sum_girls{enter}');
@@ -113,7 +113,7 @@ describe('AdhocMetrics', () => {
     });
   });
 
-  it('Typing starts with aggregate function name', () => {
+  xit('Typing starts with aggregate function name', () => {
     // select column "num"
     cy.get('[data-test=metrics]').within(() => {
       cy.get('.Select__dropdown-indicator').click();
diff --git a/superset/examples/birth_names.py b/superset/examples/birth_names.py
index 9120fe8..e5c9360 100644
--- a/superset/examples/birth_names.py
+++ b/superset/examples/birth_names.py
@@ -101,6 +101,7 @@ def load_birth_names(
     obj.main_dttm_col = "ds"
     obj.database = database
     obj.filter_select_enabled = True
+    obj.fetch_metadata()
 
     if not any(col.column_name == "num_california" for col in obj.columns):
         col_state = str(column("state").compile(db.engine))
@@ -117,7 +118,6 @@ def load_birth_names(
         obj.metrics.append(SqlMetric(metric_name="sum__num", expression=f"SUM({col})"))
 
     db.session.commit()
-    obj.fetch_metadata()
     tbl = obj
 
     metrics = [


[incubator-superset] 02/08: fix: disable jinja2 SQL templating

Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git

commit 922b8aa7c9f541fd93943af0f3ed7e8186134bf0
Author: Daniel Gaspar <da...@gmail.com>
AuthorDate: Thu Sep 17 16:13:47 2020 +0100

    fix: disable jinja2 SQL templating
    
    # Conflicts:
    #	superset/config.py
---
 superset/config.py            |  1 +
 superset/jinja_context.py     | 21 +++++++++++++++++----
 tests/superset_test_config.py |  7 ++++++-
 3 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/superset/config.py b/superset/config.py
index 71c1e99..52566af 100644
--- a/superset/config.py
+++ b/superset/config.py
@@ -298,6 +298,7 @@ DEFAULT_FEATURE_FLAGS: Dict[str, bool] = {
     "CLIENT_CACHE": False,
     "ENABLE_EXPLORE_JSON_CSRF_PROTECTION": False,
     "ENABLE_DASHBOARD_ETAG_HEADER": False,
+    "ENABLE_TEMPLATE_PROCESSING": False,
     "KV_STORE": False,
     "PRESTO_EXPAND_DATA": False,
     # Exposes API endpoint to compute thumbnails
diff --git a/superset/jinja_context.py b/superset/jinja_context.py
index bc35dbe..988aea8 100644
--- a/superset/jinja_context.py
+++ b/superset/jinja_context.py
@@ -23,7 +23,7 @@ from flask import g, request
 from jinja2.sandbox import SandboxedEnvironment
 
 from superset import jinja_base_context
-from superset.extensions import jinja_context_manager
+from superset.extensions import feature_flag_manager, jinja_context_manager
 from superset.utils.core import convert_legacy_filters_into_adhoc, merge_extra_filters
 
 if TYPE_CHECKING:
@@ -247,6 +247,16 @@ class BaseTemplateProcessor:  # pylint: disable=too-few-public-methods
         return template.render(kwargs)
 
 
+class NoOpTemplateProcessor(
+    BaseTemplateProcessor
+):  # pylint: disable=too-few-public-methods
+    def process_template(self, sql: str, **kwargs: Any) -> str:
+        """
+        Makes processing a template a noop
+        """
+        return sql
+
+
 class PrestoTemplateProcessor(BaseTemplateProcessor):
     """Presto Jinja context
 
@@ -324,7 +334,10 @@ def get_template_processor(
     query: Optional["Query"] = None,
     **kwargs: Any,
 ) -> BaseTemplateProcessor:
-    template_processor = template_processors.get(
-        database.backend, BaseTemplateProcessor
-    )
+    if feature_flag_manager.is_feature_enabled("ENABLE_TEMPLATE_PROCESSING"):
+        template_processor = template_processors.get(
+            database.backend, BaseTemplateProcessor
+        )
+    else:
+        template_processor = NoOpTemplateProcessor
     return template_processor(database=database, table=table, query=query, **kwargs)
diff --git a/tests/superset_test_config.py b/tests/superset_test_config.py
index 513d3d9..8d03115 100644
--- a/tests/superset_test_config.py
+++ b/tests/superset_test_config.py
@@ -49,7 +49,12 @@ HIVE_POLL_INTERVAL = 0.1
 
 SQL_MAX_ROW = 666
 SQLLAB_CTAS_NO_LIMIT = True  # SQL_MAX_ROW will not take affect for the CTA queries
-FEATURE_FLAGS = {"foo": "bar", "KV_STORE": True, "SHARE_QUERIES_VIA_KV_STORE": True}
+FEATURE_FLAGS = {
+    "foo": "bar",
+    "KV_STORE": True,
+    "SHARE_QUERIES_VIA_KV_STORE": True,
+    "ENABLE_TEMPLATE_PROCESSING": True,
+}
 
 
 def GET_FEATURE_FLAGS_FUNC(ff):


[incubator-superset] 03/08: chore(sql-lab): catch PyArrow deserialization error (#11201)

Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git

commit 9aba60714917fcbf714f9c71f26ce9e3ffad881d
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Mon Oct 12 10:16:00 2020 +0300

    chore(sql-lab): catch PyArrow deserialization error (#11201)
---
 superset/exceptions.py  |  4 ++++
 superset/views/core.py  | 17 +++++++++++++----
 superset/views/utils.py | 11 +++++++++--
 3 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/superset/exceptions.py b/superset/exceptions.py
index 3dca1de..c0d55f8 100644
--- a/superset/exceptions.py
+++ b/superset/exceptions.py
@@ -93,3 +93,7 @@ class QueryObjectValidationError(SupersetException):
 
 class DashboardImportException(SupersetException):
     pass
+
+
+class SerializationError(SupersetException):
+    pass
diff --git a/superset/views/core.py b/superset/views/core.py
index 36668cf..7296017 100755
--- a/superset/views/core.py
+++ b/superset/views/core.py
@@ -82,6 +82,7 @@ from superset.databases.filters import DatabaseFilter
 from superset.exceptions import (
     CertificateException,
     DatabaseNotFound,
+    SerializationError,
     SupersetException,
     SupersetSecurityException,
     SupersetTimeoutException,
@@ -1959,7 +1960,9 @@ class Superset(BaseSupersetView):  # pylint: disable=too-many-public-methods
         return self.results_exec(key)
 
     @staticmethod
-    def results_exec(key: str) -> FlaskResponse:
+    def results_exec(  # pylint: disable=too-many-return-statements
+        key: str,
+    ) -> FlaskResponse:
         """Serves a key off of the results backend
 
         It is possible to pass the `rows` query argument to limit the number
@@ -1993,9 +1996,15 @@ class Superset(BaseSupersetView):  # pylint: disable=too-many-public-methods
             return json_errors_response([ex.error], status=403)
 
         payload = utils.zlib_decompress(blob, decode=not results_backend_use_msgpack)
-        obj = _deserialize_results_payload(
-            payload, query, cast(bool, results_backend_use_msgpack)
-        )
+        try:
+            obj = _deserialize_results_payload(
+                payload, query, cast(bool, results_backend_use_msgpack)
+            )
+        except SerializationError:
+            return json_error_response(
+                __("Data could not be deserialized. You may want to re-run the query."),
+                status=404,
+            )
 
         if "rows" in request.args:
             try:
diff --git a/superset/views/utils.py b/superset/views/utils.py
index dc16494..226d9ef 100644
--- a/superset/views/utils.py
+++ b/superset/views/utils.py
@@ -39,7 +39,11 @@ from superset import (
 )
 from superset.connectors.connector_registry import ConnectorRegistry
 from superset.errors import ErrorLevel, SupersetError, SupersetErrorType
-from superset.exceptions import SupersetException, SupersetSecurityException
+from superset.exceptions import (
+    SerializationError,
+    SupersetException,
+    SupersetSecurityException,
+)
 from superset.legacy import update_time_range
 from superset.models.core import Database
 from superset.models.dashboard import Dashboard
@@ -559,7 +563,10 @@ def _deserialize_results_payload(
             ds_payload = msgpack.loads(payload, raw=False)
 
         with stats_timing("sqllab.query.results_backend_pa_deserialize", stats_logger):
-            pa_table = pa.deserialize(ds_payload["data"])
+            try:
+                pa_table = pa.deserialize(ds_payload["data"])
+            except pa.ArrowSerializationError:
+                raise SerializationError("Unable to deserialize table")
 
         df = result_set.SupersetResultSet.convert_table_to_df(pa_table)
         ds_payload["data"] = dataframe.df_to_records(df) or []


[incubator-superset] 07/08: fix(crud): set default extra value (#11262)

Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git

commit 44b7e8e6e8335f42c6c11e74f6b28e9603488f71
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Wed Oct 14 19:05:20 2020 +0300

    fix(crud): set default extra value (#11262)
---
 superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx
index f0e2c6c..0c7ecfd 100644
--- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx
+++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx
@@ -126,6 +126,9 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({
   const [isHidden, setIsHidden] = useState<boolean>(true);
 
   const isEditMode = database !== null;
+  const defaultExtra =
+    '{\n  "metadata_params": {},\n  "engine_params": {},' +
+    '\n  "metadata_cache_timeout": {},\n  "schemas_allowed_for_csv_upload": [] \n}';
 
   // Database fetch logic
   const {
@@ -589,11 +592,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({
             <div className="input-container">
               <textarea
                 name="extra"
-                value={db ? db.extra || '' : ''}
-                placeholder={
-                  '{\n  "metadata_params": {},\n  "engine_params": {},' +
-                  '\n  "metadata_cache_timeout": {},\n  "schemas_allowed_for_csv_upload": [] \n}'
-                }
+                value={(db && db.extra) ?? defaultExtra}
                 onChange={onTextChange}
               />
             </div>