diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4e5a860fd3e42..6518b4378d0c7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -672,6 +672,28 @@ CYPRESS_BASE_URL= npm run cypress open See [`superset-frontend/cypress_build.sh`](https://github.com/apache/incubator-superset/blob/master/superset-frontend/cypress_build.sh). +As an alternative you can use docker-compose environment for testing: + +Make sure you have added below line to your /etc/hosts file: +```127.0.0.1 db``` + +If you already have launched Docker environment please use the following command to assure a fresh database instance: +```docker-compose down -v``` + +Launch environment: + +```CYPRESS_CONFIG=true docker-compose up``` + +It will serve backend and frontend on port 8088. + +Run Cypress tests: + +```bash +cd cypress-base +npm install +npm run cypress open +``` + ### Storybook Superset includes a [Storybook](https://storybook.js.org/) to preview the layout/styling of various Superset components, and variations thereof. To open and view the Storybook: diff --git a/README.md b/README.md index 6edc34edfa566..5ee06e15f4cf0 100644 --- a/README.md +++ b/README.md @@ -78,11 +78,11 @@ A modern, enterprise-ready business intelligence web application. Superset provides: * An intuitive interface to explore and visualize datasets, and - create interactive dashboards. + create interactive dashboards * A wide array of beautiful visualizations to showcase your data. * Easy, code-free, user flows to drill down and slice and dice the data underlying exposed dashboards. The dashboards and charts act as a starting - point for deeper analysis. + point for deeper analysis * A state of the art SQL editor/IDE exposing a rich metadata browser, and an easy workflow to create visualizations out of any result set. * An extensible, high granularity security model allowing intricate rules @@ -133,7 +133,6 @@ A complete list of supported databases can be found [See in the documentation](https://superset.incubator.apache.org/docs/installation/installing-superset-using-docker-compose) - ## Get Involved * Ask and answer questions on [StackOverflow](https://stackoverflow.com/questions/tagged/apache-superset) @@ -152,14 +151,16 @@ how to set up a development environment. ## Resources -* Superset 101 -- Getting Started Guide (From [Preset](https://preset.io) [Blog](https://preset.io/blog/)) +* Superset 101 -- Getting Started Guide (From [Preset Blog](https://preset.io/blog/)) * [Installing Apache Superset Locally](https://preset.io/blog/2020-05-11-getting-started-installing-superset/) * [Installing Database Drivers](https://preset.io/blog/2020-05-18-install-db-drivers/) * [Connect Superset To Google Sheets](https://preset.io/blog/2020-06-01-connect-superset-google-sheets/) * [Create Your First Chart](https://preset.io/blog/2020-06-08-first-chart/) * [Create Time Series Charts](https://preset.io/blog/2020-06-26-timeseries-chart/) -* [Docker image](https://hub.docker.com/r/preset/superset/) +* [Docker image](https://hub.docker.com/r/apache/incubator-superset) * [Youtube Channel](https://www.youtube.com/channel/UCMuwrvBsg_jjI2gLcm04R0g) * [May 2020: Virtual Meetup Recording. Topics: 0.36 Overview, Committers Self-Intro, Roadmap](https://www.youtube.com/watch?v=tXGDmqjmcTs&t=20s) * [July 2020: Virtual Meetup Recording. Topics: Visualization Plugins, 0.37 Preview, Demo](https://www.youtube.com/watch?v=f6up5x_iRbI) -* [So, You Want to Build a Superset Viz Plugin...](https://preset.io/blog/2020-07-02-hello-world/) + * [November 2020: Superset 1.0](https://www.youtube.com/watch?v=GwtWRUSEjk4) +* [Building Custom Viz Plugins](https://superset.apache.org/docs/installation/building-custom-viz-plugins) +* [Superset API](https://superset.apache.org/docs/rest-api) diff --git a/docker-compose.yml b/docker-compose.yml index c58f12f308a55..0fa2d252dcc03 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -24,6 +24,7 @@ x-superset-volumes: &superset-volumes - ./superset:/app/superset - ./superset-frontend:/app/superset-frontend - superset_home:/app/superset_home + - ./tests:/app/tests version: "3.7" services: @@ -57,6 +58,8 @@ services: user: "root" depends_on: *superset-depends-on volumes: *superset-volumes + environment: + CYPRESS_CONFIG: "${CYPRESS_CONFIG}" superset-init: image: *superset-image @@ -66,6 +69,8 @@ services: depends_on: *superset-depends-on user: "root" volumes: *superset-volumes + environment: + CYPRESS_CONFIG: "${CYPRESS_CONFIG}" superset-node: image: node:12 diff --git a/docker/.env b/docker/.env index 4857d44b38943..9594adb8a8150 100644 --- a/docker/.env +++ b/docker/.env @@ -42,3 +42,4 @@ REDIS_PORT=6379 FLASK_ENV=development SUPERSET_ENV=development SUPERSET_LOAD_EXAMPLES=yes +CYPRESS_CONFIG=false diff --git a/docker/docker-bootstrap.sh b/docker/docker-bootstrap.sh index c60a6d21f75a9..f44cf3aa0f303 100755 --- a/docker/docker-bootstrap.sh +++ b/docker/docker-bootstrap.sh @@ -19,7 +19,13 @@ set -eo pipefail REQUIREMENTS_LOCAL="/app/docker/requirements-local.txt" - +# If Cypress run – overwrite the password for admin and export env variables +if [ "$CYPRESS_CONFIG" == "true" ]; then + export SUPERSET_CONFIG=tests.superset_test_config + export SUPERSET_TESTENV=true + export ENABLE_REACT_CRUD_VIEWS=true + export SUPERSET__SQLALCHEMY_DATABASE_URI=postgresql+psycopg2://superset:superset@db:5432/superset +fi # # Make sure we have dev requirements installed # diff --git a/docker/docker-init.sh b/docker/docker-init.sh index 124e747f5f9ee..d5ead5039857e 100755 --- a/docker/docker-init.sh +++ b/docker/docker-init.sh @@ -37,22 +37,29 @@ Init Step ${1}/${STEP_CNT} [${2}] -- ${3} EOF } - +ADMIN_PASSWORD="admin" +# If Cypress run – overwrite the password for admin and export env variables +if [ "$CYPRESS_CONFIG" == "true" ]; then + ADMIN_PASSWORD="general" + export SUPERSET_CONFIG=tests.superset_test_config + export SUPERSET_TESTENV=true + export ENABLE_REACT_CRUD_VIEWS=true + export SUPERSET__SQLALCHEMY_DATABASE_URI=postgresql+psycopg2://superset:superset@db:5432/superset +fi # Initialize the database echo_step "1" "Starting" "Applying DB migrations" superset db upgrade echo_step "1" "Complete" "Applying DB migrations" # Create an admin user -echo_step "2" "Starting" "Setting up admin user ( admin / admin )" +echo_step "2" "Starting" "Setting up admin user ( admin / $ADMIN_PASSWORD )" superset fab create-admin \ --username admin \ --firstname Superset \ --lastname Admin \ --email admin@superset.com \ - --password admin + --password $ADMIN_PASSWORD echo_step "2" "Complete" "Setting up admin user" - # Create default roles and permissions echo_step "3" "Starting" "Setting up roles and perms" superset init @@ -61,6 +68,12 @@ echo_step "3" "Complete" "Setting up roles and perms" if [ "$SUPERSET_LOAD_EXAMPLES" = "yes" ]; then # Load some data to play with echo_step "4" "Starting" "Loading examples" - superset load_examples + # If Cypress run which consumes superset_test_config – load required data for tests + if [ "$CYPRESS_CONFIG" == "true" ]; then + superset load_test_users + superset load_examples --load-test-data + else + superset load_examples + fi echo_step "4" "Complete" "Loading examples" fi diff --git a/docs/README.txt b/docs/README.md similarity index 100% rename from docs/README.txt rename to docs/README.md diff --git a/docs/gatsby-node.js b/docs/gatsby-node.js index 5858cb1a8befb..081885d3c682f 100644 --- a/docs/gatsby-node.js +++ b/docs/gatsby-node.js @@ -634,4 +634,34 @@ exports.createPages = ({ actions }) => { toPath: '/docs/creating-charts-dashboards/first-dashboard', isPermanent: true, }); + createRedirect({ + fromPath: '/issue_code_reference.html#issue-1000', + toPath: '/docs/miscellaneous/issue-codes#issue-1000', + isPermanent: true, + }); + createRedirect({ + fromPath: '/issue_code_reference.html#issue-1001', + toPath: '/docs/miscellaneous/issue-codes#issue-1001', + isPermanent: true, + }); + createRedirect({ + fromPath: '/issue_code_reference.html#issue-1002', + toPath: '/docs/miscellaneous/issue-codes#issue-1002', + isPermanent: true, + }); + createRedirect({ + fromPath: '/issue_code_reference.html#issue-1003', + toPath: '/docs/miscellaneous/issue-codes#issue-1003', + isPermanent: true, + }); + createRedirect({ + fromPath: '/issue_code_reference.html#issue-1004', + toPath: '/docs/miscellaneous/issue-codes#issue-1004', + isPermanent: true, + }); + createRedirect({ + fromPath: '/issue_code_reference.html#issue-1005', + toPath: '/docs/miscellaneous/issue-codes#issue-1005', + isPermanent: true, + }); }; diff --git a/docs/src/pages/docs/Miscellaneous/issue_codes.mdx b/docs/src/pages/docs/Miscellaneous/issue_codes.mdx index b34209786b777..abf4886ce169d 100644 --- a/docs/src/pages/docs/Miscellaneous/issue_codes.mdx +++ b/docs/src/pages/docs/Miscellaneous/issue_codes.mdx @@ -73,3 +73,14 @@ The table was deleted or renamed in the database. Your query failed because it is referencing a table that no longer exists in the underlying database. You should modify your query to reference the correct table. + +## Issue 1006 + +``` +One or more parameters specified in the query are missing. +``` + +Your query was not submitted to the database because it's missing one or more +parameters. You should define all the parameters referenced in the query in a +valid JSON document. Check that the parameters are spelled correctly and that +the document has a valid syntax. diff --git a/docs/src/pages/docs/frequently-asked-questions-page.mdx b/docs/src/pages/docs/frequently-asked-questions-page.mdx index 4ed6a2eab86ab..49ae50a34fe71 100644 --- a/docs/src/pages/docs/frequently-asked-questions-page.mdx +++ b/docs/src/pages/docs/frequently-asked-questions-page.mdx @@ -287,3 +287,11 @@ guarantees and are not recommended but may fit your use case temporarily: - using the ORM (SQLAlchemy) directly - using the internal FAB ModelView API (to be deprecated in Superset) - altering the source code in your fork + + +### What Does Hours Offset in the Edit Dataset view do? + + +In the Edit Dataset view, you can specify a time offset. This field lets you configure the +number of hours to be added or subtracted from the time column. +This can be used, for example, to convert UTC time to local time. diff --git a/docs/src/pages/docs/installation/building-viz-plugins.mdx b/docs/src/pages/docs/installation/building-viz-plugins.mdx index 1412ba83ad4da..51ecdc3bf8925 100644 --- a/docs/src/pages/docs/installation/building-viz-plugins.mdx +++ b/docs/src/pages/docs/installation/building-viz-plugins.mdx @@ -207,3 +207,11 @@ to your plugin. These do a quick sanity check that the plugin actually loads cor through the basics of making sure that your controls are properly respected by modifying the resulting data and/or props of the plugin. Running `yarn test` from the root directory of `superset-ui` will run all the tests for plugins/packages, including your Hello World. + +### Deploying Custom Visualization to Production + +To deploy plugins to a production environment, you must have additional code +inside Superset that includes the npm packages of your plugins so they can be installed in the frontend. + + +One option is to build your Dockerfile so it contains your custom visualization packages. diff --git a/docs/src/pages/docs/roadmap-page.mdx b/docs/src/pages/docs/roadmap-page.mdx index db220f209fc43..b9ac530bef168 100644 --- a/docs/src/pages/docs/roadmap-page.mdx +++ b/docs/src/pages/docs/roadmap-page.mdx @@ -5,14 +5,14 @@ route: /docs/roadmap --- ## Roadmap + +You can find the approximate public roadmap for Superset [here](https://github.com/apache-superset/superset-roadmap/projects/1). + -We try our best to keep the -[Superset Roadmap](https://github.com/apache-superset/superset-roadmap/projects/1) updated. - Keep in mind that the roadmap represents only a subset of what's ahead. Many contributions come directly without ever making it onto the roadmap. Find out more about how the roadmap is managed in -[SIP (Superset Improvement Proposal) 53 - Proposal to create a Superset public roadmap ](https://github.com/apache/incubator-superset/issues/10894) +[SIP (Superset Improvement Proposal) 53](https://github.com/apache/incubator-superset/issues/10894) diff --git a/docs/src/pages/docs/security-page.mdx b/docs/src/pages/docs/security-page.mdx index f450202bc57fa..be3880a2f244b 100644 --- a/docs/src/pages/docs/security-page.mdx +++ b/docs/src/pages/docs/security-page.mdx @@ -4,12 +4,141 @@ title: Security route: /docs/security --- -## Security +### Roles + +Security in Superset is handled by Flask AppBuilder (FAB), an application development framework +built on top of Flask.”. FAB provides authentication, user management, permissions and roles. +Please read its [Security documentation](https://flask-appbuilder.readthedocs.io/en/latest/security.html). + +### Provided Roles + +Superset ships with a set of roles that are handled by Superset itself. You can assume +that these roles will stay up-to-date as Superset evolves (and as you update Superset versions). + +Even though **Admin** users have the ability, we don't recommend that altering the +permissions associated with each role (e.g. by removing or adding permissions to them). The permissions +associated with each role will be re-synchronized to their original values when you run +the **superset init** command (often done between Superset versions). + +### Admin + +Admins have all possible rights, including granting or revoking rights from other +users and altering other people’s slices and dashboards. + +### Alpha + +Alpha users have access to all data sources, but they cannot grant or revoke access +from other users. They are also limited to altering the objects that they own. Alpha users can add and alter data sources. + +### Gamma + +Gamma users have limited access. They can only consume data coming from data sources +they have been given access to through another complementary role. They only have access to +view the slices and dashboards made from data sources that they have access to. Currently Gamma +users are not able to alter or add data sources. We assume that they are mostly content consumers, though they can create slices and dashboards. + +Also note that when Gamma users look at the dashboards and slices list view, they will +only see the objects that they have access to. + +### sql_lab + +The **sql_lab** role grants access to SQL Lab. Note that while **Admin** users have access +to all databases by default, both **Alpha** and **Gamma** users need to be given access on a per database basis. + +### Public + +To allow logged-out users to access some Superset features, you can use the `PUBLIC_ROLE_LIKE` config setting and assign it to another role whose permissions you want passed to this role. + +For example, by setting `PUBLIC_ROLE_LIKE = Gamma` in your `superset_config.py` file, you grant +public role the same set of permissions as for the **Gamma** role. This is useful if one +wants to enable anonymous users to view dashboards. Explicit grant on specific datasets is +still required, meaning that you need to edit the **Public** role and add the public data sources to the role manually. + +### Managing Data Source Access for Gamma Roles + +Here’s how to provide users access to only specific datasets. First make sure the users with +limited access have [only] the Gamma role assigned to them. Second, create a new role (Menu -> Security -> List Roles) and click the + sign. + +This new window allows you to give this new role a name, attribute it to users and select the +tables in the **Permissions** dropdown. To select the data sources you want to associate with this role, simply click on the dropdown and use the typeahead to search for your table names. + +You can then confirm with users assigned to the **Gamma** role that they see the +objects (dashboards and slices) associated with the tables you just extended them. + +### Customizing Permissions + +The permissions exposed by FAB are very granular and allow for a great level of +customization. FAB creates many permissions automagically for each model that is +created (can_add, can_delete, can_show, can_edit, …) as well as for each view. +On top of that, Superset can expose more granular permissions like **all_datasource_access**. + +**We do not recommend altering the 3 base roles as there are a set of assumptions that +Superset is built upon**. It is possible though for you to create your own roles, and union them to existing ones. + +### Permissions + +Roles are composed of a set of permissions, and Superset has many categories of +permissions. Here are the different categories of permissions: + +- Model & Action: models are entities like Dashboard, Slice, or User. Each model has +a fixed set of permissions, like **can_edit**, **can_show**, **can_delete**, **can_list**, **can_add**, +and so on. For example, you can allow a user to delete dashboards by adding **can_delete** on +Dashboard entity to a role and granting this user that role. +- Views: views are individual web pages, like the Explore view or the SQL Lab view. +When granted to a user, they will see that view in its menu items, and be able to load that page. +- Data source: For each data source, a permission is created. If the user does not have the +`all_datasource_access permission` granted, the user will only be able to see Slices or explore the data sources that are granted to them +- Database: Granting access to a database allows for the user to access all +data sources within that database, and will enable the user to query that +database in SQL Lab, provided that the SQL Lab specific permission have been granted to the user + +### Restricting Access to a Subset of Data Sources + +We recommend giving a user the **Gamma** role plus any other roles that would add +access to specific data sources. We recommend that you create individual roles for +each access profile. For example, the users on the Finance team might have access to a set of +databases and data sources; these permissions can be consolidated in a single role. +Users with this profile then need to be assigned the **Gamma** role as a foundation to +the models and views they can access, and that Finance role that is a collection of permissions to data objects. + +A user can have multiple roles associated with them. For example, an executive on the Finance +team could be granted **Gamma**, **Finance**, and the **Executive** roles. The **Executive** +role could provide access to a set of data sources and dashboards made available only to executives. +In the **Dashboards** view, a user can only see the ones they have access too +based on the roles and permissions that were attributed. + +### Row Level Security + +Using Row Level Security filters (under the **Security** menu) you can create filters +that are assigned to a particular table, as well as a set of roles. +If you want members of the Finance team to only have access to +rows where `department = "finance"`, you could: + +- Create a Row Level Security filter with that clause (`department = "finance"`) +- Then assign the clause to the **Finance** role and the table it applies to + +The **clause** field, which can contain arbitrary text, is then added to the generated +SQL statement’s WHERE clause. So you could even do something like create a filter +for the last 30 days and apply it to a specific role, with a clause +like `date_field > DATE_SUB(NOW(), INTERVAL 30 DAY)`. It can also support +multiple conditions: `client_id = 6` AND `advertiser="foo"`, etc. + +All relevant Row level security filters will be combined together (under the hood, +the different SQL clauses are combined using AND statements). This means it's +possible to create a situation where two roles conflict in such a way as to limit a table subset to empty. + +For example, the filters `client_id=4` and `client_id=5`, applied to a role, + will result in users of that role having `client_id=4` AND `client_id=5` + added to their query, which can never be true. + + +### Reporting Security Vulnerabilities Apache Software Foundation takes a rigorous standpoint in annihilating the security issues in its software projects. Apache Superset is highly sensitive and forthcoming to issues pertaining to its features and functionality. + If you have apprehensions regarding Superset security or you discover vulnerability or potential threat, don’t hesitate to get in touch with the Apache Security Team by dropping a mail at security@apache.org. In the mail, specify the project name Superset with the description of the @@ -17,6 +146,7 @@ issue or potential threat. You are also urged to recommend the way to reproduce issue. The security team and the Superset community will get back to you after assessing and analysing the findings. + PLEASE PAY ATTENTION to report the security issue on the security email before disclosing it on public domain. The ASF Security Team maintains a page with the description of how vulnerabilities and potential threats are handled, check their web page for more details. diff --git a/docs/src/pages/index.tsx b/docs/src/pages/index.tsx index 0018bcdf3c1f2..69864ebb02971 100644 --- a/docs/src/pages/index.tsx +++ b/docs/src/pages/index.tsx @@ -468,7 +468,7 @@ const Theme = () => { )} - ... and any other + ... and many other {' '} compatible databases diff --git a/requirements/base.txt b/requirements/base.txt index 8f0234d1f271a..0aa3250aa078a 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -24,6 +24,7 @@ chardet==3.0.4 # via aiohttp click==7.1.2 # via apache-superset, flask, flask-appbuilder colorama==0.4.4 # via apache-superset, flask-appbuilder contextlib2==0.6.0.post1 # via apache-superset +cron-descriptor==1.2.24 # via apache-superset croniter==0.3.36 # via apache-superset cryptography==3.2.1 # via apache-superset decorator==4.4.2 # via retry diff --git a/setup.cfg b/setup.cfg index 38856a350421e..2f057d4b3af9d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -30,7 +30,7 @@ combine_as_imports = true include_trailing_comma = true line_length = 88 known_first_party = superset -known_third_party =alembic,apispec,backoff,bleach,cachelib,celery,click,colorama,contextlib2,croniter,cryptography,dateutil,flask,flask_appbuilder,flask_babel,flask_caching,flask_compress,flask_login,flask_migrate,flask_sqlalchemy,flask_talisman,flask_testing,flask_wtf,freezegun,geohash,geopy,humanize,isodate,jinja2,jwt,markdown,markupsafe,marshmallow,msgpack,numpy,pandas,parameterized,parsedatetime,pathlib2,pgsanity,polyline,prison,pyarrow,pyhive,pytest,pytz,redis,retry,selenium,setuptools,simplejson,slack,sqlalchemy,sqlalchemy_utils,sqlparse,werkzeug,wtforms,wtforms_json,yaml +known_third_party =alembic,apispec,backoff,bleach,cachelib,celery,click,colorama,contextlib2,cron_descriptor,croniter,cryptography,dateutil,flask,flask_appbuilder,flask_babel,flask_caching,flask_compress,flask_login,flask_migrate,flask_sqlalchemy,flask_talisman,flask_testing,flask_wtf,freezegun,geohash,geopy,humanize,isodate,jinja2,jwt,markdown,markupsafe,marshmallow,msgpack,numpy,pandas,parameterized,parsedatetime,pathlib2,pgsanity,pkg_resources,polyline,prison,pyarrow,pyhive,pytest,pytz,redis,retry,selenium,setuptools,simplejson,slack,sqlalchemy,sqlalchemy_utils,sqlparse,typing_extensions,werkzeug,wtforms,wtforms_json,yaml multi_line_output = 3 order_by_type = false diff --git a/setup.py b/setup.py index bc30115604718..aebcb409970c7 100644 --- a/setup.py +++ b/setup.py @@ -72,6 +72,7 @@ def get_git_sha(): "colorama", "contextlib2", "croniter>=0.3.28", + "cron-descriptor", "cryptography>=3.2.1", "flask>=1.1.0, <2.0.0", "flask-appbuilder>=3.1.1, <4.0.0", diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 9d2d5f58d1254..b6a5773d0a4c7 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -2900,9 +2900,9 @@ }, "dependencies": { "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" } } }, @@ -4306,9 +4306,9 @@ } }, "d3-array": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.8.0.tgz", - "integrity": "sha512-6V272gsOeg7+9pTW1jSYOR1QE37g95I3my1hBmY+vOUNHRrk9yt4OTz/gK7PMkVAVDrYYq4mq3grTiZ8iJdNIw==" + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" }, "d3-interpolate": { "version": "2.0.1", @@ -16598,431 +16598,32 @@ } }, "@superset-ui/legacy-plugin-chart-calendar": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.15.13.tgz", - "integrity": "sha512-FV5MAMDQFvhSAl280KuE5J54l/UBH9NaC7G3GfNgQkyjGPabQjJTlzaZtRMU+6IFlsYqlA9xr5vzUanTT2Gxsw==", + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-calendar/-/legacy-plugin-chart-calendar-0.15.17.tgz", + "integrity": "sha512-8fKJWASWwieHIGZlTpozsOrRM8p8cTnC6JwdMlvjiJ1xXcwrsjQKXi1FJmbI7mWuJ5+9gdeuBlgX/QW/dLEWpQ==", "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", "d3-array": "^2.0.3", "d3-selection": "^1.4.0", "d3-tip": "^0.9.1", "prop-types": "^15.6.2" }, - "dependencies": { - "d3-array": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.8.0.tgz", - "integrity": "sha512-6V272gsOeg7+9pTW1jSYOR1QE37g95I3my1hBmY+vOUNHRrk9yt4OTz/gK7PMkVAVDrYYq4mq3grTiZ8iJdNIw==" - } - } - }, - "@superset-ui/legacy-plugin-chart-chord": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.15.13.tgz", - "integrity": "sha512-si6yLHCcThncSBUDlASkak2euMr/XO52ZMaMBLBB6DpWoD0wWnbVUnWnBioUCQDF/s64sWHMkOtBDmPu8nA/yQ==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "d3": "^3.5.17", - "prop-types": "^15.6.2", - "react": "^16.13.1" - } - }, - "@superset-ui/legacy-plugin-chart-country-map": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.15.13.tgz", - "integrity": "sha512-m62G+mJU+oqjrFScNrvneaBswjH3yINm5bX12TIokauR5pEINP46PFAJgsGwlM4GVnqqSE/rYHe8QbEJTnje8A==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "d3": "^3.5.17", - "d3-array": "^2.0.3", - "prop-types": "^15.6.2" - }, - "dependencies": { - "d3-array": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.8.0.tgz", - "integrity": "sha512-6V272gsOeg7+9pTW1jSYOR1QE37g95I3my1hBmY+vOUNHRrk9yt4OTz/gK7PMkVAVDrYYq4mq3grTiZ8iJdNIw==" - } - } - }, - "@superset-ui/legacy-plugin-chart-event-flow": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.15.13.tgz", - "integrity": "sha512-97KvEZQdXwqYZJLqVMWXi5wlFNElCOmnJNoAnkhC/Az8r6PJWpBefgR7qYu8SxOc8fXAUHTtC9F7KHhzgXjdrQ==", - "requires": { - "@data-ui/event-flow": "^0.0.84", - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "prop-types": "^15.6.2" - } - }, - "@superset-ui/legacy-plugin-chart-force-directed": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.15.13.tgz", - "integrity": "sha512-nrZtvmiXdL+bRa4PU4vSPy+ZkHnFN/2nSpId8OQhTNtCuo718A8X45gm0M1mhxtoX1H69dVit0O0xKQPtoAa8A==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "d3": "^3.5.17", - "prop-types": "^15.7.2" - } - }, - "@superset-ui/legacy-plugin-chart-heatmap": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.15.13.tgz", - "integrity": "sha512-4WWJ+X0jVB9HMlnWQ9NTTR+83HJomZRTzbs2KJy8wDmsTEVlzmpWwsPiY7yOMaH17x9YgSWfoSdUjr3tsXaf1w==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "d3": "^3.5.17", - "d3-svg-legend": "^1.x", - "d3-tip": "^0.9.1", - "prop-types": "^15.6.2" - } - }, - "@superset-ui/legacy-plugin-chart-histogram": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.15.13.tgz", - "integrity": "sha512-ahxVjClc8nC7B7dOnF4KP2FPWFbFvtOiyHjuNwPIT5NfE3jyREFdhkm40aH9KmarujEJNDBRVaDzBkB4rSvXZQ==", - "requires": { - "@data-ui/histogram": "^0.0.84", - "@data-ui/theme": "^0.0.84", - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "@vx/legend": "^0.0.198", - "@vx/responsive": "^0.0.197", - "@vx/scale": "^0.0.197", - "prop-types": "^15.6.2" - }, - "dependencies": { - "@vx/group": { - "version": "0.0.198", - "resolved": "https://registry.npmjs.org/@vx/group/-/group-0.0.198.tgz", - "integrity": "sha512-0PivE+fWZlPkSzFO/is5m4VSSv3pg+sS1yxYAZHbNffUvn472WDWptriHvoUIPQe0lOXhTSrc73UQzew9GtW/g==", - "requires": { - "@types/classnames": "^2.2.9", - "@types/react": "*", - "classnames": "^2.2.5", - "prop-types": "^15.6.2" - } - }, - "@vx/legend": { - "version": "0.0.198", - "resolved": "https://registry.npmjs.org/@vx/legend/-/legend-0.0.198.tgz", - "integrity": "sha512-3S2/yP6IvkkhUlTj6In5M1OrzY1OaT1D06hRxuiOLAbaXTerhbUGwIjGSNoovQM6JebFlbWnnA5xH1SKgw5GGA==", - "requires": { - "@types/classnames": "^2.2.9", - "@types/d3-scale": "^2.1.1", - "@types/react": "*", - "@vx/group": "0.0.198", - "classnames": "^2.2.5", - "prop-types": "^15.5.10" - } - }, - "@vx/responsive": { - "version": "0.0.197", - "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", - "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", - "requires": { - "@types/lodash": "^4.14.146", - "@types/react": "*", - "lodash": "^4.17.10", - "prop-types": "^15.6.1", - "resize-observer-polyfill": "1.5.1" - } - }, - "@vx/scale": { - "version": "0.0.197", - "resolved": "https://registry.npmjs.org/@vx/scale/-/scale-0.0.197.tgz", - "integrity": "sha512-FF0POm9rh66I3Om5DsuxynwWU+Q645aTF47vgP2dVDeOOq3Oet7CZzmXLDh3W6nVcxvzq1UdPwu94dto2PUfhg==", - "requires": { - "@types/d3-scale": "^2.1.1", - "d3-scale": "^2.2.2" - } - }, - "d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", - "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" - } - } - } - }, - "@superset-ui/legacy-plugin-chart-horizon": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.15.13.tgz", - "integrity": "sha512-XjoCmjajkaLA9Grgo+6cODmr5v0e1lKPSxDGuyNwg3c5gIu2Tq8BdJqV/mKGyDXAdbsKiIJGUIq/baUDeYi62Q==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "d3-array": "^2.0.3", - "d3-scale": "^3.0.1", - "prop-types": "^15.6.2" - }, - "dependencies": { - "d3-array": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.8.0.tgz", - "integrity": "sha512-6V272gsOeg7+9pTW1jSYOR1QE37g95I3my1hBmY+vOUNHRrk9yt4OTz/gK7PMkVAVDrYYq4mq3grTiZ8iJdNIw==" - }, - "d3-scale": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", - "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", - "requires": { - "d3-array": "^2.3.0", - "d3-format": "1 - 2", - "d3-interpolate": "1.2.0 - 2", - "d3-time": "1 - 2", - "d3-time-format": "2 - 3" - } - } - } - }, - "@superset-ui/legacy-plugin-chart-map-box": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.15.13.tgz", - "integrity": "sha512-/lsjIZ4gGqhlBFzOWm8sjFG7IEYnSj6B49aVrEuTLR4HOtEgW8ilK/RaVg1R2pPLU4WKxV3/2kpBYT4mUv5JgQ==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "immutable": "^3.8.2", - "mapbox-gl": "^0.53.0", - "prop-types": "^15.6.2", - "react-map-gl": "^4.0.10", - "supercluster": "^4.1.1", - "viewport-mercator-project": "^6.1.1" - }, - "dependencies": { - "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" - } - } - }, - "@superset-ui/legacy-plugin-chart-paired-t-test": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.15.13.tgz", - "integrity": "sha512-7GHMxYIX6iCJuFUCtA0DZsKVgZPzjPhwF+cKUfp4DLDjGW0T54bP1Kvq7MJIdn9YKEPD2bEl9dA49bjpaQeuZw==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "distributions": "^1.0.0", - "prop-types": "^15.6.2", - "reactable-arc": "0.15.0" - }, - "dependencies": { - "reactable-arc": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/reactable-arc/-/reactable-arc-0.15.0.tgz", - "integrity": "sha512-XH1mryI/xvbYb3lCVOU3rx/KRacDE0PDa45KazL/PPTM0AgPZ/awVmCAxRi179BpjbStk7cgCyFjI2oYJ28E8A==" - } - } - }, - "@superset-ui/legacy-plugin-chart-parallel-coordinates": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.15.13.tgz", - "integrity": "sha512-W/OgD6P79wLPm9g+A+aMq/VYkJ1sHJPeKjIev2DSr2sVo/CNmryq/fyQxgipdEUhJQrOe7ke1n5nBBKDz7wg/w==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "d3": "^3.5.17", - "prop-types": "^15.7.2" - } - }, - "@superset-ui/legacy-plugin-chart-partition": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.15.13.tgz", - "integrity": "sha512-NCmueZbjIC0gIUlWXdARagvxDuM+zLG5EUqw9x5JHvQctIj6D0aQ170F/1JWx48jnRD3Rp33/CKFSJ+j+KSyMg==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "d3": "^3.5.17", - "d3-hierarchy": "^1.1.8", - "prop-types": "^15.6.2" - } - }, - "@superset-ui/legacy-plugin-chart-pivot-table": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.15.13.tgz", - "integrity": "sha512-SmIae3YAy5mXcI/zlEnRIun5ztgY9kTXEkdC61QqGiQ7d1tenzxneoNIeifkUh20L/QnJqP1lnPJlgB4jD33lw==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "d3": "^3.5.17", - "datatables.net-bs": "^1.10.15", - "prop-types": "^15.6.2" - } - }, - "@superset-ui/legacy-plugin-chart-rose": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.15.13.tgz", - "integrity": "sha512-C5/Llb+eJBsrVPm/KJbfMPyvMovA0njYw75+YKnE08XlZDZ6nFwMbhb6MV79kqZgVmL++inJ1I5YSxzVrQ2w3A==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "d3": "^3.5.17", - "nvd3": "1.8.6", - "prop-types": "^15.6.2" - } - }, - "@superset-ui/legacy-plugin-chart-sankey": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.15.13.tgz", - "integrity": "sha512-1wPA4+En339Ex5t/YNR1f+4VwCXmtyFMaTBVeMlUZ09ggiULPZqEqX9GLVYa+j1VPCiW3DKM+wv1nZPo8Pj9lQ==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "d3": "^3.5.17", - "d3-sankey": "^0.4.2", - "prop-types": "^15.6.2" - } - }, - "@superset-ui/legacy-plugin-chart-sankey-loop": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.15.13.tgz", - "integrity": "sha512-/7Kag4GEq00tQpV0V/H7VRoPXm+w6q4Rz8iVu7/fJyKM8Nls25yCSescpr3usPP+PX1947jXpM+OyxABUhzocQ==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "d3-sankey-diagram": "^0.7.3", - "d3-selection": "^1.4.0", - "prop-types": "^15.6.2" - } - }, - "@superset-ui/legacy-plugin-chart-sunburst": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.15.13.tgz", - "integrity": "sha512-C4e2YylIkbu1j1HU6Ci+ioYSBVhQ0WTN6yeI2H+yGjvVZO7vuUC1zVipklU90Ofaa1Zy3JuwdhUIiaZOyh9J4g==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "d3": "^3.5.17", - "prop-types": "^15.6.2" - } - }, - "@superset-ui/legacy-plugin-chart-treemap": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.15.13.tgz", - "integrity": "sha512-Owq0n7NDiWzVELMo/ko5Io0J9smIono61N6LYXUEqD+h2OEc37rHfLOWTHdGjPQKCfOn3/rOF/YEvslh5+gpPw==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "d3-hierarchy": "^1.1.8", - "d3-selection": "^1.4.0", - "prop-types": "^15.6.2" - } - }, - "@superset-ui/legacy-plugin-chart-world-map": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.15.13.tgz", - "integrity": "sha512-UDk0gWWE9Hpu1ETOcNa0eox0mfje8opHuhotXZeqpTLNws7lIwej5th+BhuFy9Yc/gKt2c6ABUjFfagyqAdslQ==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "d3": "^3.5.17", - "d3-array": "^2.4.0", - "d3-color": "^1.4.1", - "datamaps": "^0.5.8", - "prop-types": "^15.6.2" - }, - "dependencies": { - "d3-array": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.8.0.tgz", - "integrity": "sha512-6V272gsOeg7+9pTW1jSYOR1QE37g95I3my1hBmY+vOUNHRrk9yt4OTz/gK7PMkVAVDrYYq4mq3grTiZ8iJdNIw==" - }, - "d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" - } - } - }, - "@superset-ui/legacy-preset-chart-big-number": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.15.13.tgz", - "integrity": "sha512-1Skbacxo0vswa6YG3qmql5fxG5XTm4kRBryH4sWKlFdw46AkONYci0khP/7Ql1mjOxmbt6hjbUkaC6mbs84BLw==", - "requires": { - "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "@types/d3-color": "^1.2.2", - "@types/shortid": "^0.0.29", - "d3-color": "^1.2.3", - "shortid": "^2.2.14" - } - }, - "@superset-ui/legacy-preset-chart-deckgl": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-deckgl/-/legacy-preset-chart-deckgl-0.3.1.tgz", - "integrity": "sha512-mHX2vWJH+1Hq5QuQu2wlKstLgql3/ukNU1SVoLyjDX/BdTqeZiISMCumj2UUMbf0cK1zjHPHrVUCLzJwfsQbUQ==", - "requires": { - "@math.gl/web-mercator": "^3.2.2", - "@types/d3-array": "^2.0.0", - "bootstrap-slider": "^10.0.0", - "d3-array": "^1.2.4", - "d3-color": "^1.2.0", - "d3-scale": "^2.1.2", - "deck.gl": "7.1.11", - "jquery": "^3.4.1", - "lodash": "^4.17.15", - "mapbox-gl": "^0.53.0", - "moment": "^2.20.1", - "mousetrap": "^1.6.1", - "prop-types": "^15.6.0", - "react-bootstrap-slider": "2.1.5", - "react-map-gl": "^4.0.10", - "underscore": "^1.8.3", - "urijs": "^1.18.10", - "xss": "^1.0.6" - } - }, - "@superset-ui/legacy-preset-chart-nvd3": { - "version": "0.15.16", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.15.16.tgz", - "integrity": "sha512-BwTslkj/0dp+YK88AvMlnz24mNz5kpAyLloFD3Bjjl0BzqSR/KhhYaXn5n2XNWAzJnhtGMtRxDShI/p4GeMCAw==", - "requires": { - "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.15.15", - "@superset-ui/core": "0.15.15", - "d3": "^3.5.17", - "d3-tip": "^0.9.1", - "dompurify": "^2.0.6", - "fast-safe-stringify": "^2.0.6", - "lodash": "^4.17.11", - "mathjs": "^8.0.1", - "moment": "^2.20.1", - "nvd3-fork": "2.0.3", - "prop-types": "^15.6.2", - "urijs": "^1.18.10" - }, "dependencies": { "@superset-ui/chart-controls": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.15.tgz", - "integrity": "sha512-DrvkHLztMyjEqvosu4op+CpxMfPVEHfz5MFYc1jPlREItwHEdCYUAfPk3G29a+pr82MzKQTepvVGWE/5l7C1gQ==", + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", "requires": { - "@superset-ui/core": "0.15.15", + "@superset-ui/core": "0.15.17", "lodash": "^4.17.15", "prop-types": "^15.7.2" } }, "@superset-ui/core": { - "version": "0.15.15", - "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.15.tgz", - "integrity": "sha512-lrdKncYwO6jebQ8C/jvhq7wOrg3fpC+xdnxvJpSeVaICvces8Iv6669t8fbQKBL/rdhQ4aCfg/A3mk/Pa5qQ5A==", + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", "requires": { "@babel/runtime": "^7.1.2", "@emotion/core": "^10.0.28", @@ -17065,9 +16666,2255 @@ } }, "d3-array": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.0.tgz", - "integrity": "sha512-yOokB8GozB6GAubW9n7phLdRugC8TgEjF6V1cX/q78L80d2tLirUnc0jvDSSF622JJJTmtnJOe9+WKs+yS5GFQ==" + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-chord": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-chord/-/legacy-plugin-chart-chord-0.15.17.tgz", + "integrity": "sha512-VJuTPCg3ww7Q43Uv2q0w/2FVrzt+Jfu+BF7nyrE1NAwuPbyZ8xmUlU19QSevxr/l3ALuFbD4Nqg1zuz160RBTQ==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3": "^3.5.17", + "prop-types": "^15.6.2", + "react": "^16.13.1" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-country-map": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-country-map/-/legacy-plugin-chart-country-map-0.15.17.tgz", + "integrity": "sha512-FOy4dMJosXBdpDUg26Bq/UKsS1qG3gfJISaW+q6M17+OEd/zyMjQjZ75NHN2vvCTlBCkYRsvhUV8pAH/YkGSqQ==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3": "^3.5.17", + "d3-array": "^2.0.3", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-event-flow": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-event-flow/-/legacy-plugin-chart-event-flow-0.15.17.tgz", + "integrity": "sha512-TnSxfg9aC4sYtgSWMS+P2ju91Nn8Wfc5O8OZ4ZIyeOrBoz9RtPdQOQEIaDE9+NIJZs0WSbkbiNVnfsg6aYnksA==", + "requires": { + "@data-ui/event-flow": "^0.0.84", + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-force-directed": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-force-directed/-/legacy-plugin-chart-force-directed-0.15.17.tgz", + "integrity": "sha512-gJgKp/4X/B09RS5o4/PlCw1WCByeDbOG0gbKjkRJ4Gm4ldbhocvHvkUEkIA3meu3vgpel4jFyCX1aNKZXIxuQg==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3": "^3.5.17", + "prop-types": "^15.7.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-heatmap": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-heatmap/-/legacy-plugin-chart-heatmap-0.15.17.tgz", + "integrity": "sha512-BFf4l+/YmIIMRruAapDX7owrwXPktF5ZizND2fYQM3FQ4FBLWRXvmeGLSMKo0bwUnWUNmoQSDjJKYhTrij1Hdg==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3": "^3.5.17", + "d3-svg-legend": "^1.x", + "d3-tip": "^0.9.1", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-histogram": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-histogram/-/legacy-plugin-chart-histogram-0.15.17.tgz", + "integrity": "sha512-nFdajSp6fchB2laMYCFqQS2Ya+vIYc6gq49kRedP7vhxHPxMMx2Ksm89yXgLM4XRHHUkzMJX3995UGc61UkFuw==", + "requires": { + "@data-ui/histogram": "^0.0.84", + "@data-ui/theme": "^0.0.84", + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "@vx/legend": "^0.0.198", + "@vx/responsive": "^0.0.197", + "@vx/scale": "^0.0.197", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/group": { + "version": "0.0.198", + "resolved": "https://registry.npmjs.org/@vx/group/-/group-0.0.198.tgz", + "integrity": "sha512-0PivE+fWZlPkSzFO/is5m4VSSv3pg+sS1yxYAZHbNffUvn472WDWptriHvoUIPQe0lOXhTSrc73UQzew9GtW/g==", + "requires": { + "@types/classnames": "^2.2.9", + "@types/react": "*", + "classnames": "^2.2.5", + "prop-types": "^15.6.2" + } + }, + "@vx/legend": { + "version": "0.0.198", + "resolved": "https://registry.npmjs.org/@vx/legend/-/legend-0.0.198.tgz", + "integrity": "sha512-3S2/yP6IvkkhUlTj6In5M1OrzY1OaT1D06hRxuiOLAbaXTerhbUGwIjGSNoovQM6JebFlbWnnA5xH1SKgw5GGA==", + "requires": { + "@types/classnames": "^2.2.9", + "@types/d3-scale": "^2.1.1", + "@types/react": "*", + "@vx/group": "0.0.198", + "classnames": "^2.2.5", + "prop-types": "^15.5.10" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "@vx/scale": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/scale/-/scale-0.0.197.tgz", + "integrity": "sha512-FF0POm9rh66I3Om5DsuxynwWU+Q645aTF47vgP2dVDeOOq3Oet7CZzmXLDh3W6nVcxvzq1UdPwu94dto2PUfhg==", + "requires": { + "@types/d3-scale": "^2.1.1", + "d3-scale": "^2.2.2" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + } + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-horizon": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-horizon/-/legacy-plugin-chart-horizon-0.15.17.tgz", + "integrity": "sha512-BrqeaE97NwObv287lsvlFtrAkoaUxRCNkmjATcTEyFXvQGUsqb/3LJdqefEFxTtx0E+ivS7Py1vcxF3YSmPY7Q==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3-array": "^2.0.3", + "d3-scale": "^3.0.1", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-map-box": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-map-box/-/legacy-plugin-chart-map-box-0.15.17.tgz", + "integrity": "sha512-GFputmMt3NaMtHOJ+AmO/H/b5bNhhrtldWwNYS7ZpaV26KYEZ2njx7kHAowCgDAz4HluDW+qyEbuz8PZt9+WfA==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "immutable": "^3.8.2", + "mapbox-gl": "^0.53.0", + "prop-types": "^15.6.2", + "react-map-gl": "^4.0.10", + "supercluster": "^4.1.1", + "viewport-mercator-project": "^6.1.1" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" + } + } + }, + "@superset-ui/legacy-plugin-chart-paired-t-test": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-paired-t-test/-/legacy-plugin-chart-paired-t-test-0.15.17.tgz", + "integrity": "sha512-GGVBkLElWkZ7fYAi++UBisC7s/WKqpZa8qUkNjY07YkJqx0LBa+eV+N/D4x+loTekRJY0pUt4ZnuI0R2va7AzA==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "distributions": "^1.0.0", + "prop-types": "^15.6.2", + "reactable-arc": "0.15.0" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-parallel-coordinates": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-parallel-coordinates/-/legacy-plugin-chart-parallel-coordinates-0.15.17.tgz", + "integrity": "sha512-R4aZ8WS0P7D/VnP0eY5TMQyscdKE0NkufDaTYBcV9zLzfFibx9Nk560tzZoZcH2cdqw9eH1DjfFYDr8qRXPTCA==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3": "^3.5.17", + "prop-types": "^15.7.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-partition": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-partition/-/legacy-plugin-chart-partition-0.15.17.tgz", + "integrity": "sha512-PRoefZD+9jtKZzNuIiXEH4DRuvxhtgTz2PCP4t13kOrs2KAMRs4aCLTURpIUVpt96QyCOE5d3MRyrwVWABf/Hw==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3": "^3.5.17", + "d3-hierarchy": "^1.1.8", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-pivot-table": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-pivot-table/-/legacy-plugin-chart-pivot-table-0.15.17.tgz", + "integrity": "sha512-/Hyx+TH93ZJFs/9XY0P+Km5dH57teO2kEh4+bWToI+Q4NRCg+GzAg+/oaXUnGrASiVxExfl+iWK6Wz6IRVFBOg==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3": "^3.5.17", + "datatables.net-bs": "^1.10.15", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-rose": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-rose/-/legacy-plugin-chart-rose-0.15.17.tgz", + "integrity": "sha512-F4HBioJAVv1FfctgQHZXDnlX3B1ThBDMyPOC2s+hNO/xmJ5ufKyBtoITdai0wZd0NDlZoN8SH3Rvnov2I4St3A==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3": "^3.5.17", + "nvd3": "1.8.6", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-sankey": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey/-/legacy-plugin-chart-sankey-0.15.17.tgz", + "integrity": "sha512-MTVAYUPKch562vdz2LlPUREkooCS3WIb+KX1AcrQau6SPqCfm54WgqqG35xEXcA8cy2SM2zxcLYf6dHnC5Ynmg==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3": "^3.5.17", + "d3-sankey": "^0.4.2", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-sankey-loop": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sankey-loop/-/legacy-plugin-chart-sankey-loop-0.15.17.tgz", + "integrity": "sha512-+OXQjFJs8N1aRXmf1MDb7ljoKo2PZSur1Ae/vu4zRJrcr+s9FaHSXiG9UEP3krLas4Bsm8le4jYatQNP4NtgaQ==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3-sankey-diagram": "^0.7.3", + "d3-selection": "^1.4.0", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-sunburst": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-sunburst/-/legacy-plugin-chart-sunburst-0.15.17.tgz", + "integrity": "sha512-GrthNQKCgBZIm1Tu9xvGAaGXkrQUi8PRliApp022KDQ6drqfHZ08cur/MsuQOJb+g3vxEG3plw87Evdg1FU79g==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3": "^3.5.17", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-treemap": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-treemap/-/legacy-plugin-chart-treemap-0.15.17.tgz", + "integrity": "sha512-yzuqs4PPILbJfx+a7Syv+idMdv9UZpBUYsLXsijzWGFSUOE0Q724UKmEkLmDgsSfPPZbbJWvovHTwJiOY4ZCtw==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3-hierarchy": "^1.1.8", + "d3-selection": "^1.4.0", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-plugin-chart-world-map": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-plugin-chart-world-map/-/legacy-plugin-chart-world-map-0.15.17.tgz", + "integrity": "sha512-2vyNnLgFna6nJ0/jR+DYn02PMUm9G/2yL0wFzQ5COQ7s9RDICLqf6nXUljB6NXILLKD4L3pUj5h0Sx9t045nog==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3": "^3.5.17", + "d3-array": "^2.4.0", + "d3-color": "^1.4.1", + "datamaps": "^0.5.8", + "prop-types": "^15.6.2" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-preset-chart-big-number": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-big-number/-/legacy-preset-chart-big-number-0.15.17.tgz", + "integrity": "sha512-dJjA1OS7utHicUIyyi9eQbo3ziBaq4XuABFlkwDI/dv2plJEj5LkmefFjBicIQT9odptxUvn7D2haGOdCNL0ZQ==", + "requires": { + "@data-ui/xy-chart": "^0.0.84", + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "@types/d3-color": "^1.2.2", + "@types/shortid": "^0.0.29", + "d3-color": "^1.2.3", + "shortid": "^2.2.14" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/legacy-preset-chart-deckgl": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-deckgl/-/legacy-preset-chart-deckgl-0.3.1.tgz", + "integrity": "sha512-mHX2vWJH+1Hq5QuQu2wlKstLgql3/ukNU1SVoLyjDX/BdTqeZiISMCumj2UUMbf0cK1zjHPHrVUCLzJwfsQbUQ==", + "requires": { + "@math.gl/web-mercator": "^3.2.2", + "@types/d3-array": "^2.0.0", + "bootstrap-slider": "^10.0.0", + "d3-array": "^1.2.4", + "d3-color": "^1.2.0", + "d3-scale": "^2.1.2", + "deck.gl": "7.1.11", + "jquery": "^3.4.1", + "lodash": "^4.17.15", + "mapbox-gl": "^0.53.0", + "moment": "^2.20.1", + "mousetrap": "^1.6.1", + "prop-types": "^15.6.0", + "react-bootstrap-slider": "2.1.5", + "react-map-gl": "^4.0.10", + "underscore": "^1.8.3", + "urijs": "^1.18.10", + "xss": "^1.0.6" + } + }, + "@superset-ui/legacy-preset-chart-nvd3": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.15.17.tgz", + "integrity": "sha512-04wV1CIzRIglknR0YxwffiRC3OvF1jo2sr6I7iBamXUtD/HxMXr+vlkmrnqIjAKjQ/rKtyll0fjdlTCX9pWo0A==", + "requires": { + "@data-ui/xy-chart": "^0.0.84", + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "d3": "^3.5.17", + "d3-tip": "^0.9.1", + "dompurify": "^2.0.6", + "fast-safe-stringify": "^2.0.6", + "lodash": "^4.17.11", + "mathjs": "^8.0.1", + "moment": "^2.20.1", + "nvd3-fork": "2.0.3", + "prop-types": "^15.6.2", + "urijs": "^1.18.10" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + } + } + }, + "@superset-ui/plugin-chart-echarts": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.15.17.tgz", + "integrity": "sha512-1EG07no/8+uCd6DDqkGQLoFqEou1JXee59lQeb2mujtB306P+JpT+Yf2L7Uo/5oPD5hAVSiZTHBKNdghDymnUQ==", + "requires": { + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", + "@types/echarts": "^4.6.3", + "@types/mathjs": "^6.0.7", + "echarts": "^5.0.0", + "mathjs": "^8.0.1" + }, + "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" }, "d3-interpolate": { "version": "1.4.0", @@ -17099,27 +18946,14 @@ } } }, - "@superset-ui/plugin-chart-echarts": { - "version": "0.15.14", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-echarts/-/plugin-chart-echarts-0.15.14.tgz", - "integrity": "sha512-8a08AGi+a2B6f6PaZNQTWcv645ub0zRyI/M7xD/7sDIsK7lxs0AktTpBo/6DzXdr5o6bY9TBewuTyad0SCv5qA==", - "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", - "@types/echarts": "^4.6.3", - "@types/mathjs": "^6.0.7", - "echarts": "^4.9.0", - "mathjs": "^8.0.1" - } - }, "@superset-ui/plugin-chart-table": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.15.13.tgz", - "integrity": "sha512-Lu5r/3ydMXp3Ko/LBHqrxs4FN/ellJODx/4457sr0ggWeSUbCg6YMTAdpzOeuZFdgXvxV0TpY5ADYcCd9xdx6A==", + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-table/-/plugin-chart-table-0.15.17.tgz", + "integrity": "sha512-ZXVZtfwEpTzxepFnUk6kzJptQEgxmX/MsYVKYG8OjQb9n7s9PNvP2SKI7GFhpFXW2A9zlwcD7pCs3FMm2lPMIw==", "requires": { "@emotion/core": "^10.0.28", - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", "@types/d3-array": "^2.0.0", "@types/match-sorter": "^4.0.0", "@types/react-table": "^7.0.19", @@ -17132,20 +18966,103 @@ "xss": "^1.0.6" }, "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, "d3-array": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.8.0.tgz", - "integrity": "sha512-6V272gsOeg7+9pTW1jSYOR1QE37g95I3my1hBmY+vOUNHRrk9yt4OTz/gK7PMkVAVDrYYq4mq3grTiZ8iJdNIw==" + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } } } }, "@superset-ui/plugin-chart-word-cloud": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.15.13.tgz", - "integrity": "sha512-D1wbSN1ztYlrLvxdmVYyq3JAvWAJp0jVskrDFtLwyledL2NccAcQgI8UjkZNE946xi1u65CxvX7c++lqkVPFDA==", + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/plugin-chart-word-cloud/-/plugin-chart-word-cloud-0.15.17.tgz", + "integrity": "sha512-GcVL6dEvlLrawPmlAB1toR/Drm9EKpu3olQw6WkgqV5Q21vieY3iOYXn0v2RxAkEteEnkPTcp2fABXzhLbQuSA==", "requires": { - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", "@types/d3-cloud": "^1.2.1", "@types/d3-scale": "^2.0.2", "d3-cloud": "^1.2.5", @@ -17154,10 +19071,73 @@ "encodable": "^0.7.6" }, "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, "d3-array": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.8.0.tgz", - "integrity": "sha512-6V272gsOeg7+9pTW1jSYOR1QE37g95I3my1hBmY+vOUNHRrk9yt4OTz/gK7PMkVAVDrYYq4mq3grTiZ8iJdNIw==" + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } }, "d3-scale": { "version": "3.2.3", @@ -17170,18 +19150,26 @@ "d3-time": "1 - 2", "d3-time-format": "2 - 3" } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } } } }, "@superset-ui/preset-chart-xy": { - "version": "0.15.13", - "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.15.13.tgz", - "integrity": "sha512-79Mm0y+QUVth8spNiR3b87P1bk56UVkweXwbAl49FqdB4FR92UhgmrtvVVb+k5bCgdBltrD0LyxcEl5mhMfPgg==", + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/preset-chart-xy/-/preset-chart-xy-0.15.17.tgz", + "integrity": "sha512-1rMeD4zcQBTj/wxZ8n1H0xDhAk8SJ7ATSeW8rvqxhrJYRqC8q7Q8Ep1GuxqLKmLdg7MwpNtX9KTuw6uz/DnSMw==", "requires": { "@data-ui/theme": "^0.0.84", "@data-ui/xy-chart": "^0.0.84", - "@superset-ui/chart-controls": "0.15.13", - "@superset-ui/core": "0.15.13", + "@superset-ui/chart-controls": "0.15.17", + "@superset-ui/core": "0.15.17", "@vx/axis": "^0.0.198", "@vx/legend": "^0.0.198", "@vx/scale": "^0.0.197", @@ -17191,6 +19179,49 @@ "reselect": "^4.0.0" }, "dependencies": { + "@superset-ui/chart-controls": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/chart-controls/-/chart-controls-0.15.17.tgz", + "integrity": "sha512-RjuA3mBZuNSOa0LJZ7M3rvNJT7DYXrKLYrKKV2e3sLAW4i3FuJdxGD4HD0+W6eRRHb0YybDMaysa31ulAOGrBg==", + "requires": { + "@superset-ui/core": "0.15.17", + "lodash": "^4.17.15", + "prop-types": "^15.7.2" + } + }, + "@superset-ui/core": { + "version": "0.15.17", + "resolved": "https://registry.npmjs.org/@superset-ui/core/-/core-0.15.17.tgz", + "integrity": "sha512-VjrWkxMvVSU/LB0AO6Qf/VHOdk3Jweug78FfnXlKmFK3Z4eRtfrCpKZOjEwMqKhhdppkU34MOfduZYq0uS6Ocw==", + "requires": { + "@babel/runtime": "^7.1.2", + "@emotion/core": "^10.0.28", + "@emotion/styled": "^10.0.27", + "@types/d3-format": "^1.3.0", + "@types/d3-interpolate": "^1.3.1", + "@types/d3-scale": "^2.1.1", + "@types/d3-time": "^1.0.9", + "@types/d3-time-format": "^2.1.0", + "@types/lodash": "^4.14.149", + "@types/rison": "0.0.6", + "@vx/responsive": "^0.0.197", + "csstype": "^2.6.4", + "d3-format": "^1.3.2", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.0.0", + "d3-time": "^1.0.10", + "d3-time-format": "^2.2.0", + "emotion-theming": "^10.0.27", + "fetch-retry": "^4.0.1", + "jed": "^1.1.1", + "lodash": "^4.17.11", + "pretty-ms": "^7.0.0", + "react-error-boundary": "^1.2.5", + "reselect": "^4.0.0", + "rison": "^0.1.1", + "whatwg-fetch": "^3.0.0" + } + }, "@vx/axis": { "version": "0.0.198", "resolved": "https://registry.npmjs.org/@vx/axis/-/axis-0.0.198.tgz", @@ -17244,6 +19275,18 @@ "resolved": "https://registry.npmjs.org/@vx/point/-/point-0.0.198.tgz", "integrity": "sha512-oFlw8uBLf4JDX7OJc+7eQXcnlLszdQgEs531u0t6HNpARQY/jTeeMLVUlp8sNF0XBOC+iVHU8Qe8TJdz/ONBAA==" }, + "@vx/responsive": { + "version": "0.0.197", + "resolved": "https://registry.npmjs.org/@vx/responsive/-/responsive-0.0.197.tgz", + "integrity": "sha512-Qv15PJ/Hy79LjyfJ/9E8z+zacKAnD43O2Jg9wvB6PFSNs73xPEDy/mHTYxH+FZv94ruAE3scBO0330W29sQpyg==", + "requires": { + "@types/lodash": "^4.14.146", + "@types/react": "*", + "lodash": "^4.17.10", + "prop-types": "^15.6.1", + "resize-observer-polyfill": "1.5.1" + } + }, "@vx/scale": { "version": "0.0.197", "resolved": "https://registry.npmjs.org/@vx/scale/-/scale-0.0.197.tgz", @@ -17251,6 +19294,26 @@ "requires": { "@types/d3-scale": "^2.1.1", "d3-scale": "^2.2.2" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + } } }, "@vx/shape": { @@ -17284,17 +19347,37 @@ "reduce-css-calc": "^1.3.0" } }, + "d3-array": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, "d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", + "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "1 - 2", + "d3-time-format": "2 - 3" + } + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" } } } @@ -18849,9 +20932,9 @@ } }, "@types/echarts": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@types/echarts/-/echarts-4.9.0.tgz", - "integrity": "sha512-9QIAUe6cxM5GyGNCIhlEwf7l5oclZDVM0HNRfehPx3dDUt1Jfhbvp/U2wfgwtL/IDqyASBVs1zu4qyaCsuJINA==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@types/echarts/-/echarts-4.9.2.tgz", + "integrity": "sha512-ycAmdt/PbQEuj+9cI9O0mZV6Dd+R1+ngs9S8P7Cbxj8RWXbL8NOvnzXdJRvR/+9lx/hq/O1rdLxXYXXTVImujw==", "requires": { "@types/zrender": "*" } @@ -19039,9 +21122,9 @@ "integrity": "sha512-JK7HNHXZA7i/nEp6fbNAxoX/1j1ysZXmv2/nlkt2UpX1LiUWKLtyt/dMmDTlMPR6t6PkwMmIr2W2AAyu6oELNw==" }, "@types/mathjs": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@types/mathjs/-/mathjs-6.0.7.tgz", - "integrity": "sha512-UPpG34wVjlr8uSijJ747q0SmC459t294xm/3Ed8GAnqM/I2K786WgCLQ4BO4lIsM07Gj1UhO7x0n0TSfqO0DNQ==", + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/@types/mathjs/-/mathjs-6.0.8.tgz", + "integrity": "sha512-/oDt+o/q3cTHgOsYPgvHWw6xG8ZhIWMNnz8WJMogs2jeCEHz4PODOzrT3jzRzf7UeX7nPLXhqL+cV4hOfu1mWA==", "requires": { "decimal.js": "^10.0.0" } @@ -25996,9 +28079,9 @@ } }, "dompurify": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.2.2.tgz", - "integrity": "sha512-BsGR4nDLaC5CNBnyT5I+d5pOeaoWvgVeg6Gq/aqmKYWMPR07131u60I80BvExLAJ0FQEIBQ1BTicw+C5+jOyrg==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.2.3.tgz", + "integrity": "sha512-8Hv7Q0FuwD9rWoB6qI2eZsfKbGXfoUVuGHHrE15vgk4ReOKwOkSgbqb2OMFtc0d5besOEkoLkcyuV10zQ2X5gw==" }, "domutils": { "version": "1.5.1", @@ -26092,11 +28175,19 @@ } }, "echarts": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/echarts/-/echarts-4.9.0.tgz", - "integrity": "sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.0.0.tgz", + "integrity": "sha512-6SDcJbLVOcfQyjPg+spNU1+JVrkU1B9fzUa5tpbP/mMNUPyigCOJwcEIQAJSbp9jt5UP3EXvQR0vtYXIo9AjyA==", "requires": { - "zrender": "4.3.2" + "tslib": "1.10.0", + "zrender": "5.0.1" + }, + "dependencies": { + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + } } }, "editorconfig": { @@ -26266,9 +28357,9 @@ }, "dependencies": { "d3-array": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.8.0.tgz", - "integrity": "sha512-6V272gsOeg7+9pTW1jSYOR1QE37g95I3my1hBmY+vOUNHRrk9yt4OTz/gK7PMkVAVDrYYq4mq3grTiZ8iJdNIw==" + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.9.1.tgz", + "integrity": "sha512-Ob7RdOtkqsjx1NWyQHMFLtCSk6/aKTxDdC4ZIolX+O+mDD2RzrsYgAyc0WGAlfYFVELLSilS7w8BtE3PKM8bHg==" }, "d3-interpolate": { "version": "2.0.1", @@ -28527,7 +30618,7 @@ "dependencies": { "core-js": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" } } @@ -43514,6 +45605,11 @@ "resolved": "https://registry.npmjs.org/react-is-mounted-hook/-/react-is-mounted-hook-1.0.3.tgz", "integrity": "sha512-YCCYcTVYMPfTi6WhWIwM9EYBcpHoivjjkE90O5ScsE9wXSbeXGZvLDMGt4mdSNcWshhc8JD0AzgBmsleCSdSFA==" }, + "react-js-cron": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-js-cron/-/react-js-cron-1.2.0.tgz", + "integrity": "sha512-mWxTmXkqP58ughdziS3qjEUVl1O03XEo8WDvr45/kTQfbd0C6ITniAsG5wZzwmTOgmrOKQheHog7L0TP683WUA==" + }, "react-json-tree": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.11.2.tgz", @@ -44156,6 +46252,11 @@ "has": "^1.0.1" } }, + "reactable-arc": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/reactable-arc/-/reactable-arc-0.15.0.tgz", + "integrity": "sha512-XH1mryI/xvbYb3lCVOU3rx/KRacDE0PDa45KazL/PPTM0AgPZ/awVmCAxRi179BpjbStk7cgCyFjI2oYJ28E8A==" + }, "reactcss": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", @@ -51393,9 +53494,19 @@ } }, "zrender": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-4.3.2.tgz", - "integrity": "sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.0.1.tgz", + "integrity": "sha512-i8FNCKAKfF0EfZFJ6w2p30umBrCyy481/PePFQqPdtNgCl5Hp5z7/dovqb7soEoFkhNvhjJ/J4W9zFALeae6yA==", + "requires": { + "tslib": "1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + } + } }, "zwitch": { "version": "1.0.5", diff --git a/superset-frontend/package.json b/superset-frontend/package.json index b4585c7721388..c77ea61c138a5 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -67,32 +67,32 @@ "@emotion/core": "^10.0.35", "@superset-ui/chart-controls": "^0.15.13", "@superset-ui/core": "^0.15.13", - "@superset-ui/legacy-plugin-chart-calendar": "^0.15.13", - "@superset-ui/legacy-plugin-chart-chord": "^0.15.13", - "@superset-ui/legacy-plugin-chart-country-map": "^0.15.13", - "@superset-ui/legacy-plugin-chart-event-flow": "^0.15.13", - "@superset-ui/legacy-plugin-chart-force-directed": "^0.15.13", - "@superset-ui/legacy-plugin-chart-heatmap": "^0.15.13", - "@superset-ui/legacy-plugin-chart-histogram": "^0.15.13", - "@superset-ui/legacy-plugin-chart-horizon": "^0.15.13", - "@superset-ui/legacy-plugin-chart-map-box": "^0.15.13", - "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.15.13", - "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.15.13", - "@superset-ui/legacy-plugin-chart-partition": "^0.15.13", - "@superset-ui/legacy-plugin-chart-pivot-table": "^0.15.13", - "@superset-ui/legacy-plugin-chart-rose": "^0.15.13", - "@superset-ui/legacy-plugin-chart-sankey": "^0.15.13", - "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.15.13", - "@superset-ui/legacy-plugin-chart-sunburst": "^0.15.13", - "@superset-ui/legacy-plugin-chart-treemap": "^0.15.13", - "@superset-ui/legacy-plugin-chart-world-map": "^0.15.13", - "@superset-ui/legacy-preset-chart-big-number": "^0.15.13", + "@superset-ui/legacy-plugin-chart-calendar": "^0.15.17", + "@superset-ui/legacy-plugin-chart-chord": "^0.15.17", + "@superset-ui/legacy-plugin-chart-country-map": "^0.15.17", + "@superset-ui/legacy-plugin-chart-event-flow": "^0.15.17", + "@superset-ui/legacy-plugin-chart-force-directed": "^0.15.17", + "@superset-ui/legacy-plugin-chart-heatmap": "^0.15.17", + "@superset-ui/legacy-plugin-chart-histogram": "^0.15.17", + "@superset-ui/legacy-plugin-chart-horizon": "^0.15.17", + "@superset-ui/legacy-plugin-chart-map-box": "^0.15.17", + "@superset-ui/legacy-plugin-chart-paired-t-test": "^0.15.17", + "@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.15.17", + "@superset-ui/legacy-plugin-chart-partition": "^0.15.17", + "@superset-ui/legacy-plugin-chart-pivot-table": "^0.15.17", + "@superset-ui/legacy-plugin-chart-rose": "^0.15.17", + "@superset-ui/legacy-plugin-chart-sankey": "^0.15.17", + "@superset-ui/legacy-plugin-chart-sankey-loop": "^0.15.17", + "@superset-ui/legacy-plugin-chart-sunburst": "^0.15.17", + "@superset-ui/legacy-plugin-chart-treemap": "^0.15.17", + "@superset-ui/legacy-plugin-chart-world-map": "^0.15.17", + "@superset-ui/legacy-preset-chart-big-number": "^0.15.17", "@superset-ui/legacy-preset-chart-deckgl": "^0.3.1", - "@superset-ui/legacy-preset-chart-nvd3": "^0.15.16", - "@superset-ui/plugin-chart-echarts": "^0.15.14", - "@superset-ui/plugin-chart-table": "^0.15.13", - "@superset-ui/plugin-chart-word-cloud": "^0.15.13", - "@superset-ui/preset-chart-xy": "^0.15.13", + "@superset-ui/legacy-preset-chart-nvd3": "^0.15.17", + "@superset-ui/plugin-chart-echarts": "^0.15.17", + "@superset-ui/plugin-chart-table": "^0.15.17", + "@superset-ui/plugin-chart-word-cloud": "^0.15.17", + "@superset-ui/preset-chart-xy": "^0.15.17", "@vx/responsive": "^0.0.195", "abortcontroller-polyfill": "^1.1.9", "antd": "^4.8.2", @@ -141,6 +141,7 @@ "react-dom": "^16.13.0", "react-gravatar": "^2.6.1", "react-hot-loader": "^4.12.20", + "react-js-cron": "^1.2.0", "react-json-tree": "^0.11.2", "react-jsonschema-form": "^1.2.0", "react-loadable": "^5.5.0", diff --git a/superset-frontend/spec/javascripts/datasource/ChangeDatasourceModal_spec.jsx b/superset-frontend/spec/javascripts/datasource/ChangeDatasourceModal_spec.jsx index c058851a056c9..b803c4641cedb 100644 --- a/superset-frontend/spec/javascripts/datasource/ChangeDatasourceModal_spec.jsx +++ b/superset-frontend/spec/javascripts/datasource/ChangeDatasourceModal_spec.jsx @@ -21,9 +21,9 @@ import { mount } from 'enzyme'; import configureStore from 'redux-mock-store'; import fetchMock from 'fetch-mock'; import thunk from 'redux-thunk'; +import { act } from 'react-dom/test-utils'; import sinon from 'sinon'; import { supersetTheme, ThemeProvider } from '@superset-ui/core'; -import { act } from 'react-dom/test-utils'; import Modal from 'src/common/components/Modal'; import ChangeDatasourceModal from 'src/datasource/ChangeDatasourceModal'; import waitForComponentToPaint from 'spec/helpers/waitForComponentToPaint'; @@ -47,11 +47,12 @@ const datasourceData = { uid: datasource.id, }; -const DATASOURCES_ENDPOINT = 'glob:*/superset/datasources/'; +const DATASOURCES_ENDPOINT = + 'glob:*/api/v1/dataset/?q=(order_column:changed_on_delta_humanized,order_direction:asc,page:0,page_size:20)'; const DATASOURCE_ENDPOINT = `glob:*/datasource/get/${datasourceData.type}/${datasourceData.id}`; const DATASOURCE_PAYLOAD = { new: 'data' }; -fetchMock.get(DATASOURCES_ENDPOINT, [mockDatasource['7__table']]); +fetchMock.get(DATASOURCES_ENDPOINT, { result: [mockDatasource['7__table']] }); fetchMock.get(DATASOURCE_ENDPOINT, DATASOURCE_PAYLOAD); async function mountAndWait(props = mockedProps) { @@ -80,14 +81,29 @@ describe('ChangeDatasourceModal', () => { }); it('fetches datasources', async () => { - expect(fetchMock.calls(/superset\/datasources/)).toHaveLength(3); + expect(fetchMock.calls(/api\/v1\/dataset/)).toHaveLength(6); + }); + + it('renders confirmation message', async () => { + act(() => { + wrapper.find('.datasource-link').at(0).props().onClick(); + }); + await waitForComponentToPaint(wrapper); + + expect(wrapper.find('.proceed-btn')).toExist(); }); it('changes the datasource', async () => { act(() => { - wrapper.find('.datasource-link').at(0).props().onClick(datasourceData); + wrapper.find('.datasource-link').at(0).props().onClick(); + }); + await waitForComponentToPaint(wrapper); + + act(() => { + wrapper.find('.proceed-btn').at(0).props().onClick(datasourceData); }); await waitForComponentToPaint(wrapper); + expect(fetchMock.calls(/datasource\/get\/table\/7/)).toHaveLength(1); }); }); diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopoverSimpleTabContent_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopoverSimpleTabContent_spec.jsx index 442527b77b4aa..fc13220940ce7 100644 --- a/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopoverSimpleTabContent_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/AdhocFilterEditPopoverSimpleTabContent_spec.jsx @@ -59,10 +59,10 @@ const simpleCustomFilter = new AdhocFilter({ }); const options = [ - { type: 'VARCHAR(255)', column_name: 'source' }, - { type: 'VARCHAR(255)', column_name: 'target' }, - { type: 'DOUBLE', column_name: 'value' }, - { saved_metric_name: 'my_custom_metric' }, + { type: 'VARCHAR(255)', column_name: 'source', id: 1 }, + { type: 'VARCHAR(255)', column_name: 'target', id: 2 }, + { type: 'DOUBLE', column_name: 'value', id: 3 }, + { saved_metric_name: 'my_custom_metric', id: 4 }, sumValueAdhocMetric, ]; @@ -91,9 +91,7 @@ describe('AdhocFilterEditPopoverSimpleTabContent', () => { it('passes the new adhocFilter to onChange after onSubjectChange', () => { const { wrapper, onChange } = setup(); - wrapper - .instance() - .onSubjectChange({ type: 'VARCHAR(255)', column_name: 'source' }); + wrapper.instance().onSubjectChange(1); expect(onChange.calledOnce).toBe(true); expect(onChange.lastCall.args[0]).toEqual( simpleAdhocFilter.duplicateWith({ subject: 'source' }), @@ -102,7 +100,7 @@ describe('AdhocFilterEditPopoverSimpleTabContent', () => { it('may alter the clause in onSubjectChange if the old clause is not appropriate', () => { const { wrapper, onChange } = setup(); - wrapper.instance().onSubjectChange(sumValueAdhocMetric); + wrapper.instance().onSubjectChange(sumValueAdhocMetric.optionName); expect(onChange.calledOnce).toBe(true); expect(onChange.lastCall.args[0]).toEqual( simpleAdhocFilter.duplicateWith({ diff --git a/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx b/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx index 5aff466065f2e..98a62bd84abf7 100644 --- a/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/AdhocMetricEditPopover_spec.jsx @@ -28,9 +28,9 @@ import AdhocMetricEditPopover from 'src/explore/components/AdhocMetricEditPopove import { AGGREGATES } from 'src/explore/constants'; const columns = [ - { type: 'VARCHAR(255)', column_name: 'source' }, - { type: 'VARCHAR(255)', column_name: 'target' }, - { type: 'DOUBLE', column_name: 'value' }, + { type: 'VARCHAR(255)', column_name: 'source', id: 1 }, + { type: 'VARCHAR(255)', column_name: 'target', id: 2 }, + { type: 'DOUBLE', column_name: 'value', id: 3 }, ]; const sumValueAdhocMetric = new AdhocMetric({ @@ -68,7 +68,7 @@ describe('AdhocMetricEditPopover', () => { it('overwrites the adhocMetric in state with onColumnChange', () => { const { wrapper } = setup(); - wrapper.instance().onColumnChange(columns[0]); + wrapper.instance().onColumnChange(columns[0].id); expect(wrapper.state('adhocMetric')).toEqual( sumValueAdhocMetric.duplicateWith({ column: columns[0] }), ); @@ -95,7 +95,7 @@ describe('AdhocMetricEditPopover', () => { expect(wrapper.find(Button).find({ disabled: true })).not.toExist(); wrapper.instance().onColumnChange(null); expect(wrapper.find(Button).find({ disabled: true })).toExist(); - wrapper.instance().onColumnChange({ column: columns[0] }); + wrapper.instance().onColumnChange(columns[0].id); expect(wrapper.find(Button).find({ disabled: true })).not.toExist(); wrapper.instance().onAggregateChange(null); expect(wrapper.find(Button).find({ disabled: true })).toExist(); @@ -104,7 +104,7 @@ describe('AdhocMetricEditPopover', () => { it('highlights save if changes are present', () => { const { wrapper } = setup(); expect(wrapper.find(Button).find({ buttonStyle: 'primary' })).not.toExist(); - wrapper.instance().onColumnChange({ column: columns[1] }); + wrapper.instance().onColumnChange(columns[1].id); expect(wrapper.find(Button).find({ buttonStyle: 'primary' })).toExist(); }); diff --git a/superset-frontend/spec/javascripts/explore/components/DatasourceControl_spec.jsx b/superset-frontend/spec/javascripts/explore/components/DatasourceControl_spec.jsx index 8f6b8e9492c6a..1c91c1cd25256 100644 --- a/superset-frontend/spec/javascripts/explore/components/DatasourceControl_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/components/DatasourceControl_spec.jsx @@ -24,6 +24,8 @@ import { Menu } from 'src/common/components'; import DatasourceModal from 'src/datasource/DatasourceModal'; import ChangeDatasourceModal from 'src/datasource/ChangeDatasourceModal'; import DatasourceControl from 'src/explore/components/controls/DatasourceControl'; +import Icon from 'src/components/Icon'; +import { Tooltip } from 'src/common/components/Tooltip'; const defaultProps = { name: 'datasource', @@ -40,6 +42,7 @@ const defaultProps = { backend: 'mysql', name: 'main', }, + health_check_message: 'Warning message!', }, actions: { setDatasource: sinon.spy(), @@ -91,4 +94,14 @@ describe('DatasourceControl', () => { ); expect(menuWrapper.find(Menu.Item)).toHaveLength(2); }); + + it('should render health check message', () => { + const wrapper = setup(); + const alert = wrapper.find(Icon).first(); + expect(alert.prop('name')).toBe('alert-solid'); + const tooltip = wrapper.find(Tooltip).at(1); + expect(tooltip.prop('title')).toBe( + defaultProps.datasource.health_check_message, + ); + }); }); diff --git a/superset-frontend/spec/javascripts/explore/utils_spec.jsx b/superset-frontend/spec/javascripts/explore/utils_spec.jsx index 8e419d1350d92..11a40b23762ae 100644 --- a/superset-frontend/spec/javascripts/explore/utils_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/utils_spec.jsx @@ -23,6 +23,7 @@ import { buildV1ChartDataPayload, getExploreUrl, getExploreLongUrl, + getDataTablePageSize, shouldUseLegacyApi, } from 'src/explore/exploreUtils'; import { @@ -200,6 +201,20 @@ describe('exploreUtils', () => { }); }); + describe('getDataTablePageSize', () => { + it('divides samples data into pages dynamically', () => { + let pageSize; + pageSize = getDataTablePageSize(500); + expect(pageSize).toEqual(20); + pageSize = getDataTablePageSize(0); + expect(pageSize).toEqual(50); + pageSize = getDataTablePageSize(1); + expect(pageSize).toEqual(10000); + pageSize = getDataTablePageSize(1000000); + expect(pageSize).toEqual(5); + }); + }); + describe('buildV1ChartDataPayload', () => { it('generate valid request payload despite no registered buildQuery', () => { const v1RequestPayload = buildV1ChartDataPayload({ diff --git a/superset-frontend/spec/javascripts/views/CRUD/alert/AlertList_spec.jsx b/superset-frontend/spec/javascripts/views/CRUD/alert/AlertList_spec.jsx index dff305e867925..abb4e9183fcc0 100644 --- a/superset-frontend/spec/javascripts/views/CRUD/alert/AlertList_spec.jsx +++ b/superset-frontend/spec/javascripts/views/CRUD/alert/AlertList_spec.jsx @@ -19,6 +19,7 @@ import fetchMock from 'fetch-mock'; import React from 'react'; import configureStore from 'redux-mock-store'; +import { Provider } from 'react-redux'; import thunk from 'redux-thunk'; import { styledMount as mount } from 'spec/helpers/theming'; import waitForComponentToPaint from 'spec/helpers/waitForComponentToPaint'; @@ -78,33 +79,30 @@ fetchMock.get(alertsCreatedByEndpoint, { result: [] }); fetchMock.put(alertEndpoint, { ...mockalerts[0], active: false }); fetchMock.put(alertsEndpoint, { ...mockalerts[0], active: false }); -async function mountAndWait(props) { - const mounted = mount(); - await waitForComponentToPaint(mounted); - - return mounted; -} - describe('AlertList', () => { - let wrapper; + const wrapper = mount( + + + , + ); beforeAll(async () => { - wrapper = await mountAndWait(); + await waitForComponentToPaint(wrapper); }); - it('renders', () => { + it('renders', async () => { expect(wrapper.find(AlertList)).toExist(); }); - it('renders a SubMenu', () => { + it('renders a SubMenu', async () => { expect(wrapper.find(SubMenu)).toExist(); }); - it('renders a ListView', () => { + it('renders a ListView', async () => { expect(wrapper.find(ListView)).toExist(); }); - it('renders switches', () => { + it('renders switches', async () => { expect(wrapper.find(Switch)).toHaveLength(3); }); }); diff --git a/superset-frontend/spec/javascripts/views/CRUD/alert/AlertReportModal_spec.jsx b/superset-frontend/spec/javascripts/views/CRUD/alert/AlertReportModal_spec.jsx new file mode 100644 index 0000000000000..a24b9526a7957 --- /dev/null +++ b/superset-frontend/spec/javascripts/views/CRUD/alert/AlertReportModal_spec.jsx @@ -0,0 +1,137 @@ +/** + * 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 React from 'react'; +import { Provider } from 'react-redux'; +import thunk from 'redux-thunk'; +import configureStore from 'redux-mock-store'; +import fetchMock from 'fetch-mock'; +import AlertReportModal from 'src/views/CRUD/alert/AlertReportModal'; +import Modal from 'src/common/components/Modal'; +import waitForComponentToPaint from 'spec/helpers/waitForComponentToPaint'; +import { styledMount as mount } from 'spec/helpers/theming'; + +const mockData = { + id: 1, + name: 'test report', + description: 'test report description', +}; +const FETCH_REPORT_ENDPOINT = 'glob:*/api/v1/report/*'; +const REPORT_PAYLOAD = { result: mockData }; + +fetchMock.get(FETCH_REPORT_ENDPOINT, REPORT_PAYLOAD); + +const mockStore = configureStore([thunk]); +const store = mockStore({}); + +// Report mock is default for testing +const mockedProps = { + addDangerToast: () => {}, + onAdd: jest.fn(() => []), + onHide: () => {}, + show: true, + isReport: true, +}; + +// Related mocks +const ownersEndpoint = 'glob:*/api/v1/dashboard/related/owners?*'; +const databaseEndpoint = 'glob:*/api/v1/dataset/related/database?*'; +const dashboardEndpoint = 'glob:*/api/v1/dashboard?*'; +const chartEndpoint = 'glob:*/api/v1/chart?*'; + +fetchMock.get(ownersEndpoint, { + result: [], +}); + +fetchMock.get(databaseEndpoint, { + result: [], +}); + +fetchMock.get(dashboardEndpoint, { + result: [], +}); + +fetchMock.get(chartEndpoint, { + result: [], +}); + +async function mountAndWait(props = mockedProps) { + const mounted = mount( + + + , + { + context: { store }, + }, + ); + + await waitForComponentToPaint(mounted); + + return mounted; +} + +describe('AlertReportModal', () => { + let wrapper; + + beforeAll(async () => { + wrapper = await mountAndWait(); + }); + + it('renders', () => { + expect(wrapper.find(AlertReportModal)).toExist(); + }); + + it('renders a Modal', () => { + expect(wrapper.find(Modal)).toExist(); + }); + + it('renders add header for report when no alert is included, and isReport is true', async () => { + const addWrapper = await mountAndWait(); + + expect( + addWrapper.find('[data-test="alert-report-modal-title"]').text(), + ).toEqual('Add Report'); + }); + + it('renders add header for alert when no alert is included, and isReport is false', async () => { + const props = { + ...mockedProps, + isReport: false, + }; + + const addWrapper = await mountAndWait(props); + + expect( + addWrapper.find('[data-test="alert-report-modal-title"]').text(), + ).toEqual('Add Alert'); + }); + + it.skip('renders edit header when alert prop is included', () => { + expect( + wrapper.find('[data-test="alert-report-modal-title"]').text(), + ).toEqual('Edit Report'); + }); + + it('renders input element for name', () => { + expect(wrapper.find('input[name="name"]')).toExist(); + }); + + it('renders input element for description', () => { + expect(wrapper.find('input[name="description"]')).toExist(); + }); +}); diff --git a/superset-frontend/spec/javascripts/views/CRUD/annotationlayers/AnnotationLayersList_spec.jsx b/superset-frontend/spec/javascripts/views/CRUD/annotationlayers/AnnotationLayersList_spec.jsx index 7a4847007e07e..fa6adddae69af 100644 --- a/superset-frontend/spec/javascripts/views/CRUD/annotationlayers/AnnotationLayersList_spec.jsx +++ b/superset-frontend/spec/javascripts/views/CRUD/annotationlayers/AnnotationLayersList_spec.jsx @@ -61,7 +61,7 @@ const mockUser = { }; fetchMock.get(layersInfoEndpoint, { - permissions: ['can_delete'], + permissions: ['can_write'], }); fetchMock.get(layersEndpoint, { result: mocklayers, @@ -156,7 +156,7 @@ describe('AnnotationLayersList', () => { }); it('shows/hides bulk actions when bulk actions is clicked', async () => { - const button = wrapper.find(Button).at(0); + const button = wrapper.find(Button).at(1); act(() => { button.props().onClick(); }); diff --git a/superset-frontend/spec/javascripts/views/CRUD/chart/ChartList_spec.jsx b/superset-frontend/spec/javascripts/views/CRUD/chart/ChartList_spec.jsx index 1ba734074689b..33f2385dabd51 100644 --- a/superset-frontend/spec/javascripts/views/CRUD/chart/ChartList_spec.jsx +++ b/superset-frontend/spec/javascripts/views/CRUD/chart/ChartList_spec.jsx @@ -59,7 +59,7 @@ const mockUser = { }; fetchMock.get(chartsInfoEndpoint, { - permissions: ['can_list', 'can_edit', 'can_delete'], + permissions: ['can_read', 'can_write'], }); fetchMock.get(chartssOwnersEndpoint, { diff --git a/superset-frontend/spec/javascripts/views/CRUD/data/dataset/DatasetList_spec.jsx b/superset-frontend/spec/javascripts/views/CRUD/data/dataset/DatasetList_spec.jsx index d919bc033b48a..a816a60910f8d 100644 --- a/superset-frontend/spec/javascripts/views/CRUD/data/dataset/DatasetList_spec.jsx +++ b/superset-frontend/spec/javascripts/views/CRUD/data/dataset/DatasetList_spec.jsx @@ -58,7 +58,7 @@ const mockUser = { }; fetchMock.get(datasetsInfoEndpoint, { - permissions: ['can_list', 'can_edit', 'can_add', 'can_delete'], + permissions: ['can_read', 'can_write'], }); fetchMock.get(datasetsOwnersEndpoint, { result: [], diff --git a/superset-frontend/src/SqlLab/components/ResultSet.tsx b/superset-frontend/src/SqlLab/components/ResultSet.tsx index a5a1d5f842054..d421a43a1cabb 100644 --- a/superset-frontend/src/SqlLab/components/ResultSet.tsx +++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx @@ -28,6 +28,7 @@ import { styled, t } from '@superset-ui/core'; import ErrorMessageWithStackTrace from 'src/components/ErrorMessage/ErrorMessageWithStackTrace'; import { SaveDatasetModal } from 'src/SqlLab/components/SaveDatasetModal'; import { getByUser, put as updateDatset } from 'src/api/dataset'; +import { ErrorTypeEnum } from 'src/components/ErrorMessage/types'; import Loading from '../../components/Loading'; import ExploreCtasResultsButton from './ExploreCtasResultsButton'; import ExploreResultsButton from './ExploreResultsButton'; @@ -489,10 +490,17 @@ export default class ResultSet extends React.PureComponent< return Query was stopped; } if (query.state === 'failed') { + // TODO (betodealmeida): handle this logic through the error component + // registry + const title = + query?.errors?.[0].error_type === + ErrorTypeEnum.MISSING_TEMPLATE_PARAMS_ERROR + ? t('Parameter Error') + : t('Database Error'); return (
{query.errorMessage}} copyText={query.errorMessage || undefined} diff --git a/superset-frontend/src/SqlLab/components/SqlEditor.jsx b/superset-frontend/src/SqlLab/components/SqlEditor.jsx index 044fee86ae579..4b4a1bc1acb4d 100644 --- a/superset-frontend/src/SqlLab/components/SqlEditor.jsx +++ b/superset-frontend/src/SqlLab/components/SqlEditor.jsx @@ -566,13 +566,15 @@ class SqlEditor extends React.PureComponent { {' '} {t('Autocomplete')} {' '} - { - this.props.actions.queryEditorSetTemplateParams(qe, params); - }} - code={qe.templateParams} - /> + {isFeatureEnabled(FeatureFlag.ENABLE_TEMPLATE_PROCESSING) && ( + { + this.props.actions.queryEditorSetTemplateParams(qe, params); + }} + code={qe.templateParams} + /> + )} {limitWarning} {this.props.latestQuery && ( ( + + ))` + height: 100%; + .ant-collapse-item { + border: 0; + height: 100%; + &:last-of-type.ant-collapse-item-active { + padding-bottom: ${({ theme }) => theme.gridUnit * 3}px; + } + .ant-collapse-header { + font-weight: ${({ bold, theme }) => + bold + ? theme.typography.weights.bold + : theme.typography.weights.normal}; + font-size: ${({ bigger, theme }) => + bigger ? `${theme.gridUnit * 4}px` : 'inherit'}; + + ${({ light, theme }) => + light && + ` + color: ${theme.colors.grayscale.light4}; + .ant-collapse-arrow svg { + color: ${theme.colors.grayscale.light4}; + } + `} + } + .ant-collapse-content { + height: 100%; + .ant-collapse-content-box { + height: 100%; + .loading.inline { + margin: ${({ theme }) => theme.gridUnit * 12}px auto; + display: block; + } + } + } + } + `, + { + Panel: AntdCollapse.Panel, + }, +); + +export default Collapse; diff --git a/superset-frontend/src/common/components/CronPicker.tsx b/superset-frontend/src/common/components/CronPicker.tsx new file mode 100644 index 0000000000000..b5825ec56b49f --- /dev/null +++ b/superset-frontend/src/common/components/CronPicker.tsx @@ -0,0 +1,117 @@ +/** + * 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 React from 'react'; +import { styled, t } from '@superset-ui/core'; +import ReactCronPicker, { Locale, CronProps } from 'react-js-cron'; + +export * from 'react-js-cron'; + +export const LOCALE: Locale = { + everyText: t('every'), + emptyMonths: t('every month'), + emptyMonthDays: t('every day of the month'), + emptyMonthDaysShort: t('day of the month'), + emptyWeekDays: t('every day of the week'), + emptyWeekDaysShort: t('day of the week'), + emptyHours: t('every hour'), + emptyMinutes: t('every minute UTC'), + emptyMinutesForHourPeriod: t('every'), + yearOption: t('year'), + monthOption: t('month'), + weekOption: t('week'), + dayOption: t('day'), + hourOption: t('hour'), + minuteOption: t('minute'), + rebootOption: t('reboot'), + prefixPeriod: t('Every'), + prefixMonths: t('in'), + prefixMonthDays: t('on'), + prefixWeekDays: t('on'), + prefixWeekDaysForMonthAndYearPeriod: t('and'), + prefixHours: t('at'), + prefixMinutes: t(':'), + prefixMinutesForHourPeriod: t('at'), + suffixMinutesForHourPeriod: t('minute(s) UTC'), + errorInvalidCron: t('Invalid cron expression'), + clearButtonText: t('Clear'), + weekDays: [ + // Order is important, the index will be used as value + t('Sunday'), // Sunday must always be first, it's "0" + t('Monday'), + t('Tuesday'), + t('Wednesday'), + t('Thursday'), + t('Friday'), + t('Saturday'), + ], + months: [ + // Order is important, the index will be used as value + t('January'), + t('February'), + t('March'), + t('April'), + t('May'), + t('June'), + t('July'), + t('August'), + t('September'), + t('October'), + t('November'), + t('December'), + ], + // Order is important, the index will be used as value + altWeekDays: [ + t('SUN'), // Sunday must always be first, it's "0" + t('MON'), + t('TUE'), + t('WED'), + t('THU'), + t('FRI'), + t('SAT'), + ], + // Order is important, the index will be used as value + altMonths: [ + t('JAN'), + t('FEB'), + t('MAR'), + t('APR'), + t('MAY'), + t('JUN'), + t('JUL'), + t('AUG'), + t('SEP'), + t('OCT'), + t('NOV'), + t('DEC'), + ], +}; + +export const CronPicker = styled((props: CronProps) => ( + +))` + .react-js-cron-select:not(.react-js-cron-custom-select) > div:first-of-type, + .react-js-cron-custom-select { + border-radius: ${({ theme }) => theme.gridUnit}px; + background-color: ${({ theme }) => + theme.colors.grayscale.light4} !important; + } + .react-js-cron-custom-select > div:first-of-type { + border-radius: ${({ theme }) => theme.gridUnit}px; + } +`; diff --git a/superset-frontend/src/common/components/Modal/Modal.tsx b/superset-frontend/src/common/components/Modal/Modal.tsx index 4431fd32c85d2..a11e04253192f 100644 --- a/superset-frontend/src/common/components/Modal/Modal.tsx +++ b/superset-frontend/src/common/components/Modal/Modal.tsx @@ -84,6 +84,7 @@ const StyledModal = styled(BaseModal)` .ant-modal-body { padding: ${({ theme }) => theme.gridUnit * 4}px; + overflow: auto; } .ant-modal-footer { @@ -105,6 +106,10 @@ const StyledModal = styled(BaseModal)` .ant-tabs { margin-top: -${({ theme }) => theme.gridUnit * 4}px; } + + &.no-content-padding .ant-modal-body { + padding: 0; + } `; const CustomModal = ({ diff --git a/superset-frontend/src/common/components/Radio.tsx b/superset-frontend/src/common/components/Radio.tsx new file mode 100644 index 0000000000000..3134fb7bab531 --- /dev/null +++ b/superset-frontend/src/common/components/Radio.tsx @@ -0,0 +1,54 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { styled } from '@superset-ui/core'; +import { Radio as BaseRadio } from 'src/common/components'; + +const StyledRadio = styled(BaseRadio)` + .ant-radio-inner { + width: 18px; + height: 18px; + border-width: 2px; + border-color: ${({ theme }) => theme.colors.grayscale.base}; + } + + .ant-radio.ant-radio-checked { + .ant-radio-inner { + background-color: ${({ theme }) => theme.colors.primary.dark1}; + border-color: ${({ theme }) => theme.colors.primary.dark1}; + } + + .ant-radio-inner::after { + background-color: ${({ theme }) => theme.colors.grayscale.light5}; + } + } + + .ant-radio:hover, + .ant-radio:focus { + .ant-radio-inner { + border-color: ${({ theme }) => theme.colors.primary.dark1}; + } + } +`; +const StyledGroup = styled(BaseRadio.Group)` + font-size: inherit; +`; + +export const Radio = Object.assign(StyledRadio, { + Group: StyledGroup, +}); diff --git a/superset-frontend/src/common/components/Select.tsx b/superset-frontend/src/common/components/Select.tsx new file mode 100644 index 0000000000000..75bd073912e6e --- /dev/null +++ b/superset-frontend/src/common/components/Select.tsx @@ -0,0 +1,54 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { styled } from '@superset-ui/core'; +import { Select as BaseSelect } from 'src/common/components'; + +const StyledSelect = styled(BaseSelect)` + display: block; +`; + +const StyledGraySelect = styled(StyledSelect)` + &.ant-select-single { + .ant-select-selector { + height: 36px; + padding: 0 11px; + background-color: ${({ theme }) => theme.colors.grayscale.light3}; + border: none; + + .ant-select-selection-search-input { + height: 100%; + } + + .ant-select-selection-item, + .ant-select-selection-placeholder { + line-height: 35px; + color: ${({ theme }) => theme.colors.grayscale.dark1}; + } + } + } +`; +const StyledOption = BaseSelect.Option; + +export const Select = Object.assign(StyledSelect, { + Option: StyledOption, +}); + +export const GraySelect = Object.assign(StyledGraySelect, { + Option: StyledOption, +}); diff --git a/superset-frontend/src/common/components/common.stories.tsx b/superset-frontend/src/common/components/common.stories.tsx index 59d83cf2ec7d9..969d437a9375b 100644 --- a/superset-frontend/src/common/components/common.stories.tsx +++ b/superset-frontend/src/common/components/common.stories.tsx @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import React from 'react'; +import React, { useState, useRef, useCallback } from 'react'; import { action } from '@storybook/addon-actions'; import { withKnobs, boolean, select } from '@storybook/addon-knobs'; import Button from 'src/components/Button'; @@ -24,8 +24,8 @@ import Modal from './Modal'; import Tabs, { EditableTabs } from './Tabs'; import AntdPopover from './Popover'; import { Tooltip as AntdTooltip } from './Tooltip'; -import { Menu } from '.'; import { Switch as AntdSwitch } from './Switch'; +import { Menu, Input, Divider } from '.'; import { Dropdown } from './Dropdown'; import InfoTooltip from './InfoTooltip'; import { @@ -34,6 +34,8 @@ import { } from './DatePicker'; import Badge from './Badge'; import ProgressBar from './ProgressBar'; +import Collapse from './Collapse'; +import { CronPicker, CronError } from './CronPicker'; export default { title: 'Common Components', @@ -261,3 +263,102 @@ export const BadgeTextColored = () => ( export const BadgeSuccess = () => ; export const BadgeError = () => ; export const BadgeSmall = () => ; + +export const CollapseDefault = () => ( + + + Hi! I am a sample content + + + Hi! I am another sample content + + +); +export const CollapseGhost = () => ( + + + Hi! I am a sample content + + + Hi! I am another sample content + + +); +export const CollapseBold = () => ( + + + Hi! I am a sample content + + + Hi! I am another sample content + + +); +export const CollapseBigger = () => ( + + + Hi! I am a sample content + + + Hi! I am another sample content + + +); +export const CollapseTextLight = () => ( + + + Hi! I am a sample content + + + Hi! I am another sample content + + +); +export function StyledCronPicker() { + const inputRef = useRef(null); + const defaultValue = '30 5 * * 1,6'; + const [value, setValue] = useState(defaultValue); + const customSetValue = useCallback( + (newValue: string) => { + setValue(newValue); + inputRef.current?.setValue(newValue); + }, + [inputRef], + ); + const [error, onError] = useState(); + + return ( +
+ { + setValue(event.target.value); + }} + onPressEnter={() => { + setValue(inputRef.current?.input.value || ''); + }} + /> + + + + + +

+ Error: {error ? error.description : 'undefined'} +

+
+ ); +} diff --git a/superset-frontend/src/common/components/index.tsx b/superset-frontend/src/common/components/index.tsx index 1ae7dee24d85e..4b1fa15531c2e 100644 --- a/superset-frontend/src/common/components/index.tsx +++ b/superset-frontend/src/common/components/index.tsx @@ -32,23 +32,24 @@ export { Avatar, Button, Card, - Collapse, DatePicker, + Divider, Dropdown, Empty, Input, Modal, Popover, + Radio, Select, Skeleton, Switch, - Radio, Tabs, Tooltip, } from 'antd'; -export { default as Badge } from 'src/common/components/Badge'; -export { default as Progress } from 'src/common/components/ProgressBar'; +export { default as Collapse } from './Collapse'; +export { default as Badge } from './Badge'; +export { default as Progress } from './ProgressBar'; export const MenuItem = styled(AntdMenu.Item)` > a { diff --git a/superset-frontend/src/components/DeleteModal.tsx b/superset-frontend/src/components/DeleteModal.tsx index 37a9ca580c548..59a97ebf6f75f 100644 --- a/superset-frontend/src/components/DeleteModal.tsx +++ b/superset-frontend/src/components/DeleteModal.tsx @@ -73,6 +73,7 @@ export default function DeleteModal({ id="delete" type="text" bsSize="sm" + autoComplete="off" onChange={( event: React.FormEvent, ) => { diff --git a/superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx b/superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx index 74ef9ffc54ad8..e31dcd7ebbab9 100644 --- a/superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx +++ b/superset-frontend/src/components/ErrorMessage/ErrorAlert.tsx @@ -59,6 +59,11 @@ const ErrorModal = styled(Modal)<{ level: ErrorLevel }>` color: ${({ level, theme }) => theme.colors[level].dark2}; overflow-wrap: break-word; + .ant-modal-header { + background-color: ${({ level, theme }) => theme.colors[level].light2}; + padding: ${({ theme }) => 4 * theme.gridUnit}px; + } + .icon { margin-right: ${({ theme }) => 2 * theme.gridUnit}px; } @@ -66,7 +71,6 @@ const ErrorModal = styled(Modal)<{ level: ErrorLevel }>` .header { display: flex; align-items: center; - background-color: ${({ level, theme }) => theme.colors[level].light2}; font-size: ${({ theme }) => theme.typography.sizes.l}px; } `; diff --git a/superset-frontend/src/components/ErrorMessage/types.ts b/superset-frontend/src/components/ErrorMessage/types.ts index dc0c3948528c3..40aa6b6bef781 100644 --- a/superset-frontend/src/components/ErrorMessage/types.ts +++ b/superset-frontend/src/components/ErrorMessage/types.ts @@ -42,6 +42,9 @@ export const ErrorTypeEnum = { // Other errors BACKEND_TIMEOUT_ERROR: 'BACKEND_TIMEOUT_ERROR', + + // Sqllab error + MISSING_TEMPLATE_PARAMS_ERROR: 'MISSING_TEMPLATE_PARAMS_ERROR', } as const; type ValueOf = T[keyof T]; diff --git a/superset-frontend/src/components/ImportModal/ImportModal.test.tsx b/superset-frontend/src/components/ImportModal/ImportModal.test.tsx index 1e922b4d12873..ebae34c9c62bc 100644 --- a/superset-frontend/src/components/ImportModal/ImportModal.test.tsx +++ b/superset-frontend/src/components/ImportModal/ImportModal.test.tsx @@ -22,6 +22,7 @@ import configureStore from 'redux-mock-store'; import { styledMount as mount } from 'spec/helpers/theming'; import { ReactWrapper } from 'enzyme'; +import { ImportResourceName } from 'src/views/CRUD/types'; import ImportModelsModal, { StyledIcon } from 'src/components/ImportModal'; import Modal from 'src/common/components/Modal'; @@ -29,10 +30,11 @@ const mockStore = configureStore([thunk]); const store = mockStore({}); const requiredProps = { - resourceName: 'model', - resourceLabel: 'model', + resourceName: 'database' as ImportResourceName, + resourceLabel: 'database', icon: , passwordsNeededMessage: 'Passwords are needed', + confirmOverwriteMessage: 'Database exists', addDangerToast: () => {}, addSuccessToast: () => {}, onModelImport: () => {}, @@ -61,8 +63,8 @@ describe('ImportModelsModal', () => { expect(wrapper.find(Modal)).toExist(); }); - it('renders "Import model" header', () => { - expect(wrapper.find('h4').text()).toEqual('Import model'); + it('renders "Import database" header', () => { + expect(wrapper.find('h4').text()).toEqual('Import database'); }); it('renders a label and a file input field', () => { diff --git a/superset-frontend/src/components/ImportModal/index.tsx b/superset-frontend/src/components/ImportModal/index.tsx index 1c26623f10c78..1de3f75bb7df4 100644 --- a/superset-frontend/src/components/ImportModal/index.tsx +++ b/superset-frontend/src/components/ImportModal/index.tsx @@ -22,6 +22,7 @@ import { styled, t } from '@superset-ui/core'; import Icon from 'src//components/Icon'; import Modal from 'src/common/components/Modal'; import { useImportResource } from 'src/views/CRUD/hooks'; +import { ImportResourceName } from 'src/views/CRUD/types'; export const StyledIcon = styled(Icon)` margin: auto ${({ theme }) => theme.gridUnit * 2}px auto 0; @@ -97,10 +98,11 @@ const StyledInputContainer = styled.div` `; export interface ImportModelsModalProps { - resourceName: string; + resourceName: ImportResourceName; resourceLabel: string; icon: React.ReactNode; passwordsNeededMessage: string; + confirmOverwriteMessage: string; addDangerToast: (msg: string) => void; addSuccessToast: (msg: string) => void; onModelImport: () => void; @@ -115,6 +117,7 @@ const ImportModelsModal: FunctionComponent = ({ resourceLabel, icon, passwordsNeededMessage, + confirmOverwriteMessage, addDangerToast, addSuccessToast, onModelImport, @@ -123,9 +126,14 @@ const ImportModelsModal: FunctionComponent = ({ passwordFields = [], setPasswordFields = () => {}, }) => { - const [uploadFile, setUploadFile] = useState(null); const [isHidden, setIsHidden] = useState(true); + const [uploadFile, setUploadFile] = useState(null); const [passwords, setPasswords] = useState>({}); + const [needsOverwriteConfirm, setNeedsOverwriteConfirm] = useState( + false, + ); + const [confirmedOverwrite, setConfirmedOverwrite] = useState(false); + const fileInputRef = useRef(null); const clearModal = () => { @@ -143,14 +151,18 @@ const ImportModelsModal: FunctionComponent = ({ }; const { - state: { passwordsNeeded }, + state: { alreadyExists, passwordsNeeded }, importResource, - } = useImportResource(resourceName, resourceLabel, handleErrorMsg); + } = useImportResource(resourceName, resourceLabel, handleErrorMsg); useEffect(() => { setPasswordFields(passwordsNeeded); }, [passwordsNeeded, setPasswordFields]); + useEffect(() => { + setNeedsOverwriteConfirm(alreadyExists.length > 0); + }, [alreadyExists]); + // Functions const hide = () => { setIsHidden(true); @@ -162,7 +174,7 @@ const ImportModelsModal: FunctionComponent = ({ return; } - importResource(uploadFile, passwords).then(result => { + importResource(uploadFile, passwords, confirmedOverwrite).then(result => { if (result) { addSuccessToast(t('The import was successful')); clearModal(); @@ -176,6 +188,11 @@ const ImportModelsModal: FunctionComponent = ({ setUploadFile((files && files[0]) || null); }; + const confirmOverwrite = (event: React.ChangeEvent) => { + const targetValue = (event.currentTarget?.value as string) ?? ''; + setConfirmedOverwrite(targetValue.toUpperCase() === t('OVERWRITE')); + }; + const renderPasswordFields = () => { if (passwordFields.length === 0) { return null; @@ -208,6 +225,31 @@ const ImportModelsModal: FunctionComponent = ({ ); }; + const renderOverwriteConfirmation = () => { + if (alreadyExists.length === 0) { + return null; + } + + return ( + <> + +
{confirmOverwriteMessage}
+
+ +
+ +
+ + ); + }; + // Show/hide if (isHidden && show) { setIsHidden(false); @@ -217,10 +259,13 @@ const ImportModelsModal: FunctionComponent = ({ = ({ /> {renderPasswordFields()} + {renderOverwriteConfirmation()} ); }; diff --git a/superset-frontend/src/components/Menu/Menu.tsx b/superset-frontend/src/components/Menu/Menu.tsx index 28cb532ee0cbc..173de84be8c19 100644 --- a/superset-frontend/src/components/Menu/Menu.tsx +++ b/superset-frontend/src/components/Menu/Menu.tsx @@ -99,12 +99,10 @@ const StyledHeader = styled.header` padding-left: 12px; } - .navbar-nav > li > a { + .navbar-inverse .navbar-nav > li > a { color: ${({ theme }) => theme.colors.grayscale.dark1}; border-bottom: none; - &:focus { - border-bottom: none; - } + transition: background-color ${({ theme }) => theme.transitionTiming}s; &:after { content: ''; position: absolute; @@ -115,20 +113,23 @@ const StyledHeader = styled.header` opacity: 0; transform: translateX(-50%); transition: all ${({ theme }) => theme.transitionTiming}s; + background-color: ${({ theme }) => theme.colors.primary.base}; + } + &:focus { + border-bottom: none; + background-color: transparent; + /* background-color: ${({ theme }) => theme.colors.primary.light5}; */ } - &:hover { color: ${({ theme }) => theme.colors.grayscale.dark1}; + background-color: ${({ theme }) => theme.colors.primary.light5}; border-bottom: none; + margin: 0; &:after { opacity: 1; width: 100%; } } - &:hover, - &:focus { - margin: 0; - } } .navbar-right { diff --git a/superset-frontend/src/components/URLShortLinkModal.jsx b/superset-frontend/src/components/URLShortLinkModal.tsx similarity index 78% rename from superset-frontend/src/components/URLShortLinkModal.jsx rename to superset-frontend/src/components/URLShortLinkModal.tsx index 2b5bbfca8bdd5..40e9b4521b817 100644 --- a/superset-frontend/src/components/URLShortLinkModal.jsx +++ b/superset-frontend/src/components/URLShortLinkModal.tsx @@ -17,24 +17,38 @@ * under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import { t } from '@superset-ui/core'; import CopyToClipboard from './CopyToClipboard'; import { getShortUrl } from '../utils/common'; import withToasts from '../messageToasts/enhancers/withToasts'; import ModalTrigger from './ModalTrigger'; -const propTypes = { - url: PropTypes.string, - emailSubject: PropTypes.string, - emailContent: PropTypes.string, - addDangerToast: PropTypes.func.isRequired, - title: PropTypes.string, - triggerNode: PropTypes.node.isRequired, +type URLShortLinkModalProps = { + url: string; + emailSubject: string; + emailContent: string; + title?: string; + addDangerToast: (msg: string) => void; + triggerNode: JSX.Element; }; -class URLShortLinkModal extends React.Component { - constructor(props) { +type URLShortLinkModalState = { + shortUrl: string; +}; + +class URLShortLinkModal extends React.Component< + URLShortLinkModalProps, + URLShortLinkModalState +> { + static defaultProps = { + url: window.location.href.substring(window.location.origin.length), + emailSubject: '', + emailContent: '', + }; + + modal: ModalTrigger | null; + + constructor(props: URLShortLinkModalProps) { super(props); this.state = { shortUrl: '', @@ -45,11 +59,11 @@ class URLShortLinkModal extends React.Component { this.getCopyUrl = this.getCopyUrl.bind(this); } - onShortUrlSuccess(shortUrl) { + onShortUrlSuccess(shortUrl: string) { this.setState(() => ({ shortUrl })); } - setModalRef(ref) { + setModalRef(ref: ModalTrigger | null) { this.modal = ref; } @@ -88,12 +102,4 @@ class URLShortLinkModal extends React.Component { } } -URLShortLinkModal.defaultProps = { - url: window.location.href.substring(window.location.origin.length), - emailSubject: '', - emailContent: '', -}; - -URLShortLinkModal.propTypes = propTypes; - export default withToasts(URLShortLinkModal); diff --git a/superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel.tsx b/superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel.tsx index a91cfe4a908ef..e3a7d3a6e4644 100644 --- a/superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel.tsx +++ b/superset-frontend/src/dashboard/components/FiltersBadge/DetailsPanel.tsx @@ -117,9 +117,6 @@ const DetailsPanelPopover = ({ padding-bottom: 0; } } - .ant-collapse-item:last-of-type.ant-collapse-item-active { - padding-bottom: ${theme.gridUnit * 3}px; - } &.ant-popover-placement-bottom, &.ant-popover-placement-bottomLeft, &.ant-popover-placement-bottomRight { @@ -155,15 +152,13 @@ const DetailsPanelPopover = ({ &.ant-popover { color: ${theme.colors.grayscale.light4}; } - .ant-collapse-arrow svg { - color: ${theme.colors.grayscale.light4}; - } } `} /> diff --git a/superset-frontend/src/dashboard/components/SliceHeaderControls.jsx b/superset-frontend/src/dashboard/components/SliceHeaderControls.jsx index 673f2baf6e956..58351990a693d 100644 --- a/superset-frontend/src/dashboard/components/SliceHeaderControls.jsx +++ b/superset-frontend/src/dashboard/components/SliceHeaderControls.jsx @@ -176,7 +176,7 @@ class SliceHeaderControls extends React.PureComponent { const refreshTooltip = isCached ? t('Cached %s', cachedWhen) : (updatedWhen && t('Fetched %s', updatedWhen)) || ''; - const resizeLabel = isFullSize ? t('Minimize') : t('Maximize'); + const resizeLabel = isFullSize ? t('Minimize Chart') : t('Maximize Chart'); const menu = ( - {t('Explore chart')} + {t('View Chart in Explore')} )} - {this.props.supersetCanCSV && ( - {t('Export CSV')} - )} - - {resizeLabel} - + {resizeLabel} + {t('Download as image')} + + {this.props.supersetCanCSV && ( + {t('Export CSV')} + )} ); diff --git a/superset-frontend/src/datasource/ChangeDatasourceModal.tsx b/superset-frontend/src/datasource/ChangeDatasourceModal.tsx index 81b9b8cb8c943..77b3ad4627243 100644 --- a/superset-frontend/src/datasource/ChangeDatasourceModal.tsx +++ b/superset-frontend/src/datasource/ChangeDatasourceModal.tsx @@ -20,25 +20,53 @@ import React, { FunctionComponent, useState, useRef, - useMemo, useEffect, + useCallback, } from 'react'; import { Alert, FormControl, FormControlProps } from 'react-bootstrap'; -import { SupersetClient, t } from '@superset-ui/core'; +import { SupersetClient, t, styled } from '@superset-ui/core'; import TableView from 'src/components/TableView'; -import Modal from 'src/common/components/Modal'; +import StyledModal from 'src/common/components/Modal'; +import Button from 'src/components/Button'; +import { useListViewResource } from 'src/views/CRUD/hooks'; +import Dataset from 'src/types/Dataset'; +import { useDebouncedEffect } from 'src/explore/exploreUtils'; import { getClientErrorObject } from '../utils/getClientErrorObject'; import Loading from '../components/Loading'; import withToasts from '../messageToasts/enhancers/withToasts'; +const CONFIRM_WARNING_MESSAGE = t( + 'Warning! Changing the dataset may break the chart if the metadata (columns/metrics) does not exist in the target dataset', +); + +interface Datasource { + type: string; + id: number; + uid: string; +} + interface ChangeDatasourceModalProps { addDangerToast: (msg: string) => void; - onChange: (id: number) => void; + addSuccessToast: (msg: string) => void; + onChange: (uid: string) => void; onDatasourceSave: (datasource: object, errors?: Array) => {}; onHide: () => void; show: boolean; } +const ConfirmModalStyled = styled.div` + .btn-container { + display: flex; + justify-content: flex-end; + padding: 0px 15px; + margin: 10px 0 0 0; + } + + .confirm-modal-container { + margin: 9px; + } +`; + const TABLE_COLUMNS = [ 'name', 'type', @@ -47,86 +75,78 @@ const TABLE_COLUMNS = [ 'creator', ].map(col => ({ accessor: col, Header: col })); -const TABLE_FILTERABLE = ['rawName', 'type', 'schema', 'connection', 'creator']; const CHANGE_WARNING_MSG = t( 'Changing the dataset may break the chart if the chart relies ' + 'on columns or metadata that does not exist in the target dataset', ); +const emptyRequest = { + pageIndex: 0, + pageSize: 20, + filters: [], + sortBy: [{ id: 'changed_on_delta_humanized' }], +}; + const ChangeDatasourceModal: FunctionComponent = ({ addDangerToast, + addSuccessToast, onChange, onDatasourceSave, onHide, show, }) => { - const [datasources, setDatasources] = useState(null); const [filter, setFilter] = useState(undefined); - const [loading, setLoading] = useState(true); + const [confirmChange, setConfirmChange] = useState(false); + const [confirmedDataset, setConfirmedDataset] = useState(); let searchRef = useRef(null); - useEffect(() => { - const selectDatasource = (datasource: any) => { - SupersetClient.get({ - endpoint: `/datasource/get/${datasource.type}/${datasource.id}`, - }) - .then(({ json }) => { - onDatasourceSave(json); - onChange(datasource.uid); - }) - .catch(response => { - getClientErrorObject(response).then( - ({ error, message }: { error: any; message: string }) => { - const errorMessage = error - ? error.error || error.statusText || error - : message; - addDangerToast(errorMessage); - }, - ); - }); - onHide(); - }; + const { + state: { loading, resourceCollection }, + fetchData, + } = useListViewResource('dataset', t('dataset'), addDangerToast); + + const selectDatasource = useCallback((datasource: Datasource) => { + setConfirmChange(true); + setConfirmedDataset(datasource); + }, []); + + useDebouncedEffect(() => { + if (filter) { + fetchData({ + ...emptyRequest, + filters: [ + { + id: 'table_name', + operator: 'ct', + value: filter, + }, + ], + }); + } + }, 1000); - const onEnterModal = () => { + useEffect(() => { + const onEnterModal = async () => { if (searchRef && searchRef.current) { searchRef.current.focus(); } - if (!datasources) { - SupersetClient.get({ - endpoint: '/superset/datasources/', - }) - .then(({ json }) => { - const data = json.map((ds: any) => ({ - rawName: ds.name, - connection: ds.connection, - schema: ds.schema, - name: ( -
selectDatasource(ds)} - className="datasource-link" - > - {ds.name} - - ), - type: ds.type, - })); - setLoading(false); - setDatasources(data); - }) - .catch(response => { - setLoading(false); - getClientErrorObject(response).then(({ error }: any) => { - addDangerToast(error.error || error.statusText || error); - }); - }); - } + + // Fetch initial datasets for tableview + await fetchData(emptyRequest); }; if (show) { onEnterModal(); } - }, [addDangerToast, datasources, onChange, onDatasourceSave, onHide, show]); + }, [ + addDangerToast, + fetchData, + onChange, + onDatasourceSave, + onHide, + selectDatasource, + show, + ]); const setSearchRef = (ref: any) => { searchRef = ref; @@ -135,21 +155,58 @@ const ChangeDatasourceModal: FunctionComponent = ({ const changeSearch = ( event: React.FormEvent, ) => { - setFilter((event.currentTarget?.value as string) ?? ''); + const searchValue = (event.currentTarget?.value as string) ?? ''; + setFilter(searchValue); }; - const data = useMemo( - () => - filter && datasources - ? datasources.filter((datasource: any) => - TABLE_FILTERABLE.some(field => datasource[field]?.includes(filter)), - ) - : datasources, - [datasources, filter], - ); + const handleChangeConfirm = () => { + SupersetClient.get({ + endpoint: `/datasource/get/${confirmedDataset?.type}/${confirmedDataset?.id}`, + }) + .then(({ json }) => { + onDatasourceSave(json); + onChange(`${confirmedDataset?.id}__table`); + }) + .catch(response => { + getClientErrorObject(response).then( + ({ error, message }: { error: any; message: string }) => { + const errorMessage = error + ? error.error || error.statusText || error + : message; + addDangerToast(errorMessage); + }, + ); + }); + onHide(); + addSuccessToast('Successfully changed datasource!'); + }; + + const handlerCancelConfirm = () => { + setConfirmChange(false); + }; + + const renderTableView = () => { + const data = resourceCollection.map((ds: any) => ({ + rawName: ds.table_name, + connection: ds.database.database_name, + schema: ds.schema, + name: ( + selectDatasource({ type: 'table', ...ds })} + className="datasource-link" + > + {ds.table_name} + + ), + type: ds.kind, + })); + + return data; + }; return ( - = ({ hideFooter > <> - - {t('Warning!')} {CHANGE_WARNING_MSG} - -
- { - setSearchRef(ref); - }} - type="text" - bsSize="sm" - value={filter} - placeholder={t('Search / Filter')} - onChange={changeSearch} - /> -
- {loading && } - {datasources && ( - + {!confirmChange && ( + <> + + {t('Warning!')} {CHANGE_WARNING_MSG} + +
+ { + setSearchRef(ref); + }} + type="text" + bsSize="sm" + value={filter} + placeholder={t('Search / Filter')} + onChange={changeSearch} + /> +
+ {loading && } + {!loading && ( + + )} + + )} + {confirmChange && ( + +
+ {CONFIRM_WARNING_MESSAGE} +
+ + +
+
+
)} -
+ ); }; diff --git a/superset-frontend/src/datasource/DatasourceModal.tsx b/superset-frontend/src/datasource/DatasourceModal.tsx index daf47c25944e3..2ccb8fe1cc91f 100644 --- a/superset-frontend/src/datasource/DatasourceModal.tsx +++ b/superset-frontend/src/datasource/DatasourceModal.tsx @@ -88,9 +88,9 @@ const DatasourceModal: FunctionComponent = ({ const onConfirmSave = () => { // Pull out extra fields into the extra object const schema = - currentDatasource.schema || + currentDatasource.tableSelector?.schema || currentDatasource.databaseSelector?.schema || - currentDatasource.tableSelector?.schema; + currentDatasource.schema; setIsSaving(true); diff --git a/superset-frontend/src/explore/components/AdhocFilterEditPopoverSimpleTabContent.jsx b/superset-frontend/src/explore/components/AdhocFilterEditPopoverSimpleTabContent.jsx index a0402193978d6..fa241914fc543 100644 --- a/superset-frontend/src/explore/components/AdhocFilterEditPopoverSimpleTabContent.jsx +++ b/superset-frontend/src/explore/components/AdhocFilterEditPopoverSimpleTabContent.jsx @@ -19,8 +19,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import { FormGroup } from 'react-bootstrap'; -import { Select } from 'src/components/Select'; -import { t, SupersetClient } from '@superset-ui/core'; +import { Select } from 'src/common/components/Select'; +import { t, SupersetClient, styled } from '@superset-ui/core'; import AdhocFilter, { EXPRESSION_TYPES, CLAUSES } from '../AdhocFilter'; import adhocMetricType from '../propTypes/adhocMetricType'; @@ -36,7 +36,15 @@ import { DISABLE_INPUT_OPERATORS, } from '../constants'; import FilterDefinitionOption from './FilterDefinitionOption'; -import SelectControl from './controls/SelectControl'; + +const SelectWithLabel = styled(Select)` + .ant-select-selector::after { + content: '${({ labelText }) => labelText || '\\A0'}'; + display: inline-block; + white-space: nowrap; + color: ${({ theme }) => theme.colors.grayscale.light1}; + } +`; const propTypes = { adhocFilter: PropTypes.instanceOf(AdhocFilter).isRequired, @@ -92,11 +100,8 @@ export default class AdhocFilterEditPopoverSimpleTabContent extends React.Compon }; this.selectProps = { - isMulti: false, name: 'select-column', - labelKey: 'label', - autosize: false, - clearable: false, + showSearch: true, }; this.menuPortalProps = { @@ -116,7 +121,11 @@ export default class AdhocFilterEditPopoverSimpleTabContent extends React.Compon } } - onSubjectChange(option) { + onSubjectChange(id) { + const option = this.props.options.find( + option => option.id === id || option.optionName === id, + ); + let subject; let clause; // infer the new clause based on what subject was selected. @@ -247,27 +256,38 @@ export default class AdhocFilterEditPopoverSimpleTabContent extends React.Compon } } - renderSubjectOptionLabel(option) { - return ; + optionsRemaining() { + const { suggestions } = this.state; + const { comparator } = this.props.adhocFilter; + // if select is multi/value is array, we show the options not selected + const valuesFromSuggestionsLength = Array.isArray(comparator) + ? comparator.filter(v => suggestions.includes(v)).length + : 0; + return suggestions?.length - valuesFromSuggestionsLength ?? 0; } - renderSubjectOptionValue({ value }) { - return {value}; + createSuggestionsPlaceholder() { + const optionsRemaining = this.optionsRemaining(); + const placeholder = t('%s option(s)', optionsRemaining); + return optionsRemaining ? placeholder : ''; + } + + renderSubjectOptionLabel(option) { + return ; } render() { - const { adhocFilter, options: columns, datasource } = this.props; + const { adhocFilter, options, datasource } = this.props; + let columns = options; const { subject, operator, comparator } = adhocFilter; const subjectSelectProps = { - options: columns, - value: subject ? { value: subject } : undefined, + value: subject ?? undefined, onChange: this.onSubjectChange, - optionRenderer: this.renderSubjectOptionLabel, - valueRenderer: this.renderSubjectOptionValue, - valueKey: 'filterOptionName', - noResultsText: t( + notFoundContent: t( 'No such column found. To filter on a metric, try the Custom SQL tab.', ), + filterOption: (input, option) => + option.filterBy.toLowerCase().indexOf(input.toLowerCase()) >= 0, }; if (datasource.type === 'druid') { @@ -283,19 +303,16 @@ export default class AdhocFilterEditPopoverSimpleTabContent extends React.Compon adhocFilter.clause === CLAUSES.WHERE ? t('%s column(s)', columns.length) : t('To filter on a metric, use Custom SQL tab.'); - // make sure options have `column_name` - subjectSelectProps.options = columns.filter(option => option.column_name); + columns = options.filter(option => option.column_name); } const operatorSelectProps = { placeholder: t('%s operators(s)', OPERATORS_OPTIONS.length), // like AGGREGTES_OPTIONS, operator options are string - options: OPERATORS_OPTIONS.filter(op => - this.isOperatorRelevant(op, subject), - ), value: operator, onChange: this.onOperatorChange, - getOptionLabel: translateOperator, + filterOption: (input, option) => + option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0, }; return ( @@ -303,36 +320,63 @@ export default class AdhocFilterEditPopoverSimpleTabContent extends React.Compon {MULTI_OPERATORS.has(operator) || this.state.suggestions.length > 0 ? ( - + placeholder={this.createSuggestionsPlaceholder()} + labelText={ + comparator?.length > 0 && this.createSuggestionsPlaceholder() + } + > + {this.state.suggestions.map(suggestion => ( + + {suggestion} + + ))} + ) : ( + > + {Object.keys(CLAUSES).map(clause => ( + + {clause} + + ))} + WHERE {t('filters by columns')}
diff --git a/superset-frontend/src/explore/components/AdhocMetricEditPopover.jsx b/superset-frontend/src/explore/components/AdhocMetricEditPopover.jsx index da1cde11cca9a..a75406fcf183e 100644 --- a/superset-frontend/src/explore/components/AdhocMetricEditPopover.jsx +++ b/superset-frontend/src/explore/components/AdhocMetricEditPopover.jsx @@ -21,7 +21,7 @@ import PropTypes from 'prop-types'; import { FormGroup } from 'react-bootstrap'; import Tabs from 'src/common/components/Tabs'; import Button from 'src/components/Button'; -import Select from 'src/components/Select'; +import { Select } from 'src/common/components/Select'; import { styled, t } from '@superset-ui/core'; import { ColumnOption } from '@superset-ui/chart-controls'; @@ -70,27 +70,12 @@ export default class AdhocMetricEditPopover extends React.Component { this.handleAceEditorRef = this.handleAceEditorRef.bind(this); this.refreshAceEditor = this.refreshAceEditor.bind(this); - this.popoverRef = React.createRef(); - this.state = { adhocMetric: this.props.adhocMetric, width: startingWidth, height: startingHeight, }; - this.selectProps = { - labelKey: 'label', - isMulti: false, - autosize: false, - clearable: true, - }; - - this.menuPortalProps = { - menuPosition: 'fixed', - menuPlacement: 'bottom', - menuPortalTarget: this.popoverRef.current, - }; - document.addEventListener('mouseup', this.onMouseUp); } @@ -118,7 +103,8 @@ export default class AdhocMetricEditPopover extends React.Component { this.props.onClose(); } - onColumnChange(column) { + onColumnChange(columnId) { + const column = this.props.columns.find(column => column.id === columnId); this.setState(prevState => ({ adhocMetric: prevState.adhocMetric.duplicateWith({ column, @@ -213,20 +199,23 @@ export default class AdhocMetricEditPopover extends React.Component { const columnSelectProps = { placeholder: t('%s column(s)', columns.length), - options: columns, value: (adhocMetric.column && adhocMetric.column.column_name) || adhocMetric.inferSqlExpressionColumn(), onChange: this.onColumnChange, - optionRenderer: this.renderColumnOption, - valueKey: 'column_name', + allowClear: true, + showSearch: true, + filterOption: (input, option) => + option.filterBy.toLowerCase().indexOf(input.toLowerCase()) >= 0, }; const aggregateSelectProps = { placeholder: t('%s aggregates(s)', AGGREGATES_OPTIONS.length), - options: AGGREGATES_OPTIONS, value: adhocMetric.aggregate || adhocMetric.inferSqlExpressionAggregate(), onChange: this.onAggregateChange, + allowClear: true, + autoFocus: true, + showSearch: true, }; if (this.props.datasourceType === 'druid') { @@ -241,7 +230,6 @@ export default class AdhocMetricEditPopover extends React.Component {
column - + {columns.map(column => ( + + {this.renderColumnOption(column)} + + ))} + aggregate - + {AGGREGATES_OPTIONS.map(option => ( + + {option} + + ))} + ) => Object.values(row).some(value => - value.toString().toLowerCase().includes(filterText.toLowerCase()), + value?.toString().toLowerCase().includes(filterText.toLowerCase()), ), ); }, [data, filterText]); diff --git a/superset-frontend/src/explore/components/DataTablesPane.tsx b/superset-frontend/src/explore/components/DataTablesPane.tsx index 474ef94f83e7e..d9b3493c67567 100644 --- a/superset-frontend/src/explore/components/DataTablesPane.tsx +++ b/superset-frontend/src/explore/components/DataTablesPane.tsx @@ -24,6 +24,7 @@ import Loading from 'src/components/Loading'; import TableView, { EmptyWrapperType } from 'src/components/TableView'; import { getChartDataRequest } from 'src/chart/chartAction'; import { getClientErrorObject } from 'src/utils/getClientErrorObject'; +import { getDataTablePageSize } from 'src/explore/exploreUtils'; import { CopyToClipboardButton, FilterInput, @@ -181,6 +182,9 @@ export const DataTablesPane = ({ }; const renderDataTable = (type: string) => { + // restrict cell count to 10000 or min 5 rows to avoid crashing browser + const columnsLength = columns[type].length; + const pageSize = getDataTablePageSize(columnsLength); if (isLoading[type]) { return ; } @@ -195,7 +199,8 @@ export const DataTablesPane = ({ {displayBackground && } - + { const [sqlSupported] = useState( datasource && datasource.split('__')[1] === 'table', ); - const [isPropertiesModalOpen, setIsPropertiesModalOpen] = useState(false); const [menuVisible, setMenuVisible] = useState(false); const beforeOpen = resultType => { @@ -103,20 +102,12 @@ export const DisplayQueryButton = props => { }); }; - const openPropertiesModal = () => { - setIsPropertiesModalOpen(true); - }; - - const closePropertiesModal = () => { - setIsPropertiesModalOpen(false); - }; - const handleMenuClick = ({ key, domEvent }) => { const { chartHeight, slice, onOpenInEditor, latestQueryFormData } = props; setMenuVisible(false); switch (key) { case MENU_KEYS.EDIT_PROPERTIES: - openPropertiesModal(); + props.onOpenPropertiesModal(); break; case MENU_KEYS.RUN_IN_SQL_LAB: onOpenInEditor(latestQueryFormData); @@ -182,17 +173,11 @@ export const DisplayQueryButton = props => { onToggle={setMenuVisible} > - {slice && [ + {slice && ( {t('Edit properties')} - , - , - ]} + + )}
diff --git a/superset-frontend/src/explore/components/ExploreChartHeader.jsx b/superset-frontend/src/explore/components/ExploreChartHeader.jsx index 52af3df178779..88a54b3b18ff6 100644 --- a/superset-frontend/src/explore/components/ExploreChartHeader.jsx +++ b/superset-frontend/src/explore/components/ExploreChartHeader.jsx @@ -94,7 +94,7 @@ export class ExploreChartHeader extends React.PureComponent { this.state = { isPropertiesModalOpen: false, }; - this.openProperiesModal = this.openProperiesModal.bind(this); + this.openPropertiesModal = this.openPropertiesModal.bind(this); this.closePropertiesModal = this.closePropertiesModal.bind(this); } @@ -111,7 +111,7 @@ export class ExploreChartHeader extends React.PureComponent { ); } - openProperiesModal() { + openPropertiesModal() { this.setState({ isPropertiesModalOpen: true, }); @@ -167,7 +167,7 @@ export class ExploreChartHeader extends React.PureComponent { role="button" tabIndex={0} className="edit-desc-icon" - onClick={this.openProperiesModal} + onClick={this.openPropertiesModal} >
@@ -202,7 +202,10 @@ export class ExploreChartHeader extends React.PureComponent { status={CHART_STATUS_MAP[chartStatus]} /> theme.colors.grayscale.light5}; - .ant-collapse-item { - height: 100%; - border: 0; - } - .ant-collapse-content, - .ant-collapse-content-box { - height: 100%; - } - .ant-collapse-header { - background-color: ${({ theme }) => theme.colors.grayscale.light5}; - padding-top: 0; - padding-bottom: 0; - font-weight: ${({ theme }) => theme.typography.weights.bold}; - & > .ant-collapse-arrow { - top: 5px; // not a theme variable, override necessary after setting paddings to 0 to center arrow - } - } .ant-tabs { height: 100%; .ant-tabs-nav { diff --git a/superset-frontend/src/explore/components/controls/DatasourceControl.jsx b/superset-frontend/src/explore/components/controls/DatasourceControl.jsx index d7c2a5546a574..f8f79d36499ff 100644 --- a/superset-frontend/src/explore/components/controls/DatasourceControl.jsx +++ b/superset-frontend/src/explore/components/controls/DatasourceControl.jsx @@ -19,7 +19,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Col, Collapse, Row, Well } from 'react-bootstrap'; -import { t, styled } from '@superset-ui/core'; +import { t, styled, supersetTheme } from '@superset-ui/core'; import { ColumnOption, MetricOption } from '@superset-ui/chart-controls'; import { Dropdown, Menu } from 'src/common/components'; @@ -73,6 +73,10 @@ const Styles = styled.div` vertical-align: middle; cursor: pointer; } + + .datasource-controls { + display: flex; + } `; /** @@ -213,10 +217,13 @@ class DatasourceControl extends React.PureComponent { ); + // eslint-disable-next-line camelcase + const { health_check_message: healthCheckMessage } = datasource; + return ( -
+
+ {healthCheckMessage && ( + + + + )} { }); postForm(url, formData); }; + +export const useDebouncedEffect = (effect, delay) => { + const callback = useCallback(effect, [effect]); + + useEffect(() => { + const handler = setTimeout(() => { + callback(); + }, delay); + + return () => { + clearTimeout(handler); + }; + }, [callback, delay]); +}; diff --git a/superset-frontend/src/featureFlags.ts b/superset-frontend/src/featureFlags.ts index 93b909ddcb3b1..75367d23a3f83 100644 --- a/superset-frontend/src/featureFlags.ts +++ b/superset-frontend/src/featureFlags.ts @@ -35,6 +35,7 @@ export enum FeatureFlag { ESCAPE_MARKDOWN_HTML = 'ESCAPE_MARKDOWN_HTML', VERSIONED_EXPORT = 'VERSIONED_EXPORT', GLOBAL_ASYNC_QUERIES = 'GLOBAL_ASYNC_QUERIES', + ENABLE_TEMPLATE_PROCESSING = 'ENABLE_TEMPLATE_PROCESSING', } export type FeatureFlagMap = { diff --git a/superset-frontend/src/middleware/asyncEvent.ts b/superset-frontend/src/middleware/asyncEvent.ts index 637bb1b38d84f..32d4010b7df47 100644 --- a/superset-frontend/src/middleware/asyncEvent.ts +++ b/superset-frontend/src/middleware/asyncEvent.ts @@ -184,8 +184,9 @@ const initAsyncEvents = (options: AsyncEventOptions) => { if ( isFeatureEnabled(FeatureFlag.GLOBAL_ASYNC_QUERIES) && transport === TRANSPORT_POLLING - ) + ) { processEvents(); + } return action => next(action); }; diff --git a/superset-frontend/src/types/Dataset.ts b/superset-frontend/src/types/Dataset.ts new file mode 100644 index 0000000000000..7d69932f6f0dd --- /dev/null +++ b/superset-frontend/src/types/Dataset.ts @@ -0,0 +1,36 @@ +/** + * 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 Owner from './Owner'; + +export default interface Dataset { + changed_by_name: string; + changed_by_url: string; + changed_by: string; + changed_on_delta_humanized: string; + database: { + id: string; + database_name: string; + }; + kind: string; + explore_url: string; + id: number; + owners: Array; + schema: string; + table_name: string; +} diff --git a/superset-frontend/src/views/CRUD/alert/AlertList.tsx b/superset-frontend/src/views/CRUD/alert/AlertList.tsx index bed3742b01e4d..e8437b1b52fc6 100644 --- a/superset-frontend/src/views/CRUD/alert/AlertList.tsx +++ b/superset-frontend/src/views/CRUD/alert/AlertList.tsx @@ -17,24 +17,27 @@ * under the License. */ -import { t } from '@superset-ui/core'; -import React, { useEffect, useMemo } from 'react'; +import React, { useState, useMemo, useEffect } from 'react'; import { useHistory } from 'react-router-dom'; -import { Switch } from 'src/common/components/Switch'; +import { t } from '@superset-ui/core'; +import ActionsBar, { ActionProps } from 'src/components/ListView/ActionsBar'; import Button from 'src/components/Button'; import FacePile from 'src/components/FacePile'; import { IconName } from 'src/components/Icon'; +import { Tooltip } from 'src/common/components/Tooltip'; import ListView, { FilterOperators, Filters } from 'src/components/ListView'; -import ActionsBar, { ActionProps } from 'src/components/ListView/ActionsBar'; import SubMenu, { SubMenuProps } from 'src/components/Menu/SubMenu'; +import { Switch } from 'src/common/components/Switch'; import withToasts from 'src/messageToasts/enhancers/withToasts'; import AlertStatusIcon from 'src/views/CRUD/alert/components/AlertStatusIcon'; import RecipientIcon from 'src/views/CRUD/alert/components/RecipientIcon'; + import { useListViewResource, useSingleViewResource, } from 'src/views/CRUD/hooks'; import { createErrorHandler, createFetchRelated } from 'src/views/CRUD/utils'; +import AlertReportModal from './AlertReportModal'; import { AlertObject, AlertState } from './types'; const PAGE_SIZE = 25; @@ -53,7 +56,7 @@ function AlertList({ isReportEnabled = false, user, }: AlertListProps) { - const title = isReportEnabled ? 'report' : 'alert'; + const title = isReportEnabled ? t('report') : t('alert'); const pathName = isReportEnabled ? 'Reports' : 'Alerts'; const initalFilters = useMemo( () => [ @@ -85,9 +88,18 @@ function AlertList({ addDangerToast, ); - const canEdit = hasPerm('can_edit'); - const canDelete = hasPerm('can_delete'); - const canCreate = hasPerm('can_add'); + const [alertModalOpen, setAlertModalOpen] = useState(false); + const [currentAlert, setCurrentAlert] = useState(null); + + // Actions + function handleAlertEdit(alert: AlertObject | null) { + setCurrentAlert(alert); + setAlertModalOpen(true); + } + + const canEdit = hasPerm('can_write'); + const canDelete = hasPerm('can_write'); + const canCreate = hasPerm('can_write'); const initialSort = [{ id: 'name', desc: true }]; @@ -132,15 +144,27 @@ function AlertList({ accessor: 'recipients', Header: t('Notification Method'), disableSortBy: true, + size: 'xl', }, { Header: t('Schedule'), - accessor: 'crontab', + accessor: 'crontab_humanized', + size: 'xl', + Cell: ({ + row: { + original: { crontab_humanized = '' }, + }, + }: any) => ( + + {crontab_humanized}, + + ), }, { accessor: 'created_by', disableSortBy: true, hidden: true, + size: 'xl', }, { Cell: ({ @@ -151,7 +175,7 @@ function AlertList({ Header: t('Owners'), id: 'owners', disableSortBy: true, - size: 'lg', + size: 'xl', }, { Cell: ({ row: { original } }: any) => ( @@ -165,11 +189,12 @@ function AlertList({ Header: t('Active'), accessor: 'active', id: 'active', + size: 'xl', }, { Cell: ({ row: { original } }: any) => { const history = useHistory(); - const handleEdit = () => {}; // handleAnnotationEdit(original); + const handleEdit = () => handleAlertEdit(original); const handleDelete = () => {}; // setAlertCurrentlyDeleting(original); const handleGotoExecutionLog = () => history.push(`/${original.type.toLowerCase()}/${original.id}/log`); @@ -217,21 +242,24 @@ function AlertList({ ); const subMenuButtons: SubMenuProps['buttons'] = []; + if (canCreate) { subMenuButtons.push({ name: ( <> - {t(`${title}`)} + {title} ), buttonStyle: 'primary', - onClick: () => {}, + onClick: () => { + handleAlertEdit(null); + }, }); } const EmptyStateButton = ( - ); @@ -303,6 +331,17 @@ function AlertList({ ]} buttons={subMenuButtons} /> + { + setAlertModalOpen(false); + refreshData(); + }} + show={alertModalOpen} + isReport={isReportEnabled} + /> className="alerts-list-view" columns={columns} diff --git a/superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx b/superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx new file mode 100644 index 0000000000000..cb0fc56b79c7b --- /dev/null +++ b/superset-frontend/src/views/CRUD/alert/AlertReportModal.tsx @@ -0,0 +1,1293 @@ +/** + * 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 React, { FunctionComponent, useState, useEffect } from 'react'; +import { styled, t, SupersetClient } from '@superset-ui/core'; +import rison from 'rison'; +import { useSingleViewResource } from 'src/views/CRUD/hooks'; + +import Icon from 'src/components/Icon'; +import Modal from 'src/common/components/Modal'; +import { Switch } from 'src/common/components/Switch'; +import { GraySelect as Select } from 'src/common/components/Select'; +import { Radio } from 'src/common/components/Radio'; +import { AsyncSelect } from 'src/components/Select'; +import withToasts from 'src/messageToasts/enhancers/withToasts'; +import Owner from 'src/types/Owner'; + +import { AlertReportCronScheduler } from './components/AlertReportCronScheduler'; +import { AlertObject, Operator, Recipient, MetaObject } from './types'; + +type SelectValue = { + value: string; + label: string; +}; + +interface AlertReportModalProps { + addDangerToast: (msg: string) => void; + alert?: AlertObject | null; + isReport?: boolean; + onAdd?: (alert?: AlertObject) => void; + onHide: () => void; + show: boolean; +} + +const NOTIFICATION_METHODS: NotificationMethod[] = ['Email', 'Slack']; + +const CONDITIONS = [ + { + label: t('< (Smaller than)'), + value: '<', + }, + { + label: t('> (Larger than)'), + value: '>', + }, + { + label: t('<= (Smaller or equal)'), + value: '<=', + }, + { + label: t('>= (Larger or equal)'), + value: '>=', + }, + { + label: t('== (Is Equal)'), + value: '==', + }, + { + label: t('!= (Is Not Equal)'), + value: '!=', + }, +]; + +const RETENTION_OPTIONS = [ + { + label: t('None'), + value: 0, + }, + { + label: t('30 days'), + value: 30, + }, + { + label: t('60 days'), + value: 60, + }, + { + label: t('90 days'), + value: 90, + }, +]; + +const DEFAULT_RETENTION = 90; +const DEFAULT_WORKING_TIMEOUT = 3600; + +const StyledIcon = styled(Icon)` + margin: auto ${({ theme }) => theme.gridUnit * 2}px auto 0; +`; + +const StyledSectionContainer = styled.div` + display: flex; + min-width: 1000px; + flex-direction: column; + + .header-section { + display: flex; + flex: 0 0 auto; + align-items: center; + width: 100%; + padding: ${({ theme }) => theme.gridUnit * 4}px; + border-bottom: 1px solid ${({ theme }) => theme.colors.grayscale.light2}; + } + + .column-section { + display: flex; + flex: 1 1 auto; + + .column { + flex: 1 1 auto; + min-width: calc(33.33% - ${({ theme }) => theme.gridUnit * 8}px); + padding: ${({ theme }) => theme.gridUnit * 4}px; + + .async-select { + margin: 10px 0 20px; + } + + &.condition { + border-right: 1px solid ${({ theme }) => theme.colors.grayscale.light2}; + } + + &.message { + border-left: 1px solid ${({ theme }) => theme.colors.grayscale.light2}; + } + } + } + + .inline-container { + display: flex; + flex-direction: row; + align-items: center; + &.wrap { + flex-wrap: wrap; + } + + > div { + flex: 1 1 auto; + } + + &.add-margin { + margin-bottom: 5px; + } + + .styled-input { + margin: 0 0 0 10px; + + input { + flex: 0 0 auto; + } + } + } + + .hide-dropdown { + display: none; + } +`; + +const StyledSectionTitle = styled.div` + margin: ${({ theme }) => theme.gridUnit * 2}px auto + ${({ theme }) => theme.gridUnit * 4}px auto; +`; + +const StyledSwitchContainer = styled.div` + display: flex; + align-items: center; + margin-top: 10px; + + .switch-label { + margin-left: 10px; + } +`; + +export const StyledInputContainer = styled.div` + flex: 1 1 auto; + margin: ${({ theme }) => theme.gridUnit * 2}px; + margin-top: 0; + + .required { + margin-left: ${({ theme }) => theme.gridUnit / 2}px; + color: ${({ theme }) => theme.colors.error.base}; + } + + .input-container { + display: flex; + align-items: center; + + label { + display: flex; + margin-right: ${({ theme }) => theme.gridUnit * 2}px; + } + + i { + margin: 0 ${({ theme }) => theme.gridUnit}px; + } + } + + input, + textarea, + .Select, + .ant-select { + flex: 1 1 auto; + } + + textarea { + height: 160px; + resize: none; + } + + input::placeholder, + textarea::placeholder, + .Select__placeholder { + color: ${({ theme }) => theme.colors.grayscale.light1}; + } + + textarea, + input[type='text'], + input[type='number'], + .Select__control, + .ant-select-single .ant-select-selector { + padding: ${({ theme }) => theme.gridUnit * 1.5}px + ${({ theme }) => theme.gridUnit * 2}px; + border-style: none; + border: 1px solid ${({ theme }) => theme.colors.grayscale.light2}; + border-radius: ${({ theme }) => theme.gridUnit}px; + + &[name='description'] { + flex: 1 1 auto; + } + } + + .Select__control { + padding: 2px 0; + } + + .input-label { + margin-left: 10px; + } +`; + +// Notification Method components +const StyledNotificationAddButton = styled.div` + color: ${({ theme }) => theme.colors.primary.dark1}; + cursor: pointer; + + i { + margin-right: ${({ theme }) => theme.gridUnit * 2}px; + } + + &.disabled { + color: ${({ theme }) => theme.colors.grayscale.light1}; + cursor: default; + } +`; + +const StyledNotificationMethod = styled.div` + margin-bottom: 10px; + + .input-container { + textarea { + height: auto; + } + } + + .inline-container { + margin-bottom: 10px; + + .input-container { + margin-left: 10px; + } + + > div { + margin: 0; + } + + .delete-button { + margin-left: 10px; + padding-top: 3px; + } + } +`; + +type NotificationAddStatus = 'active' | 'disabled' | 'hidden'; + +interface NotificationMethodAddProps { + status: NotificationAddStatus; + onClick: () => void; +} + +const NotificationMethodAdd: FunctionComponent = ({ + status = 'active', + onClick, +}) => { + if (status === 'hidden') { + return null; + } + + const checkStatus = () => { + if (status !== 'disabled') { + onClick(); + } + }; + + return ( + + {' '} + {status === 'active' + ? t('Add notification method') + : t('Add delivery method')} + + ); +}; + +type NotificationMethod = 'Email' | 'Slack'; + +type NotificationSetting = { + method?: NotificationMethod; + recipients: string; + options: NotificationMethod[]; +}; + +interface NotificationMethodProps { + setting?: NotificationSetting | null; + index: number; + onUpdate?: (index: number, updatedSetting: NotificationSetting) => void; + onRemove?: (index: number) => void; +} + +const NotificationMethod: FunctionComponent = ({ + setting = null, + index, + onUpdate, + onRemove, +}) => { + const { method, recipients, options } = setting || {}; + const [recipientValue, setRecipientValue] = useState( + recipients || '', + ); + + if (!setting) { + return null; + } + + const onMethodChange = (method: NotificationMethod) => { + // Since we're swapping the method, reset the recipients + setRecipientValue(''); + + if (onUpdate) { + const updatedSetting = { + ...setting, + method, + recipients: '', + }; + + onUpdate(index, updatedSetting); + } + }; + + const onRecipientsChange = ( + event: React.ChangeEvent, + ) => { + const { target } = event; + + setRecipientValue(target.value); + + if (onUpdate) { + const updatedSetting = { + ...setting, + recipients: target.value, + }; + + onUpdate(index, updatedSetting); + } + }; + + // Set recipients + if (!!recipients && recipientValue !== recipients) { + setRecipientValue(recipients); + } + + const methodOptions = (options || []).map((method: NotificationMethod) => { + return ( + + {t(method)} + + ); + }); + + return ( + +
+ +
+ +
+
+ {method !== undefined && !!onRemove ? ( + onRemove(index)} + > + + + ) : null} +
+ {method !== undefined ? ( + +
{t(method)}
+
+