diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 8dbd9a743d..179b6b8d32 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -58,9 +58,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -19527,9 +19527,9 @@ "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=" }, "antd": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/antd/-/antd-4.6.6.tgz", - "integrity": "sha512-ruqzFFyohjEEp+Qg5VzBzFgDjqdj0FoPt3V/bGtLjeuQXPqFrPs+y4WWWmqi3ydGmN4VPIGBwd3CybQDrZAN3g==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/antd/-/antd-4.8.2.tgz", + "integrity": "sha512-qxagKsiPVO+2rcAdX8WA3TPqiv5TS4FDGoaETVgCCln3x7ap1nqHkBC+Fr3CSNg8MxwQ+6m5BSBLcs5uDQg0Qw==", "requires": { "@ant-design/colors": "^4.0.5", "@ant-design/css-animation": "^1.7.2", @@ -19547,30 +19547,30 @@ "rc-cascader": "~1.4.0", "rc-checkbox": "~2.3.0", "rc-collapse": "~2.0.0", - "rc-dialog": "~8.2.1", + "rc-dialog": "~8.4.0", "rc-drawer": "~4.1.0", "rc-dropdown": "~3.2.0", - "rc-field-form": "~1.10.0", - "rc-image": "~3.0.6", - "rc-input-number": "~6.0.0", + "rc-field-form": "~1.13.0", + "rc-image": "~4.0.0", + "rc-input-number": "~6.1.0", "rc-mentions": "~1.5.0", - "rc-menu": "~8.7.1", - "rc-motion": "^2.0.0", - "rc-notification": "~4.4.0", - "rc-pagination": "~3.0.3", - "rc-picker": "~2.1.0", + "rc-menu": "~8.8.2", + "rc-motion": "^2.2.0", + "rc-notification": "~4.5.2", + "rc-pagination": "~3.1.0", + "rc-picker": "~2.3.0", "rc-progress": "~3.1.0", - "rc-rate": "~2.8.2", + "rc-rate": "~2.9.0", "rc-resize-observer": "^0.2.3", - "rc-select": "~11.3.2", - "rc-slider": "~9.5.1", + "rc-select": "~11.4.0", + "rc-slider": "~9.6.1", "rc-steps": "~4.1.0", "rc-switch": "~3.2.0", - "rc-table": "~7.9.2", - "rc-tabs": "~11.6.0", + "rc-table": "~7.11.0", + "rc-tabs": "~11.7.0", "rc-textarea": "~0.3.0", "rc-tooltip": "~5.0.0", - "rc-tree": "~3.10.0", + "rc-tree": "~3.11.0", "rc-tree-select": "~4.1.1", "rc-trigger": "~5.0.3", "rc-upload": "~3.3.1", @@ -19588,22 +19588,17 @@ } }, "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" - }, "rc-util": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.4.0.tgz", - "integrity": "sha512-kXDn1JyLJTAWLBFt+fjkTcUtXhxKkipQCobQmxIEVrX62iXgo24z8YKoWehWfMxPZFPE+RXqrmEu9j5kHz/Lrg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.5.0.tgz", + "integrity": "sha512-YJB+zZGvCll/bhxXRVLAekr7lOvTgqMlRIhgINoINfUek7wQvi5sft46NOi3yYUYhocpuW4k8+5okW46sBsZAQ==", "requires": { "react-is": "^16.12.0", "shallowequal": "^1.1.0" @@ -20098,9 +20093,9 @@ "dev": true }, "async-validator": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-3.4.0.tgz", - "integrity": "sha512-VrFk4eYiJAWKskEz115iiuCf9O0ftnMMPXrOFMqyzGH2KxO7YwncKyn/FgOOP+0MDHMfXL7gLExagCutaZGigA==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-3.5.0.tgz", + "integrity": "sha512-jMDcDHrH618eznoO4/3afJG5+I4HE/ipQd7y4mhPJmCaoHCSPOJfjpWgjFoxma2h8irL+zGe+qwyptDrR37Vhg==" }, "asynckit": { "version": "0.4.0", @@ -24388,9 +24383,9 @@ "dev": true }, "dayjs": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.9.4.tgz", - "integrity": "sha512-ABSF3alrldf7nM9sQ2U+Ln67NRwmzlLOqG7kK03kck0mw3wlSSEKv/XhKGGxUjQcS57QeiCyNdrFgtj9nWlrng==" + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.9.6.tgz", + "integrity": "sha512-HngNLtPEBWRo8EFVmHFmSXAjtCX8rGNqeXQI0Gh7wCTSqwaKgPIDqu9m07wABVopNwzvOeCb+2711vQhDlcIXw==" }, "de-indent": { "version": "1.0.2", @@ -35168,9 +35163,9 @@ } }, "moment": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.23.0.tgz", - "integrity": "sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA==" + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "moo": { "version": "0.4.3", @@ -39360,9 +39355,9 @@ } }, "rc-align": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.8.tgz", - "integrity": "sha512-2sRUkmB8z4UEXzaS+lDHzXMoR8HrtKH9nn2yHlHVNyUTnaucjMFbdEoCk+hO1g7cpIgW0MphG8i0EH2scSesfw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.9.tgz", + "integrity": "sha512-myAM2R4qoB6LqBul0leaqY8gFaiECDJ3MtQDmzDo9xM9NRT/04TvWOYd2YHU9zvGzqk9QXF6S9/MifzSKDZeMw==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -39372,17 +39367,17 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "rc-util": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.4.0.tgz", - "integrity": "sha512-kXDn1JyLJTAWLBFt+fjkTcUtXhxKkipQCobQmxIEVrX62iXgo24z8YKoWehWfMxPZFPE+RXqrmEu9j5kHz/Lrg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.5.0.tgz", + "integrity": "sha512-YJB+zZGvCll/bhxXRVLAekr7lOvTgqMlRIhgINoINfUek7wQvi5sft46NOi3yYUYhocpuW4k8+5okW46sBsZAQ==", "requires": { "react-is": "^16.12.0", "shallowequal": "^1.1.0" @@ -39456,9 +39451,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39478,9 +39473,9 @@ }, "dependencies": { "rc-util": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.4.0.tgz", - "integrity": "sha512-kXDn1JyLJTAWLBFt+fjkTcUtXhxKkipQCobQmxIEVrX62iXgo24z8YKoWehWfMxPZFPE+RXqrmEu9j5kHz/Lrg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.5.0.tgz", + "integrity": "sha512-YJB+zZGvCll/bhxXRVLAekr7lOvTgqMlRIhgINoINfUek7wQvi5sft46NOi3yYUYhocpuW4k8+5okW46sBsZAQ==", "requires": { "react-is": "^16.12.0", "shallowequal": "^1.1.0" @@ -39494,19 +39489,20 @@ } }, "rc-dialog": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-8.2.2.tgz", - "integrity": "sha512-U4jR5bE7XpIbMC20JAIv91254b+vQ8LODd8Kxco0XvkL+eJ1aCYkOfRqevJ1ipOIzF3s6F08jSH8YvJqxvpAvA==", + "version": "8.4.3", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-8.4.3.tgz", + "integrity": "sha512-LHsWXb+2Cy4vEOeJcPvk9M0WSr80Gi438ov5rXt3E6XB4j+53Z+vMFRr+TagnVuOVQRCLmmzT4qutfm2U1OK6w==", "requires": { "@babel/runtime": "^7.10.1", - "rc-animate": "3.x", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", "rc-util": "^5.0.1" }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39524,9 +39520,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39544,9 +39540,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39554,9 +39550,9 @@ } }, "rc-field-form": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.10.1.tgz", - "integrity": "sha512-aosTtNTqLYX2jsG5GyCv7axe+b57XH73T7TmmrX/cmhemhtFjvNE6RkRkmtP9VOJnZg5YGC5HfK172cnJ1Ij7Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.13.2.tgz", + "integrity": "sha512-sskFsJkEmK6wUXNVxVaXRq4jYhKFKQyVrKxHQkvCI0l2ENg8ujjT8oOV2X4aa7+tLV0FNJLKdD+LuHlnTxEeSg==", "requires": { "@babel/runtime": "^7.8.4", "async-validator": "^3.0.3", @@ -39564,9 +39560,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39574,21 +39570,21 @@ } }, "rc-image": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-3.0.6.tgz", - "integrity": "sha512-Dn8mTSlcgKJko417OX8+6yyNIL9+DEa81aexBfT78qWlEpcxtR4GgdsU0+zJLNqa2rnGZyjaBLFtaPw9tUuxYA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-4.0.1.tgz", + "integrity": "sha512-1GxjwgtONtJjlvd7sM9VSLTAlDQhkqHI0wl72YSDpdm24w5zmDsTYLgTNh/vToFa9qAml10Gaidy03qpkTAQ+A==", "requires": { "@ant-design/icons": "^4.2.2", "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", - "rc-dialog": "~8.2.2", + "rc-dialog": "~8.4.0", "rc-util": "^5.0.6" }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39596,9 +39592,9 @@ } }, "rc-input-number": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-6.0.1.tgz", - "integrity": "sha512-cS1k6IB/V84VUQd5qWzGFrLHvZjWGHGmYbrvR0QP/C1Ju1SlBqlhqhOBTc6w+dpPs84PCH5caZtNzsHeWZ1zYA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-6.1.1.tgz", + "integrity": "sha512-9t2xf1G0YEism7FAXAvF1huBk7ZNABPBf6NL+3/aDL123WiT/vhhod4cldiDWTM1Yb2EDKR//ZIa546ScdsUaA==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -39606,9 +39602,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39629,9 +39625,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39639,9 +39635,9 @@ } }, "rc-menu": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-8.7.1.tgz", - "integrity": "sha512-CuuJ9oS1oPAfenqAMa3CZZE7RrPcPTHV3310cf6RO2uJgE9ztqasRFMEBwtruH16OexTr0igTCXySm+e2/TBQg==", + "version": "8.8.3", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-8.8.3.tgz", + "integrity": "sha512-C9sT0SBXmUbVWRUseXASousacRVPnOm5aXdyJR569WIvZwbs2IncpGNmAcft1R5ZuFE3Y+SZZ5FYvtGtbCzkIQ==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -39655,9 +39651,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39675,17 +39671,17 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "rc-util": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.4.0.tgz", - "integrity": "sha512-kXDn1JyLJTAWLBFt+fjkTcUtXhxKkipQCobQmxIEVrX62iXgo24z8YKoWehWfMxPZFPE+RXqrmEu9j5kHz/Lrg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.5.0.tgz", + "integrity": "sha512-YJB+zZGvCll/bhxXRVLAekr7lOvTgqMlRIhgINoINfUek7wQvi5sft46NOi3yYUYhocpuW4k8+5okW46sBsZAQ==", "requires": { "react-is": "^16.12.0", "shallowequal": "^1.1.0" @@ -39699,20 +39695,20 @@ } }, "rc-notification": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.4.0.tgz", - "integrity": "sha512-IDeNAFGVeOsy1tv4zNVqMAXB9tianR80ewQbtObaAQfjwAjWfONdqdyjFkEU6nc6UQhSUYA5OcTGb7kwwbnh0g==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.5.4.tgz", + "integrity": "sha512-VsN0ouF4uglE5g3C9oDsXLNYX0Sz++ZNUFYCswkxhpImYJ9u6nJOpyA71uOYDVCu6bAF54Y5Hi/b+EcnMzkepg==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "2.x", - "rc-animate": "3.x", + "rc-motion": "^2.2.0", "rc-util": "^5.0.1" }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39720,18 +39716,18 @@ } }, "rc-pagination": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.0.4.tgz", - "integrity": "sha512-9v9mmB7FTWS4kWRLFfWafm6LtvB+xdNi+pTIwUODSevzImrlrmMOIhDrOB3u2tEXiy8LyqvCnoyPYt5jQBapxA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.1.2.tgz", + "integrity": "sha512-KbJvkTvRiD51vTIAi0oTARPUHNb0iV6njbDBe8yLkc3PWYDJaszASfuss6YJ98EIxEeGzuEk6xsUAEKWRJgz2g==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1" }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39739,9 +39735,9 @@ } }, "rc-picker": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.1.0.tgz", - "integrity": "sha512-Tu8+yR0qnBVND4v+eta8GRkLu4OvTUaxlk7ZHDAkVFm1RHLAl1GzA6Foni9vcpkMnFMFD6EzpaOlkArI0ryuDA==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.3.4.tgz", + "integrity": "sha512-UdeqTzR9E5KHOGMjWfsMpE3VU+3VR3J5/wMrwuIRmL8orv9Tm+Gew3NPfs7djcuTrfnu+hL+lwCWp7VftZcSng==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.1", @@ -39749,22 +39745,31 @@ "dayjs": "^1.8.30", "moment": "^2.24.0", "rc-trigger": "^5.0.4", - "rc-util": "^5.0.1", + "rc-util": "^5.4.0", "shallowequal": "^1.1.0" }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + "rc-util": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.5.0.tgz", + "integrity": "sha512-YJB+zZGvCll/bhxXRVLAekr7lOvTgqMlRIhgINoINfUek7wQvi5sft46NOi3yYUYhocpuW4k8+5okW46sBsZAQ==", + "requires": { + "react-is": "^16.12.0", + "shallowequal": "^1.1.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" } } }, @@ -39778,9 +39783,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39788,9 +39793,9 @@ } }, "rc-rate": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.8.2.tgz", - "integrity": "sha512-f9T/D+ZwWQrWHkpidpQbnXpnVMGMC4eSRAkwuu88a8Qv1C/9LNc4AErazoh8tpnZBFqq19F3j0Glv+sDgkfEig==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.0.tgz", + "integrity": "sha512-DqXWWpA3+oQfHVBYfk5Myhl1YoNYYX9roYYIF7mLiDBI5SCErOYpLaCV8PdZ3IUN+F0AtejXxy4fuHgp1cDtwQ==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -39798,9 +39803,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39819,9 +39824,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39829,23 +39834,23 @@ } }, "rc-select": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-11.3.3.tgz", - "integrity": "sha512-YMsGVEZxXctj15nIZKlFCkiOxMe0PNBeACN6nHqDozDYKR/aqP8J3XZqZ5Gw/fcgS4bI50zPVMieJKlY8/6Wfw==", + "version": "11.4.2", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-11.4.2.tgz", + "integrity": "sha512-DQHYwMcvAajnnlahKkYIW47AVTXgxpGj9CWbe+juXgvxawQRFUdd8T8L2Q05aOkMy02UTG0Qrs7EZfHmn5QHbA==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "2.x", "rc-motion": "^2.0.1", "rc-trigger": "^5.0.4", "rc-util": "^5.0.1", - "rc-virtual-list": "^3.0.3", + "rc-virtual-list": "^3.2.0", "warning": "^4.0.3" }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39861,9 +39866,9 @@ } }, "rc-slider": { - "version": "9.5.4", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.5.4.tgz", - "integrity": "sha512-24goJnWhmWi0ojNZMoPSMni2wh73IPqEK0TJh7rWn10hPLLKgG8x3KRR0g4uUdCS9APHyosqxGXUIJKGydJXVg==", + "version": "9.6.2", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.6.2.tgz", + "integrity": "sha512-uctdE1768ZmSjCcRmx6ffm/uoW/zl/SOvanvoilWyZ1NRlwkZCa1R20AIJlU9VDJo/FswWnqXqt6iDp2CnDVig==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", @@ -39873,9 +39878,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39893,9 +39898,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39913,9 +39918,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39923,32 +39928,45 @@ } }, "rc-table": { - "version": "7.9.10", - "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.9.10.tgz", - "integrity": "sha512-WtPBxYsBU/a5MIglilbMlVkiXkPKXpUM/CPCFaqA2veh1b7J40mbTGQmU8VT6S0FClkI5jm0QBtSp6LstPkOMQ==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.11.1.tgz", + "integrity": "sha512-Xq7ibC/a2kj8ywLeKhGcv689JZaldjPxxe15h89qGho6/sR9YkIUD07KjLCGFaJ0LkhGBNY1XYv2VOUFGOQuYg==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "^2.2.5", - "raf": "^3.4.1", "rc-resize-observer": "^0.2.0", - "rc-util": "^5.0.4", + "rc-util": "^5.4.0", "shallowequal": "^1.1.0" }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } + }, + "rc-util": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.5.0.tgz", + "integrity": "sha512-YJB+zZGvCll/bhxXRVLAekr7lOvTgqMlRIhgINoINfUek7wQvi5sft46NOi3yYUYhocpuW4k8+5okW46sBsZAQ==", + "requires": { + "react-is": "^16.12.0", + "shallowequal": "^1.1.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" } } }, "rc-tabs": { - "version": "11.6.2", - "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-11.6.2.tgz", - "integrity": "sha512-7Z5Lg+nP/H4V7dIlewrOC0+aogRVH3ASjTy4VIletYOeStGPWYSfwBnUTBdcCXcUuWuyyKnNkYrUD0yaRqUCIA==", + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-11.7.0.tgz", + "integrity": "sha512-nYwQcgML2drM0iau4aa6HI4qyyZSW0WpspCAtO5KGjXwHzUJcvv3qgLVuoQOWQaDDHXkI9Jj8U7Y/Hcrdyj1Kw==", "requires": { "@babel/runtime": "^7.11.2", "classnames": "2.x", @@ -39960,9 +39978,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -39981,9 +39999,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -40000,9 +40018,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -40010,9 +40028,9 @@ } }, "rc-tree": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-3.10.0.tgz", - "integrity": "sha512-kf7J/f2E2T8Kfta3/1BIg65AzTmXOgOjn0KOpvD3KI/gqkfKMRKUS1ybkxW39JUPpKwdeOHFnYH+nFFMq7tkfg==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-3.11.0.tgz", + "integrity": "sha512-3RxA6fckbzX7WOk7g4gvO6AOad0znc8QW2nsv1IXSiljQaIMiyx1AK0zhzIEtABgWKbIs9QkhnBvIAHS4Rn9LA==", "requires": { "@babel/runtime": "^7.10.1", "classnames": "2.x", @@ -40022,9 +40040,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -40044,9 +40062,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -40066,17 +40084,17 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "rc-util": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.4.0.tgz", - "integrity": "sha512-kXDn1JyLJTAWLBFt+fjkTcUtXhxKkipQCobQmxIEVrX62iXgo24z8YKoWehWfMxPZFPE+RXqrmEu9j5kHz/Lrg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.5.0.tgz", + "integrity": "sha512-YJB+zZGvCll/bhxXRVLAekr7lOvTgqMlRIhgINoINfUek7wQvi5sft46NOi3yYUYhocpuW4k8+5okW46sBsZAQ==", "requires": { "react-is": "^16.12.0", "shallowequal": "^1.1.0" @@ -40100,17 +40118,17 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "rc-util": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.4.0.tgz", - "integrity": "sha512-kXDn1JyLJTAWLBFt+fjkTcUtXhxKkipQCobQmxIEVrX62iXgo24z8YKoWehWfMxPZFPE+RXqrmEu9j5kHz/Lrg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.5.0.tgz", + "integrity": "sha512-YJB+zZGvCll/bhxXRVLAekr7lOvTgqMlRIhgINoINfUek7wQvi5sft46NOi3yYUYhocpuW4k8+5okW46sBsZAQ==", "requires": { "react-is": "^16.12.0", "shallowequal": "^1.1.0" @@ -40150,9 +40168,9 @@ }, "dependencies": { "rc-util": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.4.0.tgz", - "integrity": "sha512-kXDn1JyLJTAWLBFt+fjkTcUtXhxKkipQCobQmxIEVrX62iXgo24z8YKoWehWfMxPZFPE+RXqrmEu9j5kHz/Lrg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.5.0.tgz", + "integrity": "sha512-YJB+zZGvCll/bhxXRVLAekr7lOvTgqMlRIhgINoINfUek7wQvi5sft46NOi3yYUYhocpuW4k8+5okW46sBsZAQ==", "requires": { "react-is": "^16.12.0", "shallowequal": "^1.1.0" diff --git a/superset-frontend/package.json b/superset-frontend/package.json index c004b940d5..2a6d37e9ae 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -95,7 +95,7 @@ "@superset-ui/preset-chart-xy": "^0.15.13", "@vx/responsive": "^0.0.195", "abortcontroller-polyfill": "^1.1.9", - "antd": "^4.6.6", + "antd": "^4.8.2", "array-move": "^2.2.1", "bootstrap": "^3.4.1", "bootstrap-slider": "^10.0.0", @@ -121,7 +121,7 @@ "lodash-es": "^4.17.14", "mathjs": "^8.0.1", "memoize-one": "^5.1.1", - "moment": "^2.20.1", + "moment": "^2.26.0", "mousetrap": "^1.6.1", "mustache": "^2.2.1", "omnibar": "^2.1.1", diff --git a/superset-frontend/spec/helpers/shim.ts b/superset-frontend/spec/helpers/shim.ts index e81b21dc2d..29f7d18cdf 100644 --- a/superset-frontend/spec/helpers/shim.ts +++ b/superset-frontend/spec/helpers/shim.ts @@ -46,6 +46,19 @@ const g = global as any; g.window = g.window || {}; g.window.location = { href: 'about:blank' }; g.window.performance = { now: () => new Date().getTime() }; +Object.defineProperty(window, 'matchMedia', { + writable: true, + value: jest.fn().mockImplementation(query => ({ + matches: false, + media: query, + onchange: null, + addListener: jest.fn(), // Deprecated + removeListener: jest.fn(), // Deprecated + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + dispatchEvent: jest.fn(), + })), +}); g.$ = jQuery(g.window); diff --git a/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx b/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx index 1486eee4d3..41824bfe3f 100644 --- a/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx +++ b/superset-frontend/spec/javascripts/components/ListView/ListView_spec.jsx @@ -62,6 +62,10 @@ const mockedProps = { accessor: 'name', Header: 'Name', }, + { + accessor: 'time', + Header: 'Time', + }, ], filters: [ { @@ -85,10 +89,16 @@ const mockedProps = { paginate: true, operator: 'eq', }, + { + Header: 'Time', + id: 'time', + input: 'datetime_range', + operator: 'between', + }, ], data: [ - { id: 1, name: 'data 1' }, - { id: 2, name: 'data 2' }, + { id: 1, name: 'data 1', age: 10, time: '2020-11-18T07:53:45.354Z' }, + { id: 2, name: 'data 2', age: 1, time: '2020-11-18T07:53:45.354Z' }, ], count: 2, pageSize: 1, @@ -221,15 +231,17 @@ describe('ListView', () => { expect(mockedProps.bulkActions[0].onSelect.mock.calls[0]) .toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "id": 1, - "name": "data 1", - }, - ], - ] - `); + Array [ + Array [ + Object { + "age": 10, + "id": 1, + "name": "data 1", + "time": "2020-11-18T07:53:45.354Z", + }, + ], + ] + `); }); it('handles bulk actions on all rows', () => { @@ -250,19 +262,23 @@ describe('ListView', () => { expect(mockedProps.bulkActions[0].onSelect.mock.calls[0]) .toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "id": 1, - "name": "data 1", - }, - Object { - "id": 2, - "name": "data 2", - }, - ], - ] - `); + Array [ + Array [ + Object { + "age": 10, + "id": 1, + "name": "data 1", + "time": "2020-11-18T07:53:45.354Z", + }, + Object { + "age": 1, + "id": 2, + "name": "data 2", + "time": "2020-11-18T07:53:45.354Z", + }, + ], + ] + `); }); it('allows deselecting all', async () => { diff --git a/superset-frontend/src/components/ListView/Filters/Base.ts b/superset-frontend/src/components/ListView/Filters/Base.ts new file mode 100644 index 0000000000..91554c38ab --- /dev/null +++ b/superset-frontend/src/components/ListView/Filters/Base.ts @@ -0,0 +1,37 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { ReactNode } from 'react'; +import { styled } from '@superset-ui/core'; + +export interface BaseFilter { + Header: ReactNode; + initialValue: any; +} + +export const FilterContainer = styled.div` + display: inline-flex; + margin-right: 2em; + font-size: ${({ theme }) => theme.typography.sizes.s}px; +`; + +export const FilterTitle = styled.label` + font-weight: bold; + line-height: 27px; + margin: 0 0.4em 0 0; +`; diff --git a/superset-frontend/src/components/ListView/Filters/DateRange.tsx b/superset-frontend/src/components/ListView/Filters/DateRange.tsx new file mode 100644 index 0000000000..b458548845 --- /dev/null +++ b/superset-frontend/src/components/ListView/Filters/DateRange.tsx @@ -0,0 +1,75 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useState, useMemo } from 'react'; +import moment, { Moment } from 'moment'; +import { styled } from '@superset-ui/core'; +import { RangePicker as AntRangePicker } from 'src/common/components/DatePicker'; +import { FilterContainer, BaseFilter, FilterTitle } from './Base'; + +interface DateRangeFilterProps extends BaseFilter { + onSubmit: (val: number[]) => void; + name: string; +} + +type ValueState = [number, number]; + +const RangePicker = styled(AntRangePicker)` + padding: 0 11px; + transform: translateX(-7px); +`; + +const RangeFilterContainer = styled(FilterContainer)` + margin-right: 1em; +`; + +export default function DateRangeFilter({ + Header, + initialValue, + onSubmit, +}: DateRangeFilterProps) { + const [value, setValue] = useState(initialValue ?? null); + const momentValue = useMemo((): [Moment, Moment] | null => { + if (!value || (Array.isArray(value) && !value.length)) return null; + return [moment(value[0]), moment(value[1])]; + }, [value]); + + return ( + + {Header}: + { + if (!momentRange) { + setValue(null); + onSubmit([]); + return; + } + const changeValue = [ + momentRange[0]?.valueOf() ?? 0, + momentRange[1]?.valueOf() ?? 0, + ] as ValueState; + setValue(changeValue); + onSubmit(changeValue); + }} + /> + + ); +} diff --git a/superset-frontend/src/components/ListView/Filters/Search.tsx b/superset-frontend/src/components/ListView/Filters/Search.tsx new file mode 100644 index 0000000000..17b8104d12 --- /dev/null +++ b/superset-frontend/src/components/ListView/Filters/Search.tsx @@ -0,0 +1,61 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { useState } from 'react'; +import SearchInput from 'src/components/SearchInput'; +import { FilterContainer, BaseFilter } from './Base'; + +interface SearchHeaderProps extends BaseFilter { + Header: string; + onSubmit: (val: string) => void; + name: string; +} + +export default function SearchFilter({ + Header, + name, + initialValue, + onSubmit, +}: SearchHeaderProps) { + const [value, setValue] = useState(initialValue || ''); + const handleSubmit = () => { + if (value) { + onSubmit(value); + } + }; + const onClear = () => { + setValue(''); + onSubmit(''); + }; + + return ( + + { + setValue(e.currentTarget.value); + }} + onSubmit={handleSubmit} + onClear={onClear} + /> + + ); +} diff --git a/superset-frontend/src/components/ListView/Filters.tsx b/superset-frontend/src/components/ListView/Filters/Select.tsx similarity index 56% rename from superset-frontend/src/components/ListView/Filters.tsx rename to superset-frontend/src/components/ListView/Filters/Select.tsx index 2725c21309..d60cab927a 100644 --- a/superset-frontend/src/components/ListView/Filters.tsx +++ b/superset-frontend/src/components/ListView/Filters/Select.tsx @@ -16,29 +16,17 @@ * specific language governing permissions and limitations * under the License. */ -import React, { useState, ReactNode } from 'react'; -import { styled, withTheme, SupersetThemeProps } from '@superset-ui/core'; - +import React, { useState } from 'react'; +import { withTheme, SupersetThemeProps } from '@superset-ui/core'; import { Select, PaginatedSelect, PartialThemeConfig, } from 'src/components/Select'; +import { Filter, SelectOption } from 'src/components/ListView/types'; +import { filterSelectStyles } from 'src/components/ListView/utils'; +import { FilterContainer, BaseFilter, FilterTitle } from './Base'; -import SearchInput from 'src/components/SearchInput'; -import { - Filter, - FilterValue, - Filters, - InternalFilter, - SelectOption, -} from './types'; -import { filterSelectStyles } from './utils'; - -interface BaseFilter { - Header: ReactNode; - initialValue: any; -} interface SelectFilterProps extends BaseFilter { emptyLabel?: string; fetchSelects?: Filter['fetchSelects']; @@ -49,18 +37,6 @@ interface SelectFilterProps extends BaseFilter { theme: SupersetThemeProps['theme']; } -const FilterContainer = styled.div` - display: inline-flex; - margin-right: 2em; - font-size: ${({ theme }) => theme.typography.sizes.s}px; -`; - -const FilterTitle = styled.label` - font-weight: bold; - line-height: 27px; - margin: 0 0.4em 0 0; -`; - const CLEAR_SELECT_FILTER_VALUE = 'CLEAR_SELECT_FILTER_VALUE'; function SelectFilter({ @@ -174,108 +150,4 @@ function SelectFilter({ ); } -const StyledSelectFilter = withTheme(SelectFilter); - -interface SearchHeaderProps extends BaseFilter { - Header: string; - onSubmit: (val: string) => void; - name: string; -} - -function SearchFilter({ - Header, - name, - initialValue, - onSubmit, -}: SearchHeaderProps) { - const [value, setValue] = useState(initialValue || ''); - const handleSubmit = () => onSubmit(value); - const onClear = () => { - setValue(''); - onSubmit(''); - }; - - return ( - - { - setValue(e.currentTarget.value); - }} - onSubmit={handleSubmit} - onClear={onClear} - /> - - ); -} - -interface UIFiltersProps { - filters: Filters; - internalFilters: InternalFilter[]; - updateFilterValue: (id: number, value: FilterValue['value']) => void; -} - -const FilterWrapper = styled.div` - display: inline-block; - padding: 0 0 ${({ theme }) => theme.gridUnit * 8}px; -`; - -function UIFilters({ - filters, - internalFilters = [], - updateFilterValue, -}: UIFiltersProps) { - return ( - - {filters.map( - ( - { - Header, - fetchSelects, - id, - input, - paginate, - selects, - unfilteredLabel, - }, - index, - ) => { - const initialValue = - internalFilters[index] && internalFilters[index].value; - if (input === 'select') { - return ( - updateFilterValue(index, value)} - paginate={paginate} - selects={selects} - /> - ); - } - if (input === 'search' && typeof Header === 'string') { - return ( - updateFilterValue(index, value)} - /> - ); - } - return null; - }, - )} - - ); -} - -export default withTheme(UIFilters); +export default withTheme(SelectFilter); diff --git a/superset-frontend/src/components/ListView/Filters/index.tsx b/superset-frontend/src/components/ListView/Filters/index.tsx new file mode 100644 index 0000000000..6f6ea4d973 --- /dev/null +++ b/superset-frontend/src/components/ListView/Filters/index.tsx @@ -0,0 +1,108 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { styled, withTheme } from '@superset-ui/core'; + +import { + FilterValue, + Filters, + InternalFilter, +} from 'src/components/ListView/types'; +import SearchFilter from './Search'; +import SelectFilter from './Select'; +import DateRangeFilter from './DateRange'; + +interface UIFiltersProps { + filters: Filters; + internalFilters: InternalFilter[]; + updateFilterValue: (id: number, value: FilterValue['value']) => void; +} + +const FilterWrapper = styled.div` + display: inline-block; + padding: 0 0 ${({ theme }) => theme.gridUnit * 8}px; +`; + +function UIFilters({ + filters, + internalFilters = [], + updateFilterValue, +}: UIFiltersProps) { + return ( + + {filters.map( + ( + { + Header, + fetchSelects, + id, + input, + paginate, + selects, + unfilteredLabel, + }, + index, + ) => { + const initialValue = + internalFilters[index] && internalFilters[index].value; + if (input === 'select') { + return ( + updateFilterValue(index, value)} + paginate={paginate} + selects={selects} + /> + ); + } + if (input === 'search' && typeof Header === 'string') { + return ( + updateFilterValue(index, value)} + /> + ); + } + if (input === 'datetime_range') { + return ( + updateFilterValue(index, value)} + /> + ); + } + return null; + }, + )} + + ); +} + +export default withTheme(UIFilters); diff --git a/superset-frontend/src/components/ListView/types.ts b/superset-frontend/src/components/ListView/types.ts index 7038bd9f78..4f2a867a77 100644 --- a/superset-frontend/src/components/ListView/types.ts +++ b/superset-frontend/src/components/ListView/types.ts @@ -37,27 +37,37 @@ export interface CardSortSelectOption { value: any; } +type FilterOperator = + | 'sw' + | 'ew' + | 'ct' + | 'eq' + | 'nsw' + | 'new' + | 'nct' + | 'neq' + | 'gt' + | 'lt' + | 'rel_m_m' + | 'rel_o_m' + | 'title_or_slug' + | 'name_or_description' + | 'all_text' + | 'chart_all_text' + | 'dataset_is_null_or_empty' + | 'between'; + export interface Filter { Header: ReactNode; id: string; - operators?: SelectOption[]; - operator?: - | 'sw' - | 'ew' - | 'ct' - | 'eq' - | 'nsw' - | 'new' - | 'nct' - | 'neq' - | 'rel_m_m' - | 'rel_o_m' - | 'title_or_slug' - | 'name_or_description' - | 'all_text' - | 'chart_all_text' - | 'dataset_is_null_or_empty'; - input?: 'text' | 'textarea' | 'select' | 'checkbox' | 'search'; + operator?: FilterOperator; + input?: + | 'text' + | 'textarea' + | 'select' + | 'checkbox' + | 'search' + | 'datetime_range'; unfilteredLabel?: string; selects?: SelectOption[]; onFilterOpen?: () => void; @@ -76,7 +86,7 @@ export type ViewModeType = 'card' | 'table'; export interface FilterValue { id: string; operator?: string; - value: string | boolean | number | null | undefined; + value: string | boolean | number | null | undefined | string[] | number[]; } export interface FetchDataConfig { @@ -89,3 +99,24 @@ export interface FetchDataConfig { export interface InternalFilter extends FilterValue { Header?: string; } + +export enum FilterOperators { + startsWith = 'sw', + endsWith = 'ew', + contains = 'ct', + equals = 'eq', + notStartsWith = 'nsw', + notEndsWith = 'new', + notContains = 'nct', + notEquals = 'neq', + greaterThan = 'gt', + lessThan = 'lt', + relationManyMany = 'rel_m_m', + relationOneMany = 'rel_o_m', + titleOrSlug = 'title_or_slug', + nameOrDescription = 'name_or_description', + allText = 'all_text', + chartAllText = 'chart_all_text', + datasetIsNullOrEmpty = 'dataset_is_null_or_empty', + between = 'between', +} diff --git a/superset-frontend/src/components/ListView/utils.ts b/superset-frontend/src/components/ListView/utils.ts index a3f6426edf..af935234c9 100644 --- a/superset-frontend/src/components/ListView/utils.ts +++ b/superset-frontend/src/components/ListView/utils.ts @@ -26,7 +26,12 @@ import { useTable, } from 'react-table'; -import { NumberParam, StringParam, useQueryParams } from 'use-query-params'; +import { + NumberParam, + StringParam, + useQueryParams, + QueryParamConfig, +} from 'use-query-params'; import rison from 'rison'; import { isEqual } from 'lodash'; @@ -41,11 +46,13 @@ import { } from './types'; // Define custom RisonParam for proper encoding/decoding -const RisonParam = { - encode: (data: any | null | undefined) => +const RisonParam: QueryParamConfig = { + encode: (data?: any | null) => data === undefined ? undefined : rison.encode(data), - decode: (dataStr: string | undefined) => - dataStr === undefined ? undefined : rison.decode(dataStr), + decode: (dataStr?: string | string[]) => + dataStr === undefined || Array.isArray(dataStr) + ? undefined + : rison.decode(dataStr), }; export class ListViewError extends Error { @@ -68,7 +75,11 @@ function updateInList(list: any[], index: number, update: any): any[] { ]; } -function mergeCreateFilterValues(list: Filter[], updateObj: any) { +type QueryFilterState = { + [id: string]: FilterValue['value']; +}; + +function mergeCreateFilterValues(list: Filter[], updateObj: QueryFilterState) { return list.map(({ id, operator }) => { const update = updateObj[id]; @@ -79,8 +90,36 @@ function mergeCreateFilterValues(list: Filter[], updateObj: any) { // convert filters from UI objects to data objects export function convertFilters(fts: InternalFilter[]): FilterValue[] { return fts - .filter(f => typeof f.value !== 'undefined') - .map(({ value, operator, id }) => ({ value, operator, id })); + .filter( + f => + !( + typeof f.value === 'undefined' || + (Array.isArray(f.value) && !f.value.length) + ), + ) + .map(({ value, operator, id }) => { + // handle between filter using 2 api filters + if (operator === 'between' && Array.isArray(value)) { + return [ + { + value: value[0], + operator: 'gt', + id, + }, + { + value: value[1], + operator: 'lt', + id, + }, + ]; + } + return { + value, + operator, + id, + }; + }) + .flat(); } // convertFilters but to handle new decoded rison format @@ -125,13 +164,6 @@ export function extractInputValue(inputType: Filter['input'], event: any) { return null; } -export function getDefaultFilterOperator(filter: Filter): string { - if (filter?.operator) return filter.operator; - if (filter?.operators?.length) { - return filter.operators[0].value; - } - return ''; -} interface UseListViewConfig { fetchData: (conf: FetchDataConfig) => any; columns: any[]; diff --git a/superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx b/superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx index 2befe09f09..246e0df3bb 100644 --- a/superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx +++ b/superset-frontend/src/views/CRUD/annotation/AnnotationModal.tsx @@ -291,7 +291,6 @@ const AnnotationModal: FunctionComponent = ({ onChange={onDateChange} showTime={{ format: 'hh:mm a' }} use12Hours - // @ts-ignore value={ currentAnnotation && (currentAnnotation?.start_dttm.length || diff --git a/superset-frontend/src/views/CRUD/data/query/QueryList.test.tsx b/superset-frontend/src/views/CRUD/data/query/QueryList.test.tsx index 008d767bec..eb18e92583 100644 --- a/superset-frontend/src/views/CRUD/data/query/QueryList.test.tsx +++ b/superset-frontend/src/views/CRUD/data/query/QueryList.test.tsx @@ -29,6 +29,7 @@ import QueryList from 'src/views/CRUD/data/query/QueryList'; import QueryPreviewModal from 'src/views/CRUD/data/query/QueryPreviewModal'; import { QueryObject } from 'src/views/CRUD/types'; import ListView from 'src/components/ListView'; +import Filters from 'src/components/ListView/Filters'; import SyntaxHighlighter from 'react-syntax-highlighter/dist/cjs/light'; // store needed for withToasts @@ -71,6 +72,19 @@ fetchMock.get(queriesEndpoint, { chart_count: 3, }); +fetchMock.get('glob:*/api/v1/query/related/user*', { + result: [], + count: 0, +}); +fetchMock.get('glob:*/api/v1/query/related/database*', { + result: [], + count: 0, +}); +fetchMock.get('glob:*/api/v1/query/disting/status*', { + result: [], + count: 0, +}); + describe('QueryList', () => { const mockedProps = {}; const wrapper = mount(, { @@ -94,7 +108,7 @@ describe('QueryList', () => { const callsD = fetchMock.calls(/query\/\?q/); expect(callsD).toHaveLength(1); expect(callsD[0][0]).toMatchInlineSnapshot( - `"http://localhost/api/v1/query/?q=(order_column:changed_on,order_direction:desc,page:0,page_size:25)"`, + `"http://localhost/api/v1/query/?q=(order_column:start_time,order_direction:desc,page:0,page_size:25)"`, ); }); @@ -114,4 +128,17 @@ describe('QueryList', () => { expect(wrapper.find(QueryPreviewModal)).toExist(); }); + + it('searches', async () => { + const filtersWrapper = wrapper.find(Filters); + act(() => { + const props = filtersWrapper.find('[name="sql"]').first().props(); + // @ts-ignore + if (props.onSubmit) props.onSubmit('fooo'); + }); + await waitForComponentToPaint(wrapper); + expect((fetchMock.lastCall() ?? [])[0]).toMatchInlineSnapshot( + `"http://localhost/api/v1/query/?q=(filters:!((col:sql,opr:ct,value:fooo)),order_column:start_time,order_direction:desc,page:0,page_size:25)"`, + ); + }); }); diff --git a/superset-frontend/src/views/CRUD/data/query/QueryList.tsx b/superset-frontend/src/views/CRUD/data/query/QueryList.tsx index ed9329fd1c..52061d5141 100644 --- a/superset-frontend/src/views/CRUD/data/query/QueryList.tsx +++ b/superset-frontend/src/views/CRUD/data/query/QueryList.tsx @@ -19,21 +19,29 @@ import React, { useMemo, useState, useCallback } from 'react'; import { SupersetClient, t, styled } from '@superset-ui/core'; import moment from 'moment'; - -import { createErrorHandler, shortenSQL } from 'src/views/CRUD/utils'; +import { + createFetchRelated, + createFetchDistinct, + createErrorHandler, + shortenSQL, +} from 'src/views/CRUD/utils'; import withToasts from 'src/messageToasts/enhancers/withToasts'; import { useListViewResource } from 'src/views/CRUD/hooks'; import SubMenu, { SubMenuProps } from 'src/components/Menu/SubMenu'; import { Popover } from 'src/common/components'; import { commonMenuData } from 'src/views/CRUD/data/common'; -import ListView, { Filters, ListViewProps } from 'src/components/ListView'; +import ListView, { + Filters, + FilterOperators, + ListViewProps, +} from 'src/components/ListView'; import Icon, { IconName } from 'src/components/Icon'; import { Tooltip } from 'src/common/components/Tooltip'; import SyntaxHighlighter from 'react-syntax-highlighter/dist/cjs/light'; import sql from 'react-syntax-highlighter/dist/cjs/languages/hljs/sql'; import github from 'react-syntax-highlighter/dist/cjs/styles/hljs/github'; import { DATETIME_WITH_TIME_ZONE, TIME_WITH_MS } from 'src/constants'; -import { QueryObject } from 'src/views/CRUD/types'; +import { QueryObject, QueryObjectColumns } from 'src/views/CRUD/types'; import QueryPreviewModal from './QueryPreviewModal'; @@ -49,7 +57,7 @@ const TopAlignedListView = styled(ListView)>` SyntaxHighlighter.registerLanguage('sql', sql); const StyledSyntaxHighlighter = styled(SyntaxHighlighter)` height: ${({ theme }) => theme.gridUnit * 26}px; - overflow-x: hidden !important; /* needed to override inline styles */ + overflow: hidden !important; /* needed to override inline styles */ text-overflow: ellipsis; white-space: nowrap; `; @@ -121,7 +129,7 @@ function QueryList({ addDangerToast, addSuccessToast }: QueryListProps) { ...commonMenuData, }; - const initialSort = [{ id: 'changed_on', desc: true }]; + const initialSort = [{ id: QueryObjectColumns.start_time, desc: true }]; const columns = useMemo( () => [ { @@ -171,12 +179,12 @@ function QueryList({ addDangerToast, addSuccessToast }: QueryListProps) { ); }, - accessor: 'status', + accessor: QueryObjectColumns.status, size: 'xs', disableSortBy: true, }, { - accessor: 'start_time', + accessor: QueryObjectColumns.start_time, Header: t('Time'), size: 'lg', Cell: ({ @@ -212,17 +220,21 @@ function QueryList({ addDangerToast, addSuccessToast }: QueryListProps) { }, }, { - accessor: 'tab_name', + accessor: QueryObjectColumns.tab_name, Header: t('Tab Name'), size: 'lg', }, { - accessor: 'database.database_name', + accessor: QueryObjectColumns.database_name, Header: t('Database'), size: 'lg', }, { - accessor: 'schema', + accessor: QueryObjectColumns.database, + hidden: true, + }, + { + accessor: QueryObjectColumns.schema, Header: t('Schema'), size: 'lg', }, @@ -259,13 +271,13 @@ function QueryList({ addDangerToast, addSuccessToast }: QueryListProps) { return main; }, - accessor: 'sql_tables', + accessor: QueryObjectColumns.sql_tables, Header: t('Tables'), size: 'lg', disableSortBy: true, }, { - accessor: 'user.first_name', + accessor: QueryObjectColumns.user, Header: t('User'), size: 'lg', Cell: ({ @@ -275,12 +287,12 @@ function QueryList({ addDangerToast, addSuccessToast }: QueryListProps) { }: any) => `${user.first_name} ${user.last_name}`, }, { - accessor: 'rows', + accessor: QueryObjectColumns.rows, Header: t('Rows'), size: 'md', }, { - accessor: 'sql', + accessor: QueryObjectColumns.sql, Header: t('SQL'), Cell: ({ row: { original, id } }: any) => { return ( @@ -319,7 +331,74 @@ function QueryList({ addDangerToast, addSuccessToast }: QueryListProps) { [], ); - const filters: Filters = useMemo(() => [], []); + const filters: Filters = useMemo( + () => [ + { + Header: t('Database'), + id: 'database', + input: 'select', + operator: FilterOperators.relationOneMany, + unfilteredLabel: 'All', + fetchSelects: createFetchRelated( + 'query', + 'database', + createErrorHandler(errMsg => + addDangerToast( + t('An error occurred while fetching database values: %s', errMsg), + ), + ), + ), + paginate: true, + }, + { + Header: t('State'), + id: 'status', + input: 'select', + operator: FilterOperators.equals, + unfilteredLabel: 'All', + fetchSelects: createFetchDistinct( + 'query', + 'status', + createErrorHandler(errMsg => + addDangerToast( + t('An error occurred while fetching schema values: %s', errMsg), + ), + ), + ), + paginate: true, + }, + { + Header: t('User'), + id: 'user', + input: 'select', + operator: FilterOperators.relationOneMany, + unfilteredLabel: 'All', + fetchSelects: createFetchRelated( + 'query', + 'user', + createErrorHandler(errMsg => + addDangerToast( + t('An error occurred while fetching database values: %s', errMsg), + ), + ), + ), + paginate: true, + }, + { + Header: t('Time Range'), + id: 'start_time', + input: 'datetime_range', + operator: FilterOperators.between, + }, + { + Header: t('Search by query text'), + id: 'sql', + input: 'search', + operator: FilterOperators.contains, + }, + ], + [addDangerToast], + ); return ( <> diff --git a/superset-frontend/src/views/CRUD/types.ts b/superset-frontend/src/views/CRUD/types.ts index 48570c141d..26d9f1afb9 100644 --- a/superset-frontend/src/views/CRUD/types.ts +++ b/superset-frontend/src/views/CRUD/types.ts @@ -91,3 +91,22 @@ export interface QueryObject { tmp_table_name: string; tracking_url: string; } + +export enum QueryObjectColumns { + id = 'id', + changed_on = 'changed_on', + database = 'database', + database_name = 'database.database_name', + schema = 'schema', + sql = 'sql', + executed_sql = 'exceuted_sql', + sql_tables = 'sql_tables', + status = 'status', + tab_name = 'tab_name', + user = 'user', + start_time = 'start_time', + end_time = 'end_time', + rows = 'rows', + tmp_table_name = 'tmp_table_name', + tracking_url = 'tracking_url', +} diff --git a/superset/queries/api.py b/superset/queries/api.py index 4b2ab1398a..8f1a3fb843 100644 --- a/superset/queries/api.py +++ b/superset/queries/api.py @@ -34,7 +34,12 @@ class QueryRestApi(BaseSupersetModelRestApi): resource_name = "query" allow_browser_login = True - include_route_methods = {RouteMethod.GET, RouteMethod.GET_LIST, RouteMethod.RELATED} + include_route_methods = { + RouteMethod.GET, + RouteMethod.GET_LIST, + RouteMethod.RELATED, + RouteMethod.DISTINCT, + } class_permission_name = "QueryView" list_columns = [ @@ -105,7 +110,8 @@ class QueryRestApi(BaseSupersetModelRestApi): "created_by": RelatedFieldFilter("first_name", FilterRelatedOwners), } - search_columns = ["changed_on", "database", "sql", "status", "user"] + search_columns = ["changed_on", "database", "sql", "status", "user", "start_time"] filter_rel_fields = {"database": [["id", DatabaseFilter, lambda: []]]} allowed_rel_fields = {"database", "user"} + allowed_distinct_fields = {"status"}