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; }