feat: list view filters for Query History (#11702)

This commit is contained in:
ʈᵃᵢ 2020-11-30 14:21:53 -08:00 committed by GitHub
parent 3cd94d6da9
commit 011724750f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 809 additions and 416 deletions

View File

@ -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"

View File

@ -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",

View File

@ -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);

View File

@ -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 () => {

View File

@ -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;
`;

View File

@ -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<ValueState | null>(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 (
<RangeFilterContainer>
<FilterTitle>{Header}:</FilterTitle>
<RangePicker
showTime
bordered={false}
value={momentValue}
onChange={momentRange => {
if (!momentRange) {
setValue(null);
onSubmit([]);
return;
}
const changeValue = [
momentRange[0]?.valueOf() ?? 0,
momentRange[1]?.valueOf() ?? 0,
] as ValueState;
setValue(changeValue);
onSubmit(changeValue);
}}
/>
</RangeFilterContainer>
);
}

View File

@ -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 (
<FilterContainer>
<SearchInput
data-test="filters-search"
placeholder={Header}
name={name}
value={value}
onChange={e => {
setValue(e.currentTarget.value);
}}
onSubmit={handleSubmit}
onClear={onClear}
/>
</FilterContainer>
);
}

View File

@ -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({
</FilterContainer>
);
}
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 (
<FilterContainer>
<SearchInput
data-test="filters-search"
placeholder={Header}
name={name}
value={value}
onChange={e => {
setValue(e.currentTarget.value);
}}
onSubmit={handleSubmit}
onClear={onClear}
/>
</FilterContainer>
);
}
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 (
<FilterWrapper>
{filters.map(
(
{
Header,
fetchSelects,
id,
input,
paginate,
selects,
unfilteredLabel,
},
index,
) => {
const initialValue =
internalFilters[index] && internalFilters[index].value;
if (input === 'select') {
return (
<StyledSelectFilter
Header={Header}
emptyLabel={unfilteredLabel}
fetchSelects={fetchSelects}
initialValue={initialValue}
key={id}
name={id}
onSelect={(value: any) => updateFilterValue(index, value)}
paginate={paginate}
selects={selects}
/>
);
}
if (input === 'search' && typeof Header === 'string') {
return (
<SearchFilter
Header={Header}
initialValue={initialValue}
key={id}
name={id}
onSubmit={(value: string) => updateFilterValue(index, value)}
/>
);
}
return null;
},
)}
</FilterWrapper>
);
}
export default withTheme(UIFilters);
export default withTheme(SelectFilter);

View File

@ -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 (
<FilterWrapper>
{filters.map(
(
{
Header,
fetchSelects,
id,
input,
paginate,
selects,
unfilteredLabel,
},
index,
) => {
const initialValue =
internalFilters[index] && internalFilters[index].value;
if (input === 'select') {
return (
<SelectFilter
Header={Header}
emptyLabel={unfilteredLabel}
fetchSelects={fetchSelects}
initialValue={initialValue}
key={id}
name={id}
onSelect={(value: any) => updateFilterValue(index, value)}
paginate={paginate}
selects={selects}
/>
);
}
if (input === 'search' && typeof Header === 'string') {
return (
<SearchFilter
Header={Header}
initialValue={initialValue}
key={id}
name={id}
onSubmit={(value: string) => updateFilterValue(index, value)}
/>
);
}
if (input === 'datetime_range') {
return (
<DateRangeFilter
Header={Header}
initialValue={initialValue}
key={id}
name={id}
onSubmit={value => updateFilterValue(index, value)}
/>
);
}
return null;
},
)}
</FilterWrapper>
);
}
export default withTheme(UIFilters);

View File

@ -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',
}

View File

@ -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<string, any> = {
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[];

View File

@ -291,7 +291,6 @@ const AnnotationModal: FunctionComponent<AnnotationModalProps> = ({
onChange={onDateChange}
showTime={{ format: 'hh:mm a' }}
use12Hours
// @ts-ignore
value={
currentAnnotation &&
(currentAnnotation?.start_dttm.length ||

View File

@ -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(<QueryList {...mockedProps} />, {
@ -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)"`,
);
});
});

View File

@ -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)<ListViewProps<QueryObject>>`
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) {
</Tooltip>
);
},
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 (
<>

View File

@ -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',
}

View File

@ -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"}