@marimo-team/frontend 0.23.10-dev13 → 0.23.10-dev15
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/assets/{CellStatus-BNpTS2Th.js → CellStatus-DBCUeYom.js} +1 -1
- package/dist/assets/{JsonOutput-CPYntVn7.js → JsonOutput-DGEPX_U5.js} +1 -1
- package/dist/assets/{MarimoErrorOutput-D8_FYh4M.js → MarimoErrorOutput-DIJTbU5d.js} +1 -1
- package/dist/assets/{RenderHTML-BlI-DkEC.js → RenderHTML-qGqz4NiE.js} +1 -1
- package/dist/assets/{add-cell-with-ai-BLPYuDtc.js → add-cell-with-ai-CQkUzyP3.js} +1 -1
- package/dist/assets/{add-connection-dialog-BUOUhMLU.js → add-connection-dialog-BUFzOFYX.js} +1 -1
- package/dist/assets/{agent-panel-BWh5ASpI.js → agent-panel-DlYDz4qP.js} +1 -1
- package/dist/assets/{ai-model-dropdown-WfztO91E.js → ai-model-dropdown-C5lp905U.js} +1 -1
- package/dist/assets/{app-config-button-BhsBqwXH.js → app-config-button-B3EMY4W-.js} +1 -1
- package/dist/assets/{cell-editor-BSGwHnNC.js → cell-editor-CrAhJjif.js} +1 -1
- package/dist/assets/{cell-link-CB8WeUi5.js → cell-link-B2tOB9zv.js} +1 -1
- package/dist/assets/cells-BSWdJzbh.css +2 -0
- package/dist/assets/{cells-DrYr16TO.js → cells-Dyr2Cxn6.js} +1 -1
- package/dist/assets/{chat-display-DKS2riey.js → chat-display-CcwEW-Va.js} +1 -1
- package/dist/assets/{chat-panel-B2g8DKMb.js → chat-panel-Dw1BV-OA.js} +1 -1
- package/dist/assets/{chat-ui-CoZhAigw.js → chat-ui-BZZRPW8P.js} +1 -1
- package/dist/assets/{column-preview-B16EcXyK.js → column-preview-hU-wRhzi.js} +1 -1
- package/dist/assets/{command-palette-BDdSMeT0.js → command-palette-xXQxsnka.js} +1 -1
- package/dist/assets/{common-zEvAGAwj.js → common-Dsnmg6kC.js} +1 -1
- package/dist/assets/{components-LGou1UYG.js → components-D4zOWrhC.js} +1 -1
- package/dist/assets/{components-CB5nynlN.js → components-DQogqSMb.js} +1 -1
- package/dist/assets/{datasource-BKe0SLTo.js → datasource-D9RRY7kK.js} +1 -1
- package/dist/assets/{dependency-graph-panel-C2rUhrcE.js → dependency-graph-panel-UxxutAZg.js} +1 -1
- package/dist/assets/{documentation-panel-cQaGwB7v.js → documentation-panel-DfIIxS_V.js} +1 -1
- package/dist/assets/{download-DZUw3TyK.js → download-MIvlXU8i.js} +1 -1
- package/dist/assets/{edit-page-xztDGvY6.js → edit-page-CwdKjeTp.js} +3 -3
- package/dist/assets/{error-panel-D3mqrmOy.js → error-panel-CU66qc8N.js} +1 -1
- package/dist/assets/{file-explorer-panel-DeEwvxtD.js → file-explorer-panel-ClfGP6Ua.js} +1 -1
- package/dist/assets/{file-icons-C8WXgGhY.js → file-icons-CvVoOcQr.js} +1 -1
- package/dist/assets/{floating-outline-3J8SCP2i.js → floating-outline-DuZ8hFxl.js} +1 -1
- package/dist/assets/{focus-1NHETejS.js → focus-bL0sQrG8.js} +1 -1
- package/dist/assets/{form-66bEiwKr.js → form-BrX51bbP.js} +1 -1
- package/dist/assets/{home-page-C5b2fGpl.js → home-page-BnJvN77T.js} +1 -1
- package/dist/assets/{hooks-C14Ebau9.js → hooks-1lgPYJ80.js} +1 -1
- package/dist/assets/{html-to-image-C9fYqzra.js → html-to-image-B9LO7s0l.js} +1 -1
- package/dist/assets/{index-BQp8477C.js → index-mrajVkVt.js} +3 -3
- package/dist/assets/{kiosk-mode-e_ceeRFY.js → kiosk-mode-DNY8H2aJ.js} +1 -1
- package/dist/assets/{layout-DaBkZvqU.js → layout-DTpYObtB.js} +3 -3
- package/dist/assets/{logs-panel-C1ViUa_T.js → logs-panel-BgpFQDtQ.js} +1 -1
- package/dist/assets/{markdown-renderer-DY7HNEoY.js → markdown-renderer-Cx6P_Rvs.js} +1 -1
- package/dist/assets/{name-cell-input-DMOCXKaK.js → name-cell-input-KR7MtQIf.js} +1 -1
- package/dist/assets/{outline-panel-Ck8BQkF3.js → outline-panel-2vIdGtaQ.js} +1 -1
- package/dist/assets/{packages-panel-a9lhnFOg.js → packages-panel-CSyNZTwN.js} +1 -1
- package/dist/assets/{panels-DRxv7U4C.js → panels-D1T7mRci.js} +1 -1
- package/dist/assets/{process-output-BswD2k4M.js → process-output-CTmEUdBf.js} +1 -1
- package/dist/assets/{radio-group-2AaAWNrb.js → radio-group-p6lAM9tc.js} +1 -1
- package/dist/assets/{readonly-python-code-8smCAF83.js → readonly-python-code-CL0q8S9t.js} +1 -1
- package/dist/assets/{reveal-component-D-_WBPSy.js → reveal-component-SRmvh0fi.js} +1 -1
- package/dist/assets/{run-page-Dbr9JuQ-.js → run-page-DI0e4k54.js} +1 -1
- package/dist/assets/{scratchpad-panel-D_ImFN9n.js → scratchpad-panel-CDpXrEp_.js} +1 -1
- package/dist/assets/session-panel-Bt5f7nLH.js +1 -0
- package/dist/assets/{snippets-panel-Dew8dvfp.js → snippets-panel-rLsWyMjp.js} +1 -1
- package/dist/assets/{state-ZFlMDeHg.js → state-B7vCc_yy.js} +1 -1
- package/dist/assets/{state-DttgoaV8.js → state-Son3oz4a.js} +1 -1
- package/dist/assets/{textarea-Cxjg9eKY.js → textarea-AEYw_n1w.js} +1 -1
- package/dist/assets/{tracing-Dt4NocdT.js → tracing-OGYlH3P0.js} +1 -1
- package/dist/assets/{tracing-panel-79O4yC1b.js → tracing-panel-BIDM6lEG.js} +2 -2
- package/dist/assets/{useCellActionButton-eohdjp8c.js → useCellActionButton-Cd1h-LBQ.js} +1 -1
- package/dist/assets/{useDeleteCell-C43PMWBl.js → useDeleteCell-DoiCfKgy.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-BfzEwyF5.js → useDependencyPanelTab-ozLlME1e.js} +1 -1
- package/dist/assets/{useNotebookActions-BKdPPMYL.js → useNotebookActions-DnzCAtfZ.js} +1 -1
- package/dist/assets/{useRunCells-B7Ie4Pwb.js → useRunCells-Bh5DAPQ3.js} +1 -1
- package/dist/assets/{useSplitCell-BJAP3FSl.js → useSplitCell-Co77o43P.js} +1 -1
- package/dist/index.html +23 -23
- package/package.json +1 -1
- package/src/components/datasources/__tests__/filter-empty.test.ts +183 -0
- package/src/components/datasources/datasources.tsx +107 -3
- package/src/components/editor/documentation.css +16 -0
- package/src/core/datasets/data-source-connections.ts +2 -0
- package/dist/assets/cells-jmgGt1lS.css +0 -2
- package/dist/assets/session-panel-BpIqcHC5.js +0 -1
package/dist/index.html
CHANGED
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
<marimo-server-token data-token="{{ server_token }}" hidden></marimo-server-token>
|
|
67
67
|
<!-- /TODO -->
|
|
68
68
|
<title>{{ title }}</title>
|
|
69
|
-
<script type="module" crossorigin src="./assets/index-
|
|
69
|
+
<script type="module" crossorigin src="./assets/index-mrajVkVt.js"></script>
|
|
70
70
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-BPPi7vOr.js">
|
|
71
71
|
<link rel="modulepreload" crossorigin href="./assets/chunk-LvLJmgfZ.js">
|
|
72
72
|
<link rel="modulepreload" crossorigin href="./assets/react-Bj1aDYRI.js">
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
<link rel="modulepreload" crossorigin href="./assets/debounce-DhnxH9Rh.js">
|
|
134
134
|
<link rel="modulepreload" crossorigin href="./assets/database-zap-kIkTfzTX.js">
|
|
135
135
|
<link rel="modulepreload" crossorigin href="./assets/main-B0OX4z33.js">
|
|
136
|
-
<link rel="modulepreload" crossorigin href="./assets/cells-
|
|
136
|
+
<link rel="modulepreload" crossorigin href="./assets/cells-Dyr2Cxn6.js">
|
|
137
137
|
<link rel="modulepreload" crossorigin href="./assets/ErrorBoundary-DyYDV0HI.js">
|
|
138
138
|
<link rel="modulepreload" crossorigin href="./assets/kbd-CTUAEnEx.js">
|
|
139
139
|
<link rel="modulepreload" crossorigin href="./assets/useInstallPackage-GI6gu7_S.js">
|
|
@@ -147,35 +147,35 @@
|
|
|
147
147
|
<link rel="modulepreload" crossorigin href="./assets/usePress-DQ_tAz5W.js">
|
|
148
148
|
<link rel="modulepreload" crossorigin href="./assets/input-C3Hrdlqq.js">
|
|
149
149
|
<link rel="modulepreload" crossorigin href="./assets/ImperativeModal-B3Th7k4R.js">
|
|
150
|
-
<link rel="modulepreload" crossorigin href="./assets/cell-link-
|
|
150
|
+
<link rel="modulepreload" crossorigin href="./assets/cell-link-B2tOB9zv.js">
|
|
151
151
|
<link rel="modulepreload" crossorigin href="./assets/multi-map-CUuNtzHt.js">
|
|
152
152
|
<link rel="modulepreload" crossorigin href="./assets/alert-yTS3WpF4.js">
|
|
153
153
|
<link rel="modulepreload" crossorigin href="./assets/chevron-right-CG5QYXYk.js">
|
|
154
154
|
<link rel="modulepreload" crossorigin href="./assets/dropdown-menu-CR7cnzLX.js">
|
|
155
155
|
<link rel="modulepreload" crossorigin href="./assets/links-D1JoyKTt.js">
|
|
156
|
-
<link rel="modulepreload" crossorigin href="./assets/useRunCells-
|
|
156
|
+
<link rel="modulepreload" crossorigin href="./assets/useRunCells-Bh5DAPQ3.js">
|
|
157
157
|
<link rel="modulepreload" crossorigin href="./assets/copy-LK56fFow.js">
|
|
158
158
|
<link rel="modulepreload" crossorigin href="./assets/copy-BwrPA9zQ.js">
|
|
159
159
|
<link rel="modulepreload" crossorigin href="./assets/copy-icon-D_qz1txR.js">
|
|
160
|
-
<link rel="modulepreload" crossorigin href="./assets/RenderHTML-
|
|
161
|
-
<link rel="modulepreload" crossorigin href="./assets/datasource-
|
|
162
|
-
<link rel="modulepreload" crossorigin href="./assets/state-
|
|
160
|
+
<link rel="modulepreload" crossorigin href="./assets/RenderHTML-qGqz4NiE.js">
|
|
161
|
+
<link rel="modulepreload" crossorigin href="./assets/datasource-D9RRY7kK.js">
|
|
162
|
+
<link rel="modulepreload" crossorigin href="./assets/state-Son3oz4a.js">
|
|
163
163
|
<link rel="modulepreload" crossorigin href="./assets/package-Tv6ztuzw.js">
|
|
164
164
|
<link rel="modulepreload" crossorigin href="./assets/sparkles-lWUAsPhp.js">
|
|
165
|
-
<link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-
|
|
165
|
+
<link rel="modulepreload" crossorigin href="./assets/MarimoErrorOutput-DIJTbU5d.js">
|
|
166
166
|
<link rel="modulepreload" crossorigin href="./assets/spinner-Bhir8k53.js">
|
|
167
|
-
<link rel="modulepreload" crossorigin href="./assets/html-to-image-
|
|
168
|
-
<link rel="modulepreload" crossorigin href="./assets/focus-
|
|
167
|
+
<link rel="modulepreload" crossorigin href="./assets/html-to-image-B9LO7s0l.js">
|
|
168
|
+
<link rel="modulepreload" crossorigin href="./assets/focus-bL0sQrG8.js">
|
|
169
169
|
<link rel="modulepreload" crossorigin href="./assets/useAsyncData-bgszE9F0.js">
|
|
170
170
|
<link rel="modulepreload" crossorigin href="./assets/LazyAnyLanguageCodeMirror-DXGWNDPu.js">
|
|
171
171
|
<link rel="modulepreload" crossorigin href="./assets/micromark-factory-space-BygYYKhs.js">
|
|
172
172
|
<link rel="modulepreload" crossorigin href="./assets/chunk-5FQGJX7Z-D9iBG0F7.js">
|
|
173
|
-
<link rel="modulepreload" crossorigin href="./assets/markdown-renderer-
|
|
173
|
+
<link rel="modulepreload" crossorigin href="./assets/markdown-renderer-Cx6P_Rvs.js">
|
|
174
174
|
<link rel="modulepreload" crossorigin href="./assets/command-KARR7KMq.js">
|
|
175
175
|
<link rel="modulepreload" crossorigin href="./assets/field-zLmMOSA4.js">
|
|
176
176
|
<link rel="modulepreload" crossorigin href="./assets/popover-Bz_0Vkyf.js">
|
|
177
177
|
<link rel="modulepreload" crossorigin href="./assets/errors-vr57w7Ul.js">
|
|
178
|
-
<link rel="modulepreload" crossorigin href="./assets/download-
|
|
178
|
+
<link rel="modulepreload" crossorigin href="./assets/download-MIvlXU8i.js">
|
|
179
179
|
<link rel="modulepreload" crossorigin href="./assets/table-BGPSHfig.js">
|
|
180
180
|
<link rel="modulepreload" crossorigin href="./assets/useIframeCapabilities-CcI1zSdn.js">
|
|
181
181
|
<link rel="modulepreload" crossorigin href="./assets/error-banner-LdWZDbqd.js">
|
|
@@ -196,25 +196,25 @@
|
|
|
196
196
|
<link rel="modulepreload" crossorigin href="./assets/plus-BgB18UzY.js">
|
|
197
197
|
<link rel="modulepreload" crossorigin href="./assets/trash-2-rVklqqFF.js">
|
|
198
198
|
<link rel="modulepreload" crossorigin href="./assets/react-resizable-panels.browser.esm-CV8-hvjx.js">
|
|
199
|
-
<link rel="modulepreload" crossorigin href="./assets/JsonOutput-
|
|
199
|
+
<link rel="modulepreload" crossorigin href="./assets/JsonOutput-DGEPX_U5.js">
|
|
200
200
|
<link rel="modulepreload" crossorigin href="./assets/chart-no-axes-column-nqk474t8.js">
|
|
201
201
|
<link rel="modulepreload" crossorigin href="./assets/square-function-uY_yJr5g.js">
|
|
202
202
|
<link rel="modulepreload" crossorigin href="./assets/spec-CPQR_o92.js">
|
|
203
203
|
<link rel="modulepreload" crossorigin href="./assets/ellipsis-vertical-CkwWkOQL.js">
|
|
204
204
|
<link rel="modulepreload" crossorigin href="./assets/refresh-cw-DHwG4Mac.js">
|
|
205
205
|
<link rel="modulepreload" crossorigin href="./assets/tree-actions-BM_EJr3E.js">
|
|
206
|
-
<link rel="modulepreload" crossorigin href="./assets/components-
|
|
207
|
-
<link rel="modulepreload" crossorigin href="./assets/column-preview-
|
|
206
|
+
<link rel="modulepreload" crossorigin href="./assets/components-DQogqSMb.js">
|
|
207
|
+
<link rel="modulepreload" crossorigin href="./assets/column-preview-hU-wRhzi.js">
|
|
208
208
|
<link rel="modulepreload" crossorigin href="./assets/icons-Ol38nIbL.js">
|
|
209
|
-
<link rel="modulepreload" crossorigin href="./assets/radio-group-
|
|
210
|
-
<link rel="modulepreload" crossorigin href="./assets/floating-outline-
|
|
209
|
+
<link rel="modulepreload" crossorigin href="./assets/radio-group-p6lAM9tc.js">
|
|
210
|
+
<link rel="modulepreload" crossorigin href="./assets/floating-outline-DuZ8hFxl.js">
|
|
211
211
|
<link rel="modulepreload" crossorigin href="./assets/objectWithoutPropertiesLoose-DfWeGRFv.js">
|
|
212
212
|
<link rel="modulepreload" crossorigin href="./assets/esm-CqWdmSnV.js">
|
|
213
|
-
<link rel="modulepreload" crossorigin href="./assets/readonly-python-code-
|
|
213
|
+
<link rel="modulepreload" crossorigin href="./assets/readonly-python-code-CL0q8S9t.js">
|
|
214
214
|
<link rel="modulepreload" crossorigin href="./assets/file-headphone-BrQspHac.js">
|
|
215
215
|
<link rel="modulepreload" crossorigin href="./assets/file-BrdxGLRX.js">
|
|
216
216
|
<link rel="modulepreload" crossorigin href="./assets/image-DQHXdEQn.js">
|
|
217
|
-
<link rel="modulepreload" crossorigin href="./assets/file-icons-
|
|
217
|
+
<link rel="modulepreload" crossorigin href="./assets/file-icons-CvVoOcQr.js">
|
|
218
218
|
<link rel="modulepreload" crossorigin href="./assets/switch-BiU_sAcn.js">
|
|
219
219
|
<link rel="modulepreload" crossorigin href="./assets/events-CPoJAfgx.js">
|
|
220
220
|
<link rel="modulepreload" crossorigin href="./assets/globals-7JnRMGd4.js">
|
|
@@ -223,11 +223,11 @@
|
|
|
223
223
|
<link rel="modulepreload" crossorigin href="./assets/memoize-Tp7rARFe.js">
|
|
224
224
|
<link rel="modulepreload" crossorigin href="./assets/get-C-qh_et5.js">
|
|
225
225
|
<link rel="modulepreload" crossorigin href="./assets/_baseSet-CxV9N1bc.js">
|
|
226
|
-
<link rel="modulepreload" crossorigin href="./assets/state-
|
|
226
|
+
<link rel="modulepreload" crossorigin href="./assets/state-B7vCc_yy.js">
|
|
227
227
|
<link rel="modulepreload" crossorigin href="./assets/label-xHqFtfdz.js">
|
|
228
|
-
<link rel="modulepreload" crossorigin href="./assets/textarea-
|
|
228
|
+
<link rel="modulepreload" crossorigin href="./assets/textarea-AEYw_n1w.js">
|
|
229
229
|
<link rel="modulepreload" crossorigin href="./assets/refresh-ccw-C-n2VFP5.js">
|
|
230
|
-
<link rel="modulepreload" crossorigin href="./assets/form-
|
|
230
|
+
<link rel="modulepreload" crossorigin href="./assets/form-BrX51bbP.js">
|
|
231
231
|
<link rel="modulepreload" crossorigin href="./assets/renderShortcut-CcFk3m01.js">
|
|
232
232
|
<link rel="modulepreload" crossorigin href="./assets/useBoolean-Bp18o6XG.js">
|
|
233
233
|
<link rel="modulepreload" crossorigin href="./assets/useDeepCompareMemoize-zUHU--0D.js">
|
|
@@ -245,7 +245,7 @@
|
|
|
245
245
|
<link rel="modulepreload" crossorigin href="./assets/square-B5xWCt0a.js">
|
|
246
246
|
<link rel="modulepreload" crossorigin href="./assets/triangle-alert-D2p96PEF.js">
|
|
247
247
|
<link rel="modulepreload" crossorigin href="./assets/bundle.esm-DjhGJy4I.js">
|
|
248
|
-
<link rel="stylesheet" crossorigin href="./assets/cells-
|
|
248
|
+
<link rel="stylesheet" crossorigin href="./assets/cells-BSWdJzbh.css">
|
|
249
249
|
<link rel="stylesheet" crossorigin href="./assets/markdown-renderer-DdDKmWlR.css">
|
|
250
250
|
<link rel="stylesheet" crossorigin href="./assets/JsonOutput-B7vuddcd.css">
|
|
251
251
|
<link rel="stylesheet" crossorigin href="./assets/index-BIw7BKLH.css">
|
package/package.json
CHANGED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import type {
|
|
5
|
+
Database,
|
|
6
|
+
DatabaseSchema,
|
|
7
|
+
DataTable,
|
|
8
|
+
} from "@/core/kernel/messages";
|
|
9
|
+
import { filterEmptyDatabases } from "../datasources";
|
|
10
|
+
|
|
11
|
+
function makeTable(name: string): DataTable {
|
|
12
|
+
return {
|
|
13
|
+
name,
|
|
14
|
+
columns: [],
|
|
15
|
+
source: "memory",
|
|
16
|
+
source_type: "local",
|
|
17
|
+
type: "table",
|
|
18
|
+
engine: null,
|
|
19
|
+
indexes: null,
|
|
20
|
+
num_columns: null,
|
|
21
|
+
num_rows: null,
|
|
22
|
+
variable_name: null,
|
|
23
|
+
primary_keys: null,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function makeSchema(opts: {
|
|
28
|
+
name: string;
|
|
29
|
+
tables: DataTable[];
|
|
30
|
+
tables_resolved?: boolean;
|
|
31
|
+
}): DatabaseSchema {
|
|
32
|
+
return {
|
|
33
|
+
name: opts.name,
|
|
34
|
+
tables: opts.tables,
|
|
35
|
+
tables_resolved: opts.tables_resolved ?? true,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function makeDatabase(
|
|
40
|
+
name: string,
|
|
41
|
+
schemas: DatabaseSchema[],
|
|
42
|
+
schemas_resolved = true,
|
|
43
|
+
): Database {
|
|
44
|
+
return {
|
|
45
|
+
name,
|
|
46
|
+
dialect: "duckdb",
|
|
47
|
+
schemas,
|
|
48
|
+
schemas_resolved,
|
|
49
|
+
engine: null,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
describe("filterEmptyDatabases", () => {
|
|
54
|
+
it("hides schemas whose tables are resolved and empty", () => {
|
|
55
|
+
const databases = [
|
|
56
|
+
makeDatabase("memory", [
|
|
57
|
+
makeSchema({ name: "main", tables: [makeTable("t1")] }),
|
|
58
|
+
makeSchema({ name: "empty_schema", tables: [] }),
|
|
59
|
+
]),
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
expect(filterEmptyDatabases(databases)).toEqual([
|
|
63
|
+
makeDatabase("memory", [
|
|
64
|
+
makeSchema({ name: "main", tables: [makeTable("t1")] }),
|
|
65
|
+
]),
|
|
66
|
+
]);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("preserves databases whose schemas have not been resolved yet (lazy state)", () => {
|
|
70
|
+
const databases = [
|
|
71
|
+
makeDatabase("not_loaded_yet", [], /* schemas_resolved */ false),
|
|
72
|
+
];
|
|
73
|
+
|
|
74
|
+
expect(filterEmptyDatabases(databases)).toEqual([
|
|
75
|
+
makeDatabase("not_loaded_yet", [], false),
|
|
76
|
+
]);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("hides databases that have been resolved as empty", () => {
|
|
80
|
+
const databases = [
|
|
81
|
+
makeDatabase("really_empty", [], /* schemas_resolved */ true),
|
|
82
|
+
makeDatabase("has_tables", [
|
|
83
|
+
makeSchema({ name: "main", tables: [makeTable("t1")] }),
|
|
84
|
+
]),
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
expect(filterEmptyDatabases(databases)).toEqual([
|
|
88
|
+
makeDatabase("has_tables", [
|
|
89
|
+
makeSchema({ name: "main", tables: [makeTable("t1")] }),
|
|
90
|
+
]),
|
|
91
|
+
]);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("hides databases whose schemas all filtered to empty", () => {
|
|
95
|
+
const databases = [
|
|
96
|
+
makeDatabase("only_empty", [
|
|
97
|
+
makeSchema({ name: "a", tables: [] }),
|
|
98
|
+
makeSchema({ name: "b", tables: [] }),
|
|
99
|
+
]),
|
|
100
|
+
makeDatabase("has_tables", [
|
|
101
|
+
makeSchema({ name: "main", tables: [makeTable("t1")] }),
|
|
102
|
+
]),
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
expect(filterEmptyDatabases(databases)).toEqual([
|
|
106
|
+
makeDatabase("has_tables", [
|
|
107
|
+
makeSchema({ name: "main", tables: [makeTable("t1")] }),
|
|
108
|
+
]),
|
|
109
|
+
]);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it("treats missing schemas_resolved as resolved (backward compatible)", () => {
|
|
113
|
+
const databases = [
|
|
114
|
+
{ name: "memory", dialect: "duckdb", schemas: [], engine: null },
|
|
115
|
+
] as Database[];
|
|
116
|
+
|
|
117
|
+
expect(filterEmptyDatabases(databases)).toEqual([]);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("preserves schemas whose tables have not been resolved yet", () => {
|
|
121
|
+
const databases = [
|
|
122
|
+
makeDatabase("snowflake_db", [
|
|
123
|
+
// include_tables=False was used; the schema is not actually empty,
|
|
124
|
+
// tables will be fetched lazily on expand.
|
|
125
|
+
makeSchema({ name: "public", tables: [], tables_resolved: false }),
|
|
126
|
+
makeSchema({ name: "audit", tables: [], tables_resolved: false }),
|
|
127
|
+
makeSchema({
|
|
128
|
+
name: "really_empty",
|
|
129
|
+
tables: [],
|
|
130
|
+
tables_resolved: true,
|
|
131
|
+
}),
|
|
132
|
+
]),
|
|
133
|
+
];
|
|
134
|
+
|
|
135
|
+
expect(filterEmptyDatabases(databases)).toEqual([
|
|
136
|
+
makeDatabase("snowflake_db", [
|
|
137
|
+
makeSchema({ name: "public", tables: [], tables_resolved: false }),
|
|
138
|
+
makeSchema({ name: "audit", tables: [], tables_resolved: false }),
|
|
139
|
+
]),
|
|
140
|
+
]);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it("treats missing tables_resolved as resolved (backward compatible)", () => {
|
|
144
|
+
// Older payloads predating the new flag may omit it; default semantics
|
|
145
|
+
// treat the schema as resolved/authoritative.
|
|
146
|
+
const databases = [
|
|
147
|
+
makeDatabase("memory", [
|
|
148
|
+
{ name: "main", tables: [makeTable("t1")] },
|
|
149
|
+
{ name: "empty_schema", tables: [] },
|
|
150
|
+
] as DatabaseSchema[]),
|
|
151
|
+
];
|
|
152
|
+
|
|
153
|
+
expect(filterEmptyDatabases(databases)).toEqual([
|
|
154
|
+
makeDatabase("memory", [
|
|
155
|
+
{ name: "main", tables: [makeTable("t1")] },
|
|
156
|
+
] as DatabaseSchema[]),
|
|
157
|
+
]);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it("returns the same reference when nothing was filtered", () => {
|
|
161
|
+
const databases = [
|
|
162
|
+
makeDatabase("memory", [
|
|
163
|
+
makeSchema({ name: "main", tables: [makeTable("t1")] }),
|
|
164
|
+
]),
|
|
165
|
+
];
|
|
166
|
+
|
|
167
|
+
expect(filterEmptyDatabases(databases)).toBe(databases);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it("does not mutate the input", () => {
|
|
171
|
+
const databases = [
|
|
172
|
+
makeDatabase("memory", [
|
|
173
|
+
makeSchema({ name: "main", tables: [makeTable("t1")] }),
|
|
174
|
+
makeSchema({ name: "empty_schema", tables: [] }),
|
|
175
|
+
]),
|
|
176
|
+
];
|
|
177
|
+
const snapshot = JSON.parse(JSON.stringify(databases));
|
|
178
|
+
|
|
179
|
+
filterEmptyDatabases(databases);
|
|
180
|
+
|
|
181
|
+
expect(databases).toEqual(snapshot);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import { CommandList } from "cmdk";
|
|
4
|
-
import { atom, useAtomValue, useSetAtom } from "jotai";
|
|
5
|
-
import {
|
|
4
|
+
import { atom, useAtom, useAtomValue, useSetAtom } from "jotai";
|
|
5
|
+
import { atomWithStorage } from "jotai/utils";
|
|
6
|
+
import {
|
|
7
|
+
EyeIcon,
|
|
8
|
+
EyeOffIcon,
|
|
9
|
+
PlusIcon,
|
|
10
|
+
PlusSquareIcon,
|
|
11
|
+
XIcon,
|
|
12
|
+
} from "lucide-react";
|
|
6
13
|
import React from "react";
|
|
7
14
|
import { dbDisplayName } from "@/components/databases/display";
|
|
8
15
|
import { EngineVariable } from "@/components/databases/engine-variable";
|
|
@@ -52,6 +59,7 @@ import { sortBy } from "@/utils/arrays";
|
|
|
52
59
|
import { logNever } from "@/utils/assertNever";
|
|
53
60
|
import { cn } from "@/utils/cn";
|
|
54
61
|
import { Events } from "@/utils/events";
|
|
62
|
+
import { jotaiJsonStorage } from "@/utils/storage/jotai";
|
|
55
63
|
import {
|
|
56
64
|
DatabaseIcon,
|
|
57
65
|
SchemaIcon,
|
|
@@ -116,6 +124,63 @@ const sortedTablesAtom = atom((get) => {
|
|
|
116
124
|
});
|
|
117
125
|
});
|
|
118
126
|
|
|
127
|
+
/**
|
|
128
|
+
* Whether to hide empty schemas and databases (those with no tables) in the
|
|
129
|
+
* datasources panel.
|
|
130
|
+
*/
|
|
131
|
+
export const hideEmptyDatasourcesAtom = atomWithStorage<boolean>(
|
|
132
|
+
"marimo:datasources:hideEmpty",
|
|
133
|
+
false,
|
|
134
|
+
jotaiJsonStorage,
|
|
135
|
+
{ getOnInit: true },
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
function isKnownEmptySchema(schema: DatabaseSchema): boolean {
|
|
139
|
+
return schema.tables_resolved !== false && schema.tables.length === 0;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Apply the "hide empty" filter to a connection's databases.
|
|
144
|
+
*
|
|
145
|
+
* - Schemas with confirmed-empty table lists are hidden.
|
|
146
|
+
* - Databases are hidden when either (a) their schemas have been enumerated
|
|
147
|
+
* and the list is empty, or (b) every schema in them was hidden by the
|
|
148
|
+
* schema-level filter.
|
|
149
|
+
* - Databases / schemas whose contents haven't been resolved yet (deferred
|
|
150
|
+
* discovery — `schemas_resolved === false` or `tables_resolved === false`)
|
|
151
|
+
* are preserved so the user can expand them to trigger a fetch.
|
|
152
|
+
*/
|
|
153
|
+
export function filterEmptyDatabases(databases: Database[]): Database[] {
|
|
154
|
+
let changed = false;
|
|
155
|
+
const result: Database[] = [];
|
|
156
|
+
for (const database of databases) {
|
|
157
|
+
// Known-empty database: schema list was enumerated and is empty.
|
|
158
|
+
if (database.schemas_resolved !== false && database.schemas.length === 0) {
|
|
159
|
+
changed = true;
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
// Deferred schema discovery — keep so the user can expand and load.
|
|
163
|
+
if (database.schemas.length === 0) {
|
|
164
|
+
result.push(database);
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
const visibleSchemas = database.schemas.filter(
|
|
168
|
+
(schema) => !isKnownEmptySchema(schema),
|
|
169
|
+
);
|
|
170
|
+
if (visibleSchemas.length === 0) {
|
|
171
|
+
changed = true;
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (visibleSchemas.length === database.schemas.length) {
|
|
175
|
+
result.push(database);
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
changed = true;
|
|
179
|
+
result.push({ ...database, schemas: visibleSchemas });
|
|
180
|
+
}
|
|
181
|
+
return changed ? result : databases;
|
|
182
|
+
}
|
|
183
|
+
|
|
119
184
|
/**
|
|
120
185
|
* This atom is used to get the data connections that are available to the user.
|
|
121
186
|
* It filters out the internal engines if it has no databases or if it has only the in-memory database and no schemas.
|
|
@@ -152,10 +217,27 @@ export const connectionsAtom = atom((get) => {
|
|
|
152
217
|
|
|
153
218
|
export const DataSources: React.FC = () => {
|
|
154
219
|
const [searchValue, setSearchValue] = React.useState<string>("");
|
|
220
|
+
const [hideEmpty, setHideEmpty] = useAtom(hideEmptyDatasourcesAtom);
|
|
155
221
|
|
|
156
222
|
const closeAllColumns = useSetAtom(closeAllColumnsAtom);
|
|
157
223
|
const tables = useAtomValue(sortedTablesAtom);
|
|
158
|
-
const
|
|
224
|
+
const rawConnections = useAtomValue(connectionsAtom);
|
|
225
|
+
|
|
226
|
+
const dataConnections = React.useMemo(() => {
|
|
227
|
+
if (!hideEmpty) {
|
|
228
|
+
return rawConnections;
|
|
229
|
+
}
|
|
230
|
+
let changed = false;
|
|
231
|
+
const filtered = rawConnections.map((connection) => {
|
|
232
|
+
const databases = filterEmptyDatabases(connection.databases);
|
|
233
|
+
if (databases === connection.databases) {
|
|
234
|
+
return connection;
|
|
235
|
+
}
|
|
236
|
+
changed = true;
|
|
237
|
+
return { ...connection, databases };
|
|
238
|
+
});
|
|
239
|
+
return changed ? filtered : rawConnections;
|
|
240
|
+
}, [rawConnections, hideEmpty]);
|
|
159
241
|
|
|
160
242
|
if (tables.length === 0 && dataConnections.length === 0) {
|
|
161
243
|
return (
|
|
@@ -204,6 +286,28 @@ export const DataSources: React.FC = () => {
|
|
|
204
286
|
</button>
|
|
205
287
|
)}
|
|
206
288
|
|
|
289
|
+
<Tooltip
|
|
290
|
+
content={
|
|
291
|
+
hideEmpty
|
|
292
|
+
? "Show empty schemas and databases"
|
|
293
|
+
: "Hide empty schemas and databases"
|
|
294
|
+
}
|
|
295
|
+
>
|
|
296
|
+
<Button
|
|
297
|
+
data-testid="datasources-hide-empty-button"
|
|
298
|
+
variant="ghost"
|
|
299
|
+
size="sm"
|
|
300
|
+
className="px-2 rounded-none focus-visible:outline-hidden"
|
|
301
|
+
onClick={() => setHideEmpty(!hideEmpty)}
|
|
302
|
+
>
|
|
303
|
+
{hideEmpty ? (
|
|
304
|
+
<EyeOffIcon className="h-4 w-4" />
|
|
305
|
+
) : (
|
|
306
|
+
<EyeIcon className="h-4 w-4" />
|
|
307
|
+
)}
|
|
308
|
+
</Button>
|
|
309
|
+
</Tooltip>
|
|
310
|
+
|
|
207
311
|
<AddConnectionDialog>
|
|
208
312
|
<Button
|
|
209
313
|
variant="ghost"
|
|
@@ -51,6 +51,22 @@
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
+
a {
|
|
55
|
+
cursor: pointer;
|
|
56
|
+
text-decoration: inherit;
|
|
57
|
+
|
|
58
|
+
@apply text-link;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
a:hover,
|
|
62
|
+
a:active {
|
|
63
|
+
text-decoration: underline;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
a:visited {
|
|
67
|
+
@apply text-link-visited;
|
|
68
|
+
}
|
|
69
|
+
|
|
54
70
|
code {
|
|
55
71
|
@apply border px-1 rounded font-mono bg-[var(--slate-2)] text-sm mb-4 mt-2;
|
|
56
72
|
}
|
|
@@ -169,6 +169,7 @@ const {
|
|
|
169
169
|
return {
|
|
170
170
|
...db,
|
|
171
171
|
schemas: schemas,
|
|
172
|
+
schemas_resolved: true,
|
|
172
173
|
};
|
|
173
174
|
}),
|
|
174
175
|
};
|
|
@@ -213,6 +214,7 @@ const {
|
|
|
213
214
|
return {
|
|
214
215
|
...schema,
|
|
215
216
|
tables: tables,
|
|
217
|
+
tables_resolved: true,
|
|
216
218
|
};
|
|
217
219
|
}),
|
|
218
220
|
};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-border-style:solid;--tw-font-weight:initial}}}.cm-tooltip .documentation,.docs-documentation{font-family:var(--text-font),ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:normal}:is(.cm-tooltip .documentation,.docs-documentation) ol{padding-left:1.5rem;list-style-type:decimal}:is(.cm-tooltip .documentation,.docs-documentation) ul{padding-left:1.5rem;list-style-type:disc}:is(.cm-tooltip .documentation,.docs-documentation) p{white-space:pre-wrap;padding:.4rem 0}:is(.cm-tooltip .documentation,.docs-documentation) .section{line-height:normal}:is(.cm-tooltip .documentation,.docs-documentation) .docutils dd,:is(.cm-tooltip .documentation,.docs-documentation) .docutils p,:is(.cm-tooltip .documentation,.docs-documentation) .paragraph,:is(.cm-tooltip .documentation,.docs-documentation) li,:is(.cm-tooltip .documentation,.docs-documentation) ol,:is(.cm-tooltip .documentation,.docs-documentation) ul{white-space:normal}:is(.cm-tooltip .documentation,.docs-documentation) table{border-style:var(--tw-border-style);font-size:var(--text-sm,.875rem);line-height:var(--tw-leading,var(--text-sm--line-height,1.42857));margin-block:calc(var(--spacing,.25rem)*2);border-width:1px;border-radius:.25rem}:is(.cm-tooltip .documentation,.docs-documentation) table td,:is(.cm-tooltip .documentation,.docs-documentation) table th{border-style:var(--tw-border-style);padding:calc(var(--spacing,.25rem)*2);border-width:1px}:is(.cm-tooltip .documentation,.docs-documentation) table th{background-color:var(--slate-2)}:is(.cm-tooltip .documentation,.docs-documentation) table tr:nth-child(2n){background-color:var(--slate-1)}:is(.cm-tooltip .documentation,.docs-documentation) code{background-color:var(--slate-2);border-style:var(--tw-border-style);font-family:var(--monospace-font),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:var(--text-sm,.875rem);line-height:var(--tw-leading,var(--text-sm--line-height,1.42857));margin-bottom:calc(var(--spacing,.25rem)*4);margin-top:calc(var(--spacing,.25rem)*2);padding-inline:calc(var(--spacing,.25rem)*1);border-width:1px;border-radius:.25rem}:is(.cm-tooltip .documentation,.docs-documentation) code:empty{display:none}:is(.cm-tooltip .documentation,.docs-documentation) h1,:is(.cm-tooltip .documentation,.docs-documentation) h2{border-bottom-style:var(--tw-border-style);color:var(--primary);font-size:var(--text-xl,1.25rem);font-weight:600;line-height:var(--tw-leading,var(--text-xl--line-height,1.4));margin-bottom:calc(var(--spacing,.25rem)*1);padding-bottom:calc(var(--spacing,.25rem)*1);border-bottom-width:1px}@supports (color:color-mix(in lab,red,red)){:is(.cm-tooltip .documentation,.docs-documentation) h1,:is(.cm-tooltip .documentation,.docs-documentation) h2{color:color-mix(in srgb,var(--primary),transparent 0%)}}:is(.cm-tooltip .documentation,.docs-documentation) dt{--tw-font-weight:var(--font-weight-bold,700);font-weight:var(--font-weight-bold,700)}:is(.cm-tooltip .documentation,.docs-documentation) dt span{--tw-font-weight:var(--font-weight-normal,400);font-weight:var(--font-weight-normal,400)}:is(.cm-tooltip .documentation,.docs-documentation) .doctest-block,:is(.cm-tooltip .documentation,.docs-documentation) .literal-block{background-color:var(--slate-2);font-size:var(--text-sm,.875rem);line-height:var(--tw-leading,var(--text-sm--line-height,1.42857));padding:calc(var(--spacing,.25rem)*2);white-space:pre-wrap;border-radius:.25rem}:is(.cm-tooltip .documentation,.docs-documentation) .docutils.literal{background-color:var(--slate-2);border-radius:calc(var(--radius) - 2px);border-style:var(--tw-border-style);font-family:var(--monospace-font),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:var(--text-sm,.875rem);line-height:var(--tw-leading,var(--text-sm--line-height,1.42857));padding-inline:calc(var(--spacing,.25rem)*1);border-width:1px}:is(.cm-tooltip .documentation,.docs-documentation) .codehilite code,:is(.cm-tooltip .documentation,.docs-documentation) pre>code{background-color:var(--slate-2);border-radius:calc(var(--radius) - 2px);border-style:var(--tw-border-style);font-family:var(--monospace-font),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:var(--text-sm,.875rem);line-height:var(--tw-leading,var(--text-sm--line-height,1.42857));padding:calc(var(--spacing,.25rem)*2);white-space:pre-wrap;border-width:1px;width:100%;display:inline-block}:is(.cm-tooltip .documentation,.docs-documentation) blockquote{margin-left:calc(var(--spacing,.25rem)*2);padding-left:calc(var(--spacing,.25rem)*2);white-space:pre-wrap}:is(.cm-tooltip .documentation,.docs-documentation) blockquote .docutils dt,:is(.cm-tooltip .documentation,.docs-documentation) blockquote dl.docutils,:is(.cm-tooltip .documentation,.docs-documentation) blockquote p{font-family:var(--monospace-font),ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:var(--text-sm,.875rem);font-weight:400;line-height:var(--tw-leading,var(--text-sm--line-height,1.42857));white-space:normal;padding:0}.docutils dd{white-space:pre-wrap;padding-left:1rem}.cm-tooltip .docs-documentation,.cm-tooltip .documentation{font-size:var(--text-sm,.875rem);line-height:var(--tw-leading,var(--text-sm--line-height,1.42857));padding-block:calc(var(--spacing,.25rem)*1);padding-inline:calc(var(--spacing,.25rem)*2)}:is(.cm-tooltip .documentation,.cm-tooltip .docs-documentation) h1{font-size:var(--text-base,1rem);line-height:var(--tw-leading,var(--text-base--line-height,1.5))}:is(.cm-tooltip .documentation,.cm-tooltip .docs-documentation) .codehilite code,:is(.cm-tooltip .documentation,.cm-tooltip .docs-documentation) .doctest-block,:is(.cm-tooltip .documentation,.cm-tooltip .docs-documentation) .docutils.literal,:is(.cm-tooltip .documentation,.cm-tooltip .docs-documentation) .literal-block,:is(.cm-tooltip .documentation,.cm-tooltip .docs-documentation) blockquote .docutils dt,:is(.cm-tooltip .documentation,.cm-tooltip .docs-documentation) blockquote dl.docutils,:is(.cm-tooltip .documentation,.cm-tooltip .docs-documentation) blockquote p,:is(.cm-tooltip .documentation,.cm-tooltip .docs-documentation) code{font-size:var(--text-xs,.75rem);line-height:var(--tw-leading,var(--text-xs--line-height,1.33333))}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as ie}from"./chunk-LvLJmgfZ.js";import{d as de,l as De,p as he,u as H}from"./useEvent-D91BmmQi.js";import{t as Be}from"./react-Bj1aDYRI.js";import{Ar as Ve,At as Me,Br as ue,D as Pe,Fn as Ee,Fr as xe,Gt as Oe,In as Ue,Ir as Re,Kt as Ae,Lr as Ge,M as We,Nr as se,Oi as ze,P as Ke,Pr as pe,Rn as He,Rt as Je,Ur as Xe,Vr as fe,Wr as be,Wt as Qe,_n as Ye,a as Ze,ar as ea,cr as aa,f as ta,hr as sa,or as la,vr as na,yr as le}from"./cells-DrYr16TO.js";import"./react-dom-CSu739Rf.js";import{t as ge}from"./compiler-runtime-B3qBwwSJ.js";import{c as ra}from"./utils-CvI-39U6.js";import{t as oa}from"./ErrorBoundary-DyYDV0HI.js";import{t as O}from"./cn-DCUzRj2J.js";import{t as ma}from"./jsx-runtime-BqBOg78p.js";import"./fullscreen-eipL3i3Y.js";import{n as ca}from"./multi-map-CUuNtzHt.js";import"./popover-Bz_0Vkyf.js";import{G as ia,J as da,K as ha,U as ne,W as je,q as ua}from"./JsonOutput-CPYntVn7.js";import"./download-DZUw3TyK.js";import{r as Ne}from"./radio-group-2AaAWNrb.js";import{t as re}from"./tooltip-DTV9tlSr.js";import{r as xa,t as ee}from"./button-BbCh-29a.js";import"./dist-BrR4M-k3.js";import{u as J}from"./arrays-DYDL-3-i.js";import"./cjs-BRGiG41H.js";import"./main-B0OX4z33.js";import"./useNonce-DfoVjkkH.js";import{i as pa}from"./strings-wdPMRf6Z.js";import{r as fa}from"./requests-DIwGYs0l.js";import{t as ba}from"./createLucideIcon-D5guW7EU.js";import{t as ga}from"./x-C-6liIBr.js";import"./markdown-renderer-DY7HNEoY.js";import{t as ye}from"./add-connection-dialog-BUOUhMLU.js";import{t as ve}from"./plus-BgB18UzY.js";import{a as ja}from"./input-C3Hrdlqq.js";import{n as Na,o as ya}from"./column-preview-B16EcXyK.js";import{t as va}from"./workflow-Bm8qF7yj.js";import"./dist-CBSMxaO_.js";import"./dist-CpTFpfm_.js";import"./dist-B1U1kGCR.js";import"./dist-ChF5Ln9c.js";import"./dist-CPczQFlJ.js";import"./session-0B5NBztP.js";import"./purify.es-B9KxLTTS.js";import"./dates-CTxr0EqQ.js";import{t as wa}from"./copy-icon-D_qz1txR.js";import{t as Sa}from"./context-QkTujrKn.js";import"./utils-DCL4n9wx.js";import"./vega-loader.browser-C8wT63Va.js";import"./defaultLocale-BLUna9fQ.js";import"./defaultLocale-DzliDDTm.js";import{t as we}from"./cell-link-CB8WeUi5.js";import"./chunk-5FQGJX7Z-D9iBG0F7.js";import{r as Ca}from"./html-to-image-C9fYqzra.js";import{o as _a}from"./focus-1NHETejS.js";import{n as oe}from"./useAsyncData-bgszE9F0.js";import{a as ka,i as $a,n as Fa,o as Se,r as Ia,t as La}from"./table-BGPSHfig.js";import"./react-resizable-panels.browser.esm-CV8-hvjx.js";import{a as Ta,d as qa,o as ae,t as Da}from"./command-KARR7KMq.js";import{n as Ba}from"./icons-Ol38nIbL.js";import{r as Va}from"./tree-actions-BM_EJr3E.js";import{a as me,i as te,o as ce,r as Ce,s as _e,t as Ma}from"./components-CB5nynlN.js";import{t as Pa}from"./empty-state-Cjt8SfMh.js";import{n as Ea,t as Oa}from"./common-zEvAGAwj.js";import{a as Ua,i as Ra,n as ke,r as $e,t as Fe}from"./components-LGou1UYG.js";var Aa=ba("square-equal",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M7 10h10",key:"1101jm"}],["path",{d:"M7 14h10",key:"1mhdw3"}]]),A=ge(),C=ie(Be(),1),t=ie(ma(),1),S={engineEmpty:"pl-3",engine:"pl-3 pr-2",database:"pl-4",schemaEmpty:"pl-8",schema:"pl-7",schemaLoading:"pl-8",tableLoading:"pl-11",tableSchemaless:"pl-8",tableWithSchema:"pl-12",columnLocal:"pl-5",columnSql:"pl-13",columnPreview:"pl-10"},Ga=he(a=>{let e=a(xe),s=a(He),l=a(Ze);return J(e,r=>{if(!r.variable_name)return-1;let o=Object.values(s).find(j=>j.name===r.variable_name);if(!o)return 0;let n=l.inOrderIds.indexOf(o.declaredBy[0]);return n===-1?0:n})});const Ie=he(a=>{let e=new Map(a(Ve));for(let s of be){let l=e.get(s);l&&(l.databases.length===0&&e.delete(s),l.databases.length===1&&l.databases[0].name==="memory"&&l.databases[0].schemas.length===0&&e.delete(s))}return J([...e.values()],s=>be.has(s.name)?1:0)}),Wa=()=>{let a=(0,A.c)(32),[e,s]=C.useState(""),l=de(pe),r=H(Ga),o=H(Ie);if(r.length===0&&o.length===0){let u;return a[0]===Symbol.for("react.memo_cache_sentinel")?(u=(0,t.jsx)(Pa,{title:"No tables found",description:"Any datasets/dataframes in the global scope will be shown here.",action:(0,t.jsx)(ye,{children:(0,t.jsxs)(ee,{variant:"outline",size:"sm",children:["Add database or catalog",(0,t.jsx)(ve,{className:"h-4 w-4 ml-2"})]})}),icon:(0,t.jsx)(le,{})}),a[0]=u):u=a[0],u}let n=!!e.trim(),j;a[1]===l?j=a[2]:(j=u=>{l(u.length>0),s(u)},a[1]=l,a[2]=j);let g;a[3]!==e||a[4]!==j?(g=(0,t.jsx)(Ta,{placeholder:"Search tables...",className:"h-6 m-1",value:e,onValueChange:j,rootClassName:"flex-1 border-r border-b-0"}),a[3]=e,a[4]=j,a[5]=g):g=a[5];let N;a[6]===n?N=a[7]:(N=n&&(0,t.jsx)("button",{type:"button",className:"float-right border-b px-2 m-0 h-full hover:bg-accent hover:text-accent-foreground",onClick:()=>s(""),children:(0,t.jsx)(ga,{className:"h-4 w-4"})}),a[6]=n,a[7]=N);let f;a[8]===Symbol.for("react.memo_cache_sentinel")?(f=(0,t.jsx)(ye,{children:(0,t.jsx)(ee,{variant:"ghost",size:"sm",className:"px-2 rounded-none focus-visible:outline-hidden",children:(0,t.jsx)(ve,{className:"h-4 w-4"})})}),a[8]=f):f=a[8];let c;a[9]!==g||a[10]!==N?(c=(0,t.jsxs)("div",{className:"flex items-center w-full border-b",children:[g,N,f]}),a[9]=g,a[10]=N,a[11]=c):c=a[11];let i;if(a[12]!==o||a[13]!==n||a[14]!==e){let u;a[16]!==n||a[17]!==e?(u=x=>(0,t.jsx)(za,{connection:x,hasChildren:x.databases.length>0,children:x.databases.map(b=>(0,t.jsx)(Ka,{engineName:x.name,database:b,hasSearch:n,children:(0,t.jsx)(Ha,{schemas:b.schemas,defaultSchema:x.default_schema,defaultDatabase:x.default_database,engineName:x.name,databaseName:b.name,hasSearch:n,searchValue:e,dialect:x.dialect})},b.name))},x.name),a[16]=n,a[17]=e,a[18]=u):u=a[18],i=o.map(u),a[12]=o,a[13]=n,a[14]=e,a[15]=i}else i=a[15];let h;a[19]!==o.length||a[20]!==r.length?(h=o.length>0&&r.length>0&&(0,t.jsxs)(Ce,{className:S.engine,children:[(0,t.jsx)(Ba,{className:"h-4 w-4 text-muted-foreground"}),(0,t.jsx)("span",{className:"text-xs",children:"Python"})]}),a[19]=o.length,a[20]=r.length,a[21]=h):h=a[21];let p;a[22]!==e||a[23]!==r?(p=r.length>0&&(0,t.jsx)(Le,{tables:r,searchValue:e}),a[22]=e,a[23]=r,a[24]=p):p=a[24];let d;a[25]!==i||a[26]!==h||a[27]!==p?(d=(0,t.jsxs)(qa,{className:"flex flex-col",children:[i,h,p]}),a[25]=i,a[26]=h,a[27]=p,a[28]=d):d=a[28];let m;return a[29]!==c||a[30]!==d?(m=(0,t.jsxs)(Da,{className:"border-b bg-background rounded-none h-full pb-10 overflow-auto outline-hidden",shouldFilter:!1,children:[c,d]}),a[29]=c,a[30]=d,a[31]=m):m=a[31],m};var za=a=>{let e=(0,A.c)(25),{connection:s,children:l,hasChildren:r}=a,o=s.name===Xe,n=o?"In-Memory":s.name,{previewDataSourceConnection:j}=fa(),g;e[0]!==s.name||e[1]!==j?(g=async()=>{await j({engine:s.name})},e[0]=s.name,e[1]=j,e[2]=g):g=e[2];let N=g,f;e[3]===s.dialect?f=e[4]:(f=(0,t.jsx)(Me,{className:"h-4 w-4 text-muted-foreground",name:s.dialect}),e[3]=s.dialect,e[4]=f);let c;e[5]===s.dialect?c=e[6]:(c=ea(s.dialect),e[5]=s.dialect,e[6]=c);let i;e[7]===c?i=e[8]:(i=(0,t.jsx)("span",{className:"text-xs",children:c}),e[7]=c,e[8]=i);let h=n,p;e[9]===h?p=e[10]:(p=(0,t.jsxs)("span",{className:"text-xs text-muted-foreground",children:["(",(0,t.jsx)(Ua,{variableName:h}),")"]}),e[9]=h,e[10]=p);let d;e[11]!==N||e[12]!==o?(d=!o&&(0,t.jsx)(Va,{onClick:N,tooltip:"Refresh connection",className:"ml-auto h-4 p-0",iconClassName:"h-3.5 w-3.5"}),e[11]=N,e[12]=o,e[13]=d):d=e[13];let m;e[14]!==f||e[15]!==i||e[16]!==p||e[17]!==d?(m=(0,t.jsxs)(Ce,{className:S.engine,children:[f,i,p,d]}),e[14]=f,e[15]=i,e[16]=p,e[17]=d,e[18]=m):m=e[18];let u;e[19]!==l||e[20]!==r?(u=r?l:(0,t.jsx)(te,{content:"No databases available",className:S.engineEmpty}),e[19]=l,e[20]=r,e[21]=u):u=e[21];let x;return e[22]!==m||e[23]!==u?(x=(0,t.jsxs)(t.Fragment,{children:[m,u]}),e[22]=m,e[23]=u,e[24]=x):x=e[24],x},Ka=a=>{let e=(0,A.c)(26),{hasSearch:s,engineName:l,database:r,children:o}=a,[n,j]=C.useState(!1),[g,N]=C.useState(!1),[f,c]=C.useState(s);f!==s&&(c(s),j(s));let i;e[0]===Symbol.for("react.memo_cache_sentinel")?(i=O("text-sm flex flex-row gap-1 items-center cursor-pointer rounded-none",S.database),e[0]=i):i=e[0];let h;e[1]!==n||e[2]!==g?(h=()=>{j(!n),N(!g)},e[1]=n,e[2]=g,e[3]=h):h=e[3];let p=`${l}:${r.name}`,d;e[4]===n?d=e[5]:(d=(0,t.jsx)(_e,{isExpanded:n}),e[4]=n,e[5]=d);let m=g&&n?"text-foreground":"text-muted-foreground",u;e[6]===m?u=e[7]:(u=O("h-4 w-4",m),e[6]=m,e[7]=u);let x;e[8]===u?x=e[9]:(x=(0,t.jsx)(le,{className:u}),e[8]=u,e[9]=x);let b=g&&n&&"font-semibold",y;e[10]===b?y=e[11]:(y=O(b),e[10]=b,e[11]=y);let v;e[12]===r.name?v=e[13]:(v=r.name===""?(0,t.jsx)("i",{children:"Not connected"}):r.name,e[12]=r.name,e[13]=v);let w;e[14]!==v||e[15]!==y?(w=(0,t.jsx)("span",{className:y,children:v}),e[14]=v,e[15]=y,e[16]=w):w=e[16];let _;e[17]!==w||e[18]!==h||e[19]!==p||e[20]!==d||e[21]!==x?(_=(0,t.jsxs)(ae,{className:i,onSelect:h,value:p,children:[d,x,w]}),e[17]=w,e[18]=h,e[19]=p,e[20]=d,e[21]=x,e[22]=_):_=e[22];let T=n&&o,k;return e[23]!==_||e[24]!==T?(k=(0,t.jsxs)(t.Fragment,{children:[_,T]}),e[23]=_,e[24]=T,e[25]=k):k=e[25],k},Ha=({schemas:a,defaultSchema:e,defaultDatabase:s,dialect:l,engineName:r,databaseName:o,hasSearch:n,searchValue:j})=>{let{addSchemaList:g}=se(),[N,f]=C.useState(!1),[c,i]=C.useState(!1),{isPending:h,error:p}=oe(async()=>{if(a.length===0&&r&&!N){f(!0),i(!0);try{g({schemas:(await Qe.request({engine:r,database:o})).schemas??[],sqlSchemaContext:{engine:r,database:o}})}finally{i(!1)}}},[a.length,r,o,N]);return h||c?(0,t.jsx)(ce,{message:"Loading schemas...",className:S.schemaLoading}):p?(0,t.jsx)(me,{error:p,className:S.schemaLoading}):a.length===0?(0,t.jsx)(te,{content:"No schemas available",className:S.schemaEmpty}):(0,t.jsx)(t.Fragment,{children:a.filter(d=>j?d.tables.some(m=>m.name.toLowerCase().includes(j.toLowerCase())):!0).map(d=>(0,t.jsx)(Ja,{databaseName:o,schema:d,hasSearch:n,children:(0,t.jsx)(Le,{tables:d.tables,searchValue:j,sqlTableContext:{engine:r,database:o,schema:d.name,defaultSchema:e,defaultDatabase:s,dialect:l}})},d.name))})},Ja=a=>{let e=(0,A.c)(24),{databaseName:s,schema:l,children:r,hasSearch:o}=a,[n,j]=C.useState(o),[g,N]=C.useState(!1),f=`${s}:${l.name}`;if(ue(l.name))return r;let c;e[0]===Symbol.for("react.memo_cache_sentinel")?(c=O("text-sm flex flex-row gap-1 items-center cursor-pointer rounded-none",S.schema),e[0]=c):c=e[0];let i;e[1]!==n||e[2]!==g?(i=()=>{j(!n),N(!g)},e[1]=n,e[2]=g,e[3]=i):i=e[3];let h;e[4]===n?h=e[5]:(h=(0,t.jsx)(_e,{isExpanded:n}),e[4]=n,e[5]=h);let p=g&&n&&"text-foreground",d;e[6]===p?d=e[7]:(d=O("h-4 w-4 text-muted-foreground",p),e[6]=p,e[7]=d);let m;e[8]===d?m=e[9]:(m=(0,t.jsx)(sa,{className:d}),e[8]=d,e[9]=m);let u=g&&n&&"font-semibold",x;e[10]===u?x=e[11]:(x=O(u),e[10]=u,e[11]=x);let b;e[12]!==l.name||e[13]!==x?(b=(0,t.jsx)("span",{className:x,children:l.name}),e[12]=l.name,e[13]=x,e[14]=b):b=e[14];let y;e[15]!==i||e[16]!==h||e[17]!==m||e[18]!==b||e[19]!==f?(y=(0,t.jsxs)(ae,{className:c,onSelect:i,value:f,children:[h,m,b]}),e[15]=i,e[16]=h,e[17]=m,e[18]=b,e[19]=f,e[20]=y):y=e[20];let v=n&&r,w;return e[21]!==y||e[22]!==v?(w=(0,t.jsxs)(t.Fragment,{children:[y,v]}),e[21]=y,e[22]=v,e[23]=w):w=e[23],w},Le=a=>{let e=(0,A.c)(24),{tables:s,sqlTableContext:l,searchValue:r}=a,{addTableList:o}=se(),[n,j]=C.useState(!1),[g,N]=C.useState(!1),f;e[0]!==o||e[1]!==l||e[2]!==s.length||e[3]!==n?(f=async()=>{if(s.length===0&&l&&!n){j(!0),N(!0);let{engine:m,database:u,schema:x}=l,b=await Ae.request({engine:m,database:u,schema:x});if(!(b!=null&&b.tables))throw N(!1),Error("No tables available");o({tables:b.tables,sqlTableContext:l}),N(!1)}},e[0]=o,e[1]=l,e[2]=s.length,e[3]=n,e[4]=f):f=e[4];let c;e[5]!==l||e[6]!==s.length||e[7]!==n?(c=[s.length,l,n],e[5]=l,e[6]=s.length,e[7]=n,e[8]=c):c=e[8];let{isPending:i,error:h}=oe(f,c);if(i||g){let m;return e[9]===Symbol.for("react.memo_cache_sentinel")?(m=(0,t.jsx)(ce,{message:"Loading tables...",className:S.tableLoading}),e[9]=m):m=e[9],m}if(h){let m;return e[10]===h?m=e[11]:(m=(0,t.jsx)(me,{error:h,className:S.tableLoading}),e[10]=h,e[11]=m),m}if(s.length===0){let m;return e[12]===Symbol.for("react.memo_cache_sentinel")?(m=(0,t.jsx)(te,{content:"No tables found",className:S.tableLoading}),e[12]=m):m=e[12],m}let p;if(e[13]!==r||e[14]!==l||e[15]!==s){let m;e[17]===r?m=e[18]:(m=b=>r?b.name.toLowerCase().includes(r.toLowerCase()):!0,e[17]=r,e[18]=m);let u=s.filter(m),x;e[19]!==r||e[20]!==l?(x=b=>(0,t.jsx)(Xa,{table:b,sqlTableContext:l,isSearching:!!r},b.name),e[19]=r,e[20]=l,e[21]=x):x=e[21],p=u.map(x),e[13]=r,e[14]=l,e[15]=s,e[16]=p}else p=e[16];let d;return e[22]===p?d=e[23]:(d=(0,t.jsx)(t.Fragment,{children:p}),e[22]=p,e[23]=d),d},Xa=a=>{let e=(0,A.c)(64),{table:s,sqlTableContext:l,isSearching:r}=a,{addTable:o}=se(),[n,j]=C.useState(!1),[g,N]=C.useState(!1),f=s.columns.length>0,c;e[0]!==o||e[1]!==n||e[2]!==l||e[3]!==s.name||e[4]!==f||e[5]!==g?(c=async()=>{if(n&&!f&&l&&!g){N(!0);let{engine:B,database:Y,schema:qe}=l,Z=await Oe.request({engine:B,database:Y,schema:qe,tableName:s.name});if(!(Z!=null&&Z.table))throw Error("No table details available");o({table:Z.table,sqlTableContext:l})}},e[0]=o,e[1]=n,e[2]=l,e[3]=s.name,e[4]=f,e[5]=g,e[6]=c):c=e[6];let i;e[7]!==n||e[8]!==f?(i=[n,f],e[7]=n,e[8]=f,e[9]=i):i=e[9];let{isFetching:h,isPending:p,error:d}=oe(c,i),m=H(ra),u=_a(),{createNewCell:x}=Pe(),b=Ne(),y;e[10]!==b||e[11]!==m||e[12]!==x||e[13]!==u||e[14]!==l||e[15]!==s?(y=()=>{Ca({autoInstantiate:m,createNewCell:x,fromCellId:u}),b((()=>{if(s.source_type==="catalog"){let B=l!=null&&l.database?`${l.database}.${s.name}`:s.name;return`${s.engine}.load_table("${B}")`}if(l)return fe({table:s,columnName:"*",sqlTableContext:l});switch(s.source_type){case"local":return`mo.ui.table(${s.name})`;case"duckdb":case"connection":return fe({table:s,columnName:"*",sqlTableContext:l});default:return pa(s.source_type),""}})())},e[10]=b,e[11]=m,e[12]=x,e[13]=u,e[14]=l,e[15]=s,e[16]=y):y=e[16];let v=y,w;e[17]!==s.num_columns||e[18]!==s.num_rows?(w=()=>{let B=[];return s.num_rows!=null&&B.push(`${s.num_rows} rows`),s.num_columns!=null&&B.push(`${s.num_columns} columns`),B.length===0?null:(0,t.jsx)("div",{className:"flex flex-row gap-2 items-center pl-6 group-hover:hidden",children:(0,t.jsx)("span",{className:"text-xs text-muted-foreground",children:B.join(", ")})})},e[17]=s.num_columns,e[18]=s.num_rows,e[19]=w):w=e[19];let _=w,T;e[20]!==d||e[21]!==h||e[22]!==p||e[23]!==l||e[24]!==s?(T=()=>{if(p||h)return(0,t.jsx)(ce,{message:"Loading columns...",className:S.tableLoading});if(d)return(0,t.jsx)(me,{error:d,className:S.tableLoading});let B=s.columns;return B.length===0?(0,t.jsx)(te,{content:"No columns found",className:S.tableLoading}):B.map(Y=>(0,t.jsx)(Qa,{table:s,column:Y,sqlTableContext:l},Y.name))},e[20]=d,e[21]=h,e[22]=p,e[23]=l,e[24]=s,e[25]=T):T=e[25];let k=T,q;e[26]!==n||e[27]!==r||e[28]!==s.source_type||e[29]!==s.type?(q=()=>{if(s.source_type!=="local")return(0,t.jsx)(s.type==="table"?aa:na,{className:"h-3 w-3",strokeWidth:n||r?2.5:void 0})},e[26]=n,e[27]=r,e[28]=s.source_type,e[29]=s.type,e[30]=q):q=e[30];let V=q,M=l?`${l.database}.${l.schema}.${s.name}`:s.name,P=l&&(ue(l.schema)?S.tableSchemaless:S.tableWithSchema),E=(n||r)&&"font-semibold",$;e[31]!==P||e[32]!==E?($=O("rounded-none group h-8 cursor-pointer",P,E),e[31]=P,e[32]=E,e[33]=$):$=e[33];let F;e[34]===n?F=e[35]:(F=()=>j(!n),e[34]=n,e[35]=F);let I;e[36]===V?I=e[37]:(I=V(),e[36]=V,e[37]=I);let D;e[38]===s.name?D=e[39]:(D=(0,t.jsx)("span",{className:"text-sm",children:s.name}),e[38]=s.name,e[39]=D);let U;e[40]!==I||e[41]!==D?(U=(0,t.jsxs)("div",{className:"flex gap-2 items-center flex-1 pl-1",children:[I,D]}),e[40]=I,e[41]=D,e[42]=U):U=e[42];let R;e[43]===_?R=e[44]:(R=_(),e[43]=_,e[44]=R);let L;e[45]===v?L=e[46]:(L=xa.stopPropagation(()=>v()),e[45]=v,e[46]=L);let X;e[47]===Symbol.for("react.memo_cache_sentinel")?(X=(0,t.jsx)(ya,{className:"h-3 w-3"}),e[47]=X):X=e[47];let W;e[48]===L?W=e[49]:(W=(0,t.jsx)(re,{content:"Add table to notebook",delayDuration:400,children:(0,t.jsx)(ee,{className:"group-hover:inline-flex hidden",variant:"text",size:"icon",onClick:L,children:X})}),e[48]=L,e[49]=W);let z;e[50]!==n||e[51]!==F||e[52]!==U||e[53]!==R||e[54]!==W||e[55]!==$||e[56]!==M?(z=(0,t.jsxs)(ae,{className:$,value:M,"aria-selected":n,forceMount:!0,onSelect:F,children:[U,R,W]}),e[50]=n,e[51]=F,e[52]=U,e[53]=R,e[54]=W,e[55]=$,e[56]=M,e[57]=z):z=e[57];let K;e[58]!==n||e[59]!==k?(K=n&&k(),e[58]=n,e[59]=k,e[60]=K):K=e[60];let Q;return e[61]!==z||e[62]!==K?(Q=(0,t.jsxs)(t.Fragment,{children:[z,K]}),e[61]=z,e[62]=K,e[63]=Q):Q=e[63],Q},Qa=a=>{var U,R;let e=(0,A.c)(48),{table:s,column:l,sqlTableContext:r}=a,[o,n]=C.useState(!1),j=H(pe),g=de(Re);j&&o&&n(!1),g(o?L=>new Set([...L,`${s.name}:${l.name}`]):L=>(L.delete(`${s.name}:${l.name}`),new Set(L)));let N=Ne(),{columnsPreviews:f}=Ge(),c;e[0]!==l.name||e[1]!==s.primary_keys?(c=((U=s.primary_keys)==null?void 0:U.includes(l.name))||!1,e[0]=l.name,e[1]=s.primary_keys,e[2]=c):c=e[2];let i=c,h;e[3]!==l.name||e[4]!==s.indexes?(h=((R=s.indexes)==null?void 0:R.includes(l.name))||!1,e[3]=l.name,e[4]=s.indexes,e[5]=h):h=e[5];let p=h,d;e[6]===N?d=e[7]:(d=L=>{N(L)},e[6]=N,e[7]=d);let m=d,u=Ya,x=o?"font-semibold":"",b;e[8]!==l.name||e[9]!==x?(b=(0,t.jsx)("span",{className:x,children:l.name}),e[8]=l.name,e[9]=x,e[10]=b):b=e[10];let y=b,v=`${s.name}.${l.name}`,w=`${s.name}.${l.name}`,_;e[11]===o?_=e[12]:(_=()=>n(!o),e[11]=o,e[12]=_);let T=r?S.columnSql:S.columnLocal,k;e[13]===T?k=e[14]:(k=O("flex flex-row gap-2 items-center flex-1",T),e[13]=T,e[14]=k);let q;e[15]!==l.type||e[16]!==y?(q=(0,t.jsx)(Ma,{columnName:y,dataType:l.type}),e[15]=l.type,e[16]=y,e[17]=q):q=e[17];let V;e[18]===i?V=e[19]:(V=i&&u({tooltipContent:"Primary key",content:"PK"}),e[18]=i,e[19]=V);let M;e[20]===p?M=e[21]:(M=p&&u({tooltipContent:"Indexed",content:"IDX"}),e[20]=p,e[21]=M);let P;e[22]!==k||e[23]!==q||e[24]!==V||e[25]!==M?(P=(0,t.jsxs)("div",{className:k,children:[q,V,M]}),e[22]=k,e[23]=q,e[24]=V,e[25]=M,e[26]=P):P=e[26];let E;e[27]===l.name?E=e[28]:(E=(0,t.jsx)(re,{content:"Copy column name",delayDuration:400,children:(0,t.jsx)(ee,{variant:"text",size:"icon",className:"group-hover:opacity-100 opacity-0 hover:bg-muted text-muted-foreground hover:text-foreground",children:(0,t.jsx)(wa,{tooltip:!1,value:l.name,className:"h-3 w-3"})})}),e[27]=l.name,e[28]=E);let $;e[29]===l.external_type?$=e[30]:($=(0,t.jsx)("span",{className:"text-xs text-muted-foreground",children:l.external_type}),e[29]=l.external_type,e[30]=$);let F;e[31]!==P||e[32]!==E||e[33]!==$||e[34]!==v||e[35]!==w||e[36]!==_?(F=(0,t.jsxs)(ae,{className:"rounded-none py-1 group cursor-pointer",value:w,onSelect:_,children:[P,E,$]},v),e[31]=P,e[32]=E,e[33]=$,e[34]=v,e[35]=w,e[36]=_,e[37]=F):F=e[37];let I;e[38]!==l||e[39]!==f||e[40]!==m||e[41]!==o||e[42]!==r||e[43]!==s?(I=o&&(0,t.jsx)("div",{className:O(S.columnPreview,"pr-2 py-2 bg-(--slate-1) shadow-inner border-b"),children:(0,t.jsx)(oa,{children:(0,t.jsx)(Na,{table:s,column:l,onAddColumnChart:m,preview:f.get(r?`${r.database}.${r.schema}.${s.name}:${l.name}`:`${s.name}:${l.name}`),sqlTableContext:r})})}),e[38]=l,e[39]=f,e[40]=m,e[41]=o,e[42]=r,e[43]=s,e[44]=I):I=e[44];let D;return e[45]!==F||e[46]!==I?(D=(0,t.jsxs)(t.Fragment,{children:[F,I]}),e[45]=F,e[46]=I,e[47]=D):D=e[47],D};function Ya(a){let{tooltipContent:e,content:s}=a;return(0,t.jsx)(re,{content:e,delayDuration:100,children:(0,t.jsx)("span",{className:"text-xs text-black bg-gray-100 dark:invert rounded px-1",children:s})})}function hs(a){return a}var G={name:"name",type:"type-value",defs:"defs-refs"},Za=[{id:G.name,accessorFn:a=>[a.name,a.declaredBy],enableSorting:!0,sortingFn:"alphanumeric",header:({column:a})=>(0,t.jsx)(ne,{header:"Name",column:a}),cell:({getValue:a})=>{let[e,s]=a();return(0,t.jsx)(Oa,{name:e,declaredBy:s})}},{id:G.type,accessorFn:a=>[a.dataType,a.value],enableSorting:!0,sortingFn:"alphanumeric",header:({column:a})=>(0,t.jsx)(ne,{header:(0,t.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,t.jsx)("span",{children:"Type"}),(0,t.jsx)("span",{children:"Value"})]}),column:a}),cell:({getValue:a})=>{let[e,s]=a();return(0,t.jsxs)("div",{className:"max-w-[150px]",children:[(0,t.jsx)("div",{className:"text-ellipsis overflow-hidden whitespace-nowrap text-muted-foreground font-mono text-xs",children:e}),(0,t.jsx)("div",{className:"text-ellipsis overflow-hidden whitespace-nowrap",title:s??"",children:s})]})}},{id:G.defs,accessorFn:a=>[a.declaredBy,a.usedBy,a.name,a.declaredByNames,a.usedByNames],enableSorting:!0,sortingFn:"basic",header:({column:a})=>(0,t.jsx)(ne,{header:(0,t.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,t.jsx)("span",{children:"Declared By"}),(0,t.jsx)("span",{children:"Used By"})]}),column:a}),cell:({getValue:a})=>{let[e,s,l]=a(),r=o=>{let n=ta(o);n&&Ye(n,l)};return(0,t.jsxs)("div",{className:"flex flex-col gap-1 py-1",children:[(0,t.jsxs)("div",{className:"flex flex-row overflow-auto gap-2 items-center",children:[(0,t.jsx)("span",{title:"Declared by",children:(0,t.jsx)(Aa,{className:"w-3.5 h-3.5 text-muted-foreground"})}),e.length===1?(0,t.jsx)(we,{variant:"focus",cellId:e[0],skipScroll:!0,onClick:()=>r(e[0])}):(0,t.jsx)("div",{className:"text-destructive flex flex-row gap-2",children:e.slice(0,3).map((o,n)=>(0,t.jsxs)("span",{className:"flex",children:[(0,t.jsx)(we,{variant:"focus",cellId:o,skipScroll:!0,className:"whitespace-nowrap text-destructive",onClick:()=>r(o)},o),n<e.length-1&&", "]},o))})]}),(0,t.jsxs)("div",{className:"flex flex-row overflow-auto gap-2 items-baseline",children:[(0,t.jsx)("span",{title:"Used by",children:(0,t.jsx)(va,{className:"w-3.5 h-3.5 text-muted-foreground"})}),(0,t.jsx)(Ea,{maxCount:3,cellIds:s,skipScroll:!0,onClick:r})]})]})}}];function et({variables:a,sort:e,cellIdToIndex:s}){e||(e={id:G.defs,desc:!1});let l=[];switch(e.id){case G.name:l=J(a,r=>r.name);break;case G.type:l=J(a,r=>r.dataType);break;case G.defs:l=J(a,r=>s.get(r.declaredBy[0]));break}return e.desc?l.toReversed():l}const Te=(0,C.memo)(({className:a,cellIds:e,variables:s})=>{let[l,r]=C.useState([]),[o,n]=C.useState(""),j=Ke(),{locale:g}=Sa(),N=(0,C.useMemo)(()=>{let c=i=>{let h=j[i];return Je(h)?`cell-${e.indexOf(i)}`:h??`cell-${e.indexOf(i)}`};return Object.values(s).map(i=>({...i,declaredByNames:i.declaredBy.map(c),usedByNames:i.usedBy.map(c)}))},[s,j,e]),f=ia({data:(0,C.useMemo)(()=>{let c=new Map;return e.forEach((i,h)=>c.set(i,h)),et({variables:N,sort:l[0],cellIdToIndex:c})},[N,l,e]),columns:Za,getCoreRowModel:ha(),onGlobalFilterChange:n,getFilteredRowModel:ua(),enableFilters:!0,enableGlobalFilter:!0,enableColumnPinning:!1,getColumnCanGlobalFilter(c){return c.columnDef.enableGlobalFilter??!0},globalFilterFn:"auto",manualSorting:!0,locale:g,onSortingChange:r,getSortedRowModel:da(),state:{sorting:l,globalFilter:o}});return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(ja,{className:"w-full",placeholder:"Search",value:o,onChange:c=>n(c.target.value)}),(0,t.jsxs)(La,{className:O("w-full text-sm flex-1 border-separate border-spacing-0",a),children:[(0,t.jsx)(ka,{children:(0,t.jsx)(Se,{className:"whitespace-nowrap text-xs",children:f.getFlatHeaders().map(c=>(0,t.jsx)($a,{className:"sticky top-0 bg-background border-b",children:je(c.column.columnDef.header,c.getContext())},c.id))})}),(0,t.jsx)(Fa,{children:f.getRowModel().rows.map(c=>(0,t.jsx)(Se,{className:"hover:bg-accent",children:c.getVisibleCells().map(i=>(0,t.jsx)(Ia,{className:"border-b",children:je(i.column.columnDef.cell,i.getContext())},i.id))},c.id))})]})]})});Te.displayName="VariableTable";var at=ge(),tt=ze("marimo:session-panel:state",{openSections:["variables"],hasUserInteracted:!1},Ee),st=()=>{let a=(0,at.c)(24),e=Ue(),s=We(),l=H(xe),r=H(Ie),[o,n]=De(tt),j=l.length+r.length,g;a[0]!==j||a[1]!==o.hasUserInteracted||a[2]!==o.openSections?(g=!o.hasUserInteracted&&j>0?[...new Set([...o.openSections,"datasources"])]:o.openSections,a[0]=j,a[1]=o.hasUserInteracted,a[2]=o.openSections,a[3]=g):g=a[3];let N=g,f;a[4]===n?f=a[5]:(f=v=>{n({openSections:v,hasUserInteracted:!0})},a[4]=n,a[5]=f);let c=f,i=!N.includes("datasources")&&j>0,h;a[6]===Symbol.for("react.memo_cache_sentinel")?(h=(0,t.jsx)(le,{className:"w-4 h-4"}),a[6]=h):h=a[6];let p;a[7]!==j||a[8]!==i?(p=i&&(0,t.jsx)(Ra,{children:j}),a[7]=j,a[8]=i,a[9]=p):p=a[9];let d;a[10]===p?d=a[11]:(d=(0,t.jsxs)($e,{children:[h,"Data sources",p]}),a[10]=p,a[11]=d);let m;a[12]===Symbol.for("react.memo_cache_sentinel")?(m=(0,t.jsx)(Fe,{children:(0,t.jsx)(Wa,{})}),a[12]=m):m=a[12];let u;a[13]===d?u=a[14]:(u=(0,t.jsxs)(ke,{value:"datasources",children:[d,m]}),a[13]=d,a[14]=u);let x;a[15]===Symbol.for("react.memo_cache_sentinel")?(x=(0,t.jsxs)($e,{children:[(0,t.jsx)(la,{className:"w-4 h-4"}),"Variables"]}),a[15]=x):x=a[15];let b;a[16]!==s||a[17]!==e?(b=(0,t.jsxs)(ke,{value:"variables",lastItem:!0,children:[x,(0,t.jsx)(Fe,{children:Object.keys(e).length===0?(0,t.jsx)("div",{className:"px-3 py-4 text-sm text-muted-foreground",children:"No variables defined"}):(0,t.jsx)(Te,{cellIds:s.inOrderIds,variables:e})})]}),a[16]=s,a[17]=e,a[18]=b):b=a[18];let y;return a[19]!==c||a[20]!==N||a[21]!==u||a[22]!==b?(y=(0,t.jsxs)(ca,{type:"multiple",value:N,onValueChange:c,className:"flex flex-col h-full overflow-auto",children:[u,b]}),a[19]=c,a[20]=N,a[21]=u,a[22]=b,a[23]=y):y=a[23],y};export{st as default};
|