@libredb/studio 0.9.7 → 0.9.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-34YQUUCM.mjs +319 -0
- package/dist/chunk-34YQUUCM.mjs.map +1 -0
- package/dist/chunk-4LVB3K53.mjs +37 -0
- package/dist/chunk-4LVB3K53.mjs.map +1 -0
- package/dist/chunk-6DRZXXNT.mjs +100 -0
- package/dist/chunk-6DRZXXNT.mjs.map +1 -0
- package/dist/chunk-CPF7XWV5.mjs +1289 -0
- package/dist/chunk-CPF7XWV5.mjs.map +1 -0
- package/dist/chunk-CZVV3JJB.mjs +160 -0
- package/dist/chunk-CZVV3JJB.mjs.map +1 -0
- package/dist/chunk-D4WVWWWF.js +332 -0
- package/dist/chunk-D4WVWWWF.js.map +1 -0
- package/dist/chunk-DY3KXE44.mjs +3 -0
- package/dist/chunk-DY3KXE44.mjs.map +1 -0
- package/dist/chunk-FYSE52VB.js +242 -0
- package/dist/chunk-FYSE52VB.js.map +1 -0
- package/dist/chunk-G3S66G64.mjs +6673 -0
- package/dist/chunk-G3S66G64.mjs.map +1 -0
- package/dist/chunk-G4WYE6TI.js +4 -0
- package/dist/chunk-G4WYE6TI.js.map +1 -0
- package/dist/chunk-HGPD6PWV.js +1310 -0
- package/dist/chunk-HGPD6PWV.js.map +1 -0
- package/dist/chunk-JZO5KRZN.js +165 -0
- package/dist/chunk-JZO5KRZN.js.map +1 -0
- package/dist/chunk-KV356UXJ.js +253 -0
- package/dist/chunk-KV356UXJ.js.map +1 -0
- package/dist/chunk-PPODO6HX.mjs +237 -0
- package/dist/chunk-PPODO6HX.mjs.map +1 -0
- package/dist/chunk-PTIRB2JO.js +258 -0
- package/dist/chunk-PTIRB2JO.js.map +1 -0
- package/dist/chunk-Q6LRDBK7.js +42 -0
- package/dist/chunk-Q6LRDBK7.js.map +1 -0
- package/dist/chunk-QJP5FZRY.mjs +255 -0
- package/dist/chunk-QJP5FZRY.mjs.map +1 -0
- package/dist/chunk-R3POCJK6.mjs +248 -0
- package/dist/chunk-R3POCJK6.mjs.map +1 -0
- package/dist/chunk-RCQB4FCE.js +186 -0
- package/dist/chunk-RCQB4FCE.js.map +1 -0
- package/dist/chunk-SR5DRGBX.mjs +174 -0
- package/dist/chunk-SR5DRGBX.mjs.map +1 -0
- package/dist/chunk-VLCRUZX7.js +102 -0
- package/dist/chunk-VLCRUZX7.js.map +1 -0
- package/dist/chunk-Y52UIFEX.js +6741 -0
- package/dist/chunk-Y52UIFEX.js.map +1 -0
- package/dist/components.d.mts +273 -0
- package/dist/components.d.ts +273 -0
- package/dist/components.js +59 -0
- package/dist/components.js.map +1 -0
- package/dist/components.mjs +6 -0
- package/dist/components.mjs.map +1 -0
- package/dist/custom-BNDOYC5P.js +134 -0
- package/dist/custom-BNDOYC5P.js.map +1 -0
- package/dist/custom-S2EKFMP3.mjs +132 -0
- package/dist/custom-S2EKFMP3.mjs.map +1 -0
- package/dist/gemini-4ASHNK4H.js +81 -0
- package/dist/gemini-4ASHNK4H.js.map +1 -0
- package/dist/gemini-C5RBLQEJ.mjs +79 -0
- package/dist/gemini-C5RBLQEJ.mjs.map +1 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +10 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mongodb-XMZEZA4A.mjs +748 -0
- package/dist/mongodb-XMZEZA4A.mjs.map +1 -0
- package/dist/mongodb-YQJJTLX3.js +750 -0
- package/dist/mongodb-YQJJTLX3.js.map +1 -0
- package/dist/mssql-PMOU4D36.js +916 -0
- package/dist/mssql-PMOU4D36.js.map +1 -0
- package/{src/lib/db/providers/sql/mssql.ts → dist/mssql-ZH5VP2C5.mjs} +268 -423
- package/dist/mssql-ZH5VP2C5.mjs.map +1 -0
- package/{src/lib/db/providers/sql/mysql.ts → dist/mysql-I3WJQXN2.mjs} +277 -428
- package/dist/mysql-I3WJQXN2.mjs.map +1 -0
- package/dist/mysql-Y3MSA5QY.js +833 -0
- package/dist/mysql-Y3MSA5QY.js.map +1 -0
- package/dist/ollama-26BYLVEV.mjs +115 -0
- package/dist/ollama-26BYLVEV.mjs.map +1 -0
- package/dist/ollama-HVWAGKQC.js +117 -0
- package/dist/ollama-HVWAGKQC.js.map +1 -0
- package/dist/openai-4U56KPG7.mjs +111 -0
- package/dist/openai-4U56KPG7.mjs.map +1 -0
- package/dist/openai-AK3R37BS.js +113 -0
- package/dist/openai-AK3R37BS.js.map +1 -0
- package/dist/oracle-L6VEAVXO.js +917 -0
- package/dist/oracle-L6VEAVXO.js.map +1 -0
- package/{src/lib/db/providers/sql/oracle.ts → dist/oracle-P2G7T4P4.mjs} +321 -454
- package/dist/oracle-P2G7T4P4.mjs.map +1 -0
- package/{src/lib/db/providers/sql/postgres.ts → dist/postgres-O5KOQUVP.mjs} +261 -471
- package/dist/postgres-O5KOQUVP.mjs.map +1 -0
- package/dist/postgres-RLCWNFFX.js +971 -0
- package/dist/postgres-RLCWNFFX.js.map +1 -0
- package/dist/providers.d.mts +149 -0
- package/dist/providers.d.ts +149 -0
- package/dist/providers.js +44 -0
- package/dist/providers.js.map +1 -0
- package/dist/providers.mjs +7 -0
- package/dist/providers.mjs.map +1 -0
- package/dist/redis-4WMQOVLX.mjs +435 -0
- package/dist/redis-4WMQOVLX.mjs.map +1 -0
- package/dist/redis-QVQ6YU62.js +441 -0
- package/dist/redis-QVQ6YU62.js.map +1 -0
- package/dist/sqlite-4I2P2OGQ.js +554 -0
- package/dist/sqlite-4I2P2OGQ.js.map +1 -0
- package/dist/sqlite-OA4YJX5S.mjs +531 -0
- package/dist/sqlite-OA4YJX5S.mjs.map +1 -0
- package/dist/types-BJvJfxSY.d.mts +141 -0
- package/dist/types-BJvJfxSY.d.ts +141 -0
- package/dist/types-ClAg_v5k.d.mts +343 -0
- package/dist/types-Der_X8E8.d.ts +343 -0
- package/dist/types.d.mts +2 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +3 -0
- package/dist/types.mjs.map +1 -0
- package/dist/workspace.d.mts +80 -0
- package/dist/workspace.d.ts +80 -0
- package/dist/workspace.js +4174 -0
- package/dist/workspace.js.map +1 -0
- package/dist/workspace.mjs +4147 -0
- package/dist/workspace.mjs.map +1 -0
- package/package.json +60 -5
- package/.claude/settings.local.json +0 -127
- package/.cursorrules +0 -426
- package/.devin/wiki.json +0 -143
- package/.dockerignore +0 -80
- package/.env.example +0 -159
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -49
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -29
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -57
- package/.github/workflows/ci.yml +0 -185
- package/.github/workflows/codeql.yml +0 -57
- package/.github/workflows/docker-build-push.yml +0 -118
- package/.github/workflows/helm-release.yml +0 -113
- package/CLAUDE.md +0 -265
- package/CODE_OF_CONDUCT.md +0 -124
- package/CONTRIBUTING.md +0 -154
- package/Dockerfile +0 -73
- package/SECURITY.md +0 -107
- package/artifacthub-repo.yml +0 -4
- package/bun.lock +0 -1714
- package/bunfig.toml +0 -3
- package/charts/libredb-studio/.helmignore +0 -11
- package/charts/libredb-studio/Chart.lock +0 -6
- package/charts/libredb-studio/Chart.yaml +0 -50
- package/charts/libredb-studio/README.md +0 -206
- package/charts/libredb-studio/templates/NOTES.txt +0 -59
- package/charts/libredb-studio/templates/_helpers.tpl +0 -135
- package/charts/libredb-studio/templates/configmap.yaml +0 -37
- package/charts/libredb-studio/templates/deployment.yaml +0 -184
- package/charts/libredb-studio/templates/hpa.yaml +0 -32
- package/charts/libredb-studio/templates/ingress.yaml +0 -41
- package/charts/libredb-studio/templates/networkpolicy.yaml +0 -50
- package/charts/libredb-studio/templates/pdb.yaml +0 -18
- package/charts/libredb-studio/templates/pvc.yaml +0 -23
- package/charts/libredb-studio/templates/secret.yaml +0 -30
- package/charts/libredb-studio/templates/seed-configmap.yaml +0 -11
- package/charts/libredb-studio/templates/service.yaml +0 -22
- package/charts/libredb-studio/templates/serviceaccount.yaml +0 -13
- package/charts/libredb-studio/values.schema.json +0 -246
- package/charts/libredb-studio/values.yaml +0 -286
- package/components.json +0 -22
- package/conductor/code_styleguides/typescript.md +0 -43
- package/conductor/product-guidelines.md +0 -43
- package/conductor/product.md +0 -3
- package/conductor/setup_state.json +0 -1
- package/conductor/tech-stack.md +0 -39
- package/conductor/tracks/enhance_postgres_monitoring_20251227/metadata.json +0 -8
- package/conductor/tracks/enhance_postgres_monitoring_20251227/plan.md +0 -44
- package/conductor/tracks/enhance_postgres_monitoring_20251227/spec.md +0 -31
- package/conductor/tracks.md +0 -8
- package/conductor/workflow.md +0 -333
- package/database-compose.yml +0 -55
- package/docker/postgres-init/01-extensions.sql +0 -10
- package/docker/postgres-init/02-sample-data.sql +0 -585
- package/docker/postgres.yml +0 -68
- package/docker-compose.yml +0 -38
- package/docs/AI_PLAN.md +0 -74
- package/docs/API_DOCS.md +0 -875
- package/docs/ARCHITECTURE.md +0 -218
- package/docs/DATABASE_PROVIDERS.md +0 -358
- package/docs/FEATURES.md +0 -116
- package/docs/HELM_CHART.md +0 -252
- package/docs/LOGIN_PAGE.md +0 -178
- package/docs/MONACO_EDITOR_PERFORMANCE.md +0 -315
- package/docs/OIDC_ARCH.md +0 -681
- package/docs/OIDC_SETUP.md +0 -322
- package/docs/POSTGRES_METRICS.md +0 -516
- package/docs/QUERY_OPTIMIZATION.md +0 -370
- package/docs/SEED_CONNECTIONS.md +0 -468
- package/docs/SQL_ALIAS_COMPLETION.md +0 -190
- package/docs/STORAGE_ARCHITECTURE.md +0 -565
- package/docs/STORAGE_QUICK_SETUP.md +0 -419
- package/docs/TECHNICAL_PLAN.md +0 -36
- package/docs/THEMING.md +0 -345
- package/docs/adding-a-new-database-provider.md +0 -642
- package/docs/backlogs/000-PLATFORM_DATA_SYNC_DATABASE.md +0 -360
- package/docs/backlogs/001-INLINE_DATA_EDITING.md +0 -118
- package/docs/backlogs/002-DATA_IMPORT.md +0 -215
- package/docs/backlogs/003-QUERY_TIME_MACHINE.md +0 -183
- package/docs/backlogs/004-AI_DATA_STORYTELLER.md +0 -292
- package/docs/backlogs/005-QUERY_PLAYGROUND.md +0 -352
- package/docs/backlogs/006-DATA_MASKING.md +0 -418
- package/docs/enterprise-features.md +0 -718
- package/docs/kubernetes-helm-chart-artifacthub-plan.md +0 -803
- package/docs/medium-koyeb-article-en.md +0 -215
- package/docs/plans/test-plans.md +0 -445
- package/docs/releases/RELEASE.V0.3.0.md +0 -22
- package/docs/releases/RELEASE.V0.4.0.md +0 -154
- package/docs/releases/RELEASE.V0.5.0.md +0 -252
- package/docs/releases/RELEASE_v0.5.6.md +0 -145
- package/docs/releases/RELEASE_v0.6.1.md +0 -303
- package/docs/releases/RELEASE_v0.6.7.md +0 -292
- package/docs/releases/RELEASE_v0.7.0.md +0 -332
- package/docs/releases/RELEASE_v0.8.0.md +0 -521
- package/docs/sampledb/titanic.sql +0 -1379
- package/docs/superpowers/plans/2026-03-25-seed-connections.md +0 -1362
- package/docs/superpowers/specs/2026-03-25-seed-connections-design.md +0 -590
- package/e2e/admin-dashboard.spec.ts +0 -64
- package/e2e/connection-management.spec.ts +0 -58
- package/e2e/export.spec.ts +0 -34
- package/e2e/login.spec.ts +0 -85
- package/e2e/query-execution.spec.ts +0 -35
- package/e2e/tab-management.spec.ts +0 -64
- package/eslint.config.mjs +0 -28
- package/fly.toml +0 -43
- package/next.config.ts +0 -32
- package/playwright.config.ts +0 -34
- package/postcss.config.mjs +0 -7
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/file.svg +0 -1
- package/public/globe.svg +0 -1
- package/public/logo.svg +0 -32
- package/public/next.svg +0 -1
- package/public/screenshots/code-generator.png +0 -0
- package/public/screenshots/connection-modal.png +0 -0
- package/public/screenshots/data-profiler.png +0 -0
- package/public/screenshots/erd-diagram.png +0 -0
- package/public/screenshots/hero-editor.png +0 -0
- package/public/screenshots/nl2sql.png +0 -0
- package/public/vercel.svg +0 -1
- package/public/window.svg +0 -1
- package/render.yaml +0 -58
- package/scripts/merge-lcov.mjs +0 -239
- package/sonar-project.properties +0 -16
- package/src/app/admin/error.tsx +0 -46
- package/src/app/admin/page.tsx +0 -10
- package/src/app/api/admin/audit/route.ts +0 -52
- package/src/app/api/admin/fleet-health/route.ts +0 -81
- package/src/app/api/ai/autopilot/route.ts +0 -105
- package/src/app/api/ai/chat/route.ts +0 -132
- package/src/app/api/ai/describe-schema/route.ts +0 -52
- package/src/app/api/ai/explain/route.ts +0 -86
- package/src/app/api/ai/impact/route.ts +0 -97
- package/src/app/api/ai/index-advisor/route.ts +0 -98
- package/src/app/api/ai/nl2sql/route.ts +0 -87
- package/src/app/api/ai/query-safety/route.ts +0 -87
- package/src/app/api/auth/login/route.ts +0 -62
- package/src/app/api/auth/logout/route.ts +0 -25
- package/src/app/api/auth/me/route.ts +0 -10
- package/src/app/api/auth/oidc/callback/route.ts +0 -82
- package/src/app/api/auth/oidc/login/route.ts +0 -43
- package/src/app/api/connections/managed/route.ts +0 -35
- package/src/app/api/db/cancel/route.ts +0 -42
- package/src/app/api/db/disconnect/route.ts +0 -28
- package/src/app/api/db/health/route.ts +0 -49
- package/src/app/api/db/maintenance/route.ts +0 -72
- package/src/app/api/db/monitoring/route.ts +0 -62
- package/src/app/api/db/multi-query/route.ts +0 -116
- package/src/app/api/db/pool-stats/route.ts +0 -37
- package/src/app/api/db/profile/route.ts +0 -144
- package/src/app/api/db/provider-meta/route.ts +0 -49
- package/src/app/api/db/query/route.ts +0 -50
- package/src/app/api/db/schema/route.ts +0 -47
- package/src/app/api/db/schema-snapshot/route.ts +0 -42
- package/src/app/api/db/test-connection/route.ts +0 -55
- package/src/app/api/db/transaction/route.ts +0 -111
- package/src/app/api/storage/[collection]/route.ts +0 -67
- package/src/app/api/storage/config/route.ts +0 -17
- package/src/app/api/storage/migrate/route.ts +0 -45
- package/src/app/api/storage/route.ts +0 -32
- package/src/app/error.tsx +0 -49
- package/src/app/global-error.tsx +0 -55
- package/src/app/globals.css +0 -146
- package/src/app/icon.svg +0 -42
- package/src/app/layout.tsx +0 -34
- package/src/app/login/login-form.tsx +0 -301
- package/src/app/login/page.tsx +0 -11
- package/src/app/monitoring/page.tsx +0 -8
- package/src/app/not-found.tsx +0 -29
- package/src/app/page.tsx +0 -5
- package/src/components/AIAutopilotPanel.tsx +0 -238
- package/src/components/CodeGenerator.tsx +0 -271
- package/src/components/CommandPalette.tsx +0 -227
- package/src/components/ConnectionModal.tsx +0 -759
- package/src/components/CreateTableModal.tsx +0 -281
- package/src/components/DataCharts.tsx +0 -962
- package/src/components/DataImportModal.tsx +0 -582
- package/src/components/DataProfiler.tsx +0 -335
- package/src/components/DatabaseDocs.tsx +0 -251
- package/src/components/MaskingSettings.tsx +0 -414
- package/src/components/MobileNav.tsx +0 -50
- package/src/components/NL2SQLPanel.tsx +0 -281
- package/src/components/PivotTable.tsx +0 -257
- package/src/components/QueryEditor.tsx +0 -760
- package/src/components/QueryHistory.tsx +0 -344
- package/src/components/QuerySafetyDialog.tsx +0 -290
- package/src/components/ResultsGrid.tsx +0 -644
- package/src/components/SaveQueryModal.tsx +0 -104
- package/src/components/SavedQueries.tsx +0 -128
- package/src/components/SchemaDiagram.tsx +0 -473
- package/src/components/SchemaDiff.tsx +0 -473
- package/src/components/SnapshotTimeline.tsx +0 -116
- package/src/components/Studio.tsx +0 -639
- package/src/components/TestDataGenerator.tsx +0 -261
- package/src/components/VisualExplain.tsx +0 -820
- package/src/components/admin/AdminDashboard.tsx +0 -163
- package/src/components/admin/tabs/AuditTab.tsx +0 -531
- package/src/components/admin/tabs/MonitoringEmbed.tsx +0 -11
- package/src/components/admin/tabs/OperationsTab.tsx +0 -646
- package/src/components/admin/tabs/OverviewTab.tsx +0 -1328
- package/src/components/admin/tabs/SecurityTab.tsx +0 -284
- package/src/components/community-section.tsx +0 -92
- package/src/components/icons/db-icons.tsx +0 -84
- package/src/components/libredb-logo.tsx +0 -61
- package/src/components/monitoring/MonitoringDashboard.tsx +0 -345
- package/src/components/monitoring/tabs/MetricChart.tsx +0 -82
- package/src/components/monitoring/tabs/OverviewTab.tsx +0 -263
- package/src/components/monitoring/tabs/PerformanceTab.tsx +0 -254
- package/src/components/monitoring/tabs/PoolTab.tsx +0 -174
- package/src/components/monitoring/tabs/QueriesTab.tsx +0 -287
- package/src/components/monitoring/tabs/SessionsTab.tsx +0 -316
- package/src/components/monitoring/tabs/StorageTab.tsx +0 -335
- package/src/components/monitoring/tabs/TablesTab.tsx +0 -300
- package/src/components/results-grid/ResultCard.tsx +0 -111
- package/src/components/results-grid/RowDetailSheet.tsx +0 -178
- package/src/components/results-grid/StatsBar.tsx +0 -201
- package/src/components/results-grid/index.ts +0 -1
- package/src/components/results-grid/utils.ts +0 -23
- package/src/components/schema-explorer/ColumnList.tsx +0 -53
- package/src/components/schema-explorer/SchemaExplorer.tsx +0 -182
- package/src/components/schema-explorer/TableItem.tsx +0 -210
- package/src/components/schema-explorer/index.ts +0 -1
- package/src/components/sidebar/ConnectionItem.tsx +0 -105
- package/src/components/sidebar/ConnectionsList.tsx +0 -62
- package/src/components/sidebar/Sidebar.tsx +0 -130
- package/src/components/sidebar/index.ts +0 -2
- package/src/components/studio/BottomPanel.tsx +0 -286
- package/src/components/studio/QueryToolbar.tsx +0 -180
- package/src/components/studio/StudioDesktopHeader.tsx +0 -114
- package/src/components/studio/StudioMobileHeader.tsx +0 -340
- package/src/components/studio/StudioTabBar.tsx +0 -82
- package/src/components/studio/index.ts +0 -5
- package/src/components/ui/accordion.tsx +0 -66
- package/src/components/ui/alert-dialog.tsx +0 -157
- package/src/components/ui/alert.tsx +0 -66
- package/src/components/ui/aspect-ratio.tsx +0 -11
- package/src/components/ui/avatar.tsx +0 -53
- package/src/components/ui/badge.tsx +0 -46
- package/src/components/ui/breadcrumb.tsx +0 -109
- package/src/components/ui/button-group.tsx +0 -83
- package/src/components/ui/button.tsx +0 -60
- package/src/components/ui/calendar.tsx +0 -216
- package/src/components/ui/card.tsx +0 -92
- package/src/components/ui/carousel.tsx +0 -241
- package/src/components/ui/chart.tsx +0 -357
- package/src/components/ui/checkbox.tsx +0 -32
- package/src/components/ui/collapsible.tsx +0 -33
- package/src/components/ui/command.tsx +0 -184
- package/src/components/ui/context-menu.tsx +0 -252
- package/src/components/ui/dialog.tsx +0 -143
- package/src/components/ui/drawer.tsx +0 -135
- package/src/components/ui/dropdown-menu.tsx +0 -257
- package/src/components/ui/empty.tsx +0 -104
- package/src/components/ui/field.tsx +0 -248
- package/src/components/ui/form.tsx +0 -167
- package/src/components/ui/hover-card.tsx +0 -44
- package/src/components/ui/input-group.tsx +0 -170
- package/src/components/ui/input-otp.tsx +0 -77
- package/src/components/ui/input.tsx +0 -21
- package/src/components/ui/item.tsx +0 -193
- package/src/components/ui/kbd.tsx +0 -28
- package/src/components/ui/label.tsx +0 -24
- package/src/components/ui/menubar.tsx +0 -276
- package/src/components/ui/navigation-menu.tsx +0 -168
- package/src/components/ui/pagination.tsx +0 -127
- package/src/components/ui/popover.tsx +0 -48
- package/src/components/ui/progress.tsx +0 -31
- package/src/components/ui/radio-group.tsx +0 -45
- package/src/components/ui/resizable.tsx +0 -56
- package/src/components/ui/scroll-area.tsx +0 -58
- package/src/components/ui/select.tsx +0 -187
- package/src/components/ui/separator.tsx +0 -28
- package/src/components/ui/sheet.tsx +0 -139
- package/src/components/ui/sidebar.tsx +0 -726
- package/src/components/ui/skeleton.tsx +0 -13
- package/src/components/ui/slider.tsx +0 -63
- package/src/components/ui/sonner.tsx +0 -40
- package/src/components/ui/spinner.tsx +0 -16
- package/src/components/ui/switch.tsx +0 -31
- package/src/components/ui/table.tsx +0 -116
- package/src/components/ui/tabs.tsx +0 -66
- package/src/components/ui/textarea.tsx +0 -18
- package/src/components/ui/toggle-group.tsx +0 -83
- package/src/components/ui/toggle.tsx +0 -47
- package/src/components/ui/tooltip.tsx +0 -61
- package/src/exports/components.ts +0 -15
- package/src/exports/index.ts +0 -4
- package/src/exports/providers.ts +0 -4
- package/src/exports/types.ts +0 -26
- package/src/hooks/use-ai-chat.ts +0 -182
- package/src/hooks/use-all-connections.ts +0 -66
- package/src/hooks/use-api-call.ts +0 -71
- package/src/hooks/use-auth.ts +0 -51
- package/src/hooks/use-connection-form.ts +0 -349
- package/src/hooks/use-connection-manager.ts +0 -169
- package/src/hooks/use-connection-payload.ts +0 -15
- package/src/hooks/use-inline-editing.ts +0 -109
- package/src/hooks/use-mobile.ts +0 -20
- package/src/hooks/use-monitoring-data.ts +0 -270
- package/src/hooks/use-provider-metadata.ts +0 -62
- package/src/hooks/use-query-execution.ts +0 -478
- package/src/hooks/use-storage-sync.ts +0 -259
- package/src/hooks/use-tab-manager.ts +0 -231
- package/src/hooks/use-toast.ts +0 -20
- package/src/hooks/use-transaction-control.ts +0 -64
- package/src/lib/api/error-codes.ts +0 -30
- package/src/lib/api/errors.ts +0 -236
- package/src/lib/api/with-error-handler.ts +0 -41
- package/src/lib/audit.ts +0 -105
- package/src/lib/auth.ts +0 -87
- package/src/lib/connection-string-parser.ts +0 -172
- package/src/lib/data-masking.ts +0 -385
- package/src/lib/db/base-provider.ts +0 -325
- package/src/lib/db/errors.ts +0 -317
- package/src/lib/db/factory.ts +0 -324
- package/src/lib/db/index.ts +0 -123
- package/src/lib/db/providers/document/index.ts +0 -6
- package/src/lib/db/providers/document/mongodb.ts +0 -992
- package/src/lib/db/providers/keyvalue/redis.ts +0 -554
- package/src/lib/db/providers/sql/index.ts +0 -11
- package/src/lib/db/providers/sql/sql-base.ts +0 -174
- package/src/lib/db/providers/sql/sqlite.ts +0 -721
- package/src/lib/db/types.ts +0 -437
- package/src/lib/db/utils/pool-manager.ts +0 -287
- package/src/lib/db/utils/query-limiter.ts +0 -239
- package/src/lib/db-ui-config.ts +0 -86
- package/src/lib/editor/mongodb-completions.ts +0 -172
- package/src/lib/editor/sql-completions.ts +0 -280
- package/src/lib/llm/base-provider.ts +0 -117
- package/src/lib/llm/factory.ts +0 -102
- package/src/lib/llm/index.ts +0 -90
- package/src/lib/llm/providers/custom.ts +0 -181
- package/src/lib/llm/providers/gemini.ts +0 -126
- package/src/lib/llm/providers/ollama.ts +0 -154
- package/src/lib/llm/providers/openai.ts +0 -146
- package/src/lib/llm/types.ts +0 -173
- package/src/lib/llm/utils/config.ts +0 -187
- package/src/lib/llm/utils/retry.ts +0 -119
- package/src/lib/llm/utils/streaming.ts +0 -202
- package/src/lib/logger.ts +0 -127
- package/src/lib/monitoring-thresholds.ts +0 -44
- package/src/lib/oidc.ts +0 -262
- package/src/lib/query-generators.ts +0 -61
- package/src/lib/schema-diff/diff-engine.ts +0 -273
- package/src/lib/schema-diff/migration-generator.ts +0 -208
- package/src/lib/schema-diff/types.ts +0 -55
- package/src/lib/seed/config-loader.ts +0 -79
- package/src/lib/seed/connection-filter.ts +0 -49
- package/src/lib/seed/credential-resolver.ts +0 -62
- package/src/lib/seed/index.ts +0 -40
- package/src/lib/seed/resolve-connection.ts +0 -57
- package/src/lib/seed/types.ts +0 -69
- package/src/lib/sql/alias-extractor.ts +0 -267
- package/src/lib/sql/index.ts +0 -8
- package/src/lib/sql/statement-splitter.ts +0 -167
- package/src/lib/sql/types.ts +0 -40
- package/src/lib/ssh/tunnel.ts +0 -142
- package/src/lib/storage/factory.ts +0 -84
- package/src/lib/storage/index.ts +0 -14
- package/src/lib/storage/local-storage.ts +0 -99
- package/src/lib/storage/providers/postgres.ts +0 -225
- package/src/lib/storage/providers/sqlite.ts +0 -153
- package/src/lib/storage/storage-facade.ts +0 -272
- package/src/lib/storage/types.ts +0 -75
- package/src/lib/time-series-buffer.ts +0 -58
- package/src/lib/types.ts +0 -173
- package/src/lib/utils.ts +0 -6
- package/src/proxy.ts +0 -104
- package/src/types/db-drivers.d.ts +0 -23
- package/src/types/html2canvas.d.ts +0 -9
- package/tests/api/admin/audit.test.ts +0 -178
- package/tests/api/admin/fleet-health.test.ts +0 -183
- package/tests/api/ai/autopilot.test.ts +0 -174
- package/tests/api/ai/chat.test.ts +0 -250
- package/tests/api/ai/describe-schema.test.ts +0 -266
- package/tests/api/ai/explain.test.ts +0 -199
- package/tests/api/ai/impact.test.ts +0 -168
- package/tests/api/ai/index-advisor.test.ts +0 -171
- package/tests/api/ai/nl2sql.test.ts +0 -202
- package/tests/api/ai/query-safety.test.ts +0 -196
- package/tests/api/auth/login.test.ts +0 -170
- package/tests/api/auth/logout.test.ts +0 -140
- package/tests/api/auth/me.test.ts +0 -73
- package/tests/api/auth/oidc-callback.test.ts +0 -215
- package/tests/api/auth/oidc-login.test.ts +0 -127
- package/tests/api/db/cancel.test.ts +0 -198
- package/tests/api/db/disconnect.test.ts +0 -124
- package/tests/api/db/health.test.ts +0 -222
- package/tests/api/db/maintenance.test.ts +0 -263
- package/tests/api/db/monitoring.test.ts +0 -221
- package/tests/api/db/multi-query.test.ts +0 -316
- package/tests/api/db/pool-stats.test.ts +0 -135
- package/tests/api/db/profile.test.ts +0 -330
- package/tests/api/db/provider-meta.test.ts +0 -193
- package/tests/api/db/query.test.ts +0 -314
- package/tests/api/db/schema-snapshot.test.ts +0 -170
- package/tests/api/db/schema.test.ts +0 -191
- package/tests/api/db/test-connection.test.ts +0 -185
- package/tests/api/db/transaction.test.ts +0 -314
- package/tests/api/proxy.test.ts +0 -191
- package/tests/api/seed/managed-route.test.ts +0 -113
- package/tests/api/storage/config.test.ts +0 -42
- package/tests/api/storage/storage-routes.test.ts +0 -309
- package/tests/components/AIAutopilotPanel.test.tsx +0 -756
- package/tests/components/AdminPage.test.tsx +0 -33
- package/tests/components/CodeGenerator.test.tsx +0 -182
- package/tests/components/CommandPalette.test.tsx +0 -428
- package/tests/components/CommunitySection.test.tsx +0 -91
- package/tests/components/ConnectionModal.mobile.test.tsx +0 -284
- package/tests/components/ConnectionModal.test.tsx +0 -570
- package/tests/components/CreateTableModal.test.tsx +0 -383
- package/tests/components/DataCharts.test.tsx +0 -739
- package/tests/components/DataImportModal.test.tsx +0 -751
- package/tests/components/DataProfiler.test.tsx +0 -589
- package/tests/components/DatabaseDocs.test.tsx +0 -353
- package/tests/components/LoginPage.test.tsx +0 -163
- package/tests/components/LoginPageOIDC.test.tsx +0 -92
- package/tests/components/MaskingSettings.test.tsx +0 -498
- package/tests/components/MobileNav.test.tsx +0 -30
- package/tests/components/MonitoringPage.test.tsx +0 -32
- package/tests/components/NL2SQLPanel.test.tsx +0 -621
- package/tests/components/Page.test.tsx +0 -33
- package/tests/components/PivotTable.test.tsx +0 -350
- package/tests/components/QueryEditor.test.tsx +0 -1730
- package/tests/components/QueryHistory.test.tsx +0 -572
- package/tests/components/QuerySafetyDialog.test.tsx +0 -586
- package/tests/components/ResultsGrid.test.tsx +0 -804
- package/tests/components/RootLayout.test.tsx +0 -83
- package/tests/components/SaveQueryModal.test.tsx +0 -25
- package/tests/components/SavedQueries.test.tsx +0 -43
- package/tests/components/SchemaDiagram.test.tsx +0 -1034
- package/tests/components/SchemaDiff.test.tsx +0 -906
- package/tests/components/SnapshotTimeline.test.tsx +0 -174
- package/tests/components/Studio.test.tsx +0 -1030
- package/tests/components/TestDataGenerator.test.tsx +0 -291
- package/tests/components/VisualExplain.test.tsx +0 -704
- package/tests/components/admin/AdminDashboard.test.tsx +0 -205
- package/tests/components/admin/AuditTab.test.tsx +0 -220
- package/tests/components/admin/MonitoringEmbed.test.tsx +0 -58
- package/tests/components/admin/OperationsTab.test.tsx +0 -975
- package/tests/components/admin/OverviewTab.test.tsx +0 -254
- package/tests/components/admin/SecurityTab.test.tsx +0 -467
- package/tests/components/monitoring/MetricChart.test.tsx +0 -111
- package/tests/components/monitoring/MonitoringDashboard.test.tsx +0 -259
- package/tests/components/monitoring/OverviewTab.test.tsx +0 -78
- package/tests/components/monitoring/PerformanceTab.test.tsx +0 -87
- package/tests/components/monitoring/PoolTab.test.tsx +0 -42
- package/tests/components/monitoring/QueriesTab.test.tsx +0 -80
- package/tests/components/monitoring/SessionsTab.test.tsx +0 -154
- package/tests/components/monitoring/StorageTab.test.tsx +0 -127
- package/tests/components/monitoring/TablesTab.test.tsx +0 -153
- package/tests/components/results-grid/ResultCard.test.tsx +0 -105
- package/tests/components/results-grid/RowDetailSheet.test.tsx +0 -308
- package/tests/components/results-grid/StatsBar.test.tsx +0 -162
- package/tests/components/schema-explorer/ColumnList.test.tsx +0 -151
- package/tests/components/schema-explorer/SchemaExplorer.test.tsx +0 -461
- package/tests/components/schema-explorer/TableItem.test.tsx +0 -415
- package/tests/components/sidebar/ConnectionItem.test.tsx +0 -201
- package/tests/components/sidebar/ConnectionsList.test.tsx +0 -176
- package/tests/components/sidebar/Sidebar.test.tsx +0 -187
- package/tests/components/studio/BottomPanel.test.tsx +0 -383
- package/tests/components/studio/QueryToolbar.test.tsx +0 -321
- package/tests/components/studio/StudioDesktopHeader.test.tsx +0 -377
- package/tests/components/studio/StudioMobileHeader.test.tsx +0 -198
- package/tests/components/studio/StudioTabBar.test.tsx +0 -331
- package/tests/fixtures/connections.ts +0 -96
- package/tests/fixtures/masking-configs.ts +0 -86
- package/tests/fixtures/query-results.ts +0 -71
- package/tests/fixtures/schemas.ts +0 -64
- package/tests/fixtures/seed-connections/invalid-config.yaml +0 -7
- package/tests/fixtures/seed-connections/minimal-config.yaml +0 -8
- package/tests/fixtures/seed-connections/mixed-credentials.yaml +0 -23
- package/tests/fixtures/seed-connections/multi-role-config.yaml +0 -30
- package/tests/fixtures/seed-connections/valid-config.json +0 -15
- package/tests/fixtures/seed-connections/valid-config.yaml +0 -51
- package/tests/helpers/mock-fetch.ts +0 -59
- package/tests/helpers/mock-monaco.ts +0 -112
- package/tests/helpers/mock-navigation.ts +0 -28
- package/tests/helpers/mock-next.ts +0 -80
- package/tests/helpers/mock-provider.ts +0 -133
- package/tests/helpers/mock-sonner.ts +0 -29
- package/tests/helpers/render-with-providers.tsx +0 -19
- package/tests/hooks/use-ai-chat.test.ts +0 -600
- package/tests/hooks/use-auth.test.ts +0 -371
- package/tests/hooks/use-connection-form.test.ts +0 -743
- package/tests/hooks/use-connection-manager.test.ts +0 -466
- package/tests/hooks/use-inline-editing.test.ts +0 -321
- package/tests/hooks/use-mobile.test.ts +0 -177
- package/tests/hooks/use-monitoring-data.test.ts +0 -819
- package/tests/hooks/use-provider-metadata.test.ts +0 -228
- package/tests/hooks/use-query-execution.test.ts +0 -1212
- package/tests/hooks/use-tab-manager.test.ts +0 -756
- package/tests/hooks/use-toast.test.ts +0 -74
- package/tests/hooks/use-transaction-control.test.ts +0 -211
- package/tests/integration/db/mongodb-provider.test.ts +0 -698
- package/tests/integration/db/mssql-provider.test.ts +0 -840
- package/tests/integration/db/mysql-provider.test.ts +0 -872
- package/tests/integration/db/oracle-provider.test.ts +0 -843
- package/tests/integration/db/postgres-provider.test.ts +0 -1382
- package/tests/integration/db/redis-provider.test.ts +0 -526
- package/tests/integration/db/sqlite-provider.test.ts +0 -480
- package/tests/integration/seed/seed-pipeline.test.ts +0 -102
- package/tests/isolated/factory-singleton.test.ts +0 -150
- package/tests/isolated/use-storage-sync.test.ts +0 -389
- package/tests/run-components.sh +0 -196
- package/tests/setup-dom.ts +0 -58
- package/tests/setup.ts +0 -40
- package/tests/unit/api-errors.test.ts +0 -210
- package/tests/unit/code-generator-functions.test.ts +0 -271
- package/tests/unit/components/column-list.test.tsx +0 -190
- package/tests/unit/components/data-import-modal.test.tsx +0 -441
- package/tests/unit/components/studio-mobile-header.test.tsx +0 -327
- package/tests/unit/data-charts-functions.test.ts +0 -496
- package/tests/unit/data-import-functions.test.ts +0 -320
- package/tests/unit/data-import-utils.test.ts +0 -125
- package/tests/unit/db/base-provider.test.ts +0 -517
- package/tests/unit/db/errors.test.ts +0 -403
- package/tests/unit/db/factory.test.ts +0 -436
- package/tests/unit/db/pool-manager.test.ts +0 -440
- package/tests/unit/db/query-limiter.test.ts +0 -387
- package/tests/unit/db/sql-base.test.ts +0 -438
- package/tests/unit/lib/api/error-codes.test.ts +0 -39
- package/tests/unit/lib/audit.test.ts +0 -326
- package/tests/unit/lib/auth.test.ts +0 -146
- package/tests/unit/lib/connection-string-parser.test.ts +0 -424
- package/tests/unit/lib/data-masking.test.ts +0 -583
- package/tests/unit/lib/db-icons.test.tsx +0 -41
- package/tests/unit/lib/monitoring-thresholds.test.ts +0 -133
- package/tests/unit/lib/oidc.test.ts +0 -509
- package/tests/unit/lib/query-generators.test.ts +0 -127
- package/tests/unit/lib/storage/factory.test.ts +0 -71
- package/tests/unit/lib/storage/local-storage.test.ts +0 -114
- package/tests/unit/lib/storage/providers/postgres.test.ts +0 -312
- package/tests/unit/lib/storage/providers/sqlite.test.ts +0 -232
- package/tests/unit/lib/storage/storage-facade-extended.test.ts +0 -331
- package/tests/unit/lib/storage/storage-facade.test.ts +0 -184
- package/tests/unit/lib/storage.test.ts +0 -317
- package/tests/unit/lib/time-series-buffer.test.ts +0 -212
- package/tests/unit/lib/utils.test.ts +0 -24
- package/tests/unit/llm/base-provider.test.ts +0 -238
- package/tests/unit/llm/config.test.ts +0 -262
- package/tests/unit/llm/custom-provider.test.ts +0 -281
- package/tests/unit/llm/gemini-provider.test.ts +0 -248
- package/tests/unit/llm/llm-factory.test.ts +0 -155
- package/tests/unit/llm/ollama-provider.test.ts +0 -288
- package/tests/unit/llm/openai-provider.test.ts +0 -324
- package/tests/unit/llm/retry.test.ts +0 -180
- package/tests/unit/llm/streaming.test.ts +0 -355
- package/tests/unit/logger.test.ts +0 -198
- package/tests/unit/mongodb-completions.test.ts +0 -516
- package/tests/unit/pivot-table-functions.test.ts +0 -76
- package/tests/unit/query-cancelled-error.test.ts +0 -81
- package/tests/unit/schema-diff/diff-engine.test.ts +0 -367
- package/tests/unit/schema-diff/migration-generator.test.ts +0 -513
- package/tests/unit/seed/config-loader.test.ts +0 -73
- package/tests/unit/seed/connection-filter.test.ts +0 -91
- package/tests/unit/seed/credential-resolver.test.ts +0 -85
- package/tests/unit/seed/index.test.ts +0 -72
- package/tests/unit/seed/resolve-connection.test.ts +0 -74
- package/tests/unit/seed/types.test.ts +0 -129
- package/tests/unit/sql/alias-extractor.test.ts +0 -444
- package/tests/unit/sql/statement-splitter.test.ts +0 -348
- package/tests/unit/sql-completions.test.ts +0 -463
- package/tests/unit/ssh-tunnel.test.ts +0 -465
- package/tsconfig.json +0 -42
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import React, { useState } from 'react';
|
|
4
|
-
import { Users, Skull, Activity, Clock, Loader2 } from 'lucide-react';
|
|
5
|
-
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
|
|
6
|
-
import { Badge } from '@/components/ui/badge';
|
|
7
|
-
import { Button } from '@/components/ui/button';
|
|
8
|
-
import { Skeleton } from '@/components/ui/skeleton';
|
|
9
|
-
import {
|
|
10
|
-
Table,
|
|
11
|
-
TableBody,
|
|
12
|
-
TableCell,
|
|
13
|
-
TableHead,
|
|
14
|
-
TableHeader,
|
|
15
|
-
TableRow,
|
|
16
|
-
} from '@/components/ui/table';
|
|
17
|
-
import {
|
|
18
|
-
Tooltip,
|
|
19
|
-
TooltipContent,
|
|
20
|
-
TooltipProvider,
|
|
21
|
-
TooltipTrigger,
|
|
22
|
-
} from '@/components/ui/tooltip';
|
|
23
|
-
import {
|
|
24
|
-
AlertDialog,
|
|
25
|
-
AlertDialogAction,
|
|
26
|
-
AlertDialogCancel,
|
|
27
|
-
AlertDialogContent,
|
|
28
|
-
AlertDialogDescription,
|
|
29
|
-
AlertDialogFooter,
|
|
30
|
-
AlertDialogHeader,
|
|
31
|
-
AlertDialogTitle,
|
|
32
|
-
} from '@/components/ui/alert-dialog';
|
|
33
|
-
import type { MonitoringData, ActiveSessionDetails } from '@/lib/db/types';
|
|
34
|
-
|
|
35
|
-
interface SessionsTabProps {
|
|
36
|
-
data: MonitoringData | null;
|
|
37
|
-
loading: boolean;
|
|
38
|
-
onKillSession: (pid: number | string) => Promise<boolean>;
|
|
39
|
-
isAdmin?: boolean;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export function SessionsTab({ data, loading, onKillSession, isAdmin = true }: SessionsTabProps) {
|
|
43
|
-
const [killingPid, setKillingPid] = useState<number | string | null>(null);
|
|
44
|
-
const [confirmKill, setConfirmKill] = useState<ActiveSessionDetails | null>(null);
|
|
45
|
-
|
|
46
|
-
if (loading && !data) {
|
|
47
|
-
return <SessionsSkeleton />;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const sessions = data?.activeSessions ?? [];
|
|
51
|
-
|
|
52
|
-
const activeCount = sessions.filter((s) => s.state === 'active').length;
|
|
53
|
-
const idleCount = sessions.filter((s) => s.state === 'idle').length;
|
|
54
|
-
const idleInTxCount = sessions.filter((s) =>
|
|
55
|
-
s.state?.includes('idle in transaction')
|
|
56
|
-
).length;
|
|
57
|
-
const waitingCount = sessions.filter((s) => s.waitEventType).length;
|
|
58
|
-
|
|
59
|
-
const handleKillClick = (session: ActiveSessionDetails) => {
|
|
60
|
-
setConfirmKill(session);
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
const handleConfirmKill = async () => {
|
|
64
|
-
if (!confirmKill) return;
|
|
65
|
-
|
|
66
|
-
setKillingPid(confirmKill.pid);
|
|
67
|
-
setConfirmKill(null);
|
|
68
|
-
|
|
69
|
-
await onKillSession(confirmKill.pid);
|
|
70
|
-
|
|
71
|
-
setKillingPid(null);
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
const getStateBadge = (state: string) => {
|
|
75
|
-
switch (state) {
|
|
76
|
-
case 'active':
|
|
77
|
-
return <Badge className="bg-green-500">Active</Badge>;
|
|
78
|
-
case 'idle':
|
|
79
|
-
return <Badge variant="secondary">Idle</Badge>;
|
|
80
|
-
case 'idle in transaction':
|
|
81
|
-
return <Badge className="bg-yellow-500">Idle in TX</Badge>;
|
|
82
|
-
case 'idle in transaction (aborted)':
|
|
83
|
-
return <Badge variant="destructive">Aborted TX</Badge>;
|
|
84
|
-
default:
|
|
85
|
-
return <Badge variant="outline">{state}</Badge>;
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
return (
|
|
90
|
-
<div className="p-3 sm:p-6 space-y-4 sm:space-y-6">
|
|
91
|
-
{/* Stats Cards */}
|
|
92
|
-
<div className="grid grid-cols-4 gap-2 sm:gap-4">
|
|
93
|
-
<Card className="p-0">
|
|
94
|
-
<CardHeader className="flex flex-row items-center justify-between space-y-0 p-2 sm:p-4 pb-1 sm:pb-2">
|
|
95
|
-
<CardTitle className="text-[10px] sm:text-sm font-medium text-muted-foreground">
|
|
96
|
-
Active
|
|
97
|
-
</CardTitle>
|
|
98
|
-
<Activity className="h-3 w-3 sm:h-4 sm:w-4 text-green-500" />
|
|
99
|
-
</CardHeader>
|
|
100
|
-
<CardContent className="p-2 sm:p-4 pt-0">
|
|
101
|
-
<div className="text-lg sm:text-2xl font-bold">{activeCount}</div>
|
|
102
|
-
</CardContent>
|
|
103
|
-
</Card>
|
|
104
|
-
|
|
105
|
-
<Card className="p-0">
|
|
106
|
-
<CardHeader className="flex flex-row items-center justify-between space-y-0 p-2 sm:p-4 pb-1 sm:pb-2">
|
|
107
|
-
<CardTitle className="text-[10px] sm:text-sm font-medium text-muted-foreground">
|
|
108
|
-
Idle
|
|
109
|
-
</CardTitle>
|
|
110
|
-
<Clock className="h-3 w-3 sm:h-4 sm:w-4 text-muted-foreground" />
|
|
111
|
-
</CardHeader>
|
|
112
|
-
<CardContent className="p-2 sm:p-4 pt-0">
|
|
113
|
-
<div className="text-lg sm:text-2xl font-bold">{idleCount}</div>
|
|
114
|
-
</CardContent>
|
|
115
|
-
</Card>
|
|
116
|
-
|
|
117
|
-
<Card className="p-0">
|
|
118
|
-
<CardHeader className="flex flex-row items-center justify-between space-y-0 p-2 sm:p-4 pb-1 sm:pb-2">
|
|
119
|
-
<CardTitle className="text-[10px] sm:text-sm font-medium text-muted-foreground">
|
|
120
|
-
In TX
|
|
121
|
-
</CardTitle>
|
|
122
|
-
<Clock className={`h-3 w-3 sm:h-4 sm:w-4 ${idleInTxCount > 0 ? 'text-yellow-500' : 'text-muted-foreground'}`} />
|
|
123
|
-
</CardHeader>
|
|
124
|
-
<CardContent className="p-2 sm:p-4 pt-0">
|
|
125
|
-
<div className="text-lg sm:text-2xl font-bold">{idleInTxCount}</div>
|
|
126
|
-
</CardContent>
|
|
127
|
-
</Card>
|
|
128
|
-
|
|
129
|
-
<Card className="p-0">
|
|
130
|
-
<CardHeader className="flex flex-row items-center justify-between space-y-0 p-2 sm:p-4 pb-1 sm:pb-2">
|
|
131
|
-
<CardTitle className="text-[10px] sm:text-sm font-medium text-muted-foreground">
|
|
132
|
-
Wait
|
|
133
|
-
</CardTitle>
|
|
134
|
-
<Users className={`h-3 w-3 sm:h-4 sm:w-4 ${waitingCount > 0 ? 'text-orange-500' : 'text-muted-foreground'}`} />
|
|
135
|
-
</CardHeader>
|
|
136
|
-
<CardContent className="p-2 sm:p-4 pt-0">
|
|
137
|
-
<div className="text-lg sm:text-2xl font-bold">{waitingCount}</div>
|
|
138
|
-
</CardContent>
|
|
139
|
-
</Card>
|
|
140
|
-
</div>
|
|
141
|
-
|
|
142
|
-
{/* Sessions Table */}
|
|
143
|
-
<Card className="p-0">
|
|
144
|
-
<CardHeader className="p-3 sm:p-4">
|
|
145
|
-
<CardTitle className="text-xs sm:text-sm font-medium flex items-center gap-2">
|
|
146
|
-
<Users className="h-3 w-3 sm:h-4 sm:w-4" />
|
|
147
|
-
Sessions ({sessions.length})
|
|
148
|
-
</CardTitle>
|
|
149
|
-
</CardHeader>
|
|
150
|
-
<CardContent className="p-0 sm:p-4 sm:pt-0">
|
|
151
|
-
{sessions.length === 0 ? (
|
|
152
|
-
<div className="text-center py-8 text-muted-foreground">
|
|
153
|
-
<Users className="h-8 w-8 mx-auto mb-2 opacity-50" />
|
|
154
|
-
<p className="text-sm">No active sessions found.</p>
|
|
155
|
-
</div>
|
|
156
|
-
) : (
|
|
157
|
-
<div className="overflow-x-auto">
|
|
158
|
-
<Table>
|
|
159
|
-
<TableHeader>
|
|
160
|
-
<TableRow>
|
|
161
|
-
<TableHead className="text-xs w-[60px]">PID</TableHead>
|
|
162
|
-
<TableHead className="text-xs">User</TableHead>
|
|
163
|
-
<TableHead className="text-xs">State</TableHead>
|
|
164
|
-
<TableHead className="text-xs hidden md:table-cell">Query</TableHead>
|
|
165
|
-
<TableHead className="text-xs">Time</TableHead>
|
|
166
|
-
<TableHead className="text-xs hidden lg:table-cell">Wait</TableHead>
|
|
167
|
-
<TableHead className="text-right text-xs w-12">Act</TableHead>
|
|
168
|
-
</TableRow>
|
|
169
|
-
</TableHeader>
|
|
170
|
-
<TableBody>
|
|
171
|
-
{sessions.map((session) => (
|
|
172
|
-
<TableRow key={session.pid}>
|
|
173
|
-
<TableCell className="font-mono text-[10px] sm:text-xs py-2">
|
|
174
|
-
{session.pid}
|
|
175
|
-
</TableCell>
|
|
176
|
-
<TableCell className="py-2">
|
|
177
|
-
<div className="flex flex-col">
|
|
178
|
-
<span className="font-medium text-xs truncate max-w-[60px] sm:max-w-[100px]">{session.user}</span>
|
|
179
|
-
{session.applicationName && (
|
|
180
|
-
<span className="text-[10px] text-muted-foreground truncate max-w-[60px] sm:max-w-[100px] hidden sm:block">
|
|
181
|
-
{session.applicationName}
|
|
182
|
-
</span>
|
|
183
|
-
)}
|
|
184
|
-
</div>
|
|
185
|
-
</TableCell>
|
|
186
|
-
<TableCell className="py-2">{getStateBadge(session.state)}</TableCell>
|
|
187
|
-
<TableCell className="font-mono text-[10px] hidden md:table-cell py-2">
|
|
188
|
-
<TooltipProvider>
|
|
189
|
-
<Tooltip>
|
|
190
|
-
<TooltipTrigger asChild>
|
|
191
|
-
<div className="max-w-[150px] lg:max-w-[250px] truncate cursor-help">
|
|
192
|
-
{session.query || '-'}
|
|
193
|
-
</div>
|
|
194
|
-
</TooltipTrigger>
|
|
195
|
-
<TooltipContent
|
|
196
|
-
side="bottom"
|
|
197
|
-
className="max-w-lg"
|
|
198
|
-
>
|
|
199
|
-
<pre className="text-xs whitespace-pre-wrap">
|
|
200
|
-
{session.query || 'No query'}
|
|
201
|
-
</pre>
|
|
202
|
-
</TooltipContent>
|
|
203
|
-
</Tooltip>
|
|
204
|
-
</TooltipProvider>
|
|
205
|
-
</TableCell>
|
|
206
|
-
<TableCell className="py-2">
|
|
207
|
-
<Badge
|
|
208
|
-
variant={
|
|
209
|
-
session.durationMs > 60000
|
|
210
|
-
? 'destructive'
|
|
211
|
-
: session.durationMs > 10000
|
|
212
|
-
? 'outline'
|
|
213
|
-
: 'secondary'
|
|
214
|
-
}
|
|
215
|
-
className="text-[10px] sm:text-xs"
|
|
216
|
-
>
|
|
217
|
-
{session.duration}
|
|
218
|
-
</Badge>
|
|
219
|
-
</TableCell>
|
|
220
|
-
<TableCell className="text-[10px] text-muted-foreground hidden lg:table-cell py-2">
|
|
221
|
-
{session.waitEventType
|
|
222
|
-
? `${session.waitEventType}`
|
|
223
|
-
: '-'}
|
|
224
|
-
</TableCell>
|
|
225
|
-
<TableCell className="text-right py-2">
|
|
226
|
-
{isAdmin ? (
|
|
227
|
-
<Button
|
|
228
|
-
variant="ghost"
|
|
229
|
-
size="icon"
|
|
230
|
-
className="h-6 w-6 sm:h-8 sm:w-8 text-destructive hover:text-destructive hover:bg-destructive/10"
|
|
231
|
-
onClick={() => handleKillClick(session)}
|
|
232
|
-
disabled={killingPid === session.pid}
|
|
233
|
-
>
|
|
234
|
-
{killingPid === session.pid ? (
|
|
235
|
-
<Loader2 className="h-3 w-3 sm:h-4 sm:w-4 animate-spin" />
|
|
236
|
-
) : (
|
|
237
|
-
<Skull className="h-3 w-3 sm:h-4 sm:w-4" />
|
|
238
|
-
)}
|
|
239
|
-
</Button>
|
|
240
|
-
) : (
|
|
241
|
-
<span className="text-[10px] text-muted-foreground">-</span>
|
|
242
|
-
)}
|
|
243
|
-
</TableCell>
|
|
244
|
-
</TableRow>
|
|
245
|
-
))}
|
|
246
|
-
</TableBody>
|
|
247
|
-
</Table>
|
|
248
|
-
</div>
|
|
249
|
-
)}
|
|
250
|
-
</CardContent>
|
|
251
|
-
</Card>
|
|
252
|
-
|
|
253
|
-
{/* Confirm Kill Dialog */}
|
|
254
|
-
<AlertDialog open={!!confirmKill} onOpenChange={() => setConfirmKill(null)}>
|
|
255
|
-
<AlertDialogContent>
|
|
256
|
-
<AlertDialogHeader>
|
|
257
|
-
<AlertDialogTitle>Terminate Session?</AlertDialogTitle>
|
|
258
|
-
<AlertDialogDescription>
|
|
259
|
-
Are you sure you want to terminate session{' '}
|
|
260
|
-
<span className="font-mono font-bold">{confirmKill?.pid}</span>?
|
|
261
|
-
<br />
|
|
262
|
-
<br />
|
|
263
|
-
User: <span className="font-medium">{confirmKill?.user}</span>
|
|
264
|
-
<br />
|
|
265
|
-
State: <span className="font-medium">{confirmKill?.state}</span>
|
|
266
|
-
<br />
|
|
267
|
-
<br />
|
|
268
|
-
This action will forcefully end the connection and may cause data
|
|
269
|
-
loss if the session has uncommitted transactions.
|
|
270
|
-
</AlertDialogDescription>
|
|
271
|
-
</AlertDialogHeader>
|
|
272
|
-
<AlertDialogFooter>
|
|
273
|
-
<AlertDialogCancel>Cancel</AlertDialogCancel>
|
|
274
|
-
<AlertDialogAction
|
|
275
|
-
onClick={handleConfirmKill}
|
|
276
|
-
className="bg-destructive text-destructive-foreground hover:bg-destructive/90"
|
|
277
|
-
>
|
|
278
|
-
Terminate
|
|
279
|
-
</AlertDialogAction>
|
|
280
|
-
</AlertDialogFooter>
|
|
281
|
-
</AlertDialogContent>
|
|
282
|
-
</AlertDialog>
|
|
283
|
-
</div>
|
|
284
|
-
);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
function SessionsSkeleton() {
|
|
288
|
-
return (
|
|
289
|
-
<div className="p-6 space-y-6">
|
|
290
|
-
<div className="grid grid-cols-2 sm:grid-cols-4 gap-4">
|
|
291
|
-
{[...Array(4)].map((_, i) => (
|
|
292
|
-
<Card key={i}>
|
|
293
|
-
<CardHeader className="pb-2">
|
|
294
|
-
<Skeleton className="h-4 w-16" />
|
|
295
|
-
</CardHeader>
|
|
296
|
-
<CardContent>
|
|
297
|
-
<Skeleton className="h-8 w-12" />
|
|
298
|
-
</CardContent>
|
|
299
|
-
</Card>
|
|
300
|
-
))}
|
|
301
|
-
</div>
|
|
302
|
-
<Card>
|
|
303
|
-
<CardHeader>
|
|
304
|
-
<Skeleton className="h-5 w-32" />
|
|
305
|
-
</CardHeader>
|
|
306
|
-
<CardContent>
|
|
307
|
-
<div className="space-y-2">
|
|
308
|
-
{[...Array(5)].map((_, i) => (
|
|
309
|
-
<Skeleton key={i} className="h-12 w-full" />
|
|
310
|
-
))}
|
|
311
|
-
</div>
|
|
312
|
-
</CardContent>
|
|
313
|
-
</Card>
|
|
314
|
-
</div>
|
|
315
|
-
);
|
|
316
|
-
}
|
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import { HardDrive, Database, Archive, FolderOpen } from 'lucide-react';
|
|
5
|
-
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
|
|
6
|
-
import { Badge } from '@/components/ui/badge';
|
|
7
|
-
import { Skeleton } from '@/components/ui/skeleton';
|
|
8
|
-
import { Progress } from '@/components/ui/progress';
|
|
9
|
-
import {
|
|
10
|
-
Table,
|
|
11
|
-
TableBody,
|
|
12
|
-
TableCell,
|
|
13
|
-
TableHead,
|
|
14
|
-
TableHeader,
|
|
15
|
-
TableRow,
|
|
16
|
-
} from '@/components/ui/table';
|
|
17
|
-
import type { MonitoringData } from '@/lib/db/types';
|
|
18
|
-
|
|
19
|
-
interface StorageTabProps {
|
|
20
|
-
data: MonitoringData | null;
|
|
21
|
-
loading: boolean;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function StorageTab({ data, loading }: StorageTabProps) {
|
|
25
|
-
if (loading && !data) {
|
|
26
|
-
return <StorageSkeleton />;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const overview = data?.overview;
|
|
30
|
-
const storage = data?.storage ?? [];
|
|
31
|
-
const tables = data?.tables ?? [];
|
|
32
|
-
const indexes = data?.indexes ?? [];
|
|
33
|
-
|
|
34
|
-
// Calculate totals
|
|
35
|
-
const totalTableSize = tables.reduce((sum, t) => sum + t.tableSizeBytes, 0);
|
|
36
|
-
const totalIndexSize = indexes.reduce((sum, i) => sum + i.indexSizeBytes, 0);
|
|
37
|
-
const walStorage = storage.find((s) => s.name === 'WAL');
|
|
38
|
-
|
|
39
|
-
const formatBytes = (bytes: number) => {
|
|
40
|
-
if (bytes >= 1073741824) return `${(bytes / 1073741824).toFixed(2)} GB`;
|
|
41
|
-
if (bytes >= 1048576) return `${(bytes / 1048576).toFixed(2)} MB`;
|
|
42
|
-
if (bytes >= 1024) return `${(bytes / 1024).toFixed(2)} KB`;
|
|
43
|
-
return `${bytes} B`;
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
// Calculate storage breakdown
|
|
47
|
-
const totalSize = overview?.databaseSizeBytes ?? 0;
|
|
48
|
-
const tablePercent = totalSize > 0 ? (totalTableSize / totalSize) * 100 : 0;
|
|
49
|
-
const indexPercent = totalSize > 0 ? (totalIndexSize / totalSize) * 100 : 0;
|
|
50
|
-
const otherPercent = Math.max(0, 100 - tablePercent - indexPercent);
|
|
51
|
-
|
|
52
|
-
return (
|
|
53
|
-
<div className="p-3 sm:p-6 space-y-4 sm:space-y-6">
|
|
54
|
-
{/* Stats Cards */}
|
|
55
|
-
<div className="grid grid-cols-2 lg:grid-cols-4 gap-2 sm:gap-4">
|
|
56
|
-
<Card className="p-0">
|
|
57
|
-
<CardHeader className="flex flex-row items-center justify-between space-y-0 p-2 sm:p-4 pb-1 sm:pb-2">
|
|
58
|
-
<CardTitle className="text-[10px] sm:text-sm font-medium text-muted-foreground">
|
|
59
|
-
DB Size
|
|
60
|
-
</CardTitle>
|
|
61
|
-
<Database className="h-3 w-3 sm:h-4 sm:w-4 text-blue-500" />
|
|
62
|
-
</CardHeader>
|
|
63
|
-
<CardContent className="p-2 sm:p-4 pt-0">
|
|
64
|
-
<div className="text-lg sm:text-2xl font-bold truncate">
|
|
65
|
-
{overview?.databaseSize || 'N/A'}
|
|
66
|
-
</div>
|
|
67
|
-
</CardContent>
|
|
68
|
-
</Card>
|
|
69
|
-
|
|
70
|
-
<Card className="p-0">
|
|
71
|
-
<CardHeader className="flex flex-row items-center justify-between space-y-0 p-2 sm:p-4 pb-1 sm:pb-2">
|
|
72
|
-
<CardTitle className="text-[10px] sm:text-sm font-medium text-muted-foreground">
|
|
73
|
-
Tables
|
|
74
|
-
</CardTitle>
|
|
75
|
-
<HardDrive className="h-3 w-3 sm:h-4 sm:w-4 text-green-500" />
|
|
76
|
-
</CardHeader>
|
|
77
|
-
<CardContent className="p-2 sm:p-4 pt-0">
|
|
78
|
-
<div className="text-lg sm:text-2xl font-bold truncate">{formatBytes(totalTableSize)}</div>
|
|
79
|
-
<p className="text-[10px] sm:text-xs text-muted-foreground mt-1">
|
|
80
|
-
{tablePercent.toFixed(1)}%
|
|
81
|
-
</p>
|
|
82
|
-
</CardContent>
|
|
83
|
-
</Card>
|
|
84
|
-
|
|
85
|
-
<Card className="p-0">
|
|
86
|
-
<CardHeader className="flex flex-row items-center justify-between space-y-0 p-2 sm:p-4 pb-1 sm:pb-2">
|
|
87
|
-
<CardTitle className="text-[10px] sm:text-sm font-medium text-muted-foreground">
|
|
88
|
-
Indexes
|
|
89
|
-
</CardTitle>
|
|
90
|
-
<Archive className="h-3 w-3 sm:h-4 sm:w-4 text-purple-500" />
|
|
91
|
-
</CardHeader>
|
|
92
|
-
<CardContent className="p-2 sm:p-4 pt-0">
|
|
93
|
-
<div className="text-lg sm:text-2xl font-bold truncate">{formatBytes(totalIndexSize)}</div>
|
|
94
|
-
<p className="text-[10px] sm:text-xs text-muted-foreground mt-1">
|
|
95
|
-
{indexPercent.toFixed(1)}%
|
|
96
|
-
</p>
|
|
97
|
-
</CardContent>
|
|
98
|
-
</Card>
|
|
99
|
-
|
|
100
|
-
<Card className="p-0">
|
|
101
|
-
<CardHeader className="flex flex-row items-center justify-between space-y-0 p-2 sm:p-4 pb-1 sm:pb-2">
|
|
102
|
-
<CardTitle className="text-[10px] sm:text-sm font-medium text-muted-foreground">
|
|
103
|
-
WAL
|
|
104
|
-
</CardTitle>
|
|
105
|
-
<FolderOpen className="h-3 w-3 sm:h-4 sm:w-4 text-orange-500" />
|
|
106
|
-
</CardHeader>
|
|
107
|
-
<CardContent className="p-2 sm:p-4 pt-0">
|
|
108
|
-
<div className="text-lg sm:text-2xl font-bold truncate">
|
|
109
|
-
{walStorage?.walSize || walStorage?.size || 'N/A'}
|
|
110
|
-
</div>
|
|
111
|
-
</CardContent>
|
|
112
|
-
</Card>
|
|
113
|
-
</div>
|
|
114
|
-
|
|
115
|
-
{/* Storage Breakdown */}
|
|
116
|
-
<Card className="p-0">
|
|
117
|
-
<CardHeader className="p-3 sm:p-4 pb-2">
|
|
118
|
-
<CardTitle className="text-xs sm:text-sm font-medium flex items-center gap-2">
|
|
119
|
-
<HardDrive className="h-3 w-3 sm:h-4 sm:w-4" />
|
|
120
|
-
Storage Breakdown
|
|
121
|
-
</CardTitle>
|
|
122
|
-
</CardHeader>
|
|
123
|
-
<CardContent className="p-3 sm:p-4 pt-0 space-y-3 sm:space-y-4">
|
|
124
|
-
<div className="space-y-2 sm:space-y-3">
|
|
125
|
-
<div>
|
|
126
|
-
<div className="flex items-center justify-between text-xs sm:text-sm mb-1">
|
|
127
|
-
<span className="flex items-center gap-1 sm:gap-2">
|
|
128
|
-
<div className="w-2 h-2 sm:w-3 sm:h-3 rounded-sm bg-green-500" />
|
|
129
|
-
Tables
|
|
130
|
-
</span>
|
|
131
|
-
<span className="font-medium">{formatBytes(totalTableSize)}</span>
|
|
132
|
-
</div>
|
|
133
|
-
<Progress value={tablePercent} className="h-1.5 sm:h-2" />
|
|
134
|
-
</div>
|
|
135
|
-
|
|
136
|
-
<div>
|
|
137
|
-
<div className="flex items-center justify-between text-xs sm:text-sm mb-1">
|
|
138
|
-
<span className="flex items-center gap-1 sm:gap-2">
|
|
139
|
-
<div className="w-2 h-2 sm:w-3 sm:h-3 rounded-sm bg-purple-500" />
|
|
140
|
-
Indexes
|
|
141
|
-
</span>
|
|
142
|
-
<span className="font-medium">{formatBytes(totalIndexSize)}</span>
|
|
143
|
-
</div>
|
|
144
|
-
<Progress value={indexPercent} className="h-1.5 sm:h-2 [&>div]:bg-purple-500" />
|
|
145
|
-
</div>
|
|
146
|
-
|
|
147
|
-
<div>
|
|
148
|
-
<div className="flex items-center justify-between text-xs sm:text-sm mb-1">
|
|
149
|
-
<span className="flex items-center gap-1 sm:gap-2">
|
|
150
|
-
<div className="w-2 h-2 sm:w-3 sm:h-3 rounded-sm bg-muted-foreground" />
|
|
151
|
-
<span className="hidden sm:inline">Other (TOAST, FSM)</span>
|
|
152
|
-
<span className="sm:hidden">Other</span>
|
|
153
|
-
</span>
|
|
154
|
-
<span className="font-medium">
|
|
155
|
-
{formatBytes(totalSize - totalTableSize - totalIndexSize)}
|
|
156
|
-
</span>
|
|
157
|
-
</div>
|
|
158
|
-
<Progress value={otherPercent} className="h-1.5 sm:h-2 [&>div]:bg-muted-foreground" />
|
|
159
|
-
</div>
|
|
160
|
-
</div>
|
|
161
|
-
</CardContent>
|
|
162
|
-
</Card>
|
|
163
|
-
|
|
164
|
-
{/* Tablespaces */}
|
|
165
|
-
<Card className="p-0">
|
|
166
|
-
<CardHeader className="p-3 sm:p-4 pb-2">
|
|
167
|
-
<CardTitle className="text-xs sm:text-sm font-medium flex items-center gap-2">
|
|
168
|
-
<FolderOpen className="h-3 w-3 sm:h-4 sm:w-4" />
|
|
169
|
-
Tablespaces
|
|
170
|
-
</CardTitle>
|
|
171
|
-
</CardHeader>
|
|
172
|
-
<CardContent className="p-0 sm:p-4 sm:pt-0">
|
|
173
|
-
{storage.length === 0 ? (
|
|
174
|
-
<div className="text-center py-8 text-muted-foreground">
|
|
175
|
-
<FolderOpen className="h-8 w-8 mx-auto mb-2 opacity-50" />
|
|
176
|
-
<p className="text-sm">No tablespace information available.</p>
|
|
177
|
-
</div>
|
|
178
|
-
) : (
|
|
179
|
-
<div className="overflow-x-auto">
|
|
180
|
-
<Table>
|
|
181
|
-
<TableHeader>
|
|
182
|
-
<TableRow>
|
|
183
|
-
<TableHead className="text-xs">Name</TableHead>
|
|
184
|
-
<TableHead className="text-xs hidden md:table-cell">Location</TableHead>
|
|
185
|
-
<TableHead className="text-right text-xs">Size</TableHead>
|
|
186
|
-
<TableHead className="text-right text-xs hidden sm:table-cell">Usage</TableHead>
|
|
187
|
-
</TableRow>
|
|
188
|
-
</TableHeader>
|
|
189
|
-
<TableBody>
|
|
190
|
-
{storage.map((ts) => (
|
|
191
|
-
<TableRow key={ts.name}>
|
|
192
|
-
<TableCell className="py-2">
|
|
193
|
-
<div className="flex items-center gap-1 sm:gap-2">
|
|
194
|
-
<FolderOpen className="h-3 w-3 sm:h-4 sm:w-4 text-muted-foreground flex-shrink-0" />
|
|
195
|
-
<span className="font-medium text-xs sm:text-sm truncate max-w-[80px] sm:max-w-none">{ts.name}</span>
|
|
196
|
-
{ts.name === 'pg_default' && (
|
|
197
|
-
<Badge variant="secondary" className="text-[10px] sm:text-xs hidden sm:inline-flex">Default</Badge>
|
|
198
|
-
)}
|
|
199
|
-
{ts.name === 'WAL' && (
|
|
200
|
-
<Badge variant="outline" className="text-[10px] sm:text-xs hidden sm:inline-flex">WAL</Badge>
|
|
201
|
-
)}
|
|
202
|
-
</div>
|
|
203
|
-
</TableCell>
|
|
204
|
-
<TableCell className="font-mono text-[10px] sm:text-xs text-muted-foreground hidden md:table-cell py-2">
|
|
205
|
-
{ts.location || 'default'}
|
|
206
|
-
</TableCell>
|
|
207
|
-
<TableCell className="text-right text-xs py-2">{ts.size}</TableCell>
|
|
208
|
-
<TableCell className="text-right hidden sm:table-cell py-2">
|
|
209
|
-
{ts.usagePercent !== undefined ? (
|
|
210
|
-
<div className="flex items-center justify-end gap-1 sm:gap-2">
|
|
211
|
-
<Progress
|
|
212
|
-
value={ts.usagePercent}
|
|
213
|
-
className="w-12 sm:w-16 h-1.5 sm:h-2"
|
|
214
|
-
/>
|
|
215
|
-
<span className="text-xs w-10 sm:w-12">
|
|
216
|
-
{ts.usagePercent.toFixed(0)}%
|
|
217
|
-
</span>
|
|
218
|
-
</div>
|
|
219
|
-
) : (
|
|
220
|
-
'-'
|
|
221
|
-
)}
|
|
222
|
-
</TableCell>
|
|
223
|
-
</TableRow>
|
|
224
|
-
))}
|
|
225
|
-
</TableBody>
|
|
226
|
-
</Table>
|
|
227
|
-
</div>
|
|
228
|
-
)}
|
|
229
|
-
</CardContent>
|
|
230
|
-
</Card>
|
|
231
|
-
|
|
232
|
-
{/* Top Tables by Size */}
|
|
233
|
-
<Card className="p-0">
|
|
234
|
-
<CardHeader className="p-3 sm:p-4 pb-2">
|
|
235
|
-
<CardTitle className="text-xs sm:text-sm font-medium flex items-center gap-2">
|
|
236
|
-
<Database className="h-3 w-3 sm:h-4 sm:w-4" />
|
|
237
|
-
Largest Tables
|
|
238
|
-
</CardTitle>
|
|
239
|
-
</CardHeader>
|
|
240
|
-
<CardContent className="p-0 sm:p-4 sm:pt-0">
|
|
241
|
-
{tables.length === 0 ? (
|
|
242
|
-
<div className="text-center py-8 text-muted-foreground">
|
|
243
|
-
<Database className="h-8 w-8 mx-auto mb-2 opacity-50" />
|
|
244
|
-
<p className="text-sm">No table information available.</p>
|
|
245
|
-
</div>
|
|
246
|
-
) : (
|
|
247
|
-
<div className="overflow-x-auto">
|
|
248
|
-
<Table>
|
|
249
|
-
<TableHeader>
|
|
250
|
-
<TableRow>
|
|
251
|
-
<TableHead className="text-xs">Table</TableHead>
|
|
252
|
-
<TableHead className="text-right text-xs">Size</TableHead>
|
|
253
|
-
<TableHead className="text-right text-xs hidden sm:table-cell">% of DB</TableHead>
|
|
254
|
-
</TableRow>
|
|
255
|
-
</TableHeader>
|
|
256
|
-
<TableBody>
|
|
257
|
-
{tables
|
|
258
|
-
.slice()
|
|
259
|
-
.sort((a, b) => b.totalSizeBytes - a.totalSizeBytes)
|
|
260
|
-
.slice(0, 10)
|
|
261
|
-
.map((table) => {
|
|
262
|
-
const percent =
|
|
263
|
-
totalSize > 0
|
|
264
|
-
? (table.totalSizeBytes / totalSize) * 100
|
|
265
|
-
: 0;
|
|
266
|
-
return (
|
|
267
|
-
<TableRow key={`${table.schemaName}.${table.tableName}`}>
|
|
268
|
-
<TableCell className="py-2">
|
|
269
|
-
<div className="flex flex-col">
|
|
270
|
-
<span className="font-medium text-xs sm:text-sm truncate max-w-[100px] sm:max-w-[200px]">{table.tableName}</span>
|
|
271
|
-
<span className="text-[10px] sm:text-xs text-muted-foreground">
|
|
272
|
-
{table.schemaName}
|
|
273
|
-
</span>
|
|
274
|
-
</div>
|
|
275
|
-
</TableCell>
|
|
276
|
-
<TableCell className="text-right text-xs py-2">
|
|
277
|
-
{table.totalSize}
|
|
278
|
-
</TableCell>
|
|
279
|
-
<TableCell className="text-right hidden sm:table-cell py-2">
|
|
280
|
-
<div className="flex items-center justify-end gap-1 sm:gap-2">
|
|
281
|
-
<Progress
|
|
282
|
-
value={percent}
|
|
283
|
-
className="w-12 sm:w-16 h-1.5 sm:h-2"
|
|
284
|
-
/>
|
|
285
|
-
<span className="text-xs w-10 sm:w-12">
|
|
286
|
-
{percent.toFixed(1)}%
|
|
287
|
-
</span>
|
|
288
|
-
</div>
|
|
289
|
-
</TableCell>
|
|
290
|
-
</TableRow>
|
|
291
|
-
);
|
|
292
|
-
})}
|
|
293
|
-
</TableBody>
|
|
294
|
-
</Table>
|
|
295
|
-
</div>
|
|
296
|
-
)}
|
|
297
|
-
</CardContent>
|
|
298
|
-
</Card>
|
|
299
|
-
</div>
|
|
300
|
-
);
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
function StorageSkeleton() {
|
|
304
|
-
return (
|
|
305
|
-
<div className="p-3 sm:p-6 space-y-4 sm:space-y-6">
|
|
306
|
-
<div className="grid grid-cols-2 lg:grid-cols-4 gap-2 sm:gap-4">
|
|
307
|
-
{[...Array(4)].map((_, i) => (
|
|
308
|
-
<Card key={i} className="p-0">
|
|
309
|
-
<CardHeader className="p-2 sm:p-4 pb-1 sm:pb-2">
|
|
310
|
-
<Skeleton className="h-3 sm:h-4 w-12 sm:w-20" />
|
|
311
|
-
</CardHeader>
|
|
312
|
-
<CardContent className="p-2 sm:p-4 pt-0">
|
|
313
|
-
<Skeleton className="h-5 sm:h-8 w-16 sm:w-24" />
|
|
314
|
-
</CardContent>
|
|
315
|
-
</Card>
|
|
316
|
-
))}
|
|
317
|
-
</div>
|
|
318
|
-
<Card className="p-0">
|
|
319
|
-
<CardHeader className="p-3 sm:p-4">
|
|
320
|
-
<Skeleton className="h-4 sm:h-5 w-24 sm:w-32" />
|
|
321
|
-
</CardHeader>
|
|
322
|
-
<CardContent className="p-3 sm:p-4 pt-0">
|
|
323
|
-
<div className="space-y-2 sm:space-y-3">
|
|
324
|
-
{[...Array(3)].map((_, i) => (
|
|
325
|
-
<div key={i}>
|
|
326
|
-
<Skeleton className="h-3 sm:h-4 w-full mb-1 sm:mb-2" />
|
|
327
|
-
<Skeleton className="h-1.5 sm:h-2 w-full" />
|
|
328
|
-
</div>
|
|
329
|
-
))}
|
|
330
|
-
</div>
|
|
331
|
-
</CardContent>
|
|
332
|
-
</Card>
|
|
333
|
-
</div>
|
|
334
|
-
);
|
|
335
|
-
}
|