From 0d9f57a9c969a67e350d6bf25e07c3a9ef5bba39 Mon Sep 17 00:00:00 2001 From: Jonathan Fishner Date: Wed, 23 Jul 2025 11:35:27 +0300 Subject: [PATCH] feat: add table selection for large database imports (#776) * feat: add table selection UI for large database imports (>50 tables) * some changes * some changes * some changes * fix * fix --------- Co-authored-by: Guy Ben-Aharon --- package-lock.json | 73 +- package.json | 2 +- src/components/pagination/pagination.tsx | 121 ++++ .../import-database/import-database.tsx | 32 +- src/dialogs/common/select-tables/constants.ts | 2 + .../common/select-tables/select-tables.tsx | 665 ++++++++++++++++++ .../create-diagram-dialog-step.ts | 1 + .../create-diagram-dialog.tsx | 165 ++++- .../table-schema-dialog.tsx | 17 +- .../data/import-metadata/filter-metadata.ts | 126 ++++ .../metadata-types/index-info.ts | 13 +- src/lib/domain/db-dependency.ts | 4 + src/lib/domain/db-field.ts | 41 +- src/lib/domain/db-table.ts | 184 ++++- src/lib/domain/diagram.ts | 4 +- .../canvas/canvas-context-menu.tsx | 4 +- .../table-list-item-header.tsx | 5 +- .../tables-section/tables-section.tsx | 9 +- 18 files changed, 1348 insertions(+), 120 deletions(-) create mode 100644 src/components/pagination/pagination.tsx create mode 100644 src/dialogs/common/select-tables/constants.ts create mode 100644 src/dialogs/common/select-tables/select-tables.tsx create mode 100644 src/lib/data/import-metadata/filter-metadata.ts diff --git a/package-lock.json b/package-lock.json index 44d037f4..97ae43b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "@radix-ui/react-scroll-area": "1.2.0", "@radix-ui/react-select": "^2.1.1", "@radix-ui/react-separator": "^1.1.2", - "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tabs": "^1.1.0", "@radix-ui/react-toast": "^1.2.1", "@radix-ui/react-toggle": "^1.1.0", @@ -2255,6 +2255,24 @@ } } }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", + "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-direction": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", @@ -2968,7 +2986,7 @@ } } }, - "node_modules/@radix-ui/react-slot": { + "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-slot": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==", @@ -2986,6 +3004,39 @@ } } }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-tabs": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.2.tgz", @@ -3267,6 +3318,24 @@ } } }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", + "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-visually-hidden": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.2.tgz", diff --git a/package.json b/package.json index 9827bf73..d39eddc6 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@radix-ui/react-scroll-area": "1.2.0", "@radix-ui/react-select": "^2.1.1", "@radix-ui/react-separator": "^1.1.2", - "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tabs": "^1.1.0", "@radix-ui/react-toast": "^1.2.1", "@radix-ui/react-toggle": "^1.1.0", diff --git a/src/components/pagination/pagination.tsx b/src/components/pagination/pagination.tsx new file mode 100644 index 00000000..fd7540f2 --- /dev/null +++ b/src/components/pagination/pagination.tsx @@ -0,0 +1,121 @@ +import React from 'react'; +import { cn } from '@/lib/utils'; +import type { ButtonProps } from '../button/button'; +import { buttonVariants } from '../button/button-variants'; +import { + ChevronLeftIcon, + ChevronRightIcon, + DotsHorizontalIcon, +} from '@radix-ui/react-icons'; + +const Pagination = ({ className, ...props }: React.ComponentProps<'nav'>) => ( +