diff --git a/docs/package.json b/docs/package.json
index 7e56ebff4416..eac24d5ded70 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -51,7 +51,7 @@
"@storybook/preview-api": "^8.6.11",
"@storybook/theming": "^8.6.11",
"@superset-ui/core": "^0.20.4",
- "antd": "^6.1.2",
+ "antd": "^6.2.0",
"caniuse-lite": "^1.0.30001764",
"docusaurus-plugin-less": "^2.0.2",
"js-yaml": "^4.1.1",
diff --git a/docs/yarn.lock b/docs/yarn.lock
index 73c0c545ae95..406e8d323849 100644
--- a/docs/yarn.lock
+++ b/docs/yarn.lock
@@ -196,10 +196,10 @@
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.24"
-"@ant-design/colors@^8.0.0":
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-8.0.0.tgz#92b5aa1cd44896b62c7b67133b4d5a6a00266162"
- integrity sha512-6YzkKCw30EI/E9kHOIXsQDHmMvTllT8STzjMb4K2qzit33RW2pqCJP0sk+hidBntXxE+Vz4n1+RvCTfBw6OErw==
+"@ant-design/colors@^8.0.0", "@ant-design/colors@^8.0.1":
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-8.0.1.tgz#6b5444f2ab4061c7b1aa4bc776adb023b0253161"
+ integrity sha512-foPVl0+SWIslGUtD/xBr1p9U4AKzPhNYEseXYRRo5QSzGACYZrQbe11AYJbYfAWnWSpGBx6JjBmSeugUsD9vqQ==
dependencies:
"@ant-design/fast-color" "^3.0.0"
@@ -2689,19 +2689,19 @@
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.29.tgz#5a40109a1ab5f84d6fd8fc928b19f367cbe7e7b1"
integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==
-"@rc-component/async-validator@^5.0.3":
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/@rc-component/async-validator/-/async-validator-5.0.4.tgz#5291ad92f00a14b6766fc81735c234277f83e948"
- integrity sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==
+"@rc-component/async-validator@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@rc-component/async-validator/-/async-validator-5.1.0.tgz#e81f31e676d9cadc71e4310bbf1749c7a5882291"
+ integrity sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==
dependencies:
"@babel/runtime" "^7.24.4"
-"@rc-component/cascader@~1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@rc-component/cascader/-/cascader-1.9.0.tgz#a9b342d4b545d4f8658d1b00dcc63e4871d9c740"
- integrity sha512-2jbthe1QZrMBgtCvNKkJFjZYC3uKl4N/aYm5SsMvO3T+F+qRT1CGsSM9bXnh1rLj7jDk/GK0natShWF/jinhWQ==
+"@rc-component/cascader@~1.11.0":
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/@rc-component/cascader/-/cascader-1.11.0.tgz#71e9fe8daab963143b351102aaac58cd652d44c2"
+ integrity sha512-VDiEsskThWi8l0/1Nquc9I4ytcMKQYAb9Jkm6wiX5O5fpcMRsm+b8OulBMbr/b4rFTl/2y2y4GdKqQ+2whD+XQ==
dependencies:
- "@rc-component/select" "~1.3.0"
+ "@rc-component/select" "~1.5.0"
"@rc-component/tree" "~1.1.0"
"@rc-component/util" "^1.4.0"
clsx "^2.1.1"
@@ -2714,10 +2714,10 @@
"@rc-component/util" "^1.3.0"
clsx "^2.1.1"
-"@rc-component/collapse@~1.1.2":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@rc-component/collapse/-/collapse-1.1.2.tgz#7e0ff96a8292600bf774584257c9dc283891aea3"
- integrity sha512-ilBYk1dLLJHu5Q74dF28vwtKUYQ42ZXIIDmqTuVy4rD8JQVvkXOs+KixVNbweyuIEtJYJ7+t+9GVD9dPc6N02w==
+"@rc-component/collapse@~1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@rc-component/collapse/-/collapse-1.2.0.tgz#f4f041c0d0e97298b83aad8491fde9fe75b3ac48"
+ integrity sha512-ZRYSKSS39qsFx93p26bde7JUZJshsUBEQRlRXPuJYlAiNX0vyYlF5TsAm8JZN3LcF8XvKikdzPbgAtXSbkLUkw==
dependencies:
"@babel/runtime" "^7.10.1"
"@rc-component/motion" "^1.1.4"
@@ -2740,23 +2740,23 @@
dependencies:
"@rc-component/util" "^1.3.0"
-"@rc-component/dialog@~1.5.1":
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/@rc-component/dialog/-/dialog-1.5.1.tgz#c02f6109d4fdd3cdf4e74384837171342685f223"
- integrity sha512-by4Sf/a3azcb89WayWuwG19/Y312xtu8N81HoVQQtnsBDylfs+dog98fTAvLinnpeoWG52m/M7QLRW6fXR3l1g==
+"@rc-component/dialog@~1.8.0":
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@rc-component/dialog/-/dialog-1.8.0.tgz#b1c05c0a8df6292f00a46b3025b490c54fb4da13"
+ integrity sha512-zGksezfULKixYCIWctIhUC2M3zUJrc81JKWbi9dJrQdPaM7J+8vSOrhLoOHHkZFpBpb2Ri6JqnSuGYb2N+FrRA==
dependencies:
"@rc-component/motion" "^1.1.3"
- "@rc-component/portal" "^2.0.0"
- "@rc-component/util" "^1.0.1"
+ "@rc-component/portal" "^2.1.0"
+ "@rc-component/util" "^1.5.0"
clsx "^2.1.1"
-"@rc-component/drawer@~1.3.0":
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/@rc-component/drawer/-/drawer-1.3.0.tgz#629e789f6199bbc2e2de467bc0dde59ed0817da2"
- integrity sha512-rE+sdXEmv2W25VBQ9daGbnb4J4hBIEKmdbj0b3xpY+K7TUmLXDIlSnoXraIbFZdGyek9WxxGKK887uRnFgI+pQ==
+"@rc-component/drawer@~1.4.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@rc-component/drawer/-/drawer-1.4.0.tgz#aad9002307899b3b2a31e7c2160c44f38421e026"
+ integrity sha512-Zr1j1LRLDauz4a5JXHEmeYQfvEzfh4CddNa7tszyJnfd5GySYdZ5qLO63Tt2tgG4k+qi6tkFDKmcT46ikZfzbQ==
dependencies:
"@rc-component/motion" "^1.1.4"
- "@rc-component/portal" "^2.0.0"
+ "@rc-component/portal" "^2.1.3"
"@rc-component/util" "^1.2.1"
clsx "^2.1.1"
@@ -2769,22 +2769,22 @@
"@rc-component/util" "^1.2.1"
clsx "^2.1.1"
-"@rc-component/form@~1.6.0":
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/@rc-component/form/-/form-1.6.0.tgz#d2f9f6be1063886b9a0ccc5168a0411da6e0da15"
- integrity sha512-A7vrN8kExtw4sW06mrsgCb1rowhvBFFvQU6Bk/NL0Fj6Wet/5GF0QnGCxBu/sG3JI9FEhsJWES0D44BW2d0hzg==
+"@rc-component/form@~1.6.2":
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/@rc-component/form/-/form-1.6.2.tgz#6b0737d7a5a91f4e592c3676806741dda67f435a"
+ integrity sha512-OgIn2RAoaSBqaIgzJf/X6iflIa9LpTozci1lagLBdURDFhGA370v0+T0tXxOi8YShMjTha531sFhwtnrv+EJaQ==
dependencies:
- "@rc-component/async-validator" "^5.0.3"
- "@rc-component/util" "^1.5.0"
+ "@rc-component/async-validator" "^5.1.0"
+ "@rc-component/util" "^1.6.2"
clsx "^2.1.1"
-"@rc-component/image@~1.5.3":
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/@rc-component/image/-/image-1.5.3.tgz#ea163e5b55303d548e3b2946e99bdcd9e7586299"
- integrity sha512-/NR7QW9uCN8Ugar+xsHZOPvzPySfEhcW2/vLcr7VPRM+THZMrllMRv7LAUgW7ikR+Z67Ab67cgPp5K5YftpJsQ==
+"@rc-component/image@~1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@rc-component/image/-/image-1.6.0.tgz#4c3f66b07a1d7c50de23a7bf24660262161daf8d"
+ integrity sha512-tSfn2ZE/oP082g4QIOxeehkmgnXB7R+5AFj/lIFr4k7pEuxHBdyGIq9axoCY9qea8NN0DY6p4IB/F07tLqaT5A==
dependencies:
"@rc-component/motion" "^1.0.0"
- "@rc-component/portal" "^2.0.0"
+ "@rc-component/portal" "^2.1.2"
"@rc-component/util" "^1.3.0"
clsx "^2.1.1"
@@ -2888,10 +2888,10 @@
"@rc-component/util" "^1.3.0"
clsx "^2.1.1"
-"@rc-component/portal@^2.0.0":
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/@rc-component/portal/-/portal-2.0.1.tgz#330bc21e6f9c513a8b685615222c22e03ac7af1b"
- integrity sha512-46KYuA7Udb1LAaLIdDrfmDz3wzyeEZxIURJCn+heoQVbhtW5PQkhBSQtRus+DUdsknmTFQulxSnqrbX3CI4yXw==
+"@rc-component/portal@^2.1.0", "@rc-component/portal@^2.1.2", "@rc-component/portal@^2.1.3", "@rc-component/portal@^2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@rc-component/portal/-/portal-2.2.0.tgz#ec4c6c3de2cd09fa3ce545f2439a7eb84852a7b9"
+ integrity sha512-oc6FlA+uXCMiwArHsJyHcIkX4q6uKyndrPol2eWX8YPkAnztHOPsFIRtmWG4BMlGE5h7YIRE3NiaJ5VS8Lb1QQ==
dependencies:
"@rc-component/util" "^1.2.1"
clsx "^2.1.1"
@@ -2936,10 +2936,10 @@
"@rc-component/util" "^1.3.0"
clsx "^2.1.1"
-"@rc-component/select@~1.3.0", "@rc-component/select@~1.3.6":
- version "1.3.6"
- resolved "https://registry.yarnpkg.com/@rc-component/select/-/select-1.3.6.tgz#3272fb12382d14e8d51f20de26b3cf39feb163bc"
- integrity sha512-CzbJ9TwmWcF5asvTMZ9BMiTE9CkkrigeOGRPpzCNmeZP7KBwwmYrmOIiKh9tMG7d6DyGAEAQ75LBxzPx+pGTHA==
+"@rc-component/select@~1.5.0":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@rc-component/select/-/select-1.5.0.tgz#3c4522c7c8b7c73cc6414021198ede99e13c6732"
+ integrity sha512-Zz0hpToAfOdWo/1jj3dW5iooBNU8F6fVgVaYN4Jy1SL3Xcx2OO+IqiQnxqk/PjY6hg1HVt7LjkkrYvpJQyZxoQ==
dependencies:
"@rc-component/overflow" "^1.0.0"
"@rc-component/trigger" "^3.0.0"
@@ -2971,10 +2971,10 @@
"@rc-component/util" "^1.3.0"
clsx "^2.1.1"
-"@rc-component/table@~1.9.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@rc-component/table/-/table-1.9.0.tgz#2dd0677930ff9dd6467de1e9263aa41e020f24f3"
- integrity sha512-cq3P9FkD+F3eglkFYhBuNlHclg+r4jY8+ZIgK7zbEFo6IwpnA77YL/Gq4ensLw9oua3zFCTA6JDu6YgBei0TxA==
+"@rc-component/table@~1.9.1":
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/@rc-component/table/-/table-1.9.1.tgz#77a485f871c3a4b1abbb37f8fb9d25fb97efb481"
+ integrity sha512-FVI5ZS/GdB3BcgexfCYKi3iHhZS3Fr59EtsxORszYGrfpH1eWr33eDNSYkVfLI6tfJ7vftJDd9D5apfFWqkdJg==
dependencies:
"@rc-component/context" "^2.0.1"
"@rc-component/resize-observer" "^1.0.0"
@@ -3013,22 +3013,22 @@
"@rc-component/util" "^1.3.0"
clsx "^2.1.1"
-"@rc-component/tour@~2.2.1":
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/@rc-component/tour/-/tour-2.2.1.tgz#608c5270443e329d13251072845e75b5e64b3067"
- integrity sha512-BUCrVikGJsXli38qlJ+h2WyDD6dYxzDA9dV3o0ij6gYhAq6ooT08SUMWOikva9v4KZ2BEuluGl5bPcsjrSoBgQ==
+"@rc-component/tour@~2.3.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@rc-component/tour/-/tour-2.3.0.tgz#3c45ddcab02cd1846f707e8993beecd9dee23a8f"
+ integrity sha512-K04K9r32kUC+auBSQfr+Fss4SpSIS9JGe56oq/ALAX0p+i2ylYOI1MgR83yBY7v96eO6ZFXcM/igCQmubps0Ow==
dependencies:
- "@rc-component/portal" "^2.0.0"
+ "@rc-component/portal" "^2.2.0"
"@rc-component/trigger" "^3.0.0"
- "@rc-component/util" "^1.3.0"
+ "@rc-component/util" "^1.7.0"
clsx "^2.1.1"
-"@rc-component/tree-select@~1.4.0":
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/@rc-component/tree-select/-/tree-select-1.4.0.tgz#b26af50f71aef1fb15add63aad39220bdbb20295"
- integrity sha512-I3UAlO2hNqy9CSKc8EBaESgnmKk2QaRzuZ2XHZGFCgsSMkGl06mdF97sVfROM02YIb64ocgLKefsjE0Ch4ocwQ==
+"@rc-component/tree-select@~1.6.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@rc-component/tree-select/-/tree-select-1.6.0.tgz#df7420e906dbd7c884dc4be28263f8795a6447fc"
+ integrity sha512-UvEGmZT+gcVvRwImAZg3/sXw9nUdn4FmCs1rSIMWjEXEIAo0dTGmIyWuLCvs+1rGe9AZ7CHMPiQUEbdadwV0fw==
dependencies:
- "@rc-component/select" "~1.3.0"
+ "@rc-component/select" "~1.5.0"
"@rc-component/tree" "~1.1.0"
"@rc-component/util" "^1.4.0"
clsx "^2.1.1"
@@ -3043,13 +3043,13 @@
"@rc-component/virtual-list" "^1.0.1"
clsx "^2.1.1"
-"@rc-component/trigger@^3.0.0", "@rc-component/trigger@^3.6.15", "@rc-component/trigger@^3.7.1", "@rc-component/trigger@^3.7.2":
- version "3.7.2"
- resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-3.7.2.tgz#9ae9192c024c35432106904785359f8a46fa1412"
- integrity sha512-25x+D2k9SAkaK/MNMNmv2Nlv8FH1D9RtmjoMoLEw1Cid+sMV4pAAT5k49ku59UeXaOA1qwLUVrBUMq4A6gUSsQ==
+"@rc-component/trigger@^3.0.0", "@rc-component/trigger@^3.6.15", "@rc-component/trigger@^3.7.1", "@rc-component/trigger@^3.8.2":
+ version "3.8.2"
+ resolved "https://registry.yarnpkg.com/@rc-component/trigger/-/trigger-3.8.2.tgz#75d3bd194381678262c674e40392f287bea11765"
+ integrity sha512-I6idYAk8YY3Ly6v5hB7ONqxfdTYTcVNUmV1ZjtSsGH6N/k5tss9+OAtusr+7zdlIcD7TwnlsoB5etfB14ORtMw==
dependencies:
"@rc-component/motion" "^1.1.4"
- "@rc-component/portal" "^2.0.0"
+ "@rc-component/portal" "^2.2.0"
"@rc-component/resize-observer" "^1.0.0"
"@rc-component/util" "^1.2.1"
clsx "^2.1.1"
@@ -3062,10 +3062,10 @@
"@rc-component/util" "^1.3.0"
clsx "^2.1.1"
-"@rc-component/util@^1.0.1", "@rc-component/util@^1.1.0", "@rc-component/util@^1.2.0", "@rc-component/util@^1.2.1", "@rc-component/util@^1.3.0", "@rc-component/util@^1.4.0", "@rc-component/util@^1.5.0", "@rc-component/util@^1.6.0":
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/@rc-component/util/-/util-1.6.0.tgz#4f700da5417eb5fd5f9491f08edcba6d075d9454"
- integrity sha512-YbjuIVAm8InCnXVoA4n6G+uh31yESTxQ6fSY2frZ2/oMSvktoB+bumFUfNN7RKh7YeOkZgOvN2suGtEDhJSX0A==
+"@rc-component/util@^1.1.0", "@rc-component/util@^1.2.0", "@rc-component/util@^1.2.1", "@rc-component/util@^1.3.0", "@rc-component/util@^1.4.0", "@rc-component/util@^1.5.0", "@rc-component/util@^1.6.2", "@rc-component/util@^1.7.0":
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/@rc-component/util/-/util-1.7.0.tgz#c6eb178e0b1c48c5ae6325b21c60aeaf4f3d8d04"
+ integrity sha512-tIvIGj4Vl6fsZFvWSkYw9sAfiCKUXMyhVz6kpKyZbwyZyRPqv2vxYZROdaO1VB4gqTNvUZFXh6i3APUiterw5g==
dependencies:
is-mobile "^5.0.0"
react-is "^18.2.0"
@@ -4877,27 +4877,27 @@ ansi-styles@^6.1.0:
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
-antd@^6.1.2:
- version "6.1.2"
- resolved "https://registry.yarnpkg.com/antd/-/antd-6.1.2.tgz#99d76a950840c0ca51042507771013463db95a44"
- integrity sha512-pqYaZECL/7TBiNxxz+LieLiPCem6DaEzudqN44EZ3SvJjixLP7K41n6clo0zxe/2HiOUe9KxTMxGN+icOkL6Tw==
+antd@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/antd/-/antd-6.2.0.tgz#f61f2ebad9a8e6c9905540c97e432f5efea3bbed"
+ integrity sha512-fwETatwHYExjfzKcV41fBtgPo4kp+g+9gp5YOSSGxwnJHljps8TbXef8WP7ZnaOn5dkcA9xIC0TyUecIybBG7w==
dependencies:
- "@ant-design/colors" "^8.0.0"
+ "@ant-design/colors" "^8.0.1"
"@ant-design/cssinjs" "^2.0.1"
"@ant-design/cssinjs-utils" "^2.0.2"
"@ant-design/fast-color" "^3.0.0"
"@ant-design/icons" "^6.1.0"
"@ant-design/react-slick" "~2.0.0"
"@babel/runtime" "^7.28.4"
- "@rc-component/cascader" "~1.9.0"
+ "@rc-component/cascader" "~1.11.0"
"@rc-component/checkbox" "~1.0.1"
- "@rc-component/collapse" "~1.1.2"
+ "@rc-component/collapse" "~1.2.0"
"@rc-component/color-picker" "~3.0.3"
- "@rc-component/dialog" "~1.5.1"
- "@rc-component/drawer" "~1.3.0"
+ "@rc-component/dialog" "~1.8.0"
+ "@rc-component/drawer" "~1.4.0"
"@rc-component/dropdown" "~1.0.2"
- "@rc-component/form" "~1.6.0"
- "@rc-component/image" "~1.5.3"
+ "@rc-component/form" "~1.6.2"
+ "@rc-component/image" "~1.6.0"
"@rc-component/input" "~1.1.2"
"@rc-component/input-number" "~1.6.2"
"@rc-component/mentions" "~1.6.0"
@@ -4912,20 +4912,20 @@ antd@^6.1.2:
"@rc-component/rate" "~1.0.1"
"@rc-component/resize-observer" "^1.0.1"
"@rc-component/segmented" "~1.3.0"
- "@rc-component/select" "~1.3.6"
+ "@rc-component/select" "~1.5.0"
"@rc-component/slider" "~1.0.1"
"@rc-component/steps" "~1.2.2"
"@rc-component/switch" "~1.0.3"
- "@rc-component/table" "~1.9.0"
+ "@rc-component/table" "~1.9.1"
"@rc-component/tabs" "~1.7.0"
"@rc-component/textarea" "~1.1.2"
"@rc-component/tooltip" "~1.4.0"
- "@rc-component/tour" "~2.2.1"
+ "@rc-component/tour" "~2.3.0"
"@rc-component/tree" "~1.1.0"
- "@rc-component/tree-select" "~1.4.0"
- "@rc-component/trigger" "^3.7.2"
+ "@rc-component/tree-select" "~1.6.0"
+ "@rc-component/trigger" "^3.8.2"
"@rc-component/upload" "~1.1.0"
- "@rc-component/util" "^1.6.0"
+ "@rc-component/util" "^1.7.0"
clsx "^2.1.1"
dayjs "^1.11.11"
scroll-into-view-if-needed "^3.1.0"
diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json
index ea178dc2dc60..6b4b3a77341b 100644
--- a/superset-frontend/package-lock.json
+++ b/superset-frontend/package-lock.json
@@ -154,7 +154,7 @@
"@babel/register": "^7.23.7",
"@babel/runtime": "^7.28.6",
"@babel/runtime-corejs3": "^7.28.4",
- "@babel/types": "^7.26.9",
+ "@babel/types": "^7.28.6",
"@cypress/react": "^8.0.2",
"@emotion/babel-plugin": "^11.13.5",
"@emotion/jest": "^11.14.2",
@@ -212,7 +212,7 @@
"babel-plugin-lodash": "^3.3.4",
"babel-plugin-typescript-to-proptypes": "^2.0.0",
"baseline-browser-mapping": "^2.9.9",
- "cheerio": "1.1.0",
+ "cheerio": "1.1.2",
"concurrently": "^9.2.1",
"copy-webpack-plugin": "^13.0.1",
"cross-env": "^10.1.0",
@@ -3238,9 +3238,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
- "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz",
+ "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
@@ -24411,9 +24411,9 @@
}
},
"node_modules/cheerio": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.0.tgz",
- "integrity": "sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz",
+ "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -24421,16 +24421,16 @@
"dom-serializer": "^2.0.0",
"domhandler": "^5.0.3",
"domutils": "^3.2.2",
- "encoding-sniffer": "^0.2.0",
+ "encoding-sniffer": "^0.2.1",
"htmlparser2": "^10.0.0",
"parse5": "^7.3.0",
"parse5-htmlparser2-tree-adapter": "^7.1.0",
"parse5-parser-stream": "^7.1.2",
- "undici": "^7.10.0",
+ "undici": "^7.12.0",
"whatwg-mimetype": "^4.0.0"
},
"engines": {
- "node": ">=18.17"
+ "node": ">=20.18.1"
},
"funding": {
"url": "https://github.com/cheeriojs/cheerio?sponsor=1"
@@ -57596,9 +57596,9 @@
"license": "MIT"
},
"node_modules/undici": {
- "version": "7.11.0",
- "resolved": "https://registry.npmjs.org/undici/-/undici-7.11.0.tgz",
- "integrity": "sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg==",
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz",
+ "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -66438,7 +66438,7 @@
"version": "0.20.3",
"license": "Apache-2.0",
"devDependencies": {
- "@babel/types": "^7.28.4",
+ "@babel/types": "^7.28.6",
"@types/jest": "^30.0.0",
"jest": "^30.2.0"
},
diff --git a/superset-frontend/package.json b/superset-frontend/package.json
index 534ee6822906..17cff9c7f750 100644
--- a/superset-frontend/package.json
+++ b/superset-frontend/package.json
@@ -235,7 +235,7 @@
"@babel/register": "^7.23.7",
"@babel/runtime": "^7.28.6",
"@babel/runtime-corejs3": "^7.28.4",
- "@babel/types": "^7.26.9",
+ "@babel/types": "^7.28.6",
"@cypress/react": "^8.0.2",
"@emotion/babel-plugin": "^11.13.5",
"@emotion/jest": "^11.14.2",
@@ -293,7 +293,7 @@
"babel-plugin-lodash": "^3.3.4",
"babel-plugin-typescript-to-proptypes": "^2.0.0",
"baseline-browser-mapping": "^2.9.9",
- "cheerio": "1.1.0",
+ "cheerio": "1.1.2",
"concurrently": "^9.2.1",
"copy-webpack-plugin": "^13.0.1",
"cross-env": "^10.1.0",
diff --git a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/styles/index.tsx b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/styles/index.tsx
index 4d7f4f3c8ede..e3aedf7e6ea4 100644
--- a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/styles/index.tsx
+++ b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/styles/index.tsx
@@ -287,14 +287,14 @@ export const StyledChartContainer = styled.div<{
.dt-is-filter {
cursor: pointer;
:hover {
- background-color: ${theme.colorPrimaryBgHover};
+ background-color: ${theme.colorFillContentHover};
}
}
.dt-is-active-filter {
background: ${theme.colorPrimaryBg};
:hover {
- background-color: ${theme.colorPrimaryBgHover};
+ background-color: ${theme.colorFillContentHover};
}
}
diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/package.json b/superset-frontend/plugins/plugin-chart-pivot-table/package.json
index b8e427742d73..0ae2b1c429f4 100644
--- a/superset-frontend/plugins/plugin-chart-pivot-table/package.json
+++ b/superset-frontend/plugins/plugin-chart-pivot-table/package.json
@@ -37,7 +37,7 @@
"react-dom": "^17.0.2"
},
"devDependencies": {
- "@babel/types": "^7.28.4",
+ "@babel/types": "^7.28.6",
"@types/jest": "^30.0.0",
"jest": "^30.2.0"
}
diff --git a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js
index 12e6dbe33388..4b9cbd4d4c8b 100644
--- a/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js
+++ b/superset-frontend/plugins/plugin-chart-pivot-table/src/react-pivottable/Styles.js
@@ -145,7 +145,7 @@ export const Styles = styled.div`
}
.hoverable:hover {
- background-color: ${theme.colorPrimaryBgHover};
+ background-color: ${theme.colorFillContentHover};
cursor: pointer;
}
`}
diff --git a/superset-frontend/plugins/plugin-chart-table/src/Styles.tsx b/superset-frontend/plugins/plugin-chart-table/src/Styles.tsx
index 4d7a61af6f59..27bea632bc19 100644
--- a/superset-frontend/plugins/plugin-chart-table/src/Styles.tsx
+++ b/superset-frontend/plugins/plugin-chart-table/src/Styles.tsx
@@ -120,12 +120,12 @@ export default styled.div`
}
td.dt-is-filter:hover {
- background-color: ${theme.colorPrimaryBgHover};
+ background-color: ${theme.colorFillContentHover};
}
td.dt-is-active-filter,
td.dt-is-active-filter:hover {
- background-color: ${theme.colorPrimaryBgHover};
+ background-color: ${theme.colorFillContentHover};
}
.dt-global-filter {
diff --git a/superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx b/superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx
index 5739496f77f0..a5b166505689 100644
--- a/superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx
+++ b/superset-frontend/src/explore/components/ControlPanelsContainer.test.tsx
@@ -27,6 +27,8 @@ import { t } from '@apache-superset/core';
import {
DatasourceType,
getChartControlPanelRegistry,
+ isFeatureEnabled,
+ FeatureFlag,
} from '@superset-ui/core';
import { defaultControls, defaultState } from 'src/explore/store';
import { ExplorePageState } from 'src/explore/types';
@@ -36,6 +38,13 @@ import {
ControlPanelsContainerProps,
} from 'src/explore/components/ControlPanelsContainer';
+jest.mock('@superset-ui/core', () => ({
+ ...jest.requireActual('@superset-ui/core'),
+ isFeatureEnabled: jest.fn(),
+}));
+
+const mockIsFeatureEnabled = isFeatureEnabled as jest.Mock;
+
const FormDataMock = () => {
const formData = useSelector(
(state: ExplorePageState) => state.explore.form_data,
@@ -90,10 +99,14 @@ describe('ControlPanelsContainer', () => {
beforeEach(() => {
getChartControlPanelRegistry().registerValue('table', defaultTableConfig);
+ jest.clearAllMocks();
+ // Default: feature disabled
+ mockIsFeatureEnabled.mockReturnValue(false);
});
afterEach(() => {
getChartControlPanelRegistry().remove('table');
+ jest.clearAllMocks();
});
afterAll(() => {
@@ -277,4 +290,92 @@ describe('ControlPanelsContainer', () => {
expect(screen.getByText('Shift start date')).not.toBeVisible();
expect(screen.getByText('Calculation type')).not.toBeVisible();
});
+
+ test('should stay on Matrixify tab when matrixify is enabled', async () => {
+ // Enable Matrixify feature flag
+ mockIsFeatureEnabled.mockImplementation(
+ (featureFlag: FeatureFlag) => featureFlag === FeatureFlag.Matrixify,
+ );
+
+ const props = getDefaultProps();
+ props.form_data = {
+ ...props.form_data,
+ matrixify_enable_vertical_layout: true,
+ };
+
+ const { rerender } = render(, {
+ useRedux: true,
+ });
+
+ // Check that Matrixify tab exists and is active
+ await waitFor(() => {
+ const matrixifyTab = screen.getByRole('tab', { name: /matrixify/i });
+ expect(matrixifyTab).toBeInTheDocument();
+ expect(matrixifyTab).toHaveAttribute('aria-selected', 'true');
+ });
+
+ // Simulate saving with updated dimension values
+ const updatedProps = {
+ ...props,
+ form_data: {
+ ...props.form_data,
+ matrixify_enable_vertical_layout: true,
+ matrixify_dimension_columns: {
+ dimension: 'country',
+ values: ['USA', 'Canada'],
+ },
+ },
+ };
+
+ rerender();
+
+ // Matrixify tab should still be active after rerender
+ await waitFor(() => {
+ const matrixifyTabAfterSave = screen.getByRole('tab', {
+ name: /matrixify/i,
+ });
+ expect(matrixifyTabAfterSave).toHaveAttribute('aria-selected', 'true');
+ });
+ });
+
+ test('should automatically switch to Matrixify tab when matrixify becomes enabled', async () => {
+ // Enable Matrixify feature flag
+ mockIsFeatureEnabled.mockImplementation(
+ (featureFlag: FeatureFlag) => featureFlag === FeatureFlag.Matrixify,
+ );
+
+ const props = getDefaultProps();
+
+ const { rerender } = render(, {
+ useRedux: true,
+ });
+
+ // Initially, Data tab should be active
+ const dataTab = screen.getByRole('tab', { name: /data/i });
+ expect(dataTab).toHaveAttribute('aria-selected', 'true');
+
+ // Enable matrixify
+ const updatedProps = {
+ ...props,
+ form_data: {
+ ...props.form_data,
+ matrixify_enable_horizontal_layout: true,
+ },
+ };
+
+ rerender();
+
+ // Matrixify tab should now be active
+ await waitFor(() => {
+ const matrixifyTab = screen.getByRole('tab', { name: /matrixify/i });
+ expect(matrixifyTab).toBeInTheDocument();
+ expect(matrixifyTab).toHaveAttribute('aria-selected', 'true');
+ });
+
+ // Data tab should no longer be active
+ expect(screen.getByRole('tab', { name: /data/i })).toHaveAttribute(
+ 'aria-selected',
+ 'false',
+ );
+ });
});
diff --git a/superset-frontend/src/explore/components/ControlPanelsContainer.tsx b/superset-frontend/src/explore/components/ControlPanelsContainer.tsx
index 057a381cad4e..6f9f3e4f3f72 100644
--- a/superset-frontend/src/explore/components/ControlPanelsContainer.tsx
+++ b/superset-frontend/src/explore/components/ControlPanelsContainer.tsx
@@ -290,6 +290,7 @@ export const ControlPanelsContainer = (props: ControlPanelsContainerProps) => {
const prevChartStatus = usePrevious(props.chart.chartStatus);
const [showDatasourceAlert, setShowDatasourceAlert] = useState(false);
+ const [activeTabKey, setActiveTabKey] = useState(TABS_KEYS.DATA);
const containerRef = useRef(null);
@@ -795,6 +796,18 @@ export const ControlPanelsContainer = (props: ControlPanelsContainerProps) => {
const showCustomizeTab = customizeSections.length > 0;
const showMatrixifyTab = isFeatureEnabled(FeatureFlag.Matrixify);
+ // Check if matrixify is enabled in form_data
+ const matrixifyIsEnabled =
+ form_data.matrixify_enable_vertical_layout ||
+ form_data.matrixify_enable_horizontal_layout;
+
+ // Auto-switch to Matrixify tab when it's enabled
+ useEffect(() => {
+ if (showMatrixifyTab && matrixifyIsEnabled) {
+ setActiveTabKey(TABS_KEYS.MATRIXIFY);
+ }
+ }, [showMatrixifyTab, matrixifyIsEnabled]);
+
// Check if matrixify sections have validation errors
const matrixifyHasErrors = useMemo(() => {
if (!showMatrixifyTab) return false;
@@ -882,6 +895,8 @@ export const ControlPanelsContainer = (props: ControlPanelsContainerProps) => {
id="controlSections"
data-test="control-tabs"
allowOverflow={false}
+ activeKey={activeTabKey}
+ onChange={(key: string) => setActiveTabKey(key)}
items={[
{
key: TABS_KEYS.DATA,
diff --git a/superset-frontend/src/explore/components/controls/MatrixifyDimensionControl.test.tsx b/superset-frontend/src/explore/components/controls/MatrixifyDimensionControl.test.tsx
index 0acf0fd89ff0..961ea5e72949 100644
--- a/superset-frontend/src/explore/components/controls/MatrixifyDimensionControl.test.tsx
+++ b/superset-frontend/src/explore/components/controls/MatrixifyDimensionControl.test.tsx
@@ -430,3 +430,122 @@ test('should clear values when switching from topn to members mode', async () =>
});
});
});
+
+test('should preserve dimension values when rerendering with same mode', async () => {
+ // Regression test for bug where values disappear on save
+ const onChange = jest.fn();
+ const value: MatrixifyDimensionControlValue = {
+ dimension: 'country',
+ values: ['USA', 'Australia'],
+ };
+
+ (SupersetClient.get as jest.Mock).mockResolvedValue({
+ json: { result: ['USA', 'Canada', 'Australia', 'Mexico'] },
+ });
+
+ const { rerender } = render(
+ ,
+ );
+
+ // Simulate a rerender that would happen during save
+ rerender(
+ ,
+ );
+
+ // Values should not be cleared when mode hasn't changed
+ expect(onChange).not.toHaveBeenCalledWith({
+ dimension: 'country',
+ values: [],
+ topNValues: [],
+ });
+
+ // The values should still be present in the UI
+ expect(
+ screen.getByRole('combobox', { name: 'Select dimension values' }),
+ ).toBeInTheDocument();
+});
+
+test('should not clear values on initial render with members mode', async () => {
+ // Regression test: ensure values are not cleared on initial mount
+ const onChange = jest.fn();
+ const value: MatrixifyDimensionControlValue = {
+ dimension: 'country',
+ values: ['USA', 'Australia'],
+ };
+
+ (SupersetClient.get as jest.Mock).mockResolvedValue({
+ json: { result: ['USA', 'Canada', 'Australia', 'Mexico'] },
+ });
+
+ render(
+ ,
+ );
+
+ // onChange should not be called to clear values on initial render
+ expect(onChange).not.toHaveBeenCalledWith({
+ dimension: 'country',
+ values: [],
+ topNValues: [],
+ });
+
+ // The values selector should be visible
+ expect(
+ screen.getByRole('combobox', { name: 'Select dimension values' }),
+ ).toBeInTheDocument();
+});
+
+test('should preserve values when other props change but mode stays the same', async () => {
+ // Regression test for save scenario where form_data updates trigger rerenders
+ const onChange = jest.fn();
+ const value: MatrixifyDimensionControlValue = {
+ dimension: 'country',
+ values: ['USA', 'Australia'],
+ };
+
+ (SupersetClient.get as jest.Mock).mockResolvedValue({
+ json: { result: ['USA', 'Canada', 'Australia', 'Mexico'] },
+ });
+
+ const { rerender } = render(
+ ,
+ );
+
+ // Simulate form_data change (like what happens during save)
+ rerender(
+ ,
+ );
+
+ // Values should not be cleared when only form_data changes
+ expect(onChange).not.toHaveBeenCalledWith({
+ dimension: 'country',
+ values: [],
+ topNValues: [],
+ });
+});
diff --git a/superset-frontend/src/explore/components/controls/MatrixifyDimensionControl.tsx b/superset-frontend/src/explore/components/controls/MatrixifyDimensionControl.tsx
index 87a1efe2910c..35face1e70c5 100644
--- a/superset-frontend/src/explore/components/controls/MatrixifyDimensionControl.tsx
+++ b/superset-frontend/src/explore/components/controls/MatrixifyDimensionControl.tsx
@@ -82,17 +82,21 @@ export default function MatrixifyDimensionControl(
// Reset values when selection mode changes
useEffect(() => {
- if (prevSelectionMode.current !== selectionMode) {
- prevSelectionMode.current = selectionMode;
- if (value?.values && value.values.length > 0) {
- onChange({
- dimension: value.dimension,
- values: [],
- topNValues: [],
- });
- }
+ // Only clear values when actually switching between modes, not on initial load or re-render
+ if (
+ prevSelectionMode.current !== selectionMode &&
+ prevSelectionMode.current !== undefined &&
+ value?.dimension
+ ) {
+ // Clear values when switching between members and topn modes
+ onChange({
+ dimension: value.dimension,
+ values: [],
+ topNValues: [],
+ });
}
- }, [selectionMode, value]);
+ prevSelectionMode.current = selectionMode;
+ }, [selectionMode]);
// Initialize dimension options from datasource
useEffect(() => {
@@ -175,18 +179,6 @@ export default function MatrixifyDimensionControl(
// Load TopN values when in TopN mode
useEffect(() => {
if (!value?.dimension || !datasource || selectionMode !== 'topn') {
- // Clear values when switching away from topn mode
- if (
- selectionMode !== 'topn' &&
- value?.values &&
- value.values.length > 0
- ) {
- onChange({
- dimension: value.dimension,
- values: [],
- topNValues: [],
- });
- }
return undefined;
}