Compare commits
168 Commits
fix_docker
...
updating-s
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b099e17380 | ||
|
|
d65d3dce10 | ||
|
|
4861a10733 | ||
|
|
f846e88243 | ||
|
|
888b77d4de | ||
|
|
5bebcf61fe | ||
|
|
e8db5dfd67 | ||
|
|
cf4a21d095 | ||
|
|
c8436eb9c0 | ||
|
|
0a626bd8ae | ||
|
|
2fda221b7c | ||
|
|
9249facaf5 | ||
|
|
7db34b994e | ||
|
|
cb23d6f1a8 | ||
|
|
d497dcad41 | ||
|
|
bc6d2dba37 | ||
|
|
ce72a0ac27 | ||
|
|
9d5268ab6d | ||
|
|
17eecb1981 | ||
|
|
5906890b78 | ||
|
|
4b59e42d3f | ||
|
|
bf94370d38 | ||
|
|
eb2d69a5e6 | ||
|
|
5e847c7afa | ||
|
|
4d821f44ae | ||
|
|
c049771a7f | ||
|
|
1a1548da3b | ||
|
|
8e2f81816f | ||
|
|
1ca5947a7d | ||
|
|
7650c47e72 | ||
|
|
1818054166 | ||
|
|
175ba78d32 | ||
|
|
cf083bf827 | ||
|
|
907fc8a713 | ||
|
|
5ec3093deb | ||
|
|
7e88649730 | ||
|
|
955db48c59 | ||
|
|
5bd6e92cb8 | ||
|
|
bac61fc24e | ||
|
|
6e1ef193dd | ||
|
|
a225f329c5 | ||
|
|
2cc07e6112 | ||
|
|
e8f5d7680f | ||
|
|
47715c39d0 | ||
|
|
56f75922b9 | ||
|
|
88d07ce603 | ||
|
|
edd94b66e5 | ||
|
|
e38f2f990c | ||
|
|
5c9a882226 | ||
|
|
fe5242a876 | ||
|
|
f5d614d80d | ||
|
|
39209c2b40 | ||
|
|
9f5eb899e8 | ||
|
|
050c6daff3 | ||
|
|
c016ca5ad9 | ||
|
|
57a4199f52 | ||
|
|
222c46f639 | ||
|
|
fb7f50868d | ||
|
|
b323bf0fb6 | ||
|
|
38d64e8dd2 | ||
|
|
fb6efb9e9a | ||
|
|
e77f755765 | ||
|
|
56e59b47fe | ||
|
|
9b95accf6b | ||
|
|
c220245414 | ||
|
|
db1d77cba2 | ||
|
|
0c3aa7d8fe | ||
|
|
226b755798 | ||
|
|
c7dc4dc7fc | ||
|
|
fede4f9f1b | ||
|
|
e16ba28a8c | ||
|
|
052b38bdf3 | ||
|
|
61c0970968 | ||
|
|
1c3ef01209 | ||
|
|
9fed576cb4 | ||
|
|
e011c91921 | ||
|
|
7eb3ca408f | ||
|
|
422aa6b657 | ||
|
|
c27db070db | ||
|
|
4a06e830ca | ||
|
|
aa26ca5c27 | ||
|
|
5b5f448af0 | ||
|
|
f1136b57dd | ||
|
|
d877d46557 | ||
|
|
9c058fee7a | ||
|
|
e2eb9fe35e | ||
|
|
6bc8567802 | ||
|
|
819597faf6 | ||
|
|
27c08d0e0e | ||
|
|
ecb9ff0f8a | ||
|
|
5a3b1ee3fd | ||
|
|
c87a4fd642 | ||
|
|
57e8cd2ba2 | ||
|
|
40520c54d4 | ||
|
|
5ff259e870 | ||
|
|
d1ea4abb12 | ||
|
|
74e811706b | ||
|
|
26e1779f20 | ||
|
|
eaaa44c6c1 | ||
|
|
91faa3593a | ||
|
|
ebbef827ff | ||
|
|
5339f3dffa | ||
|
|
516f3663c0 | ||
|
|
4d9fd1b045 | ||
|
|
e623d745f5 | ||
|
|
1d2dee8a4e | ||
|
|
71786dba64 | ||
|
|
5936e8dbca | ||
|
|
d143b24232 | ||
|
|
249f5ec31a | ||
|
|
2cbd945692 | ||
|
|
66eb9593d1 | ||
|
|
59e366ce90 | ||
|
|
5d06b01fd6 | ||
|
|
c5829419e3 | ||
|
|
c094ac3584 | ||
|
|
2b4a8e9083 | ||
|
|
20adae8b21 | ||
|
|
da46ad4013 | ||
|
|
0d62bb2261 | ||
|
|
4c52ecc4d8 | ||
|
|
06c9f3368a | ||
|
|
714caeafb6 | ||
|
|
2231348356 | ||
|
|
2bce20f790 | ||
|
|
d21d7591c0 | ||
|
|
6bf8596d68 | ||
|
|
525e837c5b | ||
|
|
8891f04f11 | ||
|
|
134ca38b8d | ||
|
|
c3702be9d4 | ||
|
|
68ef13e37f | ||
|
|
cff9865c47 | ||
|
|
c22dfa1abb | ||
|
|
f0fa96fc46 | ||
|
|
00bab74d17 | ||
|
|
ee54363163 | ||
|
|
320ba9eac2 | ||
|
|
fd8f8719f8 | ||
|
|
bcc14b5274 | ||
|
|
a9229899f6 | ||
|
|
06ac7bf16c | ||
|
|
385cf8af8c | ||
|
|
40f9a40aa1 | ||
|
|
adc2ba405b | ||
|
|
d4f0ac4a63 | ||
|
|
1ec8eb8f57 | ||
|
|
363999d197 | ||
|
|
e21f945802 | ||
|
|
396cf9b822 | ||
|
|
705ffda574 | ||
|
|
f51bf67554 | ||
|
|
3c971455e7 | ||
|
|
5ed19319dd | ||
|
|
dac69e2092 | ||
|
|
72caec10fe | ||
|
|
922128f6e0 | ||
|
|
3de2b7c989 | ||
|
|
cd713a239e | ||
|
|
453e6deb97 | ||
|
|
27dde2a811 | ||
|
|
2a9a1d3194 | ||
|
|
be833dce4f | ||
|
|
92537f1fd5 | ||
|
|
ae0edbfdce | ||
|
|
9487d6c9d6 | ||
|
|
5539f87912 | ||
|
|
85b66946ed |
@@ -70,8 +70,9 @@ github:
|
||||
- cypress-matrix (4, chrome)
|
||||
- cypress-matrix (5, chrome)
|
||||
- frontend-build
|
||||
- pre-commit
|
||||
- python-lint
|
||||
- pre-commit (current)
|
||||
- pre-commit (next)
|
||||
- pre-commit (previous)
|
||||
- test-mysql
|
||||
- test-postgres (current)
|
||||
- test-postgres (next)
|
||||
|
||||
2
.github/CODEOWNERS
vendored
@@ -2,7 +2,7 @@
|
||||
|
||||
# https://github.com/apache/superset/issues/13351
|
||||
|
||||
/superset/migrations/ @apache/superset-committers
|
||||
/superset/migrations/ @mistercrunch @michael-s-molina @betodealmeida @eschutho
|
||||
|
||||
# Notify some committers of changes in the components
|
||||
|
||||
|
||||
5
.github/dependabot.yml
vendored
@@ -8,8 +8,9 @@ updates:
|
||||
|
||||
- package-ecosystem: "npm"
|
||||
ignore:
|
||||
# not until node >= 18.12.0
|
||||
- dependency-name: "css-minimizer-webpack-plugin"
|
||||
# not until React >= 18.0.0
|
||||
- dependency-name: "storybook"
|
||||
- dependency-name: "@storybook*"
|
||||
directory: "/superset-frontend/"
|
||||
schedule:
|
||||
interval: "monthly"
|
||||
|
||||
2
.github/workflows/embedded-sdk-release.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "18"
|
||||
node-version: "20"
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
- run: npm ci
|
||||
- run: npm run ci:release
|
||||
|
||||
2
.github/workflows/embedded-sdk-test.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "18"
|
||||
node-version: "20"
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
- run: npm ci
|
||||
- run: npm test
|
||||
|
||||
@@ -19,7 +19,7 @@ jobs:
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '18'
|
||||
node-version: '20'
|
||||
|
||||
- name: Install Dependencies
|
||||
run: npm install -g @action-validator/core @action-validator/cli --save-dev
|
||||
|
||||
14
.github/workflows/pre-commit.yml
vendored
@@ -16,6 +16,9 @@ concurrency:
|
||||
jobs:
|
||||
pre-commit:
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ["current", "next", "previous"]
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
@@ -24,6 +27,8 @@ jobs:
|
||||
submodules: recursive
|
||||
- name: Setup Python
|
||||
uses: ./.github/actions/setup-backend/
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Enable brew and helm-docs
|
||||
# Add brew to the path - see https://github.com/actions/runner-images/issues/6283
|
||||
run: |
|
||||
@@ -35,8 +40,11 @@ jobs:
|
||||
brew install norwoodj/tap/helm-docs
|
||||
- name: pre-commit
|
||||
run: |
|
||||
if ! pre-commit run --all-files; then
|
||||
git status
|
||||
git diff
|
||||
set +e # Don't exit immediately on failure
|
||||
pre-commit run --all-files
|
||||
if [ $? -ne 0 ] || ! git diff --quiet --exit-code; then
|
||||
echo "❌ Pre-commit check failed."
|
||||
echo "🚒 To prevent/address this CI issue, please install/use pre-commit locally."
|
||||
echo "📖 More details here: https://superset.apache.org/docs/contributing/development#git-hooks"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
2
.github/workflows/release.yml
vendored
@@ -29,7 +29,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18]
|
||||
node-version: [20]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
@@ -26,7 +26,7 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
browser: ["chrome"]
|
||||
node: [18]
|
||||
node: [20]
|
||||
env:
|
||||
SUPERSET_ENV: development
|
||||
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
|
||||
|
||||
@@ -30,7 +30,7 @@ jobs:
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
matrix:
|
||||
node: [18]
|
||||
node: [20]
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
|
||||
27
.github/workflows/superset-docs-verify.yml
vendored
@@ -12,6 +12,33 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
linkinator:
|
||||
# See docs here: https://github.com/marketplace/actions/linkinator
|
||||
name: Link Checking
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: JustinBeckwith/linkinator-action@v1.10.4
|
||||
with:
|
||||
paths: "**/*.md, **/*.mdx"
|
||||
linksToSkip: >-
|
||||
^https://github.com/apache/(superset|incubator-superset)/(pull|issue)/\d+,
|
||||
http://localhost:8088/,
|
||||
docker/.env-non-dev,
|
||||
http://127.0.0.1:3000/,
|
||||
http://localhost:9001/,
|
||||
https://charts.bitnami.com/bitnami,
|
||||
https://www.li.me/,
|
||||
https://www.fanatics.com/,
|
||||
https://tails.com/gb/,
|
||||
https://www.techaudit.info/,
|
||||
https://avetilearning.com/,
|
||||
https://www.udemy.com/,
|
||||
https://trustmedis.com/,
|
||||
http://theiconic.com.au/,
|
||||
https://dev.mysql.com/doc/refman/5.7/en/innodb-limits.html,
|
||||
^https://img\.shields\.io/.*,
|
||||
https://vkusvill.ru/
|
||||
build-deploy:
|
||||
name: Build & Deploy
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
2
.github/workflows/superset-e2e.yml
vendored
@@ -107,7 +107,7 @@ jobs:
|
||||
if: steps.check.outputs.python || steps.check.outputs.frontend
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "18"
|
||||
node-version: "20"
|
||||
- name: Install npm dependencies
|
||||
if: steps.check.outputs.python || steps.check.outputs.frontend
|
||||
uses: ./.github/actions/cached-dependencies
|
||||
|
||||
2
.github/workflows/superset-frontend.yml
vendored
@@ -33,7 +33,7 @@ jobs:
|
||||
if: steps.check.outputs.frontend
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "18"
|
||||
node-version: "20"
|
||||
- name: Install dependencies
|
||||
if: steps.check.outputs.frontend
|
||||
uses: ./.github/actions/cached-dependencies
|
||||
|
||||
53
.github/workflows/superset-python-misc.yml
vendored
@@ -1,53 +0,0 @@
|
||||
# Python Misc unit tests
|
||||
name: Python Misc
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "master"
|
||||
- "[0-9].[0-9]*"
|
||||
pull_request:
|
||||
types: [synchronize, opened, reopened, ready_for_review]
|
||||
|
||||
# cancel previous workflow jobs for PRs
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
python-lint:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
- name: Check for file changes
|
||||
id: check
|
||||
uses: ./.github/actions/change-detector/
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Setup Python
|
||||
uses: ./.github/actions/setup-backend/
|
||||
if: steps.check.outputs.python
|
||||
|
||||
babel-extract:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
- name: Check for file changes
|
||||
id: check
|
||||
uses: ./.github/actions/change-detector/
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Setup Python
|
||||
if: steps.check.outputs.python
|
||||
uses: ./.github/actions/setup-backend/
|
||||
- name: Test babel extraction
|
||||
if: steps.check.outputs.python
|
||||
run: scripts/translations/babel_update.sh
|
||||
33
.github/workflows/tag-release.yml
vendored
@@ -54,10 +54,13 @@ jobs:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
tags: true
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Use Node.js 20
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
- name: Setup supersetbot
|
||||
uses: ./.github/actions/setup-supersetbot/
|
||||
|
||||
@@ -94,16 +97,38 @@ jobs:
|
||||
--platform "linux/arm64" \
|
||||
--platform "linux/amd64"
|
||||
|
||||
# Going back on original branch to allow "post" GHA operations
|
||||
# Returning to master to support closing setup-supersetbot
|
||||
git checkout master
|
||||
|
||||
update-prs-with-release-info:
|
||||
needs: config
|
||||
if: needs.config.outputs.has-secrets
|
||||
runs-on: ubuntu-22.04
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
steps:
|
||||
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Use Node.js 20
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
- name: Setup supersetbot
|
||||
uses: ./.github/actions/setup-supersetbot/
|
||||
|
||||
- name: Label the PRs with the right release-related labels
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
export GITHUB_ACTOR=""
|
||||
git fetch --all --tags
|
||||
git checkout master
|
||||
RELEASE="${{ github.event.release.tag_name }}"
|
||||
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
||||
# in the case of a manually-triggered run, read release from input
|
||||
|
||||
2
.github/workflows/tech-debt.yml
vendored
@@ -32,7 +32,7 @@ jobs:
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '18'
|
||||
node-version: '20'
|
||||
|
||||
- name: Install Dependencies
|
||||
run: npm install
|
||||
|
||||
1
.gitignore
vendored
@@ -121,3 +121,4 @@ docker/*local*
|
||||
|
||||
# Jest test report
|
||||
test-report.html
|
||||
superset/static/stats/statistics.html
|
||||
|
||||
@@ -58,6 +58,8 @@ repos:
|
||||
rev: v3.1.0 # Use the sha or tag you want to point at
|
||||
hooks:
|
||||
- id: prettier
|
||||
additional_dependencies:
|
||||
- prettier@3.3.3
|
||||
args: ["--ignore-path=./superset-frontend/.prettierignore"]
|
||||
files: "superset-frontend"
|
||||
# blacklist unsafe functions like make_url (see #19526)
|
||||
|
||||
@@ -94,9 +94,9 @@ This statement thanks the following, on which it draws for content and inspirati
|
||||
|
||||
* [CouchDB Project Code of conduct](http://couchdb.apache.org/conduct.html)
|
||||
* [Fedora Project Code of Conduct](http://fedoraproject.org/code-of-conduct)
|
||||
* [Speak Up! Code of Conduct](http://speakup.io/coc.html)
|
||||
* [Speak Up! Code of Conduct](http://web.archive.org/web/20141109123859/http://speakup.io/coc.html)
|
||||
* [Django Code of Conduct](https://www.djangoproject.com/conduct/)
|
||||
* [Debian Code of Conduct](http://www.debian.org/vote/2014/vote_002)
|
||||
* [Debian Code of Conduct](https://www.debian.org/vote/2014/vote_002)
|
||||
* [Twitter Open Source Code of Conduct](https://github.com/twitter/code-of-conduct/blob/master/code-of-conduct.md)
|
||||
* [Mozilla Code of Conduct/Draft](https://wiki.mozilla.org/Code_of_Conduct/Draft#Conflicts_of_Interest)
|
||||
* [Python Diversity Appendix](https://www.python.org/community/diversity/)
|
||||
|
||||
@@ -22,7 +22,7 @@ ARG PY_VER=3.10-slim-bookworm
|
||||
|
||||
# if BUILDPLATFORM is null, set it to 'amd64' (or leave as is otherwise).
|
||||
ARG BUILDPLATFORM=${BUILDPLATFORM:-amd64}
|
||||
FROM --platform=${BUILDPLATFORM} node:18-bullseye-slim AS superset-node
|
||||
FROM --platform=${BUILDPLATFORM} node:20-bullseye-slim AS superset-node
|
||||
|
||||
ARG NPM_BUILD_CMD="build"
|
||||
|
||||
|
||||
@@ -34,8 +34,11 @@ RUN apt-get install -y build-essential libssl-dev \
|
||||
|
||||
# Install nodejs for custom build
|
||||
# https://nodejs.org/en/download/package-manager/
|
||||
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - \
|
||||
&& apt-get install -y nodejs
|
||||
RUN set -eux; \
|
||||
curl -sL https://deb.nodesource.com/setup_18.x | bash -; \
|
||||
apt-get install -y nodejs; \
|
||||
node --version;
|
||||
RUN if ! which npm; then apt-get install -y npm; fi
|
||||
|
||||
RUN mkdir -p /home/superset
|
||||
RUN chown superset /home/superset
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
FROM python:3.10-slim-bookworm
|
||||
|
||||
RUN apt-get update -y
|
||||
RUN apt-get install -y jq
|
||||
RUN apt-get install -y \
|
||||
git \
|
||||
jq
|
||||
|
||||
COPY make_tarball_entrypoint.sh /entrypoint.sh
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
||||
@@ -505,7 +505,7 @@ We also need to update the Environment section of [ISSUE_TEMPLATE/bug-report.yml
|
||||
|
||||
Docker release with proper tags should happen automatically as version
|
||||
tags get pushed to the `apache/superset` GitHub repository through this
|
||||
[GitHub action](https://github.com/apache/superset/blob/master/.github/workflows/docker-release.yml)
|
||||
[GitHub action](https://github.com/apache/superset/blob/master/.github/workflows/docker.yml)
|
||||
|
||||
Note that this GH action implements a `workflow_dispatch` trigger,
|
||||
meaning that it can be triggered manually from the GitHub UI. If anything
|
||||
|
||||
@@ -102,7 +102,7 @@ Some of the new features in this release are disabled by default. Each has a fea
|
||||
This release includes **hundreds** of bugfixes and stability enhancements. Future major releases will have a continued emphasis on providing a stable and bug-free experience for the user.
|
||||
|
||||
# PR Highlights
|
||||
Below is a highlight of the PRs included in this update. The full list is much longer, and can be found [here](apache/incubator-superset/CHANGELOG.md).
|
||||
Below is a highlight of the PRs included in this update. The full list is much longer, and can be found [here](https://github.com/apache/superset/blob/master/CHANGELOG.md).
|
||||
|
||||
## User Experience
|
||||
- Revert "refactor: Remove usages of reactable from TimeTable (#11046)" (#[11150](https://github.com/apache/incubator-superset/pull/11150))
|
||||
@@ -222,4 +222,4 @@ Below is a highlight of the PRs included in this update. The full list is much l
|
||||
## Complete Changelog
|
||||
Backwards incompatible changes and can be found [here](../../UPDATING.md).
|
||||
|
||||
To see the complete changelog, see [apache/incubator-superset/CHANGELOG.md](https://github.com/apache/superset/blob/master/CHANGELOG.md)
|
||||
To see the complete changelog, see [apache/superset/CHANGELOG.md](https://github.com/apache/superset/blob/master/CHANGELOG.md)
|
||||
|
||||
@@ -137,6 +137,6 @@ when available.
|
||||
**Changelog**
|
||||
|
||||
To see the complete changelog in this release, head to
|
||||
[CHANGELOG.MD](https://github.com/apache/superset/blob/1.5/CHANGELOG/1.5.0.md).
|
||||
[CHANGELOG.MD](https://github.com/apache/superset/blob/master/CHANGELOG/1.5.0.md).
|
||||
As mentioned earlier, this release has a MASSIVE amount of bug fixes. The full
|
||||
changelog lists all of them!
|
||||
|
||||
131
RELEASING/release-notes-4-1/README.md
Normal file
@@ -0,0 +1,131 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
# Release Notes for Superset 4.1.0
|
||||
|
||||
Superset 4.1.0 brings a range of new features and quality of life improvements. This release is a minor version, meaning it doesn't include any breaking changes to ensure a seamless transition for our users. Here are some of the highlights of this release.
|
||||
|
||||
### Big Number With Time Period Updates
|
||||
|
||||
We released a [Big Number with Time Period Comparison](https://github.com/apache/superset/pull/26908) chart as part of Superset 4.0. With the latest update, there are now [color options](https://github.com/apache/superset/pull/27524) for comparisons. The chart now also uses [standardize controls](https://github.com/apache/superset/pull/27193) such that when switching charts will maintain the selected metrics. To enable the new chart, you'll need to enable the `CHART_PLUGINS_EXPERIMENTAL` feature flag.
|
||||
|
||||
<div>
|
||||
<image src="media/big_number_chart.png" alt="Image" width="100%">
|
||||
</div>
|
||||
|
||||
### Table with Time Comparison
|
||||
Added functionality to do [table time comparisons](https://github.com/apache/superset/pull/28057) behind the `CHART_PLUGINS_EXPERIMENTAL` feature flag. This will help improve and facilitate efficient data analysis.
|
||||
|
||||
<div>
|
||||
<image src="media/table_with_time.png" alt="Image" width="100%">
|
||||
</div>
|
||||
|
||||
### New ECharts Versions
|
||||
|
||||
The new ECharts [Heatmap](https://github.com/apache/superset/pull/25353) has been added. Compared to the legacy Heatmap, it has more accurate percentage calculations, server side sorting to respect row limits, and a more interactive legend control that allows selecting a subset of values.
|
||||
|
||||
<div>
|
||||
<image src="media/heatmap.png" alt="Image" width="100%">
|
||||
</div>
|
||||
|
||||
We also added a new ECharts [Histogram](https://github.com/apache/superset/pull/28652) chart. The new chart will help visualize patterns, clusters, and outliers in the data and provides insights into its shape, central tendency, and spread.
|
||||
|
||||
<div>
|
||||
<image src="media/histogram.png" alt="Image" width="100%">
|
||||
</div>
|
||||
|
||||
A new Echarts [Sankey](https://github.com/apache/superset/pull/29329) chart now exists. The chart visually tracks the movement and transformation of values across system stages.
|
||||
|
||||
<div>
|
||||
<image src="media/sankey.png" alt="Image" width="100%">
|
||||
</div>
|
||||
|
||||
You can use the CLI command to migrate Area, Bubble, Line, Sankey, [Heatmap](https://github.com/apache/superset/pull/27771), and [Histogram](https://github.com/apache/superset/pull/28780) chart types but we'll add more as the ECharts migrations continue. Note that migrations for deprecated charts may be forced in upcoming major versions when the code is removed. Running migrations earlier will allow you to de-risk future upgrades while improving user experience.
|
||||
|
||||
```bash
|
||||
Usage: superset viz-migrations [OPTIONS] COMMAND [ARGS]...
|
||||
|
||||
Migrates a viz from one type to another.
|
||||
|
||||
Commands:
|
||||
downgrade Downgrades a viz to the previous version.
|
||||
upgrade Upgrade a viz to the latest version.
|
||||
```
|
||||
|
||||
Note: When migrating dashboards from one Superset instance to another (using import/export features or the Superset CLI), or restoring a backup of prior charts and dashboards, Superset will apply the existing migrations that are used during version upgrades. This will ensure that your charts and dashboards are using the latest and greatest charts that Superset officially supports. For any migration issues, feel free to [open a new issue](https://github.com/apache/superset/issues/new?assignees=&labels=bug&projects=&template=bug-report.yml) in the repo.
|
||||
|
||||
### Improved Upload Forms
|
||||
|
||||
We've made design changes to the [CSV](https://github.com/apache/superset/pull/27840), [Excel](https://github.com/apache/superset/pull/28105), and [Columnar](https://github.com/apache/superset/pull/28192
|
||||
) upload modals to improve user experience and to be more performant. The new designs has the following goals:
|
||||
|
||||
- Improved error handling.
|
||||
- Better backend parameter validation.
|
||||
- More aligned with our other modal dialogs
|
||||
|
||||
#### CSV
|
||||
<div>
|
||||
<img src="media/csv_modal_1.png" alt="Image" width="25%">
|
||||
<img src="media/csv_modal_2.png" alt="Image" width="25%">
|
||||
<img src="media/csv_modal_3.png" alt="Image" width="25%">
|
||||
<img src="media/csv_modal_4.png" alt="Image" width="25%">
|
||||
</div>
|
||||
|
||||
#### Excel
|
||||
<div>
|
||||
<img src="media/excel_modal_1.png" alt="Image" width="25%">
|
||||
<img src="media/excel_modal_2.png" alt="Image" width="25%">
|
||||
<img src="media/excel_modal_3.png" alt="Image" width="25%">
|
||||
<img src="media/excel_modal_4.png" alt="Image" width="25%">
|
||||
</div>
|
||||
|
||||
#### Columnar
|
||||
<div>
|
||||
<img src="media/columnar_modal_1.png" alt="Image" width="33%">
|
||||
<img src="media/columnar_modal_2.png" alt="Image" width="33%">
|
||||
<img src="media/columnar_modal_3.png" alt="Image" width="33%">
|
||||
</div>
|
||||
|
||||
|
||||
### OAuth2 For Databases
|
||||
|
||||
You now have the ability to enable [OAuth2](https://github.com/apache/superset/pull/27631) for databases like BigQuery, Snowflake, Dremio, Databricks, Google Sheets, etc. When enabled, it will allow users to connect to Oauth2 enabled databases with their own credentials.
|
||||
|
||||
### Catalog Support For Databases
|
||||
|
||||
Added support for the [catalog heirachy](https://github.com/apache/superset/pull/28317) for databases that support it, such as [BigQuery (projects), Databricks, Presto, Snowflake, and Trino](https://github.com/apache/superset/pull/28416). Once enabled, users will see catalogs when selecting tables in [SQL Lab, datasets](https://github.com/apache/superset/pull/28376), and when setting up Data Access Roles
|
||||
|
||||
### Slack Upload Files V2 API Updates
|
||||
As part of [[SIP-138] Proposal for Slack file upload V2 integration for Alerts and Reports](https://github.com/apache/superset/issues/29263) we now have support for Slack file upload files v2 API call. This feature is behind the feature flag `ALERT_REPORT_SLACK_V2` and also changes the Slack channel to a selector. You may also need to add the following scopes (`channels:read`, `group:read`) to your Slack bot to work.
|
||||
|
||||
<div>
|
||||
<image src="media/slack_modal.png" alt="Image" width="100%">
|
||||
</div>
|
||||
|
||||
### Total and Percentages In Tooltips For ECharts
|
||||
|
||||
Users can now see both the [total and percentage in tooltips](https://github.com/apache/superset/pull/27950) for ECharts.
|
||||
|
||||
<div>
|
||||
<image src="media/tooltips.png" alt="Image" width="100%">
|
||||
</div>
|
||||
|
||||
### Additional Metadata Bar To Dashboards
|
||||
|
||||
There is now a [metadata bar](https://github.com/apache/superset/pull/27857) added to the header of dashboards. This will now show viewers of the dashboard both the owners and last modified time of the dashboard.
|
||||
BIN
RELEASING/release-notes-4-1/media/big_number_chart.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
RELEASING/release-notes-4-1/media/columnar_modal_1.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
RELEASING/release-notes-4-1/media/columnar_modal_2.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
RELEASING/release-notes-4-1/media/columnar_modal_3.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
RELEASING/release-notes-4-1/media/csv_modal_1.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
RELEASING/release-notes-4-1/media/csv_modal_2.png
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
RELEASING/release-notes-4-1/media/csv_modal_3.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
RELEASING/release-notes-4-1/media/csv_modal_4.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
RELEASING/release-notes-4-1/media/excel_modal_1.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
RELEASING/release-notes-4-1/media/excel_modal_2.png
Normal file
|
After Width: | Height: | Size: 59 KiB |
BIN
RELEASING/release-notes-4-1/media/excel_modal_3.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
RELEASING/release-notes-4-1/media/excel_modal_4.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
RELEASING/release-notes-4-1/media/heatmap.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
RELEASING/release-notes-4-1/media/histogram.png
Normal file
|
After Width: | Height: | Size: 510 KiB |
BIN
RELEASING/release-notes-4-1/media/sankey.png
Normal file
|
After Width: | Height: | Size: 617 KiB |
BIN
RELEASING/release-notes-4-1/media/slack_modal.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
RELEASING/release-notes-4-1/media/table_with_time.png
Normal file
|
After Width: | Height: | Size: 168 KiB |
BIN
RELEASING/release-notes-4-1/media/tooltips.png
Normal file
|
After Width: | Height: | Size: 363 KiB |
@@ -45,7 +45,7 @@ These features are **finished** but currently being tested. They are usable, but
|
||||
- CACHE_IMPERSONATION
|
||||
- CONFIRM_DASHBOARD_DIFF
|
||||
- DRILL_TO_DETAIL
|
||||
- DYNAMIC_PLUGINS: [(docs)](https://superset.apache.org/docs/configuration/running-on-kubernetes)
|
||||
- DYNAMIC_PLUGINS
|
||||
- ENABLE_SUPERSET_META_DB: [(docs)](https://superset.apache.org/docs/configuration/databases/#querying-across-databases)
|
||||
- ESTIMATE_QUERY_COST
|
||||
- GLOBAL_ASYNC_QUERIES [(docs)](https://github.com/apache/superset/blob/master/CONTRIBUTING.md#async-chart-queries)
|
||||
@@ -70,7 +70,7 @@ These features flags are **safe for production**. They have been tested and will
|
||||
### Flags retained for runtime configuration
|
||||
- ALERTS_ATTACH_REPORTS
|
||||
- ALLOW_ADHOC_SUBQUERY
|
||||
- DASHBOARD_RBAC [(docs)](https://superset.apache.org/docs/using-superset/first-dashboard#manage-access-to-dashboards)
|
||||
- DASHBOARD_RBAC [(docs)](https://superset.apache.org/docs/using-superset/creating-your-first-dashboard#manage-access-to-dashboards)
|
||||
- DATAPANEL_CLOSED_BY_DEFAULT
|
||||
- DRUID_JOINS
|
||||
- EMBEDDABLE_CHARTS
|
||||
|
||||
@@ -30,24 +30,24 @@ Join our growing community!
|
||||
- [Airbnb](https://github.com/airbnb)
|
||||
- [Faasos](http://faasos.com/) [@shashanksingh]
|
||||
- [Hostnfly](https://www.hostnfly.com/) [@alexisrosuel]
|
||||
- [Lime](https://www.limebike.com/) [@cxmcc]
|
||||
- [Lime](https://www.li.me/) [@cxmcc]
|
||||
- [Lyft](https://www.lyft.com/)
|
||||
- [Ontruck](https://www.ontruck.com/)
|
||||
|
||||
### Financial Services
|
||||
- [Aktia Bank plc](https://www.aktia.com) [@villebro]
|
||||
- [Aktia Bank plc](https://www.aktia.com)
|
||||
- [American Express](https://www.americanexpress.com) [@TheLastSultan]
|
||||
- [bumper](https://www.bumper.co/) [@vasu-ram, @JamiePercival]
|
||||
- [Cape Crypto](https://capecrypto.com)
|
||||
- [Capital Service S.A.](http://capitalservice.pl) [@pkonarzewski]
|
||||
- [Clark.de](http://clark.de/)
|
||||
- [KarrotPay](https://www.daangnpay.com/)
|
||||
- [Taveo](https://www.taveo.com) [@codek]
|
||||
- [Unit](https://www.unit.co/about-us) [@amitmiran137]
|
||||
- [Wise](https://wise.com) [@koszti]
|
||||
- [Xendit](http://xendit.co/) [@LieAlbertTriAdrian]
|
||||
- [bumper](https://www.bumper.co/) [@vasu-ram, @JamiePercival]
|
||||
|
||||
### Gaming
|
||||
- [Digit Game Studios](https://www.digitgaming.com/)
|
||||
- [Popoko VM Games Studio](https://popoko.live)
|
||||
|
||||
### E-Commerce
|
||||
@@ -55,7 +55,7 @@ Join our growing community!
|
||||
- [Bazaar Technologies](https://www.bazaartech.com) [@umair-abro]
|
||||
- [Dragonpass](https://www.dragonpass.com.cn/) [@zhxjdwh]
|
||||
- [Dropit Shopping](https://www.dropit.shop/) [@dropit-dev]
|
||||
- [Fanatics](https://www.fanatics.com) [@coderfender]
|
||||
- [Fanatics](https://www.fanatics.com/) [@coderfender]
|
||||
- [Fordeal](http://www.fordeal.com) [@Renkai]
|
||||
- [GFG - Global Fashion Group](https://global-fashion-group.com) [@ksaagariconic]
|
||||
- [HuiShouBao](http://www.huishoubao.com/) [@Yukinoshita-Yukino]
|
||||
@@ -64,10 +64,10 @@ Join our growing community!
|
||||
- [Rakuten Viki](https://www.viki.com)
|
||||
- [Shopee](https://shopee.sg) [@xiaohanyu]
|
||||
- [Shopkick](https://www.shopkick.com) [@LAlbertalli]
|
||||
- [Tails.com](https://tails.com) [@alanmcruickshank]
|
||||
- [Tails.com](https://tails.com/gb/) [@alanmcruickshank]
|
||||
- [THE ICONIC](http://theiconic.com.au/) [@ksaagariconic]
|
||||
- [Utair](https://www.utair.ru) [@utair-digital]
|
||||
- [VkusVill](https://www.vkusvill.ru) [@ETselikov]
|
||||
- [VkusVill](https://vkusvill.ru/) [@ETselikov]
|
||||
- [Zalando](https://www.zalando.com) [@dmigo]
|
||||
- [Zalora](https://www.zalora.com) [@ksaagariconic]
|
||||
|
||||
@@ -80,17 +80,17 @@ Join our growing community!
|
||||
- [Caizin](https://caizin.com/) [@tejaskatariya]
|
||||
- [Careem](https://www.careem.com/) [@SamraHanifCareem]
|
||||
- [Cloudsmith](https://cloudsmith.io) [@alancarson]
|
||||
- [CnOvit](http://www.cnovit.com/) [@xieshaohu]
|
||||
- [CnOvit](https://www.cnovit.com/) [@xieshaohu]
|
||||
- [Cyberhaven](https://www.cyberhaven.com/) [@toliver-ch]
|
||||
- [Deepomatic](https://deepomatic.com/) [@Zanoellia]
|
||||
- [Dial Once](https://www.dial-once.com/)
|
||||
- [Dremio](https://dremio.com) [@narendrans]
|
||||
- [Elestio](https://elest.io/) [@kaiwalyakoparkar]
|
||||
- [ELMO Cloud HR & Payroll](https://elmosoftware.com.au/)
|
||||
- [Endress+Hauser](http://www.endress.com/) [@rumbin]
|
||||
- [FBK - ICT center](http://ict.fbk.eu)
|
||||
- [Gavagai](https://gavagai.io) [@gavagai-corp]
|
||||
- [GfK Data Lab](http://datalab.gfk.com) [@mherr]
|
||||
- [GrowthSimple](https://growthsimple.ai/)
|
||||
- [GfK Data Lab](https://www.gfk.com/home) [@mherr]
|
||||
- [Hydrolix](https://www.hydrolix.io/)
|
||||
- [Intercom](https://www.intercom.com/) [@kate-gallo]
|
||||
- [jampp](https://jampp.com/)
|
||||
@@ -105,17 +105,14 @@ Join our growing community!
|
||||
- [Peak AI](https://www.peak.ai/) [@azhar22k]
|
||||
- [PeopleDoc](https://www.people-doc.com) [@rodo]
|
||||
- [Preset, Inc.](https://preset.io)
|
||||
- [Pronto Tools](http://www.prontotools.io) [@zkan]
|
||||
- [PubNub](https://pubnub.com) [@jzucker2]
|
||||
- [ReadyTech](https://www.readytech.io)
|
||||
- [Reward Gateway](https://www.rewardgateway.com)
|
||||
- [ScopeAI](https://www.getscopeai.com) [@iloveluce]
|
||||
- [Showmax](https://tech.showmax.com) [@bobek]
|
||||
- [source{d}](https://www.sourced.tech) [@marnovo]
|
||||
- [Steamroot](https://streamroot.io/)
|
||||
- [Showmax](https://showmax.com) [@bobek]
|
||||
- [TechAudit](https://www.techaudit.info) [@ETselikov]
|
||||
- [Tenable](https://www.tenable.com) [@dflionis]
|
||||
- [Tentacle](https://public.tentaclecmi.com) [@jdclarke5]
|
||||
- [Tentacle](https://tentaclecmi.com) [@jdclarke5]
|
||||
- [timbr.ai](https://timbr.ai/) [@semantiDan]
|
||||
- [Tobii](http://www.tobii.com/) [@dwa]
|
||||
- [Tooploox](https://www.tooploox.com/) [@jakubczaplicki]
|
||||
@@ -155,14 +152,13 @@ Join our growing community!
|
||||
|
||||
### Healthcare
|
||||
- [Amino](https://amino.com) [@shkr]
|
||||
- [Beans](https://www.beans.fi) [@kakoni]
|
||||
- [Bluesquare](https://www.bluesquarehub.com/) [@madewulf]
|
||||
- [Care](https://www.getcare.io/)[@alandao2021]
|
||||
- [Living Goods](https://www.livinggoods.org) [@chelule]
|
||||
- [Maieutical Labs](https://maieuticallabs.it) [@xrmx]
|
||||
- [QPID Health](http://www.qpidhealth.com/)
|
||||
- [REDCap Cloud](https://www.redcapcloud.com/)
|
||||
- [TrustMedis](https://trustmedis.com) [@famasya]
|
||||
- [TrustMedis](https://trustmedis.com/) [@famasya]
|
||||
- [WeSure](https://www.wesure.cn/)
|
||||
|
||||
### HR / Staffing
|
||||
|
||||
@@ -58,6 +58,7 @@ assists people when migrating to a new version.
|
||||
backend, as well as the .json files used by the frontend. If you were doing anything before
|
||||
as part of your bundling to expose translation packages, it's probably not needed anymore.
|
||||
- [29264](https://github.com/apache/superset/pull/29264) Slack has updated its file upload api, and we are now supporting this new api in Superset, although the Slack api is not backward compatible. The original Slack integration is deprecated and we will require a new Slack scope `channels:read` to be added to Slack workspaces in order to use this new api. In an upcoming release, we will make this new Slack scope mandatory and remove the old Slack functionality.
|
||||
- [29798](https://github.com/apache/superset/pull/29798) Since 3.1.0, the intial schedule for an alert or report was mistakenly offset by the specified timezone's relation to UTC. The initial schedule should now begin at the correct time.
|
||||
|
||||
### Potential Downtime
|
||||
|
||||
@@ -227,7 +228,8 @@ assists people when migrating to a new version.
|
||||
- [19273](https://github.com/apache/superset/pull/19273): The `SUPERSET_CELERY_WORKERS` and `SUPERSET_WORKERS` config keys has been removed. Configure Celery directly using `CELERY_CONFIG` on Superset.
|
||||
- [19231](https://github.com/apache/superset/pull/19231): The `ENABLE_REACT_CRUD_VIEWS` feature flag has been removed (permanently enabled). Any deployments which had set this flag to false will need to verify that the React views support their use case.
|
||||
- [19230](https://github.com/apache/superset/pull/19230): The `ROW_LEVEL_SECURITY` feature flag has been removed (permanently enabled). Any deployments which had set this flag to false will need to verify that the presence of the Row Level Security feature does not interfere with their use case.
|
||||
- [19168](https://github.com/apache/superset/pull/19168): Celery upgrade to 5.X resulted in breaking changes to its command line invocation. Please follow [these](https://docs.celeryq.dev/en/stable/whatsnew-5.2.html#step-1-adjust-your-command-line-invocation) instructions for adjustments. Also consider migrating you Celery config per [here](https://docs.celeryq.dev/en/stable/userguide/configuration.html#conf-old-settings-map).
|
||||
- [19168](https://github.com/apache/superset/pull/19168): Celery upgrade to 5.X resulted in breaking changes to its command line invocation.
|
||||
html#step-1-adjust-your-command-line-invocation) instructions for adjustments. Also consider migrating you Celery config per [here](https://docs.celeryq.dev/en/stable/userguide/configuration.html#conf-old-settings-map).
|
||||
- [19142](https://github.com/apache/superset/pull/19142): The `VERSIONED_EXPORT` config key is now `True` by default.
|
||||
- [19113](https://github.com/apache/superset/pull/19113): The `ENABLE_JAVASCRIPT_CONTROLS` config key has moved from an app config to a feature flag. Any deployments who overrode this setting will now need to override the feature flag from here onward.
|
||||
- [19107](https://github.com/apache/superset/pull/19107): The `SQLLAB_BACKEND_PERSISTENCE` feature flag is now `True` by default, which enables persisting SQL Lab tabs in the backend instead of the browser's `localStorage`.
|
||||
@@ -538,7 +540,7 @@ assists people when migrating to a new version.
|
||||
- [8117](https://github.com/apache/superset/pull/8117): If you are
|
||||
using `ENABLE_PROXY_FIX = True`, review the newly-introduced variable,
|
||||
`PROXY_FIX_CONFIG`, which changes the proxy behavior in accordance with
|
||||
[Werkzeug](https://werkzeug.palletsprojects.com/en/0.15.x/middleware/proxy_fix/)
|
||||
Werkzeug.
|
||||
|
||||
- [8069](https://github.com/apache/superset/pull/8069): introduces
|
||||
[MessagePack](https://github.com/msgpack/msgpack-python) and
|
||||
|
||||
@@ -147,10 +147,11 @@ services:
|
||||
disable: true
|
||||
|
||||
superset-node:
|
||||
image: node:18
|
||||
image: node:20
|
||||
environment:
|
||||
# set this to false if you have perf issues running the npm i; npm run dev in-docker
|
||||
# if you do so, you have to run this manually on the host, which should perform better!
|
||||
BUILD_SUPERSET_FRONTEND_IN_DOCKER: true
|
||||
SCARF_ANALYTICS: "${SCARF_ANALYTICS:-}"
|
||||
container_name: superset_node
|
||||
command: ["/app/docker/docker-frontend.sh"]
|
||||
|
||||
@@ -24,12 +24,16 @@ if [ "$PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" = "false" ]; then
|
||||
fi
|
||||
|
||||
if [ "$BUILD_SUPERSET_FRONTEND_IN_DOCKER" = "true" ]; then
|
||||
echo "Building Superset frontend in dev mode inside docker container"
|
||||
cd /app/superset-frontend
|
||||
npm install -f --no-optional --global webpack webpack-cli
|
||||
npm install -f --no-optional
|
||||
|
||||
echo "Running `npm install`"
|
||||
npm install
|
||||
|
||||
echo "Running frontend"
|
||||
npm run dev
|
||||
|
||||
else
|
||||
echo "Skipping frontend build steps - YOU RUN IT MANUALLY ON THE HOST!"
|
||||
echo "Skipping frontend build steps - YOU NEED TO RUN IT MANUALLY ON THE HOST!"
|
||||
echo "https://superset.apache.org/docs/contributing/development/#webpack-dev-server"
|
||||
fi
|
||||
|
||||
@@ -74,7 +74,12 @@ DATA_CACHE_CONFIG = CACHE_CONFIG
|
||||
|
||||
class CeleryConfig:
|
||||
broker_url = f"redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_CELERY_DB}"
|
||||
imports = ("superset.sql_lab",)
|
||||
imports = (
|
||||
"superset.sql_lab",
|
||||
"superset.tasks.scheduler",
|
||||
"superset.tasks.thumbnails",
|
||||
"superset.tasks.cache",
|
||||
)
|
||||
result_backend = f"redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_RESULTS_DB}"
|
||||
worker_prefetch_multiplier = 1
|
||||
task_acks_late = False
|
||||
|
||||
@@ -1 +1 @@
|
||||
v20.12.2
|
||||
v20.16.0
|
||||
|
||||
@@ -77,6 +77,7 @@
|
||||
"Guyana",
|
||||
"Haiti",
|
||||
"Honduras",
|
||||
"Hungary",
|
||||
"Iceland",
|
||||
"India",
|
||||
"Indonesia",
|
||||
|
||||
@@ -251,15 +251,18 @@ FROM apache/superset:3.1.0
|
||||
USER root
|
||||
|
||||
RUN apt-get update && \
|
||||
wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \
|
||||
apt-get install -y wget zip libaio1
|
||||
|
||||
RUN export CHROMEDRIVER_VERSION=$(curl --silent https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_116) && \
|
||||
wget -O google-chrome-stable_current_amd64.deb -q http://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROMEDRIVER_VERSION}-1_amd64.deb && \
|
||||
apt-get install -y --no-install-recommends ./google-chrome-stable_current_amd64.deb && \
|
||||
rm -f google-chrome-stable_current_amd64.deb
|
||||
|
||||
RUN export CHROMEDRIVER_VERSION=$(curl --silent https://chromedriver.storage.googleapis.com/LATEST_RELEASE_102) && \
|
||||
wget -q https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION}/chromedriver_linux64.zip && \
|
||||
unzip chromedriver_linux64.zip -d /usr/bin && \
|
||||
RUN export CHROMEDRIVER_VERSION=$(curl --silent https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_116) && \
|
||||
wget -q https://storage.googleapis.com/chrome-for-testing-public/${CHROMEDRIVER_VERSION}/linux64/chromedriver-linux64.zip && \
|
||||
unzip -j chromedriver-linux64.zip -d /usr/bin && \
|
||||
chmod 755 /usr/bin/chromedriver && \
|
||||
rm -f chromedriver_linux64.zip
|
||||
rm -f chromedriver-linux64.zip
|
||||
|
||||
RUN pip install --no-cache gevent psycopg2 redis
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ are compatible with Superset.
|
||||
| [Azure MS SQL](/docs/configuration/databases#sql-server) | `pip install pymssql` | `mssql+pymssql://UserName@presetSQL:TestPassword@presetSQL.database.windows.net:1433/TestSchema` |
|
||||
| [ClickHouse](/docs/configuration/databases#clickhouse) | `pip install clickhouse-connect` | `clickhousedb://{username}:{password}@{hostname}:{port}/{database}` |
|
||||
| [CockroachDB](/docs/configuration/databases#cockroachdb) | `pip install cockroachdb` | `cockroachdb://root@{hostname}:{port}/{database}?sslmode=disable` |
|
||||
| [CouchbaseDB](/docs/configuration/databases#couchbaseDB) | `pip install couchbase-sqlalchemy` | `couchbasedb://{username}:{password}@{hostname}:{port}?truststorepath={ssl certificate path}` |
|
||||
| [Couchbase](/docs/configuration/databases#couchbase) | `pip install couchbase-sqlalchemy` | `couchbase://{username}:{password}@{hostname}:{port}?truststorepath={ssl certificate path}` |
|
||||
| [Dremio](/docs/configuration/databases#dremio) | `pip install sqlalchemy_dremio` | `dremio://user:pwd@host:31010/` |
|
||||
| [Elasticsearch](/docs/configuration/databases#elasticsearch) | `pip install elasticsearch-dbapi` | `elasticsearch+http://{user}:{password}@{host}:9200/` |
|
||||
| [Exasol](/docs/configuration/databases#exasol) | `pip install sqlalchemy-exasol` | `exa+pyodbc://{username}:{password}@{hostname}:{port}/my_schema?CONNECTIONLCALL=en_US.UTF-8&driver=EXAODBC` |
|
||||
@@ -375,9 +375,10 @@ cockroachdb://root@{hostname}:{port}/{database}?sslmode=disable
|
||||
|
||||
|
||||
|
||||
#### CouchbaseDB
|
||||
#### Couchbase
|
||||
|
||||
The recommended connector library for CouchbaseDB is
|
||||
The Couchbase's Superset connection is designed to support two services: Couchbase Analytics and Couchbase Columnar.
|
||||
The recommended connector library for couchbase is
|
||||
[couchbase-sqlalchemy](https://github.com/couchbase/couchbase-sqlalchemy).
|
||||
```
|
||||
pip install couchbase-sqlalchemy
|
||||
@@ -386,7 +387,7 @@ pip install couchbase-sqlalchemy
|
||||
The expected connection string is formatted as follows:
|
||||
|
||||
```
|
||||
couchbasedb://{username}:{password}@{hostname}:{port}?truststorepath={certificate path}?ssl={true/false}
|
||||
couchbase://{username}:{password}@{hostname}:{port}?truststorepath={certificate path}?ssl={true/false}
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ text strings from Superset's UI. You can jump into the existing
|
||||
language dictionaries at
|
||||
`superset/translations/<language_code>/LC_MESSAGES/messages.po`, or
|
||||
even create a dictionary for a new language altogether.
|
||||
See [Translating](howtos#contribute-translations) for more details.
|
||||
See [Translating](howtos#contributing-translations) for more details.
|
||||
|
||||
### Ask Questions
|
||||
|
||||
|
||||
@@ -92,7 +92,50 @@ To install run the following:
|
||||
pre-commit install
|
||||
```
|
||||
|
||||
A series of checks will now run when you make a git commit.
|
||||
This will install the hooks in your local repository. From now on, a series of checks will
|
||||
automatically run whenever you make a Git commit.
|
||||
|
||||
#### Running Pre-commit Manually
|
||||
|
||||
You can also run the pre-commit checks manually in various ways:
|
||||
|
||||
- **Run pre-commit on all files (same as CI):**
|
||||
|
||||
To run the pre-commit checks across all files in your repository, use the following command:
|
||||
|
||||
```bash
|
||||
pre-commit run --all-files
|
||||
```
|
||||
|
||||
This is the same set of checks that will run during CI, ensuring your changes meet the project's standards.
|
||||
|
||||
- **Run pre-commit on a specific file:**
|
||||
|
||||
If you want to check or fix a specific file, you can do so by specifying the file path:
|
||||
|
||||
```bash
|
||||
pre-commit run --files path/to/your/file.py
|
||||
```
|
||||
|
||||
This will only run the checks on the file(s) you specify.
|
||||
|
||||
- **Run a specific pre-commit check:**
|
||||
|
||||
To run a specific check (hook) across all files or a particular file, use the following command:
|
||||
|
||||
```bash
|
||||
pre-commit run <hook_id> --all-files
|
||||
```
|
||||
|
||||
Or for a specific file:
|
||||
|
||||
```bash
|
||||
pre-commit run <hook_id> --files path/to/your/file.py
|
||||
```
|
||||
|
||||
Replace `<hook_id>` with the ID of the specific hook you want to run. You can find the list
|
||||
of available hooks in the `.pre-commit-config.yaml` file.
|
||||
|
||||
|
||||
## Alternatives to docker-compose
|
||||
|
||||
@@ -108,7 +151,7 @@ functioning across environments.
|
||||
#### OS Dependencies
|
||||
|
||||
Make sure your machine meets the [OS dependencies](https://superset.apache.org/docs/installation/pypi#os-dependencies) before following these steps.
|
||||
You also need to install MySQL or [MariaDB](https://mariadb.com/downloads).
|
||||
You also need to install MySQL.
|
||||
|
||||
Ensure that you are using Python version 3.9, 3.10 or 3.11, then proceed with:
|
||||
|
||||
@@ -225,7 +268,7 @@ Frontend assets (TypeScript, JavaScript, CSS, and images) must be compiled in or
|
||||
|
||||
First, be sure you are using the following versions of Node.js and npm:
|
||||
|
||||
- `Node.js`: Version 18
|
||||
- `Node.js`: Version 20
|
||||
- `npm`: Version 10
|
||||
|
||||
We recommend using [nvm](https://github.com/nvm-sh/nvm) to manage your node environment:
|
||||
|
||||
@@ -12,7 +12,7 @@ A philosophy we would like to strongly encourage is
|
||||
|
||||
The purpose is to separate problem from possible solutions.
|
||||
|
||||
**Bug fixes:** If you’re only fixing a small bug, it’s fine to submit a pull request right away but we highly recommend to file an issue detailing what you’re fixing. This is helpful in case we don’t accept that specific fix but want to keep track of the issue. Please keep in mind that the project maintainers reserve the rights to accept or reject incoming PRs, so it is better to separate the issue and the code to fix it from each other. In some cases, project maintainers may request you to create a separate issue from PR before proceeding.
|
||||
**Bug fixes:** If you’re only fixing a small bug, it’s fine to submit a pull request right away but we highly recommend filing an issue detailing what you’re fixing. This is helpful in case we don’t accept that specific fix but want to keep track of the issue. Please keep in mind that the project maintainers reserve the rights to accept or reject incoming PRs, so it is better to separate the issue and the code to fix it from each other. In some cases, project maintainers may request you to create a separate issue from PR before proceeding.
|
||||
|
||||
**Refactor:** For small refactors, it can be a standalone PR itself detailing what you are refactoring and why. If there are concerns, project maintainers may request you to create a `#SIP` for the PR before proceeding.
|
||||
|
||||
|
||||
@@ -106,7 +106,7 @@ You can also certify metrics if you'd like for your team in this view.
|
||||
|
||||
2. Virtual calculated columns: you can write SQL queries that
|
||||
customize the appearance and behavior
|
||||
of a specific column (e.g. `CAST(recovery_rate) as float`).
|
||||
of a specific column (e.g. `CAST(recovery_rate as float)`).
|
||||
Aggregate functions aren't allowed in calculated columns.
|
||||
|
||||
<img src={useBaseUrl("/img/tutorial/tutorial_calculated_column.png" )} />
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@algolia/client-search": "^4.24.0",
|
||||
"@ant-design/icons": "^5.3.7",
|
||||
"@docsearch/react": "^3.6.0",
|
||||
"@ant-design/icons": "^5.4.0",
|
||||
"@docsearch/react": "^3.6.1",
|
||||
"@docusaurus/core": "^3.4.0",
|
||||
"@docusaurus/plugin-client-redirects": "^3.4.0",
|
||||
"@docusaurus/preset-classic": "^3.4.0",
|
||||
@@ -49,8 +49,9 @@
|
||||
"@docusaurus/module-type-aliases": "^3.4.0",
|
||||
"@docusaurus/tsconfig": "^3.4.0",
|
||||
"@types/react": "^18.3.3",
|
||||
"typescript": "^5.5.2",
|
||||
"webpack": "^5.92.1"
|
||||
"typescript": "^5.5.4",
|
||||
"webpack": "^5.93.0"
|
||||
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
|
||||
BIN
docs/static/img/databases/timescale.png
vendored
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 11 KiB |
@@ -235,14 +235,14 @@
|
||||
lodash "^4.17.15"
|
||||
rc-util "^5.9.4"
|
||||
|
||||
"@ant-design/icons@^5.3.7":
|
||||
version "5.3.7"
|
||||
resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-5.3.7.tgz#d9f3654bf7934ee5faba43f91b5a187f5309ec68"
|
||||
integrity sha512-bCPXTAg66f5bdccM4TT21SQBDO1Ek2gho9h3nO9DAKXJP4sq+5VBjrQMSxMVXSB3HyEz+cUbHQ5+6ogxCOpaew==
|
||||
"@ant-design/icons@^5.4.0":
|
||||
version "5.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@ant-design/icons/-/icons-5.4.0.tgz#4bd8f335c68207cc06fe9943d164a81cdfcfbeac"
|
||||
integrity sha512-QZbWC5xQYexCI5q4/fehSEkchJr5UGtvAJweT743qKUQQGs9IH2DehNLP49DJ3Ii9m9CijD2HN6fNy3WKhIFdA==
|
||||
dependencies:
|
||||
"@ant-design/colors" "^7.0.0"
|
||||
"@ant-design/icons-svg" "^4.4.0"
|
||||
"@babel/runtime" "^7.11.2"
|
||||
"@babel/runtime" "^7.24.8"
|
||||
classnames "^2.2.6"
|
||||
rc-util "^5.31.1"
|
||||
|
||||
@@ -1264,10 +1264,10 @@
|
||||
core-js-pure "^3.30.2"
|
||||
regenerator-runtime "^0.14.0"
|
||||
|
||||
"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.3", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.6", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4":
|
||||
version "7.24.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c"
|
||||
integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==
|
||||
"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.3", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.6", "@babel/runtime@^7.24.8", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4":
|
||||
version "7.25.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb"
|
||||
integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==
|
||||
dependencies:
|
||||
regenerator-runtime "^0.14.0"
|
||||
|
||||
@@ -1325,19 +1325,19 @@
|
||||
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
|
||||
integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
|
||||
|
||||
"@docsearch/css@3.6.0":
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.6.0.tgz#0e9f56f704b3a34d044d15fd9962ebc1536ba4fb"
|
||||
integrity sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==
|
||||
"@docsearch/css@3.6.1":
|
||||
version "3.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.6.1.tgz#f0a728ecb486c81f2d282650fc1820c914913408"
|
||||
integrity sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg==
|
||||
|
||||
"@docsearch/react@^3.5.2", "@docsearch/react@^3.6.0":
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.6.0.tgz#b4f25228ecb7fc473741aefac592121e86dd2958"
|
||||
integrity sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==
|
||||
"@docsearch/react@^3.5.2", "@docsearch/react@^3.6.1":
|
||||
version "3.6.1"
|
||||
resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.6.1.tgz#0f826df08693293806d64277d6d9c38636211b97"
|
||||
integrity sha512-qXZkEPvybVhSXj0K7U3bXc233tk5e8PfhoZ6MhPOiik/qUQxYC+Dn9DnoS7CxHQQhHfCvTiN0eY9M12oRghEXw==
|
||||
dependencies:
|
||||
"@algolia/autocomplete-core" "1.9.3"
|
||||
"@algolia/autocomplete-preset-algolia" "1.9.3"
|
||||
"@docsearch/css" "3.6.0"
|
||||
"@docsearch/css" "3.6.1"
|
||||
algoliasearch "^4.19.1"
|
||||
|
||||
"@docusaurus/core@3.4.0", "@docusaurus/core@^3.4.0":
|
||||
@@ -3377,9 +3377,9 @@ autoprefixer@^10.4.14, autoprefixer@^10.4.19:
|
||||
postcss-value-parser "^4.2.0"
|
||||
|
||||
axios@^1.4.0:
|
||||
version "1.6.8"
|
||||
resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66"
|
||||
integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==
|
||||
version "1.7.4"
|
||||
resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.4.tgz#4c8ded1b43683c8dd362973c393f3ede24052aa2"
|
||||
integrity sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==
|
||||
dependencies:
|
||||
follow-redirects "^1.15.6"
|
||||
form-data "^4.0.0"
|
||||
@@ -3567,7 +3567,7 @@ brace-expansion@^2.0.1:
|
||||
dependencies:
|
||||
balanced-match "^1.0.0"
|
||||
|
||||
braces@^3.0.2, braces@~3.0.2:
|
||||
braces@^3.0.3, braces@~3.0.2:
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
|
||||
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
|
||||
@@ -7030,11 +7030,11 @@ micromark@^4.0.0:
|
||||
micromark-util-types "^2.0.0"
|
||||
|
||||
micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5:
|
||||
version "4.0.5"
|
||||
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
|
||||
integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
|
||||
version "4.0.8"
|
||||
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
|
||||
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
|
||||
dependencies:
|
||||
braces "^3.0.2"
|
||||
braces "^3.0.3"
|
||||
picomatch "^2.3.1"
|
||||
|
||||
mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
|
||||
@@ -9909,10 +9909,10 @@ types-ramda@^0.30.0:
|
||||
dependencies:
|
||||
ts-toolbelt "^9.6.0"
|
||||
|
||||
typescript@^5.5.2:
|
||||
version "5.5.2"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.2.tgz#c26f023cb0054e657ce04f72583ea2d85f8d0507"
|
||||
integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==
|
||||
typescript@^5.5.4:
|
||||
version "5.5.4"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba"
|
||||
integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==
|
||||
|
||||
undici-types@~5.26.4:
|
||||
version "5.26.5"
|
||||
@@ -10261,10 +10261,10 @@ webpack-sources@^3.2.3:
|
||||
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
|
||||
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
|
||||
|
||||
webpack@^5.88.1, webpack@^5.92.1:
|
||||
version "5.92.1"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.92.1.tgz#eca5c1725b9e189cffbd86e8b6c3c7400efc5788"
|
||||
integrity sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==
|
||||
webpack@^5.88.1, webpack@^5.93.0:
|
||||
version "5.93.0"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.93.0.tgz#2e89ec7035579bdfba9760d26c63ac5c3462a5e5"
|
||||
integrity sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==
|
||||
dependencies:
|
||||
"@types/eslint-scope" "^3.7.3"
|
||||
"@types/estree" "^1.0.5"
|
||||
|
||||
@@ -61,6 +61,7 @@ dependencies = [
|
||||
"humanize",
|
||||
"importlib_metadata",
|
||||
"isodate",
|
||||
"jsonpath-ng>=1.6.1, <2",
|
||||
"Mako>=1.2.2",
|
||||
"markdown>=3.0",
|
||||
"msgpack>=1.0.0, <1.1",
|
||||
@@ -230,6 +231,7 @@ module = "tests.*"
|
||||
check_untyped_defs = false
|
||||
disallow_untyped_calls = false
|
||||
disallow_untyped_defs = false
|
||||
disable_error_code = "annotation-unchecked"
|
||||
|
||||
[tool.tox]
|
||||
legacy_tox_ini = """
|
||||
|
||||
@@ -144,9 +144,7 @@ geopy==2.4.1
|
||||
google-auth==2.29.0
|
||||
# via shillelagh
|
||||
greenlet==3.0.3
|
||||
# via
|
||||
# shillelagh
|
||||
# sqlalchemy
|
||||
# via shillelagh
|
||||
gunicorn==22.0.0
|
||||
# via apache-superset
|
||||
hashids==1.3.1
|
||||
@@ -173,6 +171,8 @@ jinja2==3.1.4
|
||||
# via
|
||||
# flask
|
||||
# flask-babel
|
||||
jsonpath-ng==1.6.1
|
||||
# via apache-superset
|
||||
jsonschema==4.17.3
|
||||
# via flask-appbuilder
|
||||
kombu==5.3.7
|
||||
@@ -249,6 +249,8 @@ pgsanity==0.2.9
|
||||
# via apache-superset
|
||||
platformdirs==3.8.1
|
||||
# via requests-cache
|
||||
ply==3.11
|
||||
# via jsonpath-ng
|
||||
polyline==2.0.2
|
||||
# via apache-superset
|
||||
prison==0.2.1
|
||||
|
||||
@@ -10,12 +10,12 @@
|
||||
# via
|
||||
# -r requirements/base.in
|
||||
# -r requirements/development.in
|
||||
appnope==0.1.4
|
||||
# via ipython
|
||||
astroid==3.1.0
|
||||
# via pylint
|
||||
boto3==1.34.112
|
||||
# via dataflows-tabulator
|
||||
# via
|
||||
# apache-superset
|
||||
# dataflows-tabulator
|
||||
botocore==1.34.112
|
||||
# via
|
||||
# boto3
|
||||
@@ -177,9 +177,7 @@ protobuf==4.23.0
|
||||
psycopg2-binary==2.9.6
|
||||
# via apache-superset
|
||||
pure-sasl==0.6.2
|
||||
# via
|
||||
# pyhive
|
||||
# thrift-sasl
|
||||
# via thrift-sasl
|
||||
pydata-google-auth==1.7.0
|
||||
# via pandas-gbq
|
||||
pydruid==0.6.9
|
||||
@@ -232,18 +230,9 @@ tableschema==1.20.10
|
||||
thrift==0.16.0
|
||||
# via
|
||||
# apache-superset
|
||||
# pyhive
|
||||
# thrift-sasl
|
||||
thrift-sasl==0.4.3
|
||||
# via
|
||||
# build
|
||||
# coverage
|
||||
# pip-tools
|
||||
# pylint
|
||||
# pyproject-api
|
||||
# pyproject-hooks
|
||||
# pytest
|
||||
# tox
|
||||
# via apache-superset
|
||||
tomlkit==0.12.5
|
||||
# via pylint
|
||||
toposort==1.10
|
||||
@@ -254,9 +243,6 @@ tqdm==4.66.4
|
||||
# via
|
||||
# cmdstanpy
|
||||
# prophet
|
||||
traitlets==5.14.3
|
||||
# via
|
||||
# matplotlib-inline
|
||||
trino==0.328.0
|
||||
# via apache-superset
|
||||
tzlocal==5.2
|
||||
|
||||
@@ -52,7 +52,7 @@ GITHUB_TOKEN = os.environ.get("GITHUB_TOKEN")
|
||||
def fetch_files_github_api(url: str): # type: ignore
|
||||
"""Fetches data using GitHub API."""
|
||||
req = Request(url)
|
||||
req.add_header("Authorization", f"token {GITHUB_TOKEN}")
|
||||
req.add_header("Authorization", f"Bearer {GITHUB_TOKEN}")
|
||||
req.add_header("Accept", "application/vnd.github.v3+json")
|
||||
|
||||
print(f"Fetching from {url}")
|
||||
|
||||
@@ -53,6 +53,9 @@ function test_init() {
|
||||
echo Superset init
|
||||
echo --------------------
|
||||
superset init
|
||||
echo Load test users
|
||||
echo --------------------
|
||||
superset load-test-users
|
||||
}
|
||||
|
||||
#
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd ../.. && pwd )"
|
||||
LICENSE_TMP=$(mktemp)
|
||||
@@ -47,6 +48,10 @@ pybabel extract \
|
||||
--copyright-holder=Superset \
|
||||
--project=Superset \
|
||||
-k _ -k __ -k t -k tn:1,2 -k tct .
|
||||
|
||||
# Normalize .pot file
|
||||
msgcat --sort-by-msgid --no-wrap --no-location superset/translations/messages.pot -o superset/translations/messages.pot
|
||||
|
||||
cat $LICENSE_TMP superset/translations/messages.pot > messages.pot.tmp \
|
||||
&& mv messages.pot.tmp superset/translations/messages.pot
|
||||
|
||||
|
||||
20
superset-embedded-sdk/package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@superset-ui/embedded-sdk",
|
||||
"version": "0.1.0-alpha.11",
|
||||
"version": "0.1.0-alpha.12",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@superset-ui/embedded-sdk",
|
||||
"version": "0.1.0-alpha.11",
|
||||
"version": "0.1.0-alpha.12",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@superset-ui/switchboard": "^0.18.26-0",
|
||||
@@ -3031,12 +3031,12 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/axios": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz",
|
||||
"integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==",
|
||||
"version": "1.7.4",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz",
|
||||
"integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"follow-redirects": "^1.15.0",
|
||||
"follow-redirects": "^1.15.6",
|
||||
"form-data": "^4.0.0",
|
||||
"proxy-from-env": "^1.1.0"
|
||||
}
|
||||
@@ -10269,12 +10269,12 @@
|
||||
"dev": true
|
||||
},
|
||||
"axios": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz",
|
||||
"integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==",
|
||||
"version": "1.7.4",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz",
|
||||
"integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"follow-redirects": "^1.15.0",
|
||||
"follow-redirects": "^1.15.6",
|
||||
"form-data": "^4.0.0",
|
||||
"proxy-from-env": "^1.1.0"
|
||||
},
|
||||
|
||||
@@ -1 +1 @@
|
||||
v18.20.1
|
||||
v20.16.0
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
*/
|
||||
import { withJsx } from '@mihkeleidast/storybook-addon-source';
|
||||
import { supersetTheme, ThemeProvider } from '@superset-ui/core';
|
||||
import { AntdThemeProvider } from '../src/components/AntdThemeProvider';
|
||||
import { combineReducers, createStore, applyMiddleware, compose } from 'redux';
|
||||
import thunk from 'redux-thunk';
|
||||
import { Provider } from 'react-redux';
|
||||
@@ -35,10 +36,10 @@ const store = createStore(
|
||||
|
||||
const themeDecorator = Story => (
|
||||
<ThemeProvider theme={supersetTheme}>
|
||||
<>
|
||||
<AntdThemeProvider>
|
||||
<GlobalStyles />
|
||||
<Story />
|
||||
</>
|
||||
</AntdThemeProvider>
|
||||
</ThemeProvider>
|
||||
);
|
||||
|
||||
|
||||
@@ -86,16 +86,12 @@ describe('Charts list', () => {
|
||||
saveChartToDashboard('3 - Sample dashboard');
|
||||
visitChartList();
|
||||
cy.getBySel('count-crosslinks').should('be.visible');
|
||||
cy.getBySel('crosslinks')
|
||||
.first()
|
||||
.trigger('mouseover')
|
||||
.then(() => {
|
||||
cy.get('.ant-tooltip')
|
||||
.contains('3 - Sample dashboard')
|
||||
.invoke('removeAttr', 'target')
|
||||
.click();
|
||||
cy.wait('@get');
|
||||
});
|
||||
cy.getBySel('crosslinks').first().trigger('mouseover');
|
||||
cy.get('.ant-tooltip')
|
||||
.contains('3 - Sample dashboard')
|
||||
.invoke('removeAttr', 'target')
|
||||
.click();
|
||||
cy.wait('@get');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -293,9 +289,8 @@ describe('Charts list', () => {
|
||||
// edits in list-view
|
||||
setGridMode('list');
|
||||
cy.getBySel('edit-alt').eq(1).click();
|
||||
cy.getBySel('properties-modal-name-input')
|
||||
.clear()
|
||||
.type('1 - Sample chart');
|
||||
cy.getBySel('properties-modal-name-input').clear();
|
||||
cy.getBySel('properties-modal-name-input').type('1 - Sample chart');
|
||||
cy.get('button:contains("Save")').click();
|
||||
cy.wait('@update');
|
||||
cy.getBySel('table-row').eq(1).contains('1 - Sample chart');
|
||||
|
||||
@@ -43,11 +43,8 @@ const openTableContextMenu = (
|
||||
cellContent: string,
|
||||
tableSelector = "[data-test-viz-type='table']",
|
||||
) => {
|
||||
cy.get(tableSelector)
|
||||
.scrollIntoView()
|
||||
.contains(cellContent)
|
||||
.first()
|
||||
.rightclick();
|
||||
cy.get(tableSelector).scrollIntoView();
|
||||
cy.get(tableSelector).contains(cellContent).first().rightclick();
|
||||
};
|
||||
|
||||
const drillBy = (targetDrillByColumn: string, isLegacy = false) => {
|
||||
@@ -94,14 +91,16 @@ const testEchart = (
|
||||
) => {
|
||||
cy.get(`[data-test-viz-type='${vizType}'] canvas`).then($canvas => {
|
||||
// click 'boy'
|
||||
cy.wrap($canvas)
|
||||
.scrollIntoView()
|
||||
.trigger(
|
||||
'mouseover',
|
||||
drillClickCoordinates[0][0],
|
||||
drillClickCoordinates[0][1],
|
||||
)
|
||||
.rightclick(drillClickCoordinates[0][0], drillClickCoordinates[0][1]);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).trigger(
|
||||
'mouseover',
|
||||
drillClickCoordinates[0][0],
|
||||
drillClickCoordinates[0][1],
|
||||
);
|
||||
cy.wrap($canvas).rightclick(
|
||||
drillClickCoordinates[0][0],
|
||||
drillClickCoordinates[0][1],
|
||||
);
|
||||
|
||||
drillBy('state').then(intercepted => {
|
||||
verifyExpectedFormData(intercepted, {
|
||||
@@ -139,14 +138,16 @@ const testEchart = (
|
||||
// further drill
|
||||
cy.get(`[data-test="drill-by-chart"] canvas`).then($canvas => {
|
||||
// click 'other'
|
||||
cy.wrap($canvas)
|
||||
.scrollIntoView()
|
||||
.trigger(
|
||||
'mouseover',
|
||||
drillClickCoordinates[1][0],
|
||||
drillClickCoordinates[1][1],
|
||||
)
|
||||
.rightclick(drillClickCoordinates[1][0], drillClickCoordinates[1][1]);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).trigger(
|
||||
'mouseover',
|
||||
drillClickCoordinates[1][0],
|
||||
drillClickCoordinates[1][1],
|
||||
);
|
||||
cy.wrap($canvas).rightclick(
|
||||
drillClickCoordinates[1][0],
|
||||
drillClickCoordinates[1][1],
|
||||
);
|
||||
|
||||
drillBy(furtherDrillDimension).then(intercepted => {
|
||||
verifyExpectedFormData(intercepted, {
|
||||
@@ -609,10 +610,9 @@ describe('Drill by modal', () => {
|
||||
it('Mixed Chart', () => {
|
||||
cy.get('[data-test-viz-type="mixed_timeseries"] canvas').then($canvas => {
|
||||
// click 'boy'
|
||||
cy.wrap($canvas)
|
||||
.scrollIntoView()
|
||||
.trigger('mouseover', 70, 93)
|
||||
.rightclick(70, 93);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).trigger('mouseover', 70, 93);
|
||||
cy.wrap($canvas).rightclick(70, 93);
|
||||
|
||||
drillBy('name').then(intercepted => {
|
||||
const { queries } = intercepted.request.body;
|
||||
@@ -644,10 +644,9 @@ describe('Drill by modal', () => {
|
||||
// further drill
|
||||
cy.get(`[data-test="drill-by-chart"] canvas`).then($canvas => {
|
||||
// click second query
|
||||
cy.wrap($canvas)
|
||||
.scrollIntoView()
|
||||
.trigger('mouseover', 246, 114)
|
||||
.rightclick(246, 114);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).trigger('mouseover', 246, 114);
|
||||
cy.wrap($canvas).rightclick(246, 114);
|
||||
|
||||
drillBy('ds').then(intercepted => {
|
||||
const { queries } = intercepted.request.body;
|
||||
|
||||
@@ -86,46 +86,41 @@ function testTimeChart(vizType: string) {
|
||||
interceptSamples();
|
||||
|
||||
cy.get(`[data-test-viz-type='${vizType}'] canvas`).then($canvas => {
|
||||
cy.wrap($canvas)
|
||||
.scrollIntoView()
|
||||
.trigger('mousemove', 70, 93)
|
||||
.rightclick(70, 93);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).trigger('mousemove', 70, 93);
|
||||
cy.wrap($canvas).rightclick(70, 93);
|
||||
|
||||
openModalFromChartContext('Drill to detail by 1965');
|
||||
cy.getBySel('filter-val').should('contain', '1965');
|
||||
closeModal();
|
||||
|
||||
cy.wrap($canvas)
|
||||
.scrollIntoView()
|
||||
.trigger('mousemove', 70, 93)
|
||||
.rightclick(70, 93);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).trigger('mousemove', 70, 93);
|
||||
cy.wrap($canvas).rightclick(70, 93);
|
||||
|
||||
openModalFromChartContext('Drill to detail by boy');
|
||||
cy.getBySel('filter-val').should('contain', 'boy');
|
||||
closeModal();
|
||||
|
||||
cy.wrap($canvas)
|
||||
.scrollIntoView()
|
||||
.trigger('mousemove', 70, 93)
|
||||
.rightclick(70, 93);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).trigger('mousemove', 70, 93);
|
||||
cy.wrap($canvas).rightclick(70, 93);
|
||||
|
||||
openModalFromChartContext('Drill to detail by all');
|
||||
cy.getBySel('filter-val').first().should('contain', '1965');
|
||||
cy.getBySel('filter-val').eq(1).should('contain', 'boy');
|
||||
closeModal();
|
||||
|
||||
cy.wrap($canvas)
|
||||
.scrollIntoView()
|
||||
.trigger('mousemove', 70, 145)
|
||||
.rightclick(70, 145);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).trigger('mousemove', 70, 145);
|
||||
cy.wrap($canvas).rightclick(70, 145);
|
||||
openModalFromChartContext('Drill to detail by girl');
|
||||
cy.getBySel('filter-val').should('contain', 'girl');
|
||||
closeModal();
|
||||
|
||||
cy.wrap($canvas)
|
||||
.scrollIntoView()
|
||||
.trigger('mousemove', 70, 145)
|
||||
.rightclick(70, 145);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).trigger('mousemove', 70, 145);
|
||||
cy.wrap($canvas).rightclick(70, 145);
|
||||
openModalFromChartContext('Drill to detail by all');
|
||||
cy.getBySel('filter-val').first().should('contain', '1965');
|
||||
cy.getBySel('filter-val').eq(1).should('contain', 'girl');
|
||||
@@ -206,9 +201,12 @@ describe('Drill to detail modal', () => {
|
||||
interceptSamples();
|
||||
|
||||
// opens the modal by clicking on the number on the chart
|
||||
cy.get("[data-test-viz-type='big_number_total'] .header-line")
|
||||
.scrollIntoView()
|
||||
.rightclick();
|
||||
cy.get(
|
||||
"[data-test-viz-type='big_number_total'] .header-line",
|
||||
).scrollIntoView();
|
||||
cy.get(
|
||||
"[data-test-viz-type='big_number_total'] .header-line",
|
||||
).rightclick();
|
||||
|
||||
openModalFromChartContext('Drill to detail');
|
||||
|
||||
@@ -221,9 +219,10 @@ describe('Drill to detail modal', () => {
|
||||
interceptSamples();
|
||||
|
||||
// opens the modal by clicking on the number
|
||||
cy.get("[data-test-viz-type='big_number'] .header-line")
|
||||
.scrollIntoView()
|
||||
.rightclick();
|
||||
cy.get(
|
||||
"[data-test-viz-type='big_number'] .header-line",
|
||||
).scrollIntoView();
|
||||
cy.get("[data-test-viz-type='big_number'] .header-line").rightclick();
|
||||
|
||||
openModalFromChartContext('Drill to detail');
|
||||
|
||||
@@ -233,10 +232,9 @@ describe('Drill to detail modal', () => {
|
||||
|
||||
// opens the modal by clicking on the trendline
|
||||
cy.get("[data-test-viz-type='big_number'] canvas").then($canvas => {
|
||||
cy.wrap($canvas)
|
||||
.scrollIntoView()
|
||||
.trigger('mousemove', 1, 14)
|
||||
.rightclick(1, 14);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).trigger('mousemove', 1, 14);
|
||||
cy.wrap($canvas).rightclick(1, 14);
|
||||
|
||||
openModalFromChartContext('Drill to detail by 1965');
|
||||
|
||||
@@ -254,10 +252,8 @@ describe('Drill to detail modal', () => {
|
||||
cy.get("[data-test-viz-type='table']").contains('boy').rightclick();
|
||||
|
||||
cy.wait(500);
|
||||
cy.get("[data-test-viz-type='table']")
|
||||
.contains('boy')
|
||||
.scrollIntoView()
|
||||
.rightclick();
|
||||
cy.get("[data-test-viz-type='table']").contains('boy').scrollIntoView();
|
||||
cy.get("[data-test-viz-type='table']").contains('boy').rightclick();
|
||||
|
||||
openModalFromChartContext('Drill to detail by boy');
|
||||
|
||||
@@ -268,10 +264,8 @@ describe('Drill to detail modal', () => {
|
||||
// focus on table first to trigger browser scroll
|
||||
cy.get("[data-test-viz-type='table']").contains('girl').rightclick();
|
||||
cy.wait(500);
|
||||
cy.get("[data-test-viz-type='table']")
|
||||
.scrollIntoView()
|
||||
.contains('girl')
|
||||
.rightclick();
|
||||
cy.get("[data-test-viz-type='table']").scrollIntoView();
|
||||
cy.get("[data-test-viz-type='table']").contains('girl').rightclick();
|
||||
|
||||
openModalFromChartContext('Drill to detail by girl');
|
||||
|
||||
@@ -283,8 +277,8 @@ describe('Drill to detail modal', () => {
|
||||
it('opens the modal with the correct filters', () => {
|
||||
interceptSamples();
|
||||
|
||||
cy.get("[data-test-viz-type='pivot_table_v2']").scrollIntoView();
|
||||
cy.get("[data-test-viz-type='pivot_table_v2']")
|
||||
.scrollIntoView()
|
||||
.find('[role="gridcell"]')
|
||||
.first()
|
||||
.rightclick();
|
||||
@@ -294,8 +288,8 @@ describe('Drill to detail modal', () => {
|
||||
cy.getBySel('filter-val').should('contain', 'boy');
|
||||
closeModal();
|
||||
|
||||
cy.get("[data-test-viz-type='pivot_table_v2']").scrollIntoView();
|
||||
cy.get("[data-test-viz-type='pivot_table_v2']")
|
||||
.scrollIntoView()
|
||||
.find('[role="gridcell"]')
|
||||
.first()
|
||||
.rightclick();
|
||||
@@ -305,8 +299,8 @@ describe('Drill to detail modal', () => {
|
||||
cy.getBySel('filter-val').should('contain', 'CA');
|
||||
closeModal();
|
||||
|
||||
cy.get("[data-test-viz-type='pivot_table_v2']").scrollIntoView();
|
||||
cy.get("[data-test-viz-type='pivot_table_v2']")
|
||||
.scrollIntoView()
|
||||
.find('[role="gridcell"]')
|
||||
.eq(3)
|
||||
.rightclick();
|
||||
@@ -316,8 +310,8 @@ describe('Drill to detail modal', () => {
|
||||
cy.getBySel('filter-val').should('contain', 'girl');
|
||||
closeModal();
|
||||
|
||||
cy.get("[data-test-viz-type='pivot_table_v2']").scrollIntoView();
|
||||
cy.get("[data-test-viz-type='pivot_table_v2']")
|
||||
.scrollIntoView()
|
||||
.find('[role="gridcell"]')
|
||||
.eq(3)
|
||||
.rightclick();
|
||||
@@ -327,8 +321,8 @@ describe('Drill to detail modal', () => {
|
||||
cy.getBySel('filter-val').should('contain', 'FL');
|
||||
closeModal();
|
||||
|
||||
cy.get("[data-test-viz-type='pivot_table_v2']").scrollIntoView();
|
||||
cy.get("[data-test-viz-type='pivot_table_v2']")
|
||||
.scrollIntoView()
|
||||
.find('[role="gridcell"]')
|
||||
.eq(3)
|
||||
.rightclick();
|
||||
@@ -352,26 +346,30 @@ describe('Drill to detail modal', () => {
|
||||
|
||||
cy.get("[data-test-viz-type='echarts_timeseries_bar'] canvas").then(
|
||||
$canvas => {
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(70, 100);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(70, 100);
|
||||
|
||||
openModalFromChartContext('Drill to detail by 1965');
|
||||
cy.getBySel('filter-val').should('contain', '1965');
|
||||
closeModal();
|
||||
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(70, 100);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(70, 100);
|
||||
|
||||
openModalFromChartContext('Drill to detail by boy');
|
||||
cy.getBySel('filter-val').should('contain', 'boy');
|
||||
closeModal();
|
||||
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(70, 100);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(70, 100);
|
||||
|
||||
openModalFromChartContext('Drill to detail by all');
|
||||
cy.getBySel('filter-val').first().should('contain', '1965');
|
||||
cy.getBySel('filter-val').eq(1).should('contain', 'boy');
|
||||
closeModal();
|
||||
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(72, 200);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(72, 200);
|
||||
|
||||
openModalFromChartContext('Drill to detail by girl');
|
||||
cy.getBySel('filter-val').should('contain', 'girl');
|
||||
@@ -398,13 +396,15 @@ describe('Drill to detail modal', () => {
|
||||
|
||||
// opens the modal by clicking on the slice of the Pie chart
|
||||
cy.get("[data-test-viz-type='pie'] canvas").then($canvas => {
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(130, 150);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(130, 150);
|
||||
|
||||
openModalFromChartContext('Drill to detail by girl');
|
||||
cy.getBySel('filter-val').should('contain', 'girl');
|
||||
closeModal();
|
||||
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(230, 190);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(230, 190);
|
||||
|
||||
openModalFromChartContext('Drill to detail by boy');
|
||||
cy.getBySel('filter-val').should('contain', 'boy');
|
||||
@@ -417,13 +417,15 @@ describe('Drill to detail modal', () => {
|
||||
interceptSamples();
|
||||
|
||||
cy.get("[data-test-viz-type='world_map'] svg").then($canvas => {
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(70, 150);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(70, 150);
|
||||
openModalFromChartContext('Drill to detail by USA');
|
||||
cy.getBySel('filter-val').should('contain', 'USA');
|
||||
closeModal();
|
||||
});
|
||||
cy.get("[data-test-viz-type='world_map'] svg").then($canvas => {
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(200, 140);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(200, 140);
|
||||
openModalFromChartContext('Drill to detail by SRB');
|
||||
cy.getBySel('filter-val').should('contain', 'SRB');
|
||||
});
|
||||
@@ -435,7 +437,8 @@ describe('Drill to detail modal', () => {
|
||||
interceptSamples();
|
||||
|
||||
cy.get("[data-test-viz-type='dist_bar'] svg").then($canvas => {
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(70, 150);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(70, 150);
|
||||
openModalFromChartContext('Drill to detail');
|
||||
cy.getBySel('filter-val').should('not.exist');
|
||||
});
|
||||
@@ -461,9 +464,10 @@ describe('Drill to detail modal', () => {
|
||||
const canvasCenterX = canvasWidth / 3;
|
||||
const canvasCenterY = (canvasHeight * 5) / 6;
|
||||
|
||||
cy.wrap($canvas)
|
||||
.scrollIntoView()
|
||||
.rightclick(canvasCenterX, canvasCenterY, { force: true });
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(canvasCenterX, canvasCenterY, {
|
||||
force: true,
|
||||
});
|
||||
|
||||
openModalFromChartContext('Drill to detail by boy');
|
||||
|
||||
@@ -497,19 +501,17 @@ describe('Drill to detail modal', () => {
|
||||
interceptSamples();
|
||||
|
||||
cy.get("[data-test-viz-type='box_plot'] canvas").then($canvas => {
|
||||
cy.wrap($canvas)
|
||||
.scrollIntoView()
|
||||
.trigger('mousemove', 135, 275)
|
||||
.rightclick(135, 275);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).trigger('mousemove', 135, 275);
|
||||
cy.wrap($canvas).rightclick(135, 275);
|
||||
|
||||
openModalFromChartContext('Drill to detail by boy');
|
||||
cy.getBySel('filter-val').should('contain', 'boy');
|
||||
closeModal();
|
||||
|
||||
cy.wrap($canvas)
|
||||
.scrollIntoView()
|
||||
.trigger('mousemove', 270, 280)
|
||||
.rightclick(270, 280);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).trigger('mousemove', 270, 280);
|
||||
cy.wrap($canvas).rightclick(270, 280);
|
||||
|
||||
openModalFromChartContext('Drill to detail by girl');
|
||||
cy.getBySel('filter-val').should('contain', 'girl');
|
||||
@@ -540,13 +542,15 @@ describe('Drill to detail modal', () => {
|
||||
interceptSamples();
|
||||
|
||||
cy.get("[data-test-viz-type='funnel'] canvas").then($canvas => {
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(170, 90);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(170, 90);
|
||||
|
||||
openModalFromChartContext('Drill to detail by boy');
|
||||
cy.getBySel('filter-val').should('contain', 'boy');
|
||||
closeModal();
|
||||
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(190, 250);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(190, 250);
|
||||
|
||||
openModalFromChartContext('Drill to detail by girl');
|
||||
cy.getBySel('filter-val').should('contain', 'girl');
|
||||
@@ -559,13 +563,15 @@ describe('Drill to detail modal', () => {
|
||||
interceptSamples();
|
||||
|
||||
cy.get("[data-test-viz-type='gauge_chart'] canvas").then($canvas => {
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(135, 95);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(135, 95);
|
||||
|
||||
openModalFromChartContext('Drill to detail by boy');
|
||||
cy.getBySel('filter-val').should('contain', 'boy');
|
||||
closeModal();
|
||||
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(95, 135);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(95, 135);
|
||||
|
||||
openModalFromChartContext('Drill to detail by girl');
|
||||
cy.getBySel('filter-val').should('contain', 'girl');
|
||||
@@ -584,13 +590,15 @@ describe('Drill to detail modal', () => {
|
||||
interceptSamples();
|
||||
|
||||
cy.get("[data-test-viz-type='radar'] canvas").then($canvas => {
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(180, 45);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(180, 45);
|
||||
|
||||
openModalFromChartContext('Drill to detail by boy');
|
||||
cy.getBySel('filter-val').should('contain', 'boy');
|
||||
closeModal();
|
||||
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(180, 85);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(180, 85);
|
||||
|
||||
openModalFromChartContext('Drill to detail by girl');
|
||||
cy.getBySel('filter-val').should('contain', 'girl');
|
||||
@@ -603,13 +611,15 @@ describe('Drill to detail modal', () => {
|
||||
interceptSamples();
|
||||
|
||||
cy.get("[data-test-viz-type='treemap_v2'] canvas").then($canvas => {
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(100, 30);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(100, 30);
|
||||
|
||||
openModalFromChartContext('Drill to detail by boy');
|
||||
cy.getBySel('filter-val').should('contain', 'boy');
|
||||
closeModal();
|
||||
|
||||
cy.wrap($canvas).scrollIntoView().rightclick(150, 250);
|
||||
cy.wrap($canvas).scrollIntoView();
|
||||
cy.wrap($canvas).rightclick(150, 250);
|
||||
|
||||
openModalFromChartContext('Drill to detail by girl');
|
||||
cy.getBySel('filter-val').should('contain', 'girl');
|
||||
|
||||
@@ -663,7 +663,8 @@ describe('Dashboard edit', () => {
|
||||
});
|
||||
|
||||
it('should edit the title', () => {
|
||||
cy.getBySel('dashboard-title-input').clear().type('Edited title');
|
||||
cy.getBySel('dashboard-title-input').clear();
|
||||
cy.getBySel('dashboard-title-input').type('Edited title');
|
||||
applyChanges();
|
||||
cy.getBySel('editable-title-input').should('have.value', 'Edited title');
|
||||
});
|
||||
@@ -684,7 +685,8 @@ describe('Dashboard edit', () => {
|
||||
});
|
||||
|
||||
it('should edit the title inline', () => {
|
||||
cy.getBySel('editable-title-input').clear().type('Edited title{enter}');
|
||||
cy.getBySel('editable-title-input').clear();
|
||||
cy.getBySel('editable-title-input').type('Edited title{enter}');
|
||||
cy.getBySel('header-save-button').should('be.enabled');
|
||||
});
|
||||
|
||||
@@ -747,7 +749,8 @@ describe('Dashboard edit', () => {
|
||||
'Click here to learn more about [markdown formatting](https://bit.ly/1dQOfRK)',
|
||||
);
|
||||
|
||||
cy.getBySel('dashboard-markdown-editor').click().type('Test resize');
|
||||
cy.getBySel('dashboard-markdown-editor').click();
|
||||
cy.getBySel('dashboard-markdown-editor').type('Test resize');
|
||||
|
||||
resize(
|
||||
'[data-test="dashboard-markdown-editor"] .resizable-container div.resizable-container-handle--bottom + div',
|
||||
|
||||
@@ -57,9 +57,9 @@ describe('Dashboard tabs', () => {
|
||||
it('should switch tabs', () => {
|
||||
topLevelTabs();
|
||||
|
||||
cy.get('@top-level-tabs').first().click();
|
||||
cy.get('@top-level-tabs')
|
||||
.first()
|
||||
.click()
|
||||
.should('have.class', 'ant-tabs-tab-active');
|
||||
cy.get('@top-level-tabs')
|
||||
.last()
|
||||
@@ -68,9 +68,9 @@ describe('Dashboard tabs', () => {
|
||||
cy.getBySel('grid-container').find('.box_plot').should('not.exist');
|
||||
cy.getBySel('grid-container').find('.line').should('not.exist');
|
||||
|
||||
cy.get('@top-level-tabs').last().click();
|
||||
cy.get('@top-level-tabs')
|
||||
.last()
|
||||
.click()
|
||||
.should('have.class', 'ant-tabs-tab-active');
|
||||
cy.get('@top-level-tabs')
|
||||
.first()
|
||||
@@ -99,7 +99,8 @@ describe('Dashboard tabs', () => {
|
||||
getChartAliasBySpec(TREEMAP).then(treemapAlias => {
|
||||
// apply filter
|
||||
cy.get('.Select__control').first().should('be.visible').click();
|
||||
cy.get('.Select__control input[type=text]').first().focus().type('South');
|
||||
cy.get('.Select__control input[type=text]').first().focus();
|
||||
cy.focused().type('South');
|
||||
cy.get('.Select__option').contains('South Asia').click();
|
||||
cy.get('.filter button:not(:disabled)').contains('Apply').click();
|
||||
|
||||
@@ -166,18 +167,18 @@ describe('Dashboard tabs', () => {
|
||||
});
|
||||
|
||||
it('should update size when switch tab', () => {
|
||||
cy.get('@top-level-tabs').last().click();
|
||||
cy.get('@top-level-tabs')
|
||||
.last()
|
||||
.click()
|
||||
.should('have.class', 'ant-tabs-tab-active');
|
||||
|
||||
expandFilterOnLeftPanel();
|
||||
|
||||
cy.wait(1000);
|
||||
|
||||
cy.get('@top-level-tabs').first().click();
|
||||
cy.get('@top-level-tabs')
|
||||
.first()
|
||||
.click()
|
||||
.should('have.class', 'ant-tabs-tab-active');
|
||||
|
||||
cy.wait(1000);
|
||||
|
||||
@@ -239,15 +239,11 @@ export function enterNativeFilterEditModal(waitForDataset = true) {
|
||||
* @summary helper for adding new filter
|
||||
************************************************************************* */
|
||||
export function clickOnAddFilterInModal() {
|
||||
cy.get(nativeFilters.addFilterButton.button).first().click();
|
||||
return cy
|
||||
.get(nativeFilters.addFilterButton.button)
|
||||
.first()
|
||||
.click()
|
||||
.then(() => {
|
||||
cy.get(nativeFilters.addFilterButton.dropdownItem)
|
||||
.contains('Filter')
|
||||
.click({ force: true });
|
||||
});
|
||||
.get(nativeFilters.addFilterButton.dropdownItem)
|
||||
.contains('Filter')
|
||||
.click({ force: true });
|
||||
}
|
||||
|
||||
/** ************************************************************************
|
||||
@@ -272,14 +268,22 @@ export function fillNativeFilterForm(
|
||||
cy.get(nativeFilters.modal.container)
|
||||
.find(nativeFilters.filtersPanel.filterName)
|
||||
.last()
|
||||
.click({ scrollBehavior: false })
|
||||
.clear({ force: true })
|
||||
.click({ scrollBehavior: false });
|
||||
cy.get(nativeFilters.modal.container)
|
||||
.find(nativeFilters.filtersPanel.filterName)
|
||||
.last()
|
||||
.clear({ force: true });
|
||||
cy.get(nativeFilters.modal.container)
|
||||
.find(nativeFilters.filtersPanel.filterName)
|
||||
.last()
|
||||
.type(name, { scrollBehavior: false, force: true });
|
||||
if (dataset) {
|
||||
cy.get(nativeFilters.modal.container)
|
||||
.find(nativeFilters.filtersPanel.datasetName)
|
||||
.last()
|
||||
.click({ force: true, scrollBehavior: false })
|
||||
.click({ force: true, scrollBehavior: false });
|
||||
cy.get(nativeFilters.modal.container)
|
||||
.find(nativeFilters.filtersPanel.datasetName)
|
||||
.type(`${dataset}`, { scrollBehavior: false });
|
||||
cy.get(nativeFilters.silentLoading).should('not.exist');
|
||||
cy.get(`[label="${dataset}"]`).click({ multiple: true, force: true });
|
||||
@@ -339,9 +343,9 @@ export function addParentFilterWithValue(index: number, value: string) {
|
||||
return cy
|
||||
.get(nativeFilters.filterConfigurationSections.displayedSection)
|
||||
.within(() => {
|
||||
cy.get('input[aria-label="Limit type"]').eq(index).click({ force: true });
|
||||
cy.get('input[aria-label="Limit type"]')
|
||||
.eq(index)
|
||||
.click({ force: true })
|
||||
.type(`${value}{enter}`, { delay: 30, force: true });
|
||||
});
|
||||
}
|
||||
|
||||
@@ -240,7 +240,8 @@ describe('Dashboards list', () => {
|
||||
// edits in list-view
|
||||
setGridMode('list');
|
||||
cy.getBySel('edit-alt').eq(0).click();
|
||||
cy.getBySel('dashboard-title-input').clear().type('1 - Sample dashboard');
|
||||
cy.getBySel('dashboard-title-input').clear();
|
||||
cy.getBySel('dashboard-title-input').type('1 - Sample dashboard');
|
||||
cy.get('button:contains("Save")').click();
|
||||
cy.wait('@update');
|
||||
cy.getBySel('table-row').eq(0).contains('1 - Sample dashboard');
|
||||
|
||||
@@ -62,8 +62,10 @@ describe('Add database', () => {
|
||||
it('show error alerts on dynamic form for bad host', () => {
|
||||
// click postgres dynamic form
|
||||
cy.get('.preferred > :nth-child(1)').click();
|
||||
cy.get('input[name="host"]').focus().type('badhost', { force: true });
|
||||
cy.get('input[name="port"]').focus().type('5432', { force: true });
|
||||
cy.get('input[name="host"]').focus();
|
||||
cy.focused().type('badhost', { force: true });
|
||||
cy.get('input[name="port"]').focus();
|
||||
cy.focused().type('5432', { force: true });
|
||||
cy.get('.ant-form-item-explain-error').contains(
|
||||
"The hostname provided can't be resolved",
|
||||
);
|
||||
@@ -72,8 +74,10 @@ describe('Add database', () => {
|
||||
it('show error alerts on dynamic form for bad port', () => {
|
||||
// click postgres dynamic form
|
||||
cy.get('.preferred > :nth-child(1)').click();
|
||||
cy.get('input[name="host"]').focus().type('localhost', { force: true });
|
||||
cy.get('input[name="port"]').focus().type('123', { force: true });
|
||||
cy.get('input[name="host"]').focus();
|
||||
cy.focused().type('localhost', { force: true });
|
||||
cy.get('input[name="port"]').focus();
|
||||
cy.focused().type('123', { force: true });
|
||||
cy.get('input[name="database"]').focus();
|
||||
cy.get('.ant-form-item-explain-error').contains('The port is closed');
|
||||
});
|
||||
|
||||
@@ -41,12 +41,10 @@ describe('AdhocMetrics', () => {
|
||||
cy.get('[data-test="AdhocMetricEditTitle#trigger"]').click();
|
||||
cy.get('[data-test="AdhocMetricEditTitle#input"]').type(metricName);
|
||||
|
||||
cy.get('input[aria-label="Select column"]')
|
||||
.click()
|
||||
.type('num_girls{enter}');
|
||||
cy.get('input[aria-label="Select aggregate options"]')
|
||||
.click()
|
||||
.type('sum{enter}');
|
||||
cy.get('input[aria-label="Select column"]').click();
|
||||
cy.get('input[aria-label="Select column"]').type('num_girls{enter}');
|
||||
cy.get('input[aria-label="Select aggregate options"]').click();
|
||||
cy.get('input[aria-label="Select aggregate options"]').type('sum{enter}');
|
||||
|
||||
cy.get('[data-test="AdhocMetricEdit#save"]').contains('Save').click();
|
||||
|
||||
|
||||
@@ -35,8 +35,10 @@ describe.skip('AdhocFilters', () => {
|
||||
});
|
||||
|
||||
cy.get('[data-test=adhoc_filters]').within(() => {
|
||||
cy.get('.Select__control').scrollIntoView().click();
|
||||
cy.get('input[type=text]').focus().type('name{enter}');
|
||||
cy.get('.Select__control').scrollIntoView();
|
||||
cy.get('.Select__control').click();
|
||||
cy.get('input[type=text]').focus();
|
||||
cy.focused().type('name{enter}');
|
||||
cy.get("div[role='button']").first().click();
|
||||
});
|
||||
|
||||
@@ -54,9 +56,8 @@ describe.skip('AdhocFilters', () => {
|
||||
|
||||
it('Set simple adhoc filter', () => {
|
||||
cy.get('[aria-label="Comparator option"] .Select__control').click();
|
||||
cy.get('[data-test=adhoc-filter-simple-value] input[type=text]')
|
||||
.focus()
|
||||
.type('Jack{enter}', { delay: 20 });
|
||||
cy.get('[data-test=adhoc-filter-simple-value] input[type=text]').focus();
|
||||
cy.focused().type('Jack{enter}', { delay: 20 });
|
||||
|
||||
cy.get('[data-test="adhoc-filter-edit-popover-save-button"]').click();
|
||||
|
||||
@@ -75,18 +76,15 @@ describe.skip('AdhocFilters', () => {
|
||||
const filterType = 'name';
|
||||
const filterContent = "'Amy' OR name = 'Donald'";
|
||||
|
||||
cy.get('[data-test=adhoc_filters] .Select__control')
|
||||
.scrollIntoView()
|
||||
.click();
|
||||
cy.get('[data-test=adhoc_filters] .Select__control').scrollIntoView();
|
||||
cy.get('[data-test=adhoc_filters] .Select__control').click();
|
||||
|
||||
// remove previous input
|
||||
cy.get('[data-test=adhoc_filters] input[type=text]')
|
||||
.focus()
|
||||
.type('{backspace}');
|
||||
cy.get('[data-test=adhoc_filters] input[type=text]').focus();
|
||||
cy.focused().type('{backspace}');
|
||||
|
||||
cy.get('[data-test=adhoc_filters] input[type=text]')
|
||||
.focus()
|
||||
.type(`${filterType}{enter}`);
|
||||
cy.get('[data-test=adhoc_filters] input[type=text]').focus();
|
||||
cy.focused().type(`${filterType}{enter}`);
|
||||
|
||||
cy.wait('@filterValues');
|
||||
|
||||
|
||||
@@ -37,9 +37,9 @@ describe('Advanced analytics', () => {
|
||||
.find('input[type=search]')
|
||||
.type('28 days{enter}');
|
||||
|
||||
cy.get('[data-test=time_compare]').find('input[type=search]').clear();
|
||||
cy.get('[data-test=time_compare]')
|
||||
.find('input[type=search]')
|
||||
.clear()
|
||||
.type('1 year{enter}');
|
||||
|
||||
cy.get('button[data-test="run-query-button"]').click();
|
||||
|
||||
@@ -51,9 +51,9 @@ describe('Datasource control', () => {
|
||||
'[data-test="table-content-rows"] [data-test="editable-title-input"]',
|
||||
)
|
||||
.first()
|
||||
.focus()
|
||||
.clear()
|
||||
.type(`${newMetricName}{enter}`);
|
||||
.focus();
|
||||
cy.focused().clear();
|
||||
cy.focused().type(`${newMetricName}{enter}`);
|
||||
|
||||
cy.get('[data-test="datasource-modal-save"]').click();
|
||||
cy.get('.ant-modal-confirm-btns button').contains('OK').click();
|
||||
@@ -101,9 +101,8 @@ describe('Color scheme control', () => {
|
||||
);
|
||||
cy.get('.color-scheme-tooltip').contains('Superset Colors');
|
||||
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('lyftColors{enter}');
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]').focus();
|
||||
cy.focused().type('lyftColors{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="lyftColors"]',
|
||||
).should('exist');
|
||||
@@ -153,14 +152,11 @@ describe('Test datatable', () => {
|
||||
cy.intercept(
|
||||
'datasource/samples?force=false&datasource_type=table&datasource_id=*',
|
||||
).as('Samples');
|
||||
cy.contains('Samples')
|
||||
.click()
|
||||
.then(() => {
|
||||
cy.wait('@Samples');
|
||||
cy.get('.ant-tabs-tab-active').contains('Samples');
|
||||
cy.get('[data-test="row-count-label"]').contains('1k rows');
|
||||
cy.get('.ant-empty-description').should('not.exist');
|
||||
});
|
||||
cy.contains('Samples').click();
|
||||
cy.wait('@Samples');
|
||||
cy.get('.ant-tabs-tab-active').contains('Samples');
|
||||
cy.get('[data-test="row-count-label"]').contains('1k rows');
|
||||
cy.get('.ant-empty-description').should('not.exist');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -180,18 +176,15 @@ describe('Time range filter', () => {
|
||||
cy.visitChartByParams(formData);
|
||||
cy.verifySliceSuccess({ waitAlias: '@chartData' });
|
||||
|
||||
cy.get('[data-test=time-range-trigger]')
|
||||
.click()
|
||||
.then(() => {
|
||||
cy.get('.footer').find('button').its('length').should('eq', 2);
|
||||
cy.get('.ant-popover-content').within(() => {
|
||||
cy.get('input[value="100 years ago"]');
|
||||
cy.get('input[value="now"]');
|
||||
});
|
||||
cy.get('[data-test=cancel-button]').click();
|
||||
cy.wait(500);
|
||||
cy.get('.ant-popover').should('not.exist');
|
||||
});
|
||||
cy.get('[data-test=time-range-trigger]').click();
|
||||
cy.get('.footer').find('button').its('length').should('eq', 2);
|
||||
cy.get('.ant-popover-content').within(() => {
|
||||
cy.get('input[value="100 years ago"]');
|
||||
cy.get('input[value="now"]');
|
||||
});
|
||||
cy.get('[data-test=cancel-button]').click();
|
||||
cy.wait(500);
|
||||
cy.get('.ant-popover').should('not.exist');
|
||||
});
|
||||
|
||||
it('Common time_range params', () => {
|
||||
@@ -205,13 +198,10 @@ describe('Time range filter', () => {
|
||||
cy.visitChartByParams(formData);
|
||||
cy.verifySliceSuccess({ waitAlias: '@chartData' });
|
||||
|
||||
cy.get('[data-test=time-range-trigger]')
|
||||
.click()
|
||||
.then(() => {
|
||||
cy.get('.ant-radio-group').children().its('length').should('eq', 5);
|
||||
cy.get('.ant-radio-checked + span').contains('Last year');
|
||||
cy.get('[data-test=cancel-button]').click();
|
||||
});
|
||||
cy.get('[data-test=time-range-trigger]').click();
|
||||
cy.get('.ant-radio-group').children().its('length').should('eq', 5);
|
||||
cy.get('.ant-radio-checked + span').contains('Last year');
|
||||
cy.get('[data-test=cancel-button]').click();
|
||||
});
|
||||
|
||||
it('Previous time_range params', () => {
|
||||
@@ -225,13 +215,10 @@ describe('Time range filter', () => {
|
||||
cy.visitChartByParams(formData);
|
||||
cy.verifySliceSuccess({ waitAlias: '@chartData' });
|
||||
|
||||
cy.get('[data-test=time-range-trigger]')
|
||||
.click()
|
||||
.then(() => {
|
||||
cy.get('.ant-radio-group').children().its('length').should('eq', 3);
|
||||
cy.get('.ant-radio-checked + span').contains('previous calendar month');
|
||||
cy.get('[data-test=cancel-button]').click();
|
||||
});
|
||||
cy.get('[data-test=time-range-trigger]').click();
|
||||
cy.get('.ant-radio-group').children().its('length').should('eq', 3);
|
||||
cy.get('.ant-radio-checked + span').contains('previous calendar month');
|
||||
cy.get('[data-test=cancel-button]').click();
|
||||
});
|
||||
|
||||
it('Custom time_range params', () => {
|
||||
@@ -245,16 +232,13 @@ describe('Time range filter', () => {
|
||||
cy.visitChartByParams(formData);
|
||||
cy.verifySliceSuccess({ waitAlias: '@chartData' });
|
||||
|
||||
cy.get('[data-test=time-range-trigger]')
|
||||
.click()
|
||||
.then(() => {
|
||||
cy.get('[data-test=custom-frame]').then(() => {
|
||||
cy.get('.ant-input-number-input-wrap > input')
|
||||
.invoke('attr', 'value')
|
||||
.should('eq', '7');
|
||||
});
|
||||
cy.get('[data-test=cancel-button]').click();
|
||||
});
|
||||
cy.get('[data-test=time-range-trigger]').click();
|
||||
cy.get('[data-test=custom-frame]').then(() => {
|
||||
cy.get('.ant-input-number-input-wrap > input')
|
||||
.invoke('attr', 'value')
|
||||
.should('eq', '7');
|
||||
});
|
||||
cy.get('[data-test=cancel-button]').click();
|
||||
});
|
||||
|
||||
it('No filter time_range params', () => {
|
||||
@@ -268,11 +252,8 @@ describe('Time range filter', () => {
|
||||
cy.visitChartByParams(formData);
|
||||
cy.verifySliceSuccess({ waitAlias: '@chartData' });
|
||||
|
||||
cy.get('[data-test=time-range-trigger]')
|
||||
.click()
|
||||
.then(() => {
|
||||
cy.get('[data-test=no-filter]');
|
||||
});
|
||||
cy.get('[data-test=time-range-trigger]').click();
|
||||
cy.get('[data-test=no-filter]').should('exist');
|
||||
cy.get('[data-test=cancel-button]').click();
|
||||
});
|
||||
});
|
||||
@@ -288,7 +269,8 @@ describe('Groupby control', () => {
|
||||
.contains('Drop columns here or click')
|
||||
.click();
|
||||
cy.get('[id="adhoc-metric-edit-tabs-tab-simple"]').click();
|
||||
cy.get('input[aria-label="Column"]').click().type('state{enter}');
|
||||
cy.get('input[aria-label="Column"]').click();
|
||||
cy.get('input[aria-label="Column"]').type('state{enter}');
|
||||
cy.get('[data-test="ColumnEdit#save"]').contains('Save').click();
|
||||
|
||||
cy.get('button[data-test="run-query-button"]').click();
|
||||
|
||||
@@ -117,7 +117,9 @@ describe('Test explore links', () => {
|
||||
|
||||
cy.get('[data-test="query-save-button"]').click();
|
||||
cy.get('[data-test="saveas-radio"]').check();
|
||||
cy.get('[data-test="new-chart-name"]').click().clear().type(newChartName);
|
||||
cy.get('[data-test="new-chart-name"]').click();
|
||||
cy.get('[data-test="new-chart-name"]').clear();
|
||||
cy.get('[data-test="new-chart-name"]').type(newChartName);
|
||||
// Add a new option using the "CreatableSelect" feature
|
||||
cy.get('[data-test="save-chart-modal-select-dashboard-form"]')
|
||||
.find('input[aria-label="Select a dashboard"]')
|
||||
@@ -147,7 +149,9 @@ describe('Test explore links', () => {
|
||||
|
||||
cy.get('[data-test="query-save-button"]').click();
|
||||
cy.get('[data-test="save-overwrite-radio"]').check();
|
||||
cy.get('[data-test="new-chart-name"]').click().clear().type(newChartName);
|
||||
cy.get('[data-test="new-chart-name"]').click();
|
||||
cy.get('[data-test="new-chart-name"]').clear();
|
||||
cy.get('[data-test="new-chart-name"]').type(newChartName);
|
||||
// This time around, typing the same dashboard name
|
||||
// will select the existing one
|
||||
cy.get('[data-test="save-chart-modal-select-dashboard-form"]')
|
||||
|
||||
@@ -108,9 +108,8 @@ describe('Visualization > Area', () => {
|
||||
|
||||
cy.get('#controlSections-tab-display').click();
|
||||
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('supersetColors{enter}');
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]').focus();
|
||||
cy.focused().type('supersetColors{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]',
|
||||
).should('exist');
|
||||
|
||||
@@ -51,9 +51,8 @@ describe('Visualization > Box Plot', () => {
|
||||
|
||||
cy.get('#controlSections-tab-display').click();
|
||||
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('supersetColors{enter}');
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]').focus();
|
||||
cy.focused().type('supersetColors{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]',
|
||||
).should('exist');
|
||||
|
||||
@@ -70,28 +70,26 @@ describe('Visualization > Bubble', () => {
|
||||
},
|
||||
],
|
||||
});
|
||||
cy.get('[data-test="chart-container"]')
|
||||
.should('be.visible')
|
||||
.within(() => {
|
||||
cy.get('svg').find('.nv-point-clips circle').should('have.length', 8);
|
||||
})
|
||||
.then(nodeList => {
|
||||
// Check that all circles have same color.
|
||||
const color = nodeList[0].getAttribute('fill');
|
||||
const circles = Array.prototype.slice.call(nodeList);
|
||||
expect(circles.every(c => c.getAttribute('fill') === color)).to.equal(
|
||||
true,
|
||||
);
|
||||
});
|
||||
cy.get('[data-test="chart-container"]').should('be.visible');
|
||||
cy.get('[data-test="chart-container"]').within(() => {
|
||||
cy.get('svg').find('.nv-point-clips circle').should('have.length', 8);
|
||||
});
|
||||
cy.get('[data-test="chart-container"]').then(nodeList => {
|
||||
// Check that all circles have same color.
|
||||
const color = nodeList[0].getAttribute('fill');
|
||||
const circles = Array.prototype.slice.call(nodeList);
|
||||
expect(circles.every(c => c.getAttribute('fill') === color)).to.equal(
|
||||
true,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('should allow type to search color schemes and apply the scheme', () => {
|
||||
cy.visitChartByParams(BUBBLE_FORM_DATA);
|
||||
|
||||
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('supersetColors{enter}');
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]').focus();
|
||||
cy.focused().type('supersetColors{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]',
|
||||
).should('exist');
|
||||
|
||||
@@ -91,9 +91,8 @@ describe('Visualization > Compare', () => {
|
||||
|
||||
cy.get('#controlSections-tab-display').click();
|
||||
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('supersetColors{enter}');
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]').focus();
|
||||
cy.focused().type('supersetColors{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]',
|
||||
).should('exist');
|
||||
|
||||
@@ -81,9 +81,8 @@ describe('Visualization > Distribution bar chart', () => {
|
||||
|
||||
cy.get('#controlSections-tab-display').click();
|
||||
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('bnbColors{enter}');
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]').focus();
|
||||
cy.focused().type('bnbColors{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="bnbColors"]',
|
||||
).should('exist');
|
||||
|
||||
@@ -66,9 +66,8 @@ describe('Visualization > Gauge', () => {
|
||||
|
||||
cy.get('#controlSections-tab-display').click();
|
||||
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('bnbColors{enter}');
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]').focus();
|
||||
cy.focused().type('bnbColors{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="bnbColors"]',
|
||||
).should('exist');
|
||||
|
||||
@@ -82,9 +82,8 @@ describe('Visualization > Graph', () => {
|
||||
|
||||
cy.get('#controlSections-tab-display').click();
|
||||
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('bnbColors{enter}');
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]').focus();
|
||||
cy.focused().type('bnbColors{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="bnbColors"]',
|
||||
).should('exist');
|
||||
|
||||
@@ -89,9 +89,8 @@ describe('Visualization > Histogram', () => {
|
||||
|
||||
cy.get('#controlSections-tab-display').click();
|
||||
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('supersetColors{enter}');
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]').focus();
|
||||
cy.focused().type('supersetColors{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]',
|
||||
).should('exist');
|
||||
|
||||
@@ -51,10 +51,10 @@ describe('Visualization > Line', () => {
|
||||
// Title edit for saved metrics is disabled - switch to Simple
|
||||
cy.get('[id="adhoc-metric-edit-tabs-tab-SIMPLE"]').click();
|
||||
|
||||
cy.get('input[aria-label="Select column"]').click().type('num{enter}');
|
||||
cy.get('input[aria-label="Select aggregate options"]')
|
||||
.click()
|
||||
.type('sum{enter}');
|
||||
cy.get('input[aria-label="Select column"]').click();
|
||||
cy.get('input[aria-label="Select column"]').type('num{enter}');
|
||||
cy.get('input[aria-label="Select aggregate options"]').click();
|
||||
cy.get('input[aria-label="Select aggregate options"]').type('sum{enter}');
|
||||
cy.get('[data-test="AdhocMetricEdit#save"]').contains('Save').click();
|
||||
|
||||
cy.get('[data-test="metrics-header"]').contains('Metrics');
|
||||
@@ -77,9 +77,8 @@ describe('Visualization > Line', () => {
|
||||
it('should allow type to search color schemes and apply the scheme', () => {
|
||||
cy.get('#controlSections-tab-display').click();
|
||||
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('bnbColors{enter}');
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]').focus();
|
||||
cy.focused().type('bnbColors{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="bnbColors"]',
|
||||
).should('exist');
|
||||
|
||||
@@ -73,9 +73,8 @@ describe('Visualization > Pie', () => {
|
||||
|
||||
cy.get('#controlSections-tab-display').click();
|
||||
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('supersetColors{enter}');
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]').focus();
|
||||
cy.focused().type('supersetColors{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]',
|
||||
).should('exist');
|
||||
|
||||
@@ -78,9 +78,8 @@ describe('Visualization > Sankey', () => {
|
||||
|
||||
cy.get('#controlSections-tab-display').click();
|
||||
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('bnbColors{enter}');
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]').focus();
|
||||
cy.focused().type('bnbColors{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="bnbColors"]',
|
||||
).should('exist');
|
||||
|
||||
@@ -88,9 +88,8 @@ describe('Visualization > Sunburst', () => {
|
||||
|
||||
cy.get('#controlSections-tab-display').click();
|
||||
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('supersetColors{enter}');
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]').focus();
|
||||
cy.focused().type('supersetColors{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="color_scheme"] .ant-select-selection-item [data-test="supersetColors"]',
|
||||
).should('exist');
|
||||
|
||||
@@ -126,7 +126,8 @@ describe('Visualization > Table', () => {
|
||||
// should handle frontend sorting correctly
|
||||
cy.get('.chart-container th').contains('name').click();
|
||||
cy.get('.chart-container td:nth-child(2):eq(0)').contains('Adam');
|
||||
cy.get('.chart-container th').contains('ds').click().click();
|
||||
cy.get('.chart-container th').contains('ds').click();
|
||||
cy.get('.chart-container th').contains('ds').click();
|
||||
cy.get('.chart-container td:nth-child(1):eq(0)').contains('2008');
|
||||
});
|
||||
|
||||
|
||||
@@ -84,9 +84,10 @@ describe('Visualization > World Map', () => {
|
||||
verify(WORLD_MAP_FORM_DATA);
|
||||
|
||||
cy.get('.Control[data-test="linear_color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="linear_color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('greens{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="linear_color_scheme"] input[type="search"]',
|
||||
).focus();
|
||||
cy.focused().type('greens{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="linear_color_scheme"] .ant-select-selection-item [data-test="greens"]',
|
||||
).should('exist');
|
||||
|
||||
@@ -39,14 +39,12 @@ describe('SqlLab query panel', () => {
|
||||
}).as('mockSQLResponse');
|
||||
|
||||
cy.get('.TableSelector .Select:eq(0)').click();
|
||||
cy.get('.TableSelector .Select:eq(0) input[type=text]')
|
||||
.focus()
|
||||
.type('{enter}');
|
||||
cy.get('.TableSelector .Select:eq(0) input[type=text]').focus();
|
||||
cy.focused().type('{enter}');
|
||||
|
||||
cy.get('#brace-editor textarea')
|
||||
.focus()
|
||||
.clear()
|
||||
.type(`{selectall}{backspace}SELECT 1`);
|
||||
cy.get('#brace-editor textarea').focus();
|
||||
cy.focused().clear();
|
||||
cy.focused().type(`{selectall}{backspace}SELECT 1`);
|
||||
|
||||
cy.get('#js-sql-toolbar button:eq(0)').eq(0).click();
|
||||
|
||||
@@ -92,11 +90,12 @@ describe('SqlLab query panel', () => {
|
||||
let initialResultsTable: HTMLElement | null = null;
|
||||
let savedQueryResultsTable = null;
|
||||
|
||||
cy.get('#brace-editor textarea')
|
||||
.clear({ force: true })
|
||||
.type(`{selectall}{backspace}${query}`, { force: true })
|
||||
.focus() // focus => blur is required for updating the query that is to be saved
|
||||
.blur();
|
||||
cy.get('#brace-editor textarea').clear({ force: true });
|
||||
cy.get('#brace-editor textarea').type(`{selectall}{backspace}${query}`, {
|
||||
force: true,
|
||||
});
|
||||
cy.get('#brace-editor textarea').focus(); // focus => blur is required for updating the query that is to be saved
|
||||
cy.focused().blur();
|
||||
|
||||
// ctrl + r also runs query
|
||||
cy.get('#brace-editor textarea').type('{ctrl}r', { force: true });
|
||||
@@ -113,11 +112,10 @@ describe('SqlLab query panel', () => {
|
||||
.click();
|
||||
|
||||
// Enter name + save into modal
|
||||
cy.get('.modal-sm input')
|
||||
.clear({ force: true })
|
||||
.type(`{selectall}{backspace}${savedQueryTitle}`, {
|
||||
force: true,
|
||||
});
|
||||
cy.get('.modal-sm input').clear({ force: true });
|
||||
cy.get('.modal-sm input').type(`{selectall}{backspace}${savedQueryTitle}`, {
|
||||
force: true,
|
||||
});
|
||||
|
||||
cy.get('.modal-sm .modal-body button')
|
||||
.eq(0) // save
|
||||
@@ -159,10 +157,9 @@ describe('SqlLab query panel', () => {
|
||||
|
||||
const query = 'SELECT gender, name FROM birth_names';
|
||||
|
||||
cy.get('.ace_text-input')
|
||||
.focus()
|
||||
.clear({ force: true })
|
||||
.type(`{selectall}{backspace}${query}`, { force: true });
|
||||
cy.get('.ace_text-input').focus();
|
||||
cy.focused().clear({ force: true });
|
||||
cy.focused().type(`{selectall}{backspace}${query}`, { force: true });
|
||||
cy.get('.sql-toolbar button').contains('Run').click();
|
||||
cy.wait('@queryFinished');
|
||||
|
||||
|
||||
@@ -106,8 +106,12 @@ export function drag(selector: string, content: string | number | RegExp) {
|
||||
to(target: string | Cypress.Chainable) {
|
||||
cy.get('.dragdroppable')
|
||||
.contains(selector, content)
|
||||
.trigger('mousedown', { which: 1, force: true })
|
||||
.trigger('dragstart', { dataTransfer, force: true })
|
||||
.trigger('mousedown', { which: 1, force: true });
|
||||
cy.get('.dragdroppable')
|
||||
.contains(selector, content)
|
||||
.trigger('dragstart', { dataTransfer, force: true });
|
||||
cy.get('.dragdroppable')
|
||||
.contains(selector, content)
|
||||
.trigger('drag', { force: true });
|
||||
|
||||
(typeof target === 'string' ? cy.get(target) : target)
|
||||
@@ -122,10 +126,14 @@ export function drag(selector: string, content: string | number | RegExp) {
|
||||
export function resize(selector: string) {
|
||||
return {
|
||||
to(cordX: number, cordY: number) {
|
||||
cy.get(selector)
|
||||
.trigger('mousedown', { which: 1, force: true })
|
||||
.trigger('mousemove', { which: 1, cordX, cordY, force: true })
|
||||
.trigger('mouseup', { which: 1, force: true });
|
||||
cy.get(selector).trigger('mousedown', { which: 1, force: true });
|
||||
cy.get(selector).trigger('mousemove', {
|
||||
which: 1,
|
||||
cordX,
|
||||
cordY,
|
||||
force: true,
|
||||
});
|
||||
cy.get(selector).trigger('mouseup', { which: 1, force: true });
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||