feat: support multiple select table (#82)

This commit is contained in:
CorrectRoadH
2023-05-13 15:01:42 +08:00
committed by GitHub
parent d423ce7a06
commit 79d02af91c
11 changed files with 331 additions and 186 deletions

View File

@ -57,6 +57,7 @@
"stripe": "^12.3.0",
"styled-components": "^5.3.9",
"swr": "^2.1.5",
"tailwind-scrollbar-hide": "^1.1.7",
"uuid": "^9.0.0",
"zustand": "^4.3.6"
},

345
pnpm-lock.yaml generated
View File

@ -139,6 +139,9 @@ dependencies:
swr:
specifier: ^2.1.5
version: 2.1.5(react@18.2.0)
tailwind-scrollbar-hide:
specifier: ^1.1.7
version: registry.npmmirror.com/tailwind-scrollbar-hide@1.1.7
uuid:
specifier: ^9.0.0
version: 9.0.0
@ -965,123 +968,6 @@ packages:
glob: 7.1.7
dev: true
/@next/swc-android-arm-eabi@13.2.4:
resolution: {integrity: sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==}
engines: {node: '>= 10'}
cpu: [arm]
os: [android]
requiresBuild: true
dev: false
optional: true
/@next/swc-android-arm64@13.2.4:
resolution: {integrity: sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
requiresBuild: true
dev: false
optional: true
/@next/swc-darwin-arm64@13.2.4:
resolution: {integrity: sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: false
optional: true
/@next/swc-darwin-x64@13.2.4:
resolution: {integrity: sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: false
optional: true
/@next/swc-freebsd-x64@13.2.4:
resolution: {integrity: sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
dev: false
optional: true
/@next/swc-linux-arm-gnueabihf@13.2.4:
resolution: {integrity: sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: false
optional: true
/@next/swc-linux-arm64-gnu@13.2.4:
resolution: {integrity: sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: false
optional: true
/@next/swc-linux-arm64-musl@13.2.4:
resolution: {integrity: sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: false
optional: true
/@next/swc-linux-x64-gnu@13.2.4:
resolution: {integrity: sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: false
optional: true
/@next/swc-linux-x64-musl@13.2.4:
resolution: {integrity: sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: false
optional: true
/@next/swc-win32-arm64-msvc@13.2.4:
resolution: {integrity: sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: false
optional: true
/@next/swc-win32-ia32-msvc@13.2.4:
resolution: {integrity: sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: false
optional: true
/@next/swc-win32-x64-msvc@13.2.4:
resolution: {integrity: sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: false
optional: true
/@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@ -2206,7 +2092,7 @@ packages:
normalize-path: 3.0.0
readdirp: 3.6.0
optionalDependencies:
fsevents: 2.3.2
fsevents: registry.npmmirror.com/fsevents@2.3.2
dev: true
/client-only@0.0.1:
@ -3065,14 +2951,6 @@ packages:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
dev: true
/fsevents@2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
requiresBuild: true
dev: true
optional: true
/function-bind@1.1.1:
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
@ -4356,19 +4234,19 @@ packages:
react-dom: 18.2.0(react@18.2.0)
styled-jsx: 5.1.1(react@18.2.0)
optionalDependencies:
'@next/swc-android-arm-eabi': 13.2.4
'@next/swc-android-arm64': 13.2.4
'@next/swc-darwin-arm64': 13.2.4
'@next/swc-darwin-x64': 13.2.4
'@next/swc-freebsd-x64': 13.2.4
'@next/swc-linux-arm-gnueabihf': 13.2.4
'@next/swc-linux-arm64-gnu': 13.2.4
'@next/swc-linux-arm64-musl': 13.2.4
'@next/swc-linux-x64-gnu': 13.2.4
'@next/swc-linux-x64-musl': 13.2.4
'@next/swc-win32-arm64-msvc': 13.2.4
'@next/swc-win32-ia32-msvc': 13.2.4
'@next/swc-win32-x64-msvc': 13.2.4
'@next/swc-android-arm-eabi': registry.npmmirror.com/@next/swc-android-arm-eabi@13.2.4
'@next/swc-android-arm64': registry.npmmirror.com/@next/swc-android-arm64@13.2.4
'@next/swc-darwin-arm64': registry.npmmirror.com/@next/swc-darwin-arm64@13.2.4
'@next/swc-darwin-x64': registry.npmmirror.com/@next/swc-darwin-x64@13.2.4
'@next/swc-freebsd-x64': registry.npmmirror.com/@next/swc-freebsd-x64@13.2.4
'@next/swc-linux-arm-gnueabihf': registry.npmmirror.com/@next/swc-linux-arm-gnueabihf@13.2.4
'@next/swc-linux-arm64-gnu': registry.npmmirror.com/@next/swc-linux-arm64-gnu@13.2.4
'@next/swc-linux-arm64-musl': registry.npmmirror.com/@next/swc-linux-arm64-musl@13.2.4
'@next/swc-linux-x64-gnu': registry.npmmirror.com/@next/swc-linux-x64-gnu@13.2.4
'@next/swc-linux-x64-musl': registry.npmmirror.com/@next/swc-linux-x64-musl@13.2.4
'@next/swc-win32-arm64-msvc': registry.npmmirror.com/@next/swc-win32-arm64-msvc@13.2.4
'@next/swc-win32-ia32-msvc': registry.npmmirror.com/@next/swc-win32-ia32-msvc@13.2.4
'@next/swc-win32-x64-msvc': registry.npmmirror.com/@next/swc-win32-x64-msvc@13.2.4
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
@ -6032,7 +5910,7 @@ packages:
dev: false
registry.npmmirror.com/@babel/runtime@7.21.0:
resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@babel/runtime/-/runtime-7.21.0.tgz}
resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/runtime/-/runtime-7.21.0.tgz}
name: '@babel/runtime'
version: 7.21.0
engines: {node: '>=6.9.0'}
@ -6040,8 +5918,155 @@ packages:
regenerator-runtime: registry.npmmirror.com/regenerator-runtime@0.13.11
dev: false
registry.npmmirror.com/@next/swc-android-arm-eabi@13.2.4:
resolution: {integrity: sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.4.tgz}
name: '@next/swc-android-arm-eabi'
version: 13.2.4
engines: {node: '>= 10'}
cpu: [arm]
os: [android]
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/@next/swc-android-arm64@13.2.4:
resolution: {integrity: sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@next/swc-android-arm64/-/swc-android-arm64-13.2.4.tgz}
name: '@next/swc-android-arm64'
version: 13.2.4
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/@next/swc-darwin-arm64@13.2.4:
resolution: {integrity: sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.4.tgz}
name: '@next/swc-darwin-arm64'
version: 13.2.4
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/@next/swc-darwin-x64@13.2.4:
resolution: {integrity: sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.4.tgz}
name: '@next/swc-darwin-x64'
version: 13.2.4
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/@next/swc-freebsd-x64@13.2.4:
resolution: {integrity: sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.4.tgz}
name: '@next/swc-freebsd-x64'
version: 13.2.4
engines: {node: '>= 10'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/@next/swc-linux-arm-gnueabihf@13.2.4:
resolution: {integrity: sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.4.tgz}
name: '@next/swc-linux-arm-gnueabihf'
version: 13.2.4
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/@next/swc-linux-arm64-gnu@13.2.4:
resolution: {integrity: sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.4.tgz}
name: '@next/swc-linux-arm64-gnu'
version: 13.2.4
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/@next/swc-linux-arm64-musl@13.2.4:
resolution: {integrity: sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.4.tgz}
name: '@next/swc-linux-arm64-musl'
version: 13.2.4
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [musl]
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/@next/swc-linux-x64-gnu@13.2.4:
resolution: {integrity: sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.4.tgz}
name: '@next/swc-linux-x64-gnu'
version: 13.2.4
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [glibc]
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/@next/swc-linux-x64-musl@13.2.4:
resolution: {integrity: sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.4.tgz}
name: '@next/swc-linux-x64-musl'
version: 13.2.4
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [musl]
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/@next/swc-win32-arm64-msvc@13.2.4:
resolution: {integrity: sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.4.tgz}
name: '@next/swc-win32-arm64-msvc'
version: 13.2.4
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/@next/swc-win32-ia32-msvc@13.2.4:
resolution: {integrity: sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.4.tgz}
name: '@next/swc-win32-ia32-msvc'
version: 13.2.4
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/@next/swc-win32-x64-msvc@13.2.4:
resolution: {integrity: sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.4.tgz}
name: '@next/swc-win32-x64-msvc'
version: 13.2.4
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/@radix-ui/number@1.0.0:
resolution: {integrity: sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/number/-/number-1.0.0.tgz}
resolution: {integrity: sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@radix-ui/number/-/number-1.0.0.tgz}
name: '@radix-ui/number'
version: 1.0.0
dependencies:
@ -6049,7 +6074,7 @@ packages:
dev: false
registry.npmmirror.com/@radix-ui/primitive@1.0.0:
resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.0.0.tgz}
resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.0.0.tgz}
name: '@radix-ui/primitive'
version: 1.0.0
dependencies:
@ -6057,7 +6082,7 @@ packages:
dev: false
registry.npmmirror.com/@radix-ui/react-compose-refs@1.0.0(react@18.2.0):
resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz}
resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz}
id: registry.npmmirror.com/@radix-ui/react-compose-refs/1.0.0
name: '@radix-ui/react-compose-refs'
version: 1.0.0
@ -6069,7 +6094,7 @@ packages:
dev: false
registry.npmmirror.com/@radix-ui/react-context@1.0.0(react@18.2.0):
resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.0.0.tgz}
resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.0.0.tgz}
id: registry.npmmirror.com/@radix-ui/react-context/1.0.0
name: '@radix-ui/react-context'
version: 1.0.0
@ -6081,7 +6106,7 @@ packages:
dev: false
registry.npmmirror.com/@radix-ui/react-direction@1.0.0(react@18.2.0):
resolution: {integrity: sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-direction/-/react-direction-1.0.0.tgz}
resolution: {integrity: sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-direction/-/react-direction-1.0.0.tgz}
id: registry.npmmirror.com/@radix-ui/react-direction/1.0.0
name: '@radix-ui/react-direction'
version: 1.0.0
@ -6093,7 +6118,7 @@ packages:
dev: false
registry.npmmirror.com/@radix-ui/react-presence@1.0.0(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.0.0.tgz}
resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.0.0.tgz}
id: registry.npmmirror.com/@radix-ui/react-presence/1.0.0
name: '@radix-ui/react-presence'
version: 1.0.0
@ -6109,7 +6134,7 @@ packages:
dev: false
registry.npmmirror.com/@radix-ui/react-primitive@1.0.2(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-zY6G5Qq4R8diFPNwtyoLRZBxzu1Z+SXMlfYpChN7Dv8gvmx9X3qhDqiLWvKseKVJMuedFeU/Sa0Sy/Ia+t06Dw==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-1.0.2.tgz}
resolution: {integrity: sha512-zY6G5Qq4R8diFPNwtyoLRZBxzu1Z+SXMlfYpChN7Dv8gvmx9X3qhDqiLWvKseKVJMuedFeU/Sa0Sy/Ia+t06Dw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-1.0.2.tgz}
id: registry.npmmirror.com/@radix-ui/react-primitive/1.0.2
name: '@radix-ui/react-primitive'
version: 1.0.2
@ -6124,7 +6149,7 @@ packages:
dev: false
registry.npmmirror.com/@radix-ui/react-scroll-area@1.0.3(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-sBX9j8Q+0/jReNObEAveKIGXJtk3xUoSIx4cMKygGtO128QJyVDn01XNOFsyvihKDCTcu7SINzQ2jPAZEhIQtw==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.3.tgz}
resolution: {integrity: sha512-sBX9j8Q+0/jReNObEAveKIGXJtk3xUoSIx4cMKygGtO128QJyVDn01XNOFsyvihKDCTcu7SINzQ2jPAZEhIQtw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.3.tgz}
id: registry.npmmirror.com/@radix-ui/react-scroll-area/1.0.3
name: '@radix-ui/react-scroll-area'
version: 1.0.3
@ -6147,7 +6172,7 @@ packages:
dev: false
registry.npmmirror.com/@radix-ui/react-slot@1.0.1(react@18.2.0):
resolution: {integrity: sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.0.1.tgz}
resolution: {integrity: sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.0.1.tgz}
id: registry.npmmirror.com/@radix-ui/react-slot/1.0.1
name: '@radix-ui/react-slot'
version: 1.0.1
@ -6160,7 +6185,7 @@ packages:
dev: false
registry.npmmirror.com/@radix-ui/react-use-callback-ref@1.0.0(react@18.2.0):
resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz}
resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz}
id: registry.npmmirror.com/@radix-ui/react-use-callback-ref/1.0.0
name: '@radix-ui/react-use-callback-ref'
version: 1.0.0
@ -6172,7 +6197,7 @@ packages:
dev: false
registry.npmmirror.com/@radix-ui/react-use-layout-effect@1.0.0(react@18.2.0):
resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz}
resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz}
id: registry.npmmirror.com/@radix-ui/react-use-layout-effect/1.0.0
name: '@radix-ui/react-use-layout-effect'
version: 1.0.0
@ -6183,8 +6208,24 @@ packages:
react: 18.2.0
dev: false
registry.npmmirror.com/fsevents@2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz}
name: fsevents
version: 2.3.2
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
requiresBuild: true
dev: true
optional: true
registry.npmmirror.com/regenerator-runtime@0.13.11:
resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, registry: https://registry.npmjs.org/, tarball: https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz}
resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz}
name: regenerator-runtime
version: 0.13.11
dev: false
registry.npmmirror.com/tailwind-scrollbar-hide@1.1.7:
resolution: {integrity: sha512-X324n9OtpTmOMqEgDUEA/RgLrNfBF/jwJdctaPZDzB3mppxJk7TLIDmOreEDm1Bq4R9LSPu4Epf8VSdovNU+iA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/tailwind-scrollbar-hide/-/tailwind-scrollbar-hide-1.1.7.tgz}
name: tailwind-scrollbar-hide
version: 1.1.7
dev: false

View File

@ -16,6 +16,7 @@ import ConversationList from "./Sidebar/ConversationList";
import ConnectionList from "./Sidebar/ConnectionList";
import QuotaWidget from "./QuotaWidget";
import { HasFeature } from "../utils";
import MultipleSelect from "./kit/MultipleSelect";
interface State {}
@ -31,6 +32,10 @@ const ConnectionSidebar = () => {
(database) => database.connectionId === currentConnectionCtx?.connection.id
);
const [tableList, updateTableList] = useState<Table[]>([]);
const selectedTablesName: string[] =
conversationStore.getConversationById(
conversationStore.currentConversationId
)?.selectedTablesName || [];
const tableSchemaLoadingState = useLoading();
useEffect(() => {
@ -84,13 +89,7 @@ const ConnectionSidebar = () => {
database.name === currentConnectionCtx?.database?.name
)?.tableList || [];
updateTableList([
{
name: "",
structure: "",
} as Table,
...tableList,
]);
updateTableList(tableList);
}, [connectionStore, currentConnectionCtx]);
const handleDatabaseNameSelect = async (databaseName: string) => {
@ -116,8 +115,18 @@ const ConnectionSidebar = () => {
}
};
const handleTableNameSelect = async (tableName: string) => {
conversationStore.updateTableName(tableName);
const handleTableNameSelect = async (selectedTablesName: string[]) => {
conversationStore.updateSelectedTablesName(selectedTablesName);
};
const handleAllSelect = async () => {
conversationStore.updateSelectedTablesName(
tableList.map((table) => table.name)
);
};
const handleEmptySelect = async () => {
conversationStore.updateSelectedTablesName([]);
};
return (
<>
@ -173,13 +182,9 @@ const ConnectionSidebar = () => {
) : (
tableList.length > 0 && (
<div className="w-full sticky top-0 z-1 my-4">
<Select
<MultipleSelect
className="w-full px-4 py-3 !text-base"
value={
conversationStore.getConversationById(
conversationStore.currentConversationId
)?.tableName || ""
}
value={selectedTablesName}
itemList={tableList.map((table) => {
return {
label:
@ -192,8 +197,27 @@ const ConnectionSidebar = () => {
onValueChange={(tableName) =>
handleTableNameSelect(tableName)
}
placeholder={t("connection.select-table") || ""}
/>
placeholder={
(selectedTablesName.length
? selectedTablesName.join(",")
: t("connection.all-tables")) || ""
}
>
<button
className="whitespace-nowrap rounded w-full bg-indigo-600 px-2 py-1 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
onClick={(e) => {
selectedTablesName.length
? handleEmptySelect()
: handleAllSelect();
// The Button area is a option that have select event. So must to stop Propagation
e.stopPropagation();
}}
>
{selectedTablesName.length
? t("connection.empty-select")
: t("connection.select-all")}
</button>
</MultipleSelect>
</div>
)
))}

View File

@ -178,20 +178,24 @@ const ConversationView = () => {
const tables = await connectionStore.getOrFetchDatabaseSchema(
connectionStore.currentConnectionCtx?.database
);
// Empty table name(such as "") denote all table. "" and `undefined` both are false in `if`
if (currentConversation.tableName) {
const table = tables.find((table) => {
return table.name === currentConversation.tableName;
// Empty table name(such as []) denote all table. [] and `undefined` both are false in `if`
const tableList: string[] = [];
if (currentConversation.selectedTablesName) {
currentConversation.selectedTablesName.forEach((tableName) => {
const table = tables.find((table) => table.name === tableName);
tableList.push(table!.structure);
});
if (table) {
tokens += countTextTokens(schema + table.structure);
schema += table.structure;
}
} else {
for (const table of tables) {
tableList.push(table!.structure);
}
}
if (tableList) {
for (const table of tableList) {
if (tokens < MAX_TOKENS / 2) {
tokens += countTextTokens(schema + table.structure);
schema += table.structure;
tokens += countTextTokens(schema + table);
schema += table;
}
}
}

View File

@ -0,0 +1,66 @@
import { Listbox, Transition } from "@headlessui/react";
import { Fragment, ReactNode, useState } from "react";
import { CheckIcon } from "@heroicons/react/20/solid";
import * as SelectUI from "@radix-ui/react-select";
import Icon from "../Icon";
interface Props<T = any> {
value: T[];
itemList: {
value: T;
label: string;
}[];
className?: string;
placeholder?: string;
selectedPlaceholder?: string;
onValueChange: (value: T) => void;
}
const MultipleSelect = (props: Props & { children?: ReactNode }) => {
const { itemList, value, placeholder, className, onValueChange, children } =
props;
return (
<Listbox value={value} onChange={onValueChange} multiple>
<Listbox.Button
className={`${
className || ""
} flex flex-row justify-between items-center text-sm whitespace-nowrap dark:text-gray-300 bg-white dark:bg-zinc-700 border dark:border-zinc-800 px-3 py-2 rounded-lg`}
>
<div className="truncate">{placeholder}</div>
<SelectUI.Icon className="ml-1 w-5 h-auto shrink-0">
<Icon.BiChevronDown className="w-full h-auto opacity-60" />
</SelectUI.Icon>
</Listbox.Button>
<Transition
as={Fragment}
leave="transition ease-in duration-100"
leaveFrom="opacity-100"
leaveTo="opacity-0"
>
<Listbox.Options className="absolute p-1 mt-1 max-h-60 overflow-y-auto scrollbar-hide w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm">
{children && (
<Listbox.Option key="button" value="button">
{children}
</Listbox.Option>
)}
{itemList.map((item) => (
<Listbox.Option
className="w-full px-3 py-2 whitespace-nowrap truncate text-ellipsis overflow-x-hidden text-sm rounded-lg flex flex-row justify-between items-center cursor-pointer hover:bg-gray-100 dark:hover:bg-zinc-800"
key={item.value}
value={item.value}
>
{item.label}
{(value.find((v: string) => v === item.value) ? true : false) ? (
<span className=" inset-y-0 left-0 flex items-center pl-3 text-black">
<CheckIcon className="h-5 w-5" aria-hidden="true" />
</span>
) : null}
</Listbox.Option>
))}
</Listbox.Options>
</Transition>
</Listbox>
);
};
export default MultipleSelect;

View File

@ -27,7 +27,7 @@
"edit": "Edit Connection",
"select-database": "Select your database",
"select-table": "Select your table",
"all-tables":"All Tables",
"all-tables": "All Tables",
"database-type": "Database type",
"title": "Title",
"host": "Host",
@ -35,6 +35,8 @@
"database-name": "Database name",
"username": "Username",
"password": "Password",
"empty-select": "clear selection",
"select-all": "select all",
"tidb-serverless-ssl-hint": "SSL is required and configured"
},
"assistant": {

View File

@ -33,6 +33,8 @@
"database-name": "Nombre de Base de Datos",
"username": "Usuario",
"password": "Contraseña",
"empty-select": "selección clara",
"select-all": "seleccionar todo",
"tidb-serverless-ssl-hint": "Se requiere SSL y ya está configurado"
},
"assistant": {

View File

@ -27,7 +27,9 @@
"edit": "编辑连接",
"select-database": "选择数据库",
"select-table": "选择数据表",
"all-tables":"全部表",
"all-tables": "全部表",
"select-all": "选择全部",
"empty-select": "清空选择",
"database-type": "数据库类型",
"title": "标题",
"host": "主机",

View File

@ -31,7 +31,7 @@ interface ConversationState {
conversation: Partial<Conversation>
) => void;
clearConversation: (filter: (conversation: Conversation) => boolean) => void;
updateTableName: (tableName: string) => void;
updateSelectedTablesName: (selectedTablesName: string[]) => void;
}
export const useConversationStore = create<ConversationState>()(
@ -78,13 +78,13 @@ export const useConversationStore = create<ConversationState>()(
conversationList: state.conversationList.filter(filter),
}));
},
updateTableName: (tableName: string) => {
updateSelectedTablesName: (selectedTablesName: string[]) => {
const currentConversation = get().getConversationById(
get().currentConversationId
);
if (currentConversation) {
get().updateConversation(currentConversation.id, {
tableName,
selectedTablesName,
});
}
},

View File

@ -4,7 +4,7 @@ export interface Conversation {
id: string;
connectionId?: Id;
databaseName?: string;
tableName?: string;
selectedTablesName?: string[];
assistantId: Id;
title: string;
createdAt: Timestamp;

View File

@ -13,5 +13,8 @@ module.exports = {
},
},
},
plugins: [require("@tailwindcss/typography")],
plugins: [
require("@tailwindcss/typography"),
require("tailwind-scrollbar-hide"),
],
};