Compare commits

...

15 Commits

Author SHA1 Message Date
David
0a66e4ea2d fix(helm): support initContainers in supersetWebsockets (#42201) 2026-07-18 10:29:42 -07:00
AYUSHI RAI
3e0f9e60c0 fix(charts): preserve minute/second precision in X-axis time labels f… (#41505)
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude <noreply@anthropic.com>
2026-07-18 10:28:03 -07:00
Durgaprasad M L
ff1cf5f24e fix(table): hide search dropdown when search box is disabled (#41772) 2026-07-18 10:23:54 -07:00
dependabot[bot]
023b60c8f0 chore(deps-dev): bump pandas-gbq from 0.19.1 to 0.35.0 (#42161)
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-18 07:23:17 -07:00
dependabot[bot]
2ada286ee9 chore(deps-dev): update pydynamodb requirement from >=0.4.2 to >=0.8.2 (#42162)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-18 07:23:13 -07:00
dependabot[bot]
42e5640f60 chore(deps-dev): update nzalchemy requirement from <11.2,>=11.0.2 to >=11.1.2,<11.2 (#42164)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-18 07:23:09 -07:00
dependabot[bot]
74703906df chore(deps): bump dom-to-image-more from 3.10.0 to 3.10.2 in /superset-frontend (#42180)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-18 21:15:23 +07:00
dependabot[bot]
3c23394675 chore(deps-dev): bump eslint from 10.6.0 to 10.7.0 in /superset-websocket (#42159)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-18 16:12:08 +07:00
dependabot[bot]
b6ce28ff72 chore(deps): bump typing-extensions from 4.15.0 to 4.16.0 (#42165)
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-18 16:11:46 +07:00
dependabot[bot]
79eff6b6f1 chore(deps): bump greenlet from 3.5.1 to 3.5.3 (#42166)
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-18 16:08:28 +07:00
dependabot[bot]
a58012fc0f chore(deps): bump the docusaurus-openapi group in /docs with 2 updates (#42195)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-18 16:05:39 +07:00
dependabot[bot]
dab5f30842 chore(deps): bump @docusaurus/faster from 3.10.1 to 3.10.2 in /docs (#42179)
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: hainenber <dotronghai96@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
Co-authored-by: hainenber <dotronghai96@gmail.com>
2026-07-18 15:55:18 +07:00
dependabot[bot]
8299e7f87c chore(deps-dev): bump storybook from 10.4.6 to 10.5.0 in /superset-frontend (#42185)
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: hainenber <dotronghai96@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: hainenber <dotronghai96@gmail.com>
2026-07-18 15:41:22 +07:00
dependabot[bot]
f6acf68dfa chore(deps): bump react-intersection-observer from 10.0.3 to 10.1.0 in /superset-frontend (#42181)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-18 13:31:08 +07:00
dependabot[bot]
cce77b42f6 chore(deps-dev): bump @formatjs/intl-durationformat from 0.10.16 to 0.10.17 in /superset-frontend (#42184)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-18 13:11:17 +07:00
22 changed files with 982 additions and 511 deletions

View File

@@ -65,6 +65,11 @@ updates:
lumagl:
patterns:
- "@luma.gl/*"
storybook:
patterns:
- "@storybook/*"
- "storybook"
- "eslint-plugin-storybook"
open-pull-requests-limit: 30
versioning-strategy: increase
cooldown:
@@ -99,6 +104,22 @@ updates:
directory: "/docs/"
schedule:
interval: "daily"
groups:
storybook:
patterns:
- "@storybook/*"
- "storybook"
docusaurus:
patterns:
- "@docusaurus/*"
docusaurus-openapi:
patterns:
- "docusaurus-plugin-openapi-docs"
- "docusaurus-theme-openapi-docs"
typescript-eslint:
patterns:
- "@typescript-eslint/*"
- "typescript-eslint"
open-pull-requests-limit: 10
versioning-strategy: increase
cooldown:

View File

@@ -44,12 +44,12 @@
},
"dependencies": {
"@ant-design/icons": "^6.2.5",
"@docusaurus/core": "^3.10.1",
"@docusaurus/faster": "^3.10.1",
"@docusaurus/plugin-client-redirects": "^3.10.1",
"@docusaurus/preset-classic": "3.10.1",
"@docusaurus/theme-live-codeblock": "^3.10.1",
"@docusaurus/theme-mermaid": "^3.10.1",
"@docusaurus/core": "^3.10.2",
"@docusaurus/faster": "^3.10.2",
"@docusaurus/plugin-client-redirects": "^3.10.2",
"@docusaurus/preset-classic": "3.10.2",
"@docusaurus/theme-live-codeblock": "^3.10.2",
"@docusaurus/theme-mermaid": "^3.10.2",
"@emotion/core": "^11.0.0",
"@emotion/react": "^11.13.3",
"@emotion/styled": "^11.14.1",
@@ -58,14 +58,14 @@
"@fontsource/inter": "^5.2.8",
"@mdx-js/react": "^3.1.1",
"@saucelabs/theme-github-codeblock": "^0.3.0",
"@storybook/addon-docs": "^10.4.5",
"@storybook/addon-docs": "^10.5.0",
"@superset-ui/core": "^0.20.4",
"@swc/core": "^1.15.43",
"antd": "^6.5.0",
"baseline-browser-mapping": "^2.10.40",
"caniuse-lite": "^1.0.30001803",
"docusaurus-plugin-openapi-docs": "^5.1.1",
"docusaurus-theme-openapi-docs": "^5.1.1",
"docusaurus-plugin-openapi-docs": "^5.1.2",
"docusaurus-theme-openapi-docs": "^5.1.2",
"js-yaml": "^5.2.0",
"json-bigint": "^1.0.0",
"prism-react-renderer": "^2.4.1",
@@ -77,20 +77,20 @@
"react-table": "^7.8.0",
"remark-import-partial": "^0.0.2",
"reselect": "^5.2.0",
"storybook": "^10.4.5",
"storybook": "^10.5.0",
"swagger-ui-react": "^5.32.8",
"swc-loader": "^0.2.7",
"tinycolor2": "^1.4.2",
"unist-util-visit": "^5.1.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "^3.10.1",
"@docusaurus/tsconfig": "^3.10.1",
"@docusaurus/module-type-aliases": "^3.10.2",
"@docusaurus/tsconfig": "^3.10.2",
"@eslint/js": "^9.39.2",
"@types/js-yaml": "^4.0.9",
"@types/react": "^19.1.8",
"@typescript-eslint/eslint-plugin": "^8.59.3",
"@typescript-eslint/parser": "^8.63.0",
"@typescript-eslint/eslint-plugin": "^8.64.0",
"@typescript-eslint/parser": "^8.64.0",
"eslint": "^9.39.2",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.6",
@@ -124,8 +124,6 @@
"serialize-javascript": "7.0.5",
"d3-color": "3.1.0",
"ws": "^8.21.0",
"@docusaurus/core/@docusaurus/utils/gray-matter/js-yaml": "^3.15.0",
"@docusaurus/core/**/js-yaml": "^4.3.0",
"docusaurus-plugin-openapi-docs/**/js-yaml": "^4.3.0"
},
"packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610"

File diff suppressed because it is too large Load Diff

View File

@@ -29,7 +29,7 @@ maintainers:
- name: craig-rueda
email: craig@craigrueda.com
url: https://github.com/craig-rueda
version: 0.21.0 # See [README](https://github.com/apache/superset/blob/master/helm/superset/README.md#versioning) for version details.
version: 0.21.1 # See [README](https://github.com/apache/superset/blob/master/helm/superset/README.md#versioning) for version details.
dependencies:
- name: postgresql
version: 16.7.27

View File

@@ -23,7 +23,7 @@ NOTE: This file is generated by helm-docs: https://github.com/norwoodj/helm-docs
# superset
![Version: 0.21.0](https://img.shields.io/badge/Version-0.21.0-informational?style=flat-square)
![Version: 0.21.1](https://img.shields.io/badge/Version-0.21.1-informational?style=flat-square)
Apache Superset is a modern, enterprise-ready business intelligence web application
@@ -305,11 +305,13 @@ Alternatively, perform a fresh install. This is a one-time migration; subsequent
| supersetWebsockets.deploymentAnnotations | object | `{}` | |
| supersetWebsockets.enabled | bool | `false` | This is only required if you intend to use `GLOBAL_ASYNC_QUERIES` in `ws` mode see https://superset.apache.org/docs/contributing/misc#async-chart-queries |
| supersetWebsockets.extraContainers | list | `[]` | Launch additional containers into supersetWebsockets pods |
| supersetWebsockets.extraInitContainers | list | `[]` | Extra init containers appended after supersetWebsockets initContainers |
| supersetWebsockets.image.pullPolicy | string | `"IfNotPresent"` | |
| supersetWebsockets.image.repository | string | `"oneacrefund/superset-websocket"` | There is no official image (yet), this one is community-supported |
| supersetWebsockets.image.tag | string | `"latest"` | |
| supersetWebsockets.ingress.path | string | `"/ws"` | |
| supersetWebsockets.ingress.pathType | string | `"Prefix"` | |
| supersetWebsockets.initContainers | list | a container waiting for redis | List of initContainers |
| supersetWebsockets.livenessProbe.failureThreshold | int | `3` | |
| supersetWebsockets.livenessProbe.httpGet.path | string | `"/health"` | |
| supersetWebsockets.livenessProbe.httpGet.port | string | `"ws"` | |

View File

@@ -64,6 +64,15 @@ spec:
{{- if .Values.supersetWebsockets.podSecurityContext }}
{{- toYaml .Values.supersetWebsockets.podSecurityContext | nindent 8 }}
{{- end }}
{{- if or .Values.supersetWebsockets.initContainers .Values.supersetWebsockets.extraInitContainers }}
initContainers:
{{- if .Values.supersetWebsockets.initContainers }}
{{- tpl (toYaml .Values.supersetWebsockets.initContainers) . | nindent 6 }}
{{- end }}
{{- if .Values.supersetWebsockets.extraInitContainers }}
{{- tpl (toYaml .Values.supersetWebsockets.extraInitContainers) . | nindent 6 }}
{{- end }}
{{- end }}
{{- with .Values.hostAliases }}
hostAliases: {{- toYaml . | nindent 6 }}
{{- end }}

View File

@@ -20,6 +20,7 @@ templates:
- deployment-worker.yaml
- deployment-beat.yaml
- deployment-flower.yaml
- deployment-ws.yaml
- init-job.yaml
tests:
- it: renders only the default wait-for container by default
@@ -150,6 +151,24 @@ tests:
path: spec.template.spec.initContainers[1].name
value: prepare-assets
- it: appends websockets extraInitContainers after wait-for-redis
template: deployment-ws.yaml
set:
supersetWebsockets.enabled: true
supersetWebsockets.extraInitContainers:
- name: prepare-assets
image: busybox
asserts:
- lengthEqual:
path: spec.template.spec.initContainers
count: 2
- equal:
path: spec.template.spec.initContainers[0].name
value: wait-for-redis
- equal:
path: spec.template.spec.initContainers[1].name
value: prepare-assets
- it: appends init job extraInitContainers after wait-for-postgres
template: init-job.yaml
set:

View File

@@ -867,6 +867,38 @@ supersetWebsockets:
# -- (int)
http: nil
command: []
# -- List of initContainers
# @default -- a container waiting for redis
initContainers:
- name: wait-for-redis
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: "{{ .Values.image.pullPolicy }}"
envFrom:
- secretRef:
name: "{{ tpl .Values.envFromSecret . }}"
command:
- /bin/bash
- -c
- |
# See supersetNode.initContainers for the rationale.
SECONDS=0
until (exec 3<>/dev/tcp/"$REDIS_HOST"/"$REDIS_PORT") 2>/dev/null; do
if [ "$SECONDS" -ge 120 ]; then
echo "timeout waiting for redis at $REDIS_HOST:$REDIS_PORT after 120s" >&2
exit 1
fi
echo "waiting for redis at $REDIS_HOST:$REDIS_PORT (elapsed ${SECONDS}s)"
sleep 2
done
echo "redis at $REDIS_HOST:$REDIS_PORT is up"
resources:
limits:
memory: "256Mi"
requests:
cpu: "250m"
memory: "128Mi"
# -- Extra init containers appended after supersetWebsockets initContainers
extraInitContainers: []
resources: {}
# -- Launch additional containers into supersetWebsockets pods
extraContainers: []

View File

@@ -63,7 +63,7 @@ dependencies = [
"flask-session>=0.4.0, <1.0",
"flask-wtf>=1.3.0, <2.0",
"geopy",
"greenlet<=3.5.1, >=3.5.1",
"greenlet<=3.5.3, >=3.5.3",
"gunicorn>=26.0.0, <27; sys_platform != 'win32'",
"hashids>=1.3.1, <2",
# holidays>=0.45 required for security fix
@@ -113,7 +113,7 @@ dependencies = [
"sqlglot>=30.12.0, <31",
# newer pandas needs 0.9+
"tabulate>=0.10.0, <1.0",
"typing-extensions>=4, <5",
"typing-extensions>=4.16.0, <5",
"waitress; sys_platform == 'win32'",
"watchdog>=6.0.0",
"wtforms>=3.2.2, <4",
@@ -126,7 +126,7 @@ dependencies = [
athena = ["pyathena[pandas]>=2, <4"]
aurora-data-api = ["preset-sqlalchemy-aurora-data-api>=0.2.8,<0.3"]
bigquery = [
"pandas-gbq>=0.19.1",
"pandas-gbq>=0.35.0",
"sqlalchemy-bigquery>=1.17.0",
"google-cloud-bigquery>=3.42.1",
]
@@ -149,7 +149,7 @@ dremio = ["sqlalchemy-dremio>=1.2.1, <4"]
drill = ["sqlalchemy-drill>=1.1.10, <2"]
druid = ["pydruid>=0.6.5,<0.7"]
duckdb = ["duckdb>=1.5.4,<2", "duckdb-engine>=0.17.0"]
dynamodb = ["pydynamodb>=0.4.2"]
dynamodb = ["pydynamodb>=0.8.2"]
solr = ["sqlalchemy-solr >= 0.2.4.3"]
elasticsearch = ["elasticsearch-dbapi>=0.2.13, <0.3.0"]
exasol = ["sqlalchemy-exasol>=2.4.0, <8.0"]
@@ -213,7 +213,7 @@ tdengine = [
teradata = ["teradatasql>=20.0.0.62"]
thumbnails = [] # deprecated, will be removed in 7.0
vertica = ["sqlalchemy-vertica-python>= 0.6.3, < 0.7"]
netezza = ["nzalchemy>=11.0.2, < 11.2"]
netezza = ["nzalchemy>= 11.1.2, < 11.2"]
starrocks = ["starrocks>=1.3.3, <2"]
doris = ["pydoris>=1.2.0, <2.0.0"]
oceanbase = ["oceanbase_py>=0.0.1.2"]

View File

@@ -164,7 +164,7 @@ google-auth==2.53.0
# via
# -r requirements/base.in
# shillelagh
greenlet==3.5.1
greenlet==3.5.3
# via
# apache-superset (pyproject.toml)
# shillelagh
@@ -427,7 +427,7 @@ trio==0.33.0
# trio-websocket
trio-websocket==0.12.2
# via selenium
typing-extensions==4.15.0
typing-extensions==4.16.0
# via
# apache-superset (pyproject.toml)
# alembic

View File

@@ -340,7 +340,6 @@ gevent==26.4.0
google-api-core==2.23.0
# via
# google-cloud-bigquery
# google-cloud-bigquery-storage
# google-cloud-core
# pandas-gbq
# sqlalchemy-bigquery
@@ -350,7 +349,6 @@ google-auth==2.53.0
# google-api-core
# google-auth-oauthlib
# google-cloud-bigquery
# google-cloud-bigquery-storage
# google-cloud-core
# pandas-gbq
# pydata-google-auth
@@ -365,8 +363,6 @@ google-cloud-bigquery==3.42.1
# apache-superset
# pandas-gbq
# sqlalchemy-bigquery
google-cloud-bigquery-storage==2.26.0
# via pandas-gbq
google-cloud-core==2.4.1
# via google-cloud-bigquery
google-crc32c==1.6.0
@@ -377,7 +373,7 @@ googleapis-common-protos==1.66.0
# via
# google-api-core
# grpcio-status
greenlet==3.5.1
greenlet==3.5.3
# via
# -c requirements/base-constraint.txt
# apache-superset
@@ -638,6 +634,7 @@ packaging==25.0
# kombu
# limits
# matplotlib
# pandas-gbq
# pytest
# shillelagh
# sqlalchemy-bigquery
@@ -649,7 +646,7 @@ pandas==2.1.4
# db-dtypes
# pandas-gbq
# prophet
pandas-gbq==0.19.1
pandas-gbq==0.35.0
# via apache-superset
parameterized==0.9.0
# via apache-superset
@@ -705,18 +702,17 @@ prompt-toolkit==3.0.51
prophet==1.2.0
# via apache-superset
proto-plus==1.25.0
# via
# google-api-core
# google-cloud-bigquery-storage
# via google-api-core
protobuf==5.29.6
# via
# google-api-core
# google-cloud-bigquery-storage
# googleapis-common-protos
# grpcio-status
# proto-plus
psutil==6.1.0
# via apache-superset
# via
# apache-superset
# pandas-gbq
psycopg2-binary==2.9.12
# via apache-superset
py-key-value-aio==0.4.4
@@ -1043,7 +1039,7 @@ trio-websocket==0.12.2
# via
# -c requirements/base-constraint.txt
# selenium
typing-extensions==4.15.0
typing-extensions==4.16.0
# via
# -c requirements/base-constraint.txt
# alembic

View File

@@ -89,7 +89,7 @@
"content-disposition": "^2.0.1",
"d3-scale": "^4.0.2",
"dayjs": "^1.11.21",
"dom-to-image-more": "^3.10.0",
"dom-to-image-more": "^3.10.2",
"dom-to-pdf": "^0.3.2",
"echarts": "^6.1.0",
"fast-glob": "^3.3.2",
@@ -128,7 +128,7 @@
"react-dnd-html5-backend": "^11.1.3",
"react-dom": "^18.3.0",
"react-google-recaptcha": "^3.1.0",
"react-intersection-observer": "^10.0.3",
"react-intersection-observer": "^10.1.0",
"react-json-tree": "^0.20.0",
"react-lines-ellipsis": "^0.16.1",
"react-loadable": "^5.5.0",
@@ -178,13 +178,13 @@
"@babel/types": "^7.29.7",
"@emotion/babel-plugin": "^11.13.5",
"@emotion/jest": "^11.14.2",
"@formatjs/intl-durationformat": "^0.10.16",
"@formatjs/intl-durationformat": "^0.10.17",
"@istanbuljs/nyc-config-typescript": "^1.0.1",
"@playwright/test": "^1.61.1",
"@pmmmwh/react-refresh-webpack-plugin": "^0.6.2",
"@storybook/addon-docs": "10.4.6",
"@storybook/addon-links": "10.4.6",
"@storybook/react-webpack5": "10.4.6",
"@storybook/addon-docs": "10.5.0",
"@storybook/addon-links": "10.5.0",
"@storybook/react-webpack5": "10.5.0",
"@storybook/test-runner": "0.24.4",
"@svgr/webpack": "^8.1.0",
"@swc/core": "^1.15.43",
@@ -240,7 +240,7 @@
"eslint-plugin-prettier": "^5.5.6",
"eslint-plugin-react-prefer-function-component": "^5.0.0",
"eslint-plugin-react-you-might-not-need-an-effect": "^1.0.1",
"eslint-plugin-storybook": "10.4.6",
"eslint-plugin-storybook": "10.5.0",
"eslint-plugin-testing-library": "^7.16.2",
"eslint-plugin-theme-colors": "file:eslint-rules/eslint-plugin-theme-colors",
"fetch-mock": "^12.6.0",
@@ -273,7 +273,7 @@
"source-map": "^0.7.6",
"source-map-support": "^0.5.21",
"speed-measure-webpack-plugin": "^1.6.0",
"storybook": "10.4.6",
"storybook": "10.5.0",
"style-loader": "^4.0.0",
"stylelint": "^17.14.0",
"swc-loader": "^0.2.7",
@@ -4093,38 +4093,38 @@
}
},
"node_modules/@formatjs/bigdecimal": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/@formatjs/bigdecimal/-/bigdecimal-0.2.6.tgz",
"integrity": "sha512-aPzKsGQOkQRHUEbyO/ZtYfr4EqaBQnSs6U4tzTla1xBnIdEHgY2GqEqso28UMwWRkzKqqTj5+/6BmuOsRkfn2A==",
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/@formatjs/bigdecimal/-/bigdecimal-0.2.7.tgz",
"integrity": "sha512-B4+XY/e4u5v261r3a37Kq2ax91gPZSKGyVpx8X5dygAggLlUz+6MeBpmAhaBFGB8WQ4JB1qD+QtKHk9aJkEb9Q==",
"dev": true,
"license": "MIT"
},
"node_modules/@formatjs/fast-memoize": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-3.1.6.tgz",
"integrity": "sha512-H5aexk1Le7T9TPmscacZ+1pR6CTa2n1wq+HDVGXhH8TzUlQQpeXzZs91dRtmFHrbeNbjPFPfQujUqm7MHgVoXQ==",
"version": "3.1.7",
"resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-3.1.7.tgz",
"integrity": "sha512-zXfhLpvA6T7+efdt9JLbBwZ00tT7NsBMDVnDu8rpHeNNv8KfRZAMo2gkG0k9lK/Nzc//3kJ9pImsfuJxk3KhUA==",
"dev": true,
"license": "MIT"
},
"node_modules/@formatjs/intl-durationformat": {
"version": "0.10.16",
"resolved": "https://registry.npmjs.org/@formatjs/intl-durationformat/-/intl-durationformat-0.10.16.tgz",
"integrity": "sha512-Ponn8K7eQAA7qeZRRD85lrvsByfeRDxw6aEE9EXapQ47wknptM0aYgumImVsMaBdJikpWYryGAMRZIB7IYYfmQ==",
"version": "0.10.17",
"resolved": "https://registry.npmjs.org/@formatjs/intl-durationformat/-/intl-durationformat-0.10.17.tgz",
"integrity": "sha512-YXm0u5WMaSQ8Gr3th33RFNzoI24nMDScg6iZ9EQZk2CNY3Sg19qklq+FQIuuQEbrDwBlQGrMSDE97m4mETnOxw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@formatjs/bigdecimal": "0.2.6",
"@formatjs/intl-localematcher": "0.8.11"
"@formatjs/bigdecimal": "0.2.7",
"@formatjs/intl-localematcher": "0.8.12"
}
},
"node_modules/@formatjs/intl-localematcher": {
"version": "0.8.11",
"resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.8.11.tgz",
"integrity": "sha512-MzBbR9ifqgtzHwUl2PGEDtRVZGXF9nXPtrMyN6/iKbQaim1Ob7fnPJQMllVkHm3RK74o5VqnLrZIE9egWJhf5g==",
"version": "0.8.12",
"resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.8.12.tgz",
"integrity": "sha512-5H3r5ZJ2jZqHEv9K343lvHmeMDKMxssawAVD2H4J9xtu0ZXb6MlNxwLqdwBxJSHFU0C24KSZnffgmAi+59mK4A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@formatjs/fast-memoize": "3.1.6"
"@formatjs/fast-memoize": "3.1.7"
}
},
"node_modules/@gar/promise-retry": {
@@ -10321,16 +10321,16 @@
"license": "MIT"
},
"node_modules/@storybook/addon-docs": {
"version": "10.4.6",
"resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.4.6.tgz",
"integrity": "sha512-aWAfP5JMiT5a3zBJizwroCRzOCqZwDTJmvsYvwMD3ilIEa/kT1vhf6Xrbk4XIPhDwbh8Hpb/Gfnka1xBYEISWg==",
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.5.0.tgz",
"integrity": "sha512-kbZGdX+mysiY4xezhpcFEwzQ1zSXcMhSS3u09Qt8+w5XetCAMMSv/yAxzpi6z+YoH+EdQ53e1q3MFtPUkzkfUA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@mdx-js/react": "^3.0.0",
"@storybook/csf-plugin": "10.4.6",
"@storybook/csf-plugin": "10.5.0",
"@storybook/icons": "^2.0.2",
"@storybook/react-dom-shim": "10.4.6",
"@storybook/react-dom-shim": "10.5.0",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"ts-dedent": "^2.0.0"
@@ -10341,7 +10341,7 @@
},
"peerDependencies": {
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"storybook": "^10.4.6"
"storybook": "^10.5.0"
},
"peerDependenciesMeta": {
"@types/react": {
@@ -10350,9 +10350,9 @@
}
},
"node_modules/@storybook/addon-links": {
"version": "10.4.6",
"resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-10.4.6.tgz",
"integrity": "sha512-VGfERTsGRFmfvNP3SKprFWkC6Od5kXzSutT5PSZjQ/O9NnCdHhd/RILxFDN2TzZn9ywDc7t5b4AldKmSYCv3EQ==",
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-10.5.0.tgz",
"integrity": "sha512-pZlBqBjJc9Lo3LbcPx2ch0+BXD/efFQ0x9v7w+siCTs4IfqiePBuMK6ZSBQfxai+x/zHm0vKNTmOikEvP8j1wA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10365,7 +10365,7 @@
"peerDependencies": {
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"storybook": "^10.4.6"
"storybook": "^10.5.0"
},
"peerDependenciesMeta": {
"@types/react": {
@@ -10377,13 +10377,13 @@
}
},
"node_modules/@storybook/builder-webpack5": {
"version": "10.4.6",
"resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-10.4.6.tgz",
"integrity": "sha512-klJUCBlkr1mFqXxsyYc7akIBhT5VOBTRcHChSFXq6Kbh+qQYOvfmgBpY0Tv+f7ffBmzp6gxpTorg7eGxlklxeQ==",
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-10.5.0.tgz",
"integrity": "sha512-RFqlqK/wCtI9JzZ45o7aTsh+tDsg1TXn8KcLimBPh/Dfp77wZsZaOD+eS+0Fb8d2EbOgReLS500KjZruX3f3JQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/core-webpack": "10.4.6",
"@storybook/core-webpack": "10.5.0",
"case-sensitive-paths-webpack-plugin": "^2.4.0",
"cjs-module-lexer": "^1.2.3",
"css-loader": "^7.1.2",
@@ -10391,6 +10391,7 @@
"fork-ts-checker-webpack-plugin": "^9.1.0",
"html-webpack-plugin": "^5.5.0",
"magic-string": "^0.30.5",
"semver": "^7.7.3",
"style-loader": "^4.0.0",
"terser-webpack-plugin": "^5.3.17",
"ts-dedent": "^2.0.0",
@@ -10404,7 +10405,7 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
"storybook": "^10.4.6"
"storybook": "^10.5.0"
},
"peerDependenciesMeta": {
"typescript": {
@@ -10413,9 +10414,9 @@
}
},
"node_modules/@storybook/core-webpack": {
"version": "10.4.6",
"resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-10.4.6.tgz",
"integrity": "sha512-DDhpgaFGb1AC0lzfR2LOozCj+uT14tsr2R9551PHgcC3ru1yfhL2DNbIjdiMuQP8nVm+2HKeXWhybJGYtk9z9g==",
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-10.5.0.tgz",
"integrity": "sha512-8O/h7nk1h91w4DBtZo6yo89cvPxzryTcYaFxOsSG5jrn/HMWxZIcyXm3nu3metCbTffnVBu2pmLuHaiCkv/9Ng==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10426,13 +10427,13 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
"storybook": "^10.4.6"
"storybook": "^10.5.0"
}
},
"node_modules/@storybook/csf-plugin": {
"version": "10.4.6",
"resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.4.6.tgz",
"integrity": "sha512-NILLxDqpA/JR/AazGWpsz+4fadJwRU4uhHephGtYpVOWnQA/DkJfKT6zpcJVq8+QA8A2zKMLX3GVKsXIrxjuDA==",
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.5.0.tgz",
"integrity": "sha512-R7VFw6FnDZTWct0ekOcFnTfDgdHnnAuQW+AbGG9A9IZPvyH9uLJivK7L86+r9MITRrO2+v81HaFDsT/OFk6ZkQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10445,7 +10446,7 @@
"peerDependencies": {
"esbuild": "*",
"rollup": "*",
"storybook": "^10.4.6",
"storybook": "^10.5.0",
"vite": "*",
"webpack": "*"
},
@@ -10483,17 +10484,17 @@
}
},
"node_modules/@storybook/preset-react-webpack": {
"version": "10.4.6",
"resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-10.4.6.tgz",
"integrity": "sha512-D6EjK1sknC/1GmdWQjV38HEP+tBxJ5ObNuCUWQzGsJqsiq45HaOemZbIyJqxp3dYx2/YpFd0bawn7PlOP4yNOQ==",
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-10.5.0.tgz",
"integrity": "sha512-x26YF06xSR8sYhHn/cOmbJl8VGQhOWGd49teU80cCwdUHTSu98jVAPyGQhuGmHEw3WndnWarIxXIu1iGhZ414w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/core-webpack": "10.4.6",
"@storybook/core-webpack": "10.5.0",
"@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0",
"@types/semver": "^7.7.1",
"magic-string": "^0.30.5",
"react-docgen": "^7.1.1",
"react-docgen": "^8.0.2",
"resolve": "^1.22.8",
"semver": "^7.7.3",
"tsconfig-paths": "^4.2.0",
@@ -10506,7 +10507,7 @@
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"storybook": "^10.4.6"
"storybook": "^10.5.0"
},
"peerDependenciesMeta": {
"typescript": {
@@ -10515,14 +10516,14 @@
}
},
"node_modules/@storybook/react": {
"version": "10.4.6",
"resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.4.6.tgz",
"integrity": "sha512-9Y7YecrVFe1/01KYjfOLxVqTg2Aq+IO6TEv6sC2U0PfD0AWCSCmQ91QqgBpN/XW4aFFWoiZNinyXMUlU8zxy2w==",
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.5.0.tgz",
"integrity": "sha512-2IhddiREy7NqAqnFsEOfW6HBG7azIcLxhRQYploSsaemOncR29xhzvAZsG+xlWgrtvxv4h3fYQTTR4TNn8CgPQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/global": "^5.0.0",
"@storybook/react-dom-shim": "10.4.6",
"@storybook/react-dom-shim": "10.5.0",
"react-docgen": "^8.0.2",
"react-docgen-typescript": "^2.2.2"
},
@@ -10535,7 +10536,7 @@
"@types/react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"storybook": "^10.4.6",
"storybook": "^10.5.0",
"typescript": ">= 4.9.x"
},
"peerDependenciesMeta": {
@@ -10615,9 +10616,9 @@
}
},
"node_modules/@storybook/react-dom-shim": {
"version": "10.4.6",
"resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.4.6.tgz",
"integrity": "sha512-iGNmKzrq9vgl2PDrYAnZKI+yvac3Ym+lJXXuQaqlFRS23zA5MNm4EBX+rAG7WulqchoK6NaZ0KQOs2mAgEpTMg==",
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.5.0.tgz",
"integrity": "sha512-GwGA6zDj4Cfw6vGsdfPKfF39L0W6solNbbnjdjGa57m2ooASkidLhrXo2wgC9wh3o/jcfonmYPDRGY6sEhGDtg==",
"dev": true,
"license": "MIT",
"funding": {
@@ -10629,7 +10630,7 @@
"@types/react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"storybook": "^10.4.6"
"storybook": "^10.5.0"
},
"peerDependenciesMeta": {
"@types/react": {
@@ -10641,15 +10642,15 @@
}
},
"node_modules/@storybook/react-webpack5": {
"version": "10.4.6",
"resolved": "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-10.4.6.tgz",
"integrity": "sha512-34rOHFRa4NrBnMKsQMq8QTvw65QQJUtasYfEOw1/Pa9+CFWfFQZ3kfDLRxatphUyc0rbKxmVrVE4SFEMY/eMsA==",
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-10.5.0.tgz",
"integrity": "sha512-Z5Tpg0jNelMOzxfP47oH+AESyol/52WzariOJB6/rUAj5S9vMb/IM7KrF/3QQUa/j3om6dmclxA83CUhGgreig==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/builder-webpack5": "10.4.6",
"@storybook/preset-react-webpack": "10.4.6",
"@storybook/react": "10.4.6"
"@storybook/builder-webpack5": "10.5.0",
"@storybook/preset-react-webpack": "10.5.0",
"@storybook/react": "10.5.0"
},
"funding": {
"type": "opencollective",
@@ -10658,7 +10659,7 @@
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"storybook": "^10.4.6",
"storybook": "^10.5.0",
"typescript": ">= 4.9.x"
},
"peerDependenciesMeta": {
@@ -10667,28 +10668,6 @@
}
}
},
"node_modules/@storybook/react/node_modules/react-docgen": {
"version": "8.0.3",
"resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-8.0.3.tgz",
"integrity": "sha512-aEZ9qP+/M+58x2qgfSFEWH1BxLyHe5+qkLNJOZQb5iGS017jpbRnoKhNRrXPeA6RfBrZO5wZrT9DMC1UqE1f1w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.28.0",
"@babel/traverse": "^7.28.0",
"@babel/types": "^7.28.2",
"@types/babel__core": "^7.20.5",
"@types/babel__traverse": "^7.20.7",
"@types/doctrine": "^0.0.9",
"@types/resolve": "^1.20.2",
"doctrine": "^3.0.0",
"resolve": "^1.22.1",
"strip-indent": "^4.0.0"
},
"engines": {
"node": "^20.9.0 || >=22"
}
},
"node_modules/@storybook/test-runner": {
"version": "0.24.4",
"resolved": "https://registry.npmjs.org/@storybook/test-runner/-/test-runner-0.24.4.tgz",
@@ -18676,9 +18655,9 @@
"license": "MIT"
},
"node_modules/dom-to-image-more": {
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/dom-to-image-more/-/dom-to-image-more-3.10.0.tgz",
"integrity": "sha512-APrFEimSmH4phJKs8DlURuSr3BFwDqNi62l14bx73Wrhx0OhE4dd0qzZR+4E3sH8PnHxvax1LOrosC9oXRFA5A==",
"version": "3.10.2",
"resolved": "https://registry.npmjs.org/dom-to-image-more/-/dom-to-image-more-3.10.2.tgz",
"integrity": "sha512-+ZNbiRB7Fpsfzn8WSCmAIKUFSXp8uahlI+LsY8t8oWtAATqokeKS3eD3oQikheouap6aVMht8y0b4oAobWRr9w==",
"license": "MIT"
},
"node_modules/dom-to-pdf": {
@@ -19848,17 +19827,18 @@
}
},
"node_modules/eslint-plugin-storybook": {
"version": "10.4.6",
"resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-10.4.6.tgz",
"integrity": "sha512-CfGSXn6zFspeYTU8R7v797MOmJFj8xc6MWf/oGuRwbKeMoSwnliR+OlXSjMZYM1D6gfmwiuH1VX58LSHdn+ZPg==",
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-10.5.0.tgz",
"integrity": "sha512-UyhbK11baKAYqzyDUHlwDlm1aP/wxPMR0vFmsxA5984BGaPwarhoXUWng1Xa0cd9BdPbQ+zr/y8ADk6XxtwkYg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "^8.48.0",
"@typescript-eslint/utils": "^8.48.0"
},
"peerDependencies": {
"eslint": ">=8",
"storybook": "^10.4.6"
"storybook": "^10.5.0"
}
},
"node_modules/eslint-plugin-testing-library": {
@@ -35136,17 +35116,17 @@
}
},
"node_modules/react-docgen": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.1.1.tgz",
"integrity": "sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==",
"version": "8.0.3",
"resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-8.0.3.tgz",
"integrity": "sha512-aEZ9qP+/M+58x2qgfSFEWH1BxLyHe5+qkLNJOZQb5iGS017jpbRnoKhNRrXPeA6RfBrZO5wZrT9DMC1UqE1f1w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.18.9",
"@babel/traverse": "^7.18.9",
"@babel/types": "^7.18.9",
"@types/babel__core": "^7.18.0",
"@types/babel__traverse": "^7.18.0",
"@babel/core": "^7.28.0",
"@babel/traverse": "^7.28.0",
"@babel/types": "^7.28.2",
"@types/babel__core": "^7.20.5",
"@types/babel__traverse": "^7.20.7",
"@types/doctrine": "^0.0.9",
"@types/resolve": "^1.20.2",
"doctrine": "^3.0.0",
@@ -35154,7 +35134,7 @@
"strip-indent": "^4.0.0"
},
"engines": {
"node": ">=16.14.0"
"node": "^20.9.0 || >=22"
}
},
"node_modules/react-docgen-typescript": {
@@ -35218,9 +35198,9 @@
}
},
"node_modules/react-intersection-observer": {
"version": "10.0.3",
"resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-10.0.3.tgz",
"integrity": "sha512-luICLMbs0zxTO/70Zy7K5jOXkABPEVSAF8T3FdZUlctsrIaPLmx8TZe2SSA+CY2HGWfz2INyNTnp82pxNNsShA==",
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-10.1.0.tgz",
"integrity": "sha512-V8HDu3+Llg6OEhOxx8LnUSS0t4VS+1Xk9ZatkI8Jct/H0CwKnqFTCu8NT3q7ghJTghTdIrEMPSWr2dkKPG+gdQ==",
"license": "MIT",
"peerDependencies": {
"react": "^17.0.0 || ^18.0.0 || ^19.0.0",
@@ -38380,20 +38360,22 @@
}
},
"node_modules/storybook": {
"version": "10.4.6",
"resolved": "https://registry.npmjs.org/storybook/-/storybook-10.4.6.tgz",
"integrity": "sha512-6wkA6LxfDSSilloITsrFOJfsnw0mDUP2h8Ls+lRt8oRsudtz2RWFhLv+Toiwg6NW7hUpdTDc2hzR7DztJid6+A==",
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/storybook/-/storybook-10.5.0.tgz",
"integrity": "sha512-dRhM/kSSvHQR8DmZO41v5sJuz9U6zDjjR2gRBTgZN2RBSXbmF0Brvgszrvvxyx2VfxuYKzhB+xumKwWkwlBtig==",
"dev": true,
"license": "MIT",
"dependencies": {
"@storybook/global": "^5.0.0",
"@storybook/icons": "^2.0.2",
"@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/user-event": "^14.6.1",
"@vitest/expect": "3.2.4",
"@vitest/spy": "3.2.4",
"@webcontainer/env": "^1.1.1",
"esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0 || ^0.28.0",
"jsonc-parser": "^3.3.1",
"open": "^10.2.0",
"oxc-parser": "^0.127.0",
"oxc-resolver": "^11.19.1",
@@ -38412,7 +38394,7 @@
"peerDependencies": {
"@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"prettier": "^2 || ^3",
"vite-plus": "^0.1.15"
"vite-plus": "^0.1.15 || ^0.2.0"
},
"peerDependenciesMeta": {
"@types/react": {
@@ -38426,6 +38408,26 @@
}
}
},
"node_modules/storybook/node_modules/@testing-library/dom": {
"version": "10.4.1",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz",
"integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.10.4",
"@babel/runtime": "^7.12.5",
"@types/aria-query": "^5.0.1",
"aria-query": "5.3.0",
"dom-accessibility-api": "^0.5.9",
"lz-string": "^1.5.0",
"picocolors": "1.1.1",
"pretty-format": "^27.0.2"
},
"engines": {
"node": ">=18"
}
},
"node_modules/storybook/node_modules/@testing-library/user-event": {
"version": "14.6.1",
"resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz",
@@ -38440,6 +38442,16 @@
"@testing-library/dom": ">=7.21.4"
}
},
"node_modules/storybook/node_modules/aria-query": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
"integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"dequal": "^2.0.3"
}
},
"node_modules/storybook/node_modules/define-lazy-prop": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
@@ -38469,6 +38481,13 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/storybook/node_modules/jsonc-parser": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
"integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
"dev": true,
"license": "MIT"
},
"node_modules/storybook/node_modules/open": {
"version": "10.2.0",
"resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz",
@@ -41025,9 +41044,9 @@
}
},
"node_modules/unplugin/node_modules/picomatch": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
"integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
"dev": true,
"license": "MIT",
"engines": {

View File

@@ -174,7 +174,7 @@
"content-disposition": "^2.0.1",
"d3-scale": "^4.0.2",
"dayjs": "^1.11.21",
"dom-to-image-more": "^3.10.0",
"dom-to-image-more": "^3.10.2",
"dom-to-pdf": "^0.3.2",
"echarts": "^6.1.0",
"fast-glob": "^3.3.2",
@@ -213,7 +213,7 @@
"react-dnd-html5-backend": "^11.1.3",
"react-dom": "^18.3.0",
"react-google-recaptcha": "^3.1.0",
"react-intersection-observer": "^10.0.3",
"react-intersection-observer": "^10.1.0",
"react-json-tree": "^0.20.0",
"react-lines-ellipsis": "^0.16.1",
"react-loadable": "^5.5.0",
@@ -263,13 +263,13 @@
"@babel/types": "^7.29.7",
"@emotion/babel-plugin": "^11.13.5",
"@emotion/jest": "^11.14.2",
"@formatjs/intl-durationformat": "^0.10.16",
"@formatjs/intl-durationformat": "^0.10.17",
"@istanbuljs/nyc-config-typescript": "^1.0.1",
"@playwright/test": "^1.61.1",
"@pmmmwh/react-refresh-webpack-plugin": "^0.6.2",
"@storybook/addon-docs": "10.4.6",
"@storybook/addon-links": "10.4.6",
"@storybook/react-webpack5": "10.4.6",
"@storybook/addon-docs": "10.5.0",
"@storybook/addon-links": "10.5.0",
"@storybook/react-webpack5": "10.5.0",
"@storybook/test-runner": "0.24.4",
"@svgr/webpack": "^8.1.0",
"@swc/core": "^1.15.43",
@@ -325,7 +325,7 @@
"eslint-plugin-prettier": "^5.5.6",
"eslint-plugin-react-prefer-function-component": "^5.0.0",
"eslint-plugin-react-you-might-not-need-an-effect": "^1.0.1",
"eslint-plugin-storybook": "10.4.6",
"eslint-plugin-storybook": "10.5.0",
"eslint-plugin-testing-library": "^7.16.2",
"eslint-plugin-theme-colors": "file:eslint-rules/eslint-plugin-theme-colors",
"fetch-mock": "^12.6.0",
@@ -358,7 +358,7 @@
"source-map": "^0.7.6",
"source-map-support": "^0.5.21",
"speed-measure-webpack-plugin": "^1.6.0",
"storybook": "10.4.6",
"storybook": "10.5.0",
"style-loader": "^4.0.0",
"stylelint": "^17.14.0",
"swc-loader": "^0.2.7",

View File

@@ -480,7 +480,7 @@ const AgGridDataTable: FunctionComponent<AgGridTableProps> = memo(
)}
{includeSearch && (
<div className="search-container">
{serverPagination && (
{serverPagination && searchOptions?.length > 0 && (
<div className="search-by-text-container">
<span className="search-by-text"> {t('Search by')}:</span>
<SearchSelectDropdown

View File

@@ -18,7 +18,12 @@
* under the License.
*/
import { t } from '@apache-superset/core/translation';
import { ColDef } from '@superset-ui/core/components/ThemedAgGridReact';
import {
ColDef,
ValueFormatterParams,
ValueGetterParams,
CellClassParams,
} from '@superset-ui/core/components/ThemedAgGridReact';
import { useCallback, useMemo } from 'react';
import { DataRecordValue, JsonObject } from '@superset-ui/core';
import { GenericDataType } from '@apache-superset/core/common';
@@ -289,9 +294,9 @@ export const useColDefs = ({
field: colId,
headerName: getHeaderLabel(col),
headerTooltip: col.description,
valueFormatter: p => valueFormatter(p, col),
valueGetter: p => valueGetter(p, col),
cellStyle: p => {
valueFormatter: (p: ValueFormatterParams) => valueFormatter(p, col),
valueGetter: (p: ValueGetterParams) => valueGetter(p, col),
cellStyle: (p: CellClassParams) => {
const cellSurfaceColor =
p.node?.rowPinned != null
? theme.colorBgBase
@@ -315,7 +320,7 @@ export const useColDefs = ({
return getCellStyle(cellStyleParams);
},
cellClass: p =>
cellClass: (p: CellClassParams) =>
getCellClass({
...p,
col,
@@ -477,7 +482,7 @@ export const useColDefs = ({
headerName: t('№'),
headerClass: 'ag-header-center',
field: ROW_NUMBER_COL_ID,
valueGetter: params => {
valueGetter: (params: ValueGetterParams) => {
if (params.node?.rowPinned != null) return '';
if (serverPagination && serverPaginationData) {
return currentPage * pageSize + (params.node?.rowIndex ?? 0) + 1;

View File

@@ -195,6 +195,119 @@ test('AgGridTableChart renders with search enabled', async () => {
expect(searchInput).toHaveAttribute('id', 'filter-text-box');
});
test('AgGridTableChart hides Search by dropdown if includeSearch is false', async () => {
const props = transformProps({
...testData.basic,
rawFormData: {
...testData.basic.rawFormData,
server_pagination: true,
include_search: false,
},
});
props.serverPagination = true;
props.includeSearch = false;
render(
ProviderWrapper({
children: (
<AgGridTableChart
{...props}
setDataMask={mockSetDataMask}
slice_id={1}
/>
),
}),
);
await waitFor(() => {
const grid = document.querySelector('.ag-container');
expect(grid).toBeInTheDocument();
});
expect(screen.queryByText(/Search by/i)).not.toBeInTheDocument();
});
test('AgGridTableChart renders Search by dropdown if includeSearch is true and there are search options', async () => {
const props = transformProps({
...testData.basic,
rawFormData: {
...testData.basic.rawFormData,
server_pagination: true,
include_search: true,
},
});
props.serverPagination = true;
props.includeSearch = true;
render(
ProviderWrapper({
children: (
<AgGridTableChart
{...props}
setDataMask={mockSetDataMask}
slice_id={1}
/>
),
}),
);
await waitFor(() => {
const grid = document.querySelector('.ag-container');
expect(grid).toBeInTheDocument();
});
expect(screen.getByText(/Search by/i)).toBeInTheDocument();
});
test('AgGridTableChart does not render Search by dropdown if includeSearch is true but searchOptions is empty', async () => {
const noStringColumnsData = {
...testData.basic,
queriesData: [
{
...testData.basic.queriesData[0],
colnames: ['__timestamp', 'sum__num'],
coltypes: [GenericDataType.Temporal, GenericDataType.Numeric],
data: [
{
__timestamp: '2020-01-01T12:34:56',
sum__num: 2467063,
},
],
},
],
};
const props = transformProps({
...noStringColumnsData,
rawFormData: {
...noStringColumnsData.rawFormData,
server_pagination: true,
include_search: true,
},
});
props.serverPagination = true;
props.includeSearch = true;
render(
ProviderWrapper({
children: (
<AgGridTableChart
{...props}
setDataMask={mockSetDataMask}
slice_id={1}
/>
),
}),
);
await waitFor(() => {
const grid = document.querySelector('.ag-container');
expect(grid).toBeInTheDocument();
});
expect(screen.queryByText(/Search by/i)).not.toBeInTheDocument();
});
test('AgGridTableChart renders with totals', async () => {
const props = transformProps({
...testData.basic,

View File

@@ -99,22 +99,43 @@ export const getSmartDateFormatter = (timeGrain?: string) => {
const day = normalizedDate.getUTCDate();
const cleanDate = new Date(Date.UTC(year, month, day, 0, 0, 0, 0));
return baseFormatter(cleanDate);
} else if (
timeGrain === TimeGranularity.HOUR ||
timeGrain === TimeGranularity.THIRTY_MINUTES ||
timeGrain === TimeGranularity.FIFTEEN_MINUTES ||
timeGrain === TimeGranularity.TEN_MINUTES ||
timeGrain === TimeGranularity.FIVE_MINUTES ||
timeGrain === TimeGranularity.MINUTE ||
timeGrain === TimeGranularity.SECOND
) {
// Set to top of hour UTC
} else if (timeGrain === TimeGranularity.HOUR) {
// Set to top of hour UTC - smart formatter will show hour
const year = normalizedDate.getUTCFullYear();
const month = normalizedDate.getUTCMonth();
const day = normalizedDate.getUTCDate();
const hour = normalizedDate.getUTCHours();
const cleanDate = new Date(Date.UTC(year, month, day, hour, 0, 0, 0));
return baseFormatter(cleanDate);
} else if (
timeGrain === TimeGranularity.THIRTY_MINUTES ||
timeGrain === TimeGranularity.FIFTEEN_MINUTES ||
timeGrain === TimeGranularity.TEN_MINUTES ||
timeGrain === TimeGranularity.FIVE_MINUTES ||
timeGrain === TimeGranularity.MINUTE
) {
// Preserve hour and minute for sub-hour grains
const year = normalizedDate.getUTCFullYear();
const month = normalizedDate.getUTCMonth();
const day = normalizedDate.getUTCDate();
const hour = normalizedDate.getUTCHours();
const minute = normalizedDate.getUTCMinutes();
const cleanDate = new Date(
Date.UTC(year, month, day, hour, minute, 0, 0),
);
return baseFormatter(cleanDate);
} else if (timeGrain === TimeGranularity.SECOND) {
// Preserve hour, minute, and second for second-level grain
const year = normalizedDate.getUTCFullYear();
const month = normalizedDate.getUTCMonth();
const day = normalizedDate.getUTCDate();
const hour = normalizedDate.getUTCHours();
const minute = normalizedDate.getUTCMinutes();
const second = normalizedDate.getUTCSeconds();
const cleanDate = new Date(
Date.UTC(year, month, day, hour, minute, second, 0),
);
return baseFormatter(cleanDate);
}
// Use the base formatter on the normalized date

View File

@@ -17,6 +17,9 @@
* under the License.
*/
import {
createSmartDateFormatter,
createSmartDateVerboseFormatter,
getTimeFormatterRegistry,
NumberFormats,
SMART_DATE_ID,
SMART_DATE_VERBOSE_ID,
@@ -29,6 +32,16 @@ import {
getXAxisFormatter,
} from '../../src/utils/formatters';
// The app normally registers these via setupFormatters() at bootstrap.
// Register them here so tests that check actual formatted output (not just
// formatter identity) exercise the real smart-date formatting logic instead
// of falling back to treating "smart_date" as a literal d3 format string.
beforeAll(() => {
getTimeFormatterRegistry()
.registerValue(SMART_DATE_ID, createSmartDateFormatter())
.registerValue(SMART_DATE_VERBOSE_ID, createSmartDateVerboseFormatter());
});
test('getPercentFormatter should format as percent if no format is specified', () => {
const value = 0.6;
expect(getPercentFormatter().format(value)).toEqual('60%');
@@ -296,3 +309,43 @@ test('getXAxisFormatter returns a string for an Invalid Date without throwing',
expect(() => customFormatter.format(invalid)).not.toThrow();
expect(typeof customFormatter.format(invalid)).toBe('string');
});
test('getSmartDateFormatter MINUTE grain distinguishes different minutes', () => {
const formatter = getXAxisFormatter(
SMART_DATE_ID,
TimeGranularity.MINUTE,
) as TimeFormatter;
const date1 = new Date('2024-01-15T10:15:00Z');
const date2 = new Date('2024-01-15T10:30:00Z');
expect(formatter.format(date1)).not.toBe(formatter.format(date2));
});
test('getSmartDateFormatter FIFTEEN_MINUTES grain distinguishes different minutes', () => {
const formatter = getXAxisFormatter(
SMART_DATE_ID,
TimeGranularity.FIFTEEN_MINUTES,
) as TimeFormatter;
const date1 = new Date('2024-01-15T10:15:00Z');
const date2 = new Date('2024-01-15T10:30:00Z');
expect(formatter.format(date1)).not.toBe(formatter.format(date2));
});
test('getSmartDateFormatter HOUR grain collapses minutes to same label', () => {
const formatter = getXAxisFormatter(
SMART_DATE_ID,
TimeGranularity.HOUR,
) as TimeFormatter;
const date1 = new Date('2024-01-15T10:00:00Z');
const date2 = new Date('2024-01-15T10:35:00Z');
expect(formatter.format(date1)).toBe(formatter.format(date2));
});
test('getSmartDateFormatter SECOND grain distinguishes different seconds', () => {
const formatter = getXAxisFormatter(
SMART_DATE_ID,
TimeGranularity.SECOND,
) as TimeFormatter;
const date1 = new Date('2024-01-15T10:35:00Z');
const date2 = new Date('2024-01-15T10:35:45Z');
expect(formatter.format(date1)).not.toBe(formatter.format(date2));
});

View File

@@ -583,7 +583,7 @@ export default typedMemo(function DataTable<D extends object>({
<Flex wrap align="center" gap="middle">
{searchInput && (
<>
{serverPagination && (
{serverPagination && searchOptions?.length > 0 && (
<Space direction="vertical" size={4}>
{t('Search by')}
<SearchSelectDropdown

View File

@@ -2432,6 +2432,56 @@ describe('plugin-chart-table', () => {
expect(filters[0].val).toEqual(['Michael']);
});
});
test('does not render "Search by" if there are no search options (server pagination enabled)', () => {
const props = transformProps({
...testData.raw,
rawFormData: {
...testData.raw.rawFormData,
server_pagination: true,
include_search: true,
},
queriesData: [
{
...testData.raw.queriesData[0],
colnames: ['num'],
coltypes: [GenericDataType.Numeric],
data: [{ num: 1 }, { num: 2 }],
},
],
});
render(
ProviderWrapper({
children: <TableChart {...props} sticky={false} />,
}),
);
expect(screen.queryByText('Search by')).not.toBeInTheDocument();
});
test('renders "Search by" if include_search is true and there are search options (server pagination enabled)', () => {
const props = transformProps({
...testData.raw,
rawFormData: {
...testData.raw.rawFormData,
server_pagination: true,
include_search: true,
},
queriesData: [
{
...testData.raw.queriesData[0],
colnames: ['name'],
coltypes: [GenericDataType.String],
data: [{ name: 'Michael' }, { name: 'John' }],
},
],
});
render(
ProviderWrapper({
children: <TableChart {...props} sticky={false} />,
}),
);
expect(screen.queryByText('Search by')).toBeInTheDocument();
});
});
/**

View File

@@ -26,7 +26,7 @@
"@types/ws": "^8.18.1",
"@typescript-eslint/eslint-plugin": "^8.63.0",
"@typescript-eslint/parser": "^8.63.0",
"eslint": "^10.5.0",
"eslint": "^10.7.0",
"eslint-config-prettier": "^10.1.8",
"globals": "^17.6.0",
"prettier": "^3.9.5",
@@ -1360,9 +1360,9 @@
}
},
"node_modules/eslint": {
"version": "10.6.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-10.6.0.tgz",
"integrity": "sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==",
"version": "10.7.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-10.7.0.tgz",
"integrity": "sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==",
"dev": true,
"license": "MIT",
"workspaces": [

View File

@@ -35,7 +35,7 @@
"@types/ws": "^8.18.1",
"@typescript-eslint/eslint-plugin": "^8.63.0",
"@typescript-eslint/parser": "^8.63.0",
"eslint": "^10.5.0",
"eslint": "^10.7.0",
"eslint-config-prettier": "^10.1.8",
"globals": "^17.6.0",
"prettier": "^3.9.5",