@marimo-team/frontend 0.25.3-dev12 → 0.25.3-dev121
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-_Aw9_foI.js +1 -0
- package/dist/assets/{ConnectedDataExplorerComponent-TprnxZeJ.js → ConnectedDataExplorerComponent-BRgqbAsc.js} +1 -1
- package/dist/assets/{ErrorBoundary-CM13wrd8.js → ErrorBoundary-DxSzjvbx.js} +2 -2
- package/dist/assets/JsonOutput-B7pGj79O.js +11 -0
- package/dist/assets/{LazyAnyLanguageCodeMirror-B4fCknq1.js → LazyAnyLanguageCodeMirror-BPYE76jR.js} +2 -2
- package/dist/assets/MarimoErrorOutput-Bzo6Bkp5.js +10 -0
- package/dist/assets/{RenderHTML-DX6i99Op.js → RenderHTML-D6AC0IhC.js} +1 -1
- package/dist/assets/RunButton-BjYsPiKa.js +1 -0
- package/dist/assets/__vite-browser-external-BynxqS4w.js +1 -0
- package/dist/assets/__vite-browser-external-DTOT9NDN.js +1 -0
- package/dist/assets/{add-cell-with-ai-BpD_790A.js → add-cell-with-ai-CFrR1iW4.js} +6 -6
- package/dist/assets/{add-connection-dialog-B1BXCjex.js → add-connection-dialog-CyNAB_W2.js} +1 -1
- package/dist/assets/{agent-panel-CDFUc1uu.js → agent-panel-VOrccb5q.js} +3 -3
- package/dist/assets/ai-model-dropdown-Bfxv_zvu.js +13 -0
- package/dist/assets/{alert-dialog-BaPGzeOK.js → alert-dialog-C-sWmKva.js} +1 -1
- package/dist/assets/any-language-editor-DUMe1UCk.js +1 -0
- package/dist/assets/{app-config-button-AdV-QDD7.js → app-config-button-BRcjv8A_.js} +1 -1
- package/dist/assets/arrays-0R2reF2y.js +1 -0
- package/dist/assets/{blob-BG8yoQmx.js → blob-DTYOX-m5.js} +1 -1
- package/dist/assets/{button-COI-NGrx.js → button-D8gVKwe-.js} +1 -1
- package/dist/assets/{cache-panel-DTY1dqvi.js → cache-panel-BV-c7ed0.js} +1 -1
- package/dist/assets/{capabilities-BJvf-MD4.js → capabilities-Pq1YNPlK.js} +1 -1
- package/dist/assets/cell-editor-eKgYK8Bd.js +42 -0
- package/dist/assets/{cell-link-8Auigi8P.js → cell-link-D3rkqgbU.js} +1 -1
- package/dist/assets/{cells-C6YGYGdi.js → cells-2HETnlvE.js} +18 -18
- package/dist/assets/{chat-display-DhgI2MS9.js → chat-display-BrT4VJJK.js} +1 -1
- package/dist/assets/chat-panel-qpPNEwxV.js +4 -0
- package/dist/assets/chat-ui-SAdJxg-k.js +4 -0
- package/dist/assets/{circle-DXf-VWZG.js → circle-B6D_6D8w.js} +1 -1
- package/dist/assets/{code-visibility-BJImdpDi.js → code-visibility-DYDagVy7.js} +1 -1
- package/dist/assets/column-preview-yI7-INkZ.js +1 -0
- package/dist/assets/command-palette-DF-B_YpW.js +1 -0
- package/dist/assets/{common-Sl3uthjg.js → common-DgXKwblm.js} +1 -1
- package/dist/assets/components-CBE8cOLK.js +1 -0
- package/dist/assets/{components-3cou6Mka.js → components-CuMhY4Sf.js} +1 -1
- package/dist/assets/{components-CskjK6xZ.js → components-DCo7mAWO.js} +1 -1
- package/dist/assets/config-CD1IuZFJ.js +1 -0
- package/dist/assets/{config-DRIpOKqh.js → config-DMz7oN0r.js} +1 -1
- package/dist/assets/{config-CA1V-wjh.js → config-DpY86_Yq.js} +1 -1
- package/dist/assets/{copy-D8O_CYCG.js → copy-KlhazlhB.js} +1 -1
- package/dist/assets/{copy-icon-BIiRXh_3.js → copy-icon-8-a5vovc.js} +1 -1
- package/dist/assets/{createReducer-DgRODTW6.js → createReducer-CaI_Oa0v.js} +1 -1
- package/dist/assets/{datasource-DfbNb83e.js → datasource-D9JMcEAP.js} +1 -1
- package/dist/assets/{dates-CfmdTL6B.js → dates-CQMwFko2.js} +1 -1
- package/dist/assets/{dependency-graph-panel-L5cBE5sl.js → dependency-graph-panel-BVJWPCvw.js} +3 -3
- package/dist/assets/{dist-iaThVDkA.js → dist-jlhMTKo_.js} +1 -1
- package/dist/assets/{documentation-panel-D7S8JIc2.js → documentation-panel--wI4XHso.js} +1 -1
- package/dist/assets/{download-C03FOElq.js → download-Dod42wfD.js} +1 -1
- package/dist/assets/{dropdown-menu-C1rnl-0o.js → dropdown-menu-DS6umAnH.js} +1 -1
- package/dist/assets/edit-page-Uj9YSRMX.js +9 -0
- package/dist/assets/{error-banner-COZ7SfYV.js → error-banner-B5kzVf_0.js} +1 -1
- package/dist/assets/{error-entries-CLnPDv7b.js → error-entries-D00nWhWE.js} +1 -1
- package/dist/assets/{error-panel-D2xrYLue.js → error-panel-CcN_1PWf.js} +1 -1
- package/dist/assets/{es-Cqst59WX.js → es-N9SHpmG7.js} +1 -1
- package/dist/assets/{feedback-button-DzPunIqU.js → feedback-button-ByGgqUsX.js} +1 -1
- package/dist/assets/feedback-button-tbWwJ_t6.js +1 -0
- package/dist/assets/file-explorer-panel-eTEqtMPW.js +1 -0
- package/dist/assets/{file-name-input-B4fRaQkI.js → file-name-input-D5SfTNWh.js} +1 -1
- package/dist/assets/{floating-outline-B5MaM1JS.js → floating-outline-B-k3P_AO.js} +1 -1
- package/dist/assets/{formats-yZ06h1Pl.js → formats-zylfwejq.js} +1 -1
- package/dist/assets/{formatting-BqrP-n49.js → formatting-uom1es4b.js} +1 -1
- package/dist/assets/{fullscreen-B9tHcfpV.js → fullscreen-BWTs8pYZ.js} +1 -1
- package/dist/assets/{gallery-page-BefvdsM7.js → gallery-page-BzbMhDHi.js} +1 -1
- package/dist/assets/{ganttDiagram-EL5Y4UJY-2n7Ig5Jm.js → ganttDiagram-EL5Y4UJY-CYqkCfFG.js} +1 -1
- package/dist/assets/{glide-data-editor-C3eaYlXg.js → glide-data-editor-BMqhUrHI.js} +2 -2
- package/dist/assets/{glide-utils-CIrAxdjv.js → glide-utils-HFqhvWHI.js} +2 -2
- package/dist/assets/home-page-DJcYWiga.js +1 -0
- package/dist/assets/{hooks-DzML9nez.js → hooks-CGLb_CCz.js} +1 -1
- package/dist/assets/{html-to-image-DK9Zl1lU.js → html-to-image-D_0rd3_B.js} +1 -1
- package/dist/assets/index-BnhSnwvB.css +2 -0
- package/dist/assets/index-bSIORW11.js +30 -0
- package/dist/assets/{input-BoBxR50a.js → input-DmHMEZGh.js} +1 -1
- package/dist/assets/kiosk-mode-DFS6HopF.js +1 -0
- package/dist/assets/{layout-Ck1RoL1B.js → layout-C2XnLAfO.js} +5 -5
- package/dist/assets/linear-Bma8J3iM.js +1 -0
- package/dist/assets/links-DX2w97N9.js +1 -0
- package/dist/assets/{logs-panel-BRytaWaO.js → logs-panel-B3T1GFBk.js} +1 -1
- package/dist/assets/{markdown-renderer-DX0Xrrfy.js → markdown-renderer-BhiTvxtL.js} +1 -1
- package/dist/assets/{menu-items-BrwnTgyK.js → menu-items-BgUyNUpu.js} +1 -1
- package/dist/assets/{mermaid-C4EiVqcd.js → mermaid-BKXlWk4F.js} +2 -2
- package/dist/assets/{name-cell-input-DlpTvPLa.js → name-cell-input-CgAObR6N.js} +1 -1
- package/dist/assets/numbers-CsZVw3Dc.js +1 -0
- package/dist/assets/{objects-snlMn4yk.js → objects-rLPlQ3X_.js} +1 -1
- package/dist/assets/{once-Haz_uxEL.js → once-6KNTRW0u.js} +1 -1
- package/dist/assets/{outline-panel-B2WIpz-1.js → outline-panel-BhBb7Vqw.js} +1 -1
- package/dist/assets/{package-data-dv4FBHxR.js → package-data-CKPmBDtg.js} +1 -1
- package/dist/assets/packages-panel-Bt0xNpFl.js +1 -0
- package/dist/assets/{panel-accordion-state-BqSH5ttk.js → panel-accordion-state-ZsUdpAYn.js} +1 -1
- package/dist/assets/panels-DJghvIKo.js +1 -0
- package/dist/assets/precisionRound-BxlUs8G4.js +1 -0
- package/dist/assets/process-output-CeOMwE17.js +1 -0
- package/dist/assets/{quadrantDiagram-AXDQQJYC-yBhCDI7E.js → quadrantDiagram-AXDQQJYC-D9KH5Zge.js} +1 -1
- package/dist/assets/react-vega-BTNeboR2.js +189 -0
- package/dist/assets/{readonly-code-display-MnMEoYW5.js → readonly-code-display-TvOC7ESE.js} +1 -1
- package/dist/assets/{readonly-python-code-ggs4hAzC.js → readonly-python-code-Cqkfdeyo.js} +1 -1
- package/dist/assets/{renderShortcut-C1JwYcqW.js → renderShortcut-rUwGqKgC.js} +1 -1
- package/dist/assets/{requests-lt0JK8Jt.js → requests-BIFR-h4M.js} +1 -1
- package/dist/assets/requests-DuLJN9Tf.js +1 -0
- package/dist/assets/{reveal-component-PiV1eQk9.js → reveal-component-CwE6U9oJ.js} +37 -37
- package/dist/assets/run-page-CtonWTtJ.js +1 -0
- package/dist/assets/{runs-BLp5jezv.js → runs-C49hleBy.js} +1 -1
- package/dist/assets/{runtime-details-state-CoL-p0MC.js → runtime-details-state-CKqJSfSR.js} +1 -1
- package/dist/assets/{save-worker-BbUSwZRG.js → save-worker-UwdGcNK5.js} +2 -1
- package/dist/assets/scratchpad-panel-CwVBedfZ.js +1 -0
- package/dist/assets/{scroll-to-bottom-button-1FyowpWV.js → scroll-to-bottom-button-CIkON2WJ.js} +1 -1
- package/dist/assets/{secrets-panel-D7KN4tVs.js → secrets-panel-bcfEKxRx.js} +1 -1
- package/dist/assets/{select-DTBn5eTb.js → select-3CVGlYrC.js} +1 -1
- package/dist/assets/{session-DqoWmb7X.js → session-CMLIzZKw.js} +1 -1
- package/dist/assets/session-panel-CdHdKUCF.js +1 -0
- package/dist/assets/{snippets-panel-ClGHtEKQ.js → snippets-panel-DYLWOLYw.js} +1 -1
- package/dist/assets/{spec-BfSBcO5B.js → spec-DlH4Mp7d.js} +1 -1
- package/dist/assets/{state-uwRvJLb8.js → state-3mcyTS9q.js} +1 -1
- package/dist/assets/state-B_MCKzBL.js +1 -0
- package/dist/assets/{state-C3oDoyFe.js → state-C5WAeuTu.js} +1 -1
- package/dist/assets/{state-DxQnC_1I.js → state-Cv2JW3l9.js} +1 -1
- package/dist/assets/{state-DtGB7xeJ.js → state-DZN9vZ6z.js} +1 -1
- package/dist/assets/state-DgECPVFs.js +107 -0
- package/dist/assets/{strings-B2vv-ENv.js → strings-C25fhMR_.js} +1 -1
- package/dist/assets/{swiper-component-a07domrZ.js → swiper-component-CRGRy5_O.js} +1 -1
- package/dist/assets/{switch-CTaiAjrz.js → switch-DYjBfpNJ.js} +1 -1
- package/dist/assets/{tabs-BuQlZFbt.js → tabs-CY8E4r9U.js} +1 -1
- package/dist/assets/{terminal-wnSHYT8N.js → terminal-Ca-kubKb.js} +1 -1
- package/dist/assets/{time-MgToa8VM.js → time-DswSXBDk.js} +1 -1
- package/dist/assets/{toast-BGzLGnvw.js → toast-Gzxi-le_.js} +1 -1
- package/dist/assets/tooltip-Brya4Ghn.js +61 -0
- package/dist/assets/{tooltip-C9TuY18o.js → tooltip-CkGm8X7m.js} +1 -1
- package/dist/assets/tracing-B0J2ctTm.js +1 -0
- package/dist/assets/tracing-panel-C1OCpoeE.js +2 -0
- package/dist/assets/{tree-actions-DnUokmva.js → tree-actions-sjBxIglc.js} +1 -1
- package/dist/assets/{use-restore-focus-BxEGwIbk.js → use-restore-focus-DdS7Tl0F.js} +1 -1
- package/dist/assets/{useAddCell-IN24thff.js → useAddCell-CaXnFGki.js} +1 -1
- package/dist/assets/useAsyncData-qvoPYHtx.js +1 -0
- package/dist/assets/useBoolean-Dd2nWXFJ.js +1 -0
- package/dist/assets/useCellActionButton-CJ90CMEj.js +1 -0
- package/dist/assets/useDebounce-DwTQ_1Pu.js +1 -0
- package/dist/assets/{useDeepCompareMemoize-DFIVN9dn.js → useDeepCompareMemoize-B2DVK2De.js} +1 -1
- package/dist/assets/useDelayElapsed-BlsDT4TV.js +1 -0
- package/dist/assets/{useDeleteCell-fQlM46Y2.js → useDeleteCell-D9N85822.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-ImXYINm_.js → useDependencyPanelTab-CzAE0cm-.js} +1 -1
- package/dist/assets/{useEvent-Dfcbgjhg.js → useEvent-BDjgaBtz.js} +1 -1
- package/dist/assets/{useEventListener-D9cftcHj.js → useEventListener-CjDeLqFC.js} +1 -1
- package/dist/assets/{useIframeCapabilities-CwTkczVN.js → useIframeCapabilities-Czr9e4uG.js} +1 -1
- package/dist/assets/{useInstallPackage-BW06eter.js → useInstallPackage-wcDq9hYT.js} +1 -1
- package/dist/assets/{useInterval--x3s1VpI.js → useInterval-DJdQmXnq.js} +1 -1
- package/dist/assets/useNotebookActions-CAMEQ38y.js +1 -0
- package/dist/assets/{useRunCells-DSJPXE-j.js → useRunCells-DGakx8hj.js} +1 -1
- package/dist/assets/{useSplitCell-DQyMF5gd.js → useSplitCell-AK5BKPGM.js} +1 -1
- package/dist/assets/useStateForKey-CGMJQT8x.js +1 -0
- package/dist/assets/{useTheme-n8Dj1zH7.js → useTheme-BAA27lh7.js} +1 -1
- package/dist/assets/{utils-CaQYvazl.js → utils-DfElfBpz.js} +1 -1
- package/dist/assets/vega-component-BeyxAJad.js +1 -0
- package/dist/assets/{vega-embed-container-DJPNkHPb.js → vega-embed-container-DtArSJz1.js} +1 -1
- package/dist/assets/vega-loader.browser-Bu25TKax.js +6 -0
- package/dist/assets/worker-jm2VC7pS.js +159 -0
- package/dist/assets/{write-secret-modal-DzKAInL2.js → write-secret-modal-BEx-EUlh.js} +1 -1
- package/dist/assets/{xychartDiagram-S5SC5T6Z-KbGzG6-u.js → xychartDiagram-S5SC5T6Z-CeRnBS5e.js} +1 -1
- package/dist/index.html +81 -79
- package/package.json +12 -12
- package/src/__tests__/host-imports.test.ts +1 -0
- package/src/__tests__/mount.test.ts +0 -20
- package/src/components/app-config/ai-config.tsx +7 -2
- package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
- package/src/components/chat/acp/__tests__/state.test.ts +2 -2
- package/src/components/chat/acp/blocks.tsx +2 -2
- package/src/components/chat/chat-components.tsx +2 -0
- package/src/components/chat/chat-panel.tsx +9 -8
- package/src/components/chat/chat-utils.ts +4 -8
- package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
- package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
- package/src/components/data-table/__tests__/columns.test.tsx +105 -0
- package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
- package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
- package/src/components/data-table/__tests__/export-actions.test.tsx +105 -0
- package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
- package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
- package/src/components/data-table/cell-selection/feature.ts +2 -2
- package/src/components/data-table/cell-selection/types.ts +2 -2
- package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
- package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
- package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
- package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
- package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
- package/src/components/data-table/charts/charts.tsx +40 -30
- package/src/components/data-table/charts/storage.ts +16 -5
- package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
- package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
- package/src/components/data-table/column-summary/column-summary.tsx +2 -4
- package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
- package/src/components/data-table/columns.tsx +45 -46
- package/src/components/data-table/context-menu.tsx +36 -20
- package/src/components/data-table/data-table.tsx +7 -1
- package/src/components/data-table/date-popover.tsx +6 -4
- package/src/components/data-table/export-actions.tsx +76 -48
- package/src/components/data-table/row-viewer-panel/row-viewer.tsx +2 -2
- package/src/components/data-table/search-highlight.tsx +79 -0
- package/src/components/data-table/types.ts +1 -0
- package/src/components/data-table/url-detector.tsx +49 -9
- package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
- package/src/components/datasources/__tests__/column-preview.test.tsx +63 -2
- package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
- package/src/components/datasources/column-preview.tsx +8 -2
- package/src/components/datasources/datasources.tsx +47 -35
- package/src/components/debugger/debugger-code.tsx +5 -0
- package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
- package/src/components/dependency-graph/elements.ts +24 -21
- package/src/components/dependency-graph/panels.tsx +2 -1
- package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
- package/src/components/editor/SortableCell.tsx +1 -3
- package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
- package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +24 -0
- package/src/components/editor/actions/pair-with-agent-modal.tsx +18 -15
- package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
- package/src/components/editor/ai/ai-completion-editor.tsx +1 -0
- package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
- package/src/components/editor/cell/CreateCellButton.tsx +8 -10
- package/src/components/editor/cell/DeleteButton.tsx +1 -0
- package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
- package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
- package/src/components/editor/cell/code/cell-editor.tsx +1 -1
- package/src/components/editor/cell/code/language-toggle.tsx +8 -7
- package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
- package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +30 -1
- package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
- package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
- package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +12 -18
- package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +58 -1
- package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
- package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
- package/src/components/editor/chrome/wrapper/storage.ts +1 -1
- package/src/components/editor/connections/components.tsx +1 -1
- package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
- package/src/components/editor/controls/command-palette.tsx +22 -10
- package/src/components/editor/dynamic-favicon.tsx +21 -40
- package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +12 -23
- package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
- package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
- package/src/components/editor/file-tree/file-explorer.tsx +10 -5
- package/src/components/editor/file-tree/file-viewer.tsx +4 -2
- package/src/components/editor/file-tree/use-file-search.ts +35 -21
- package/src/components/editor/notebook-banner.tsx +1 -0
- package/src/components/editor/output/MarimoTracebackOutput.tsx +2 -2
- package/src/components/editor/output/ansi-reduce.ts +33 -20
- package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
- package/src/components/editor/package-alert.tsx +6 -4
- package/src/components/editor/renderers/grid-layout/grid-layout.tsx +12 -6
- package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
- package/src/components/home/components.tsx +17 -31
- package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
- package/src/components/icons/large-spinner.tsx +3 -14
- package/src/components/icons/spinner.tsx +1 -1
- package/src/components/mcp/mcp-status-indicator.tsx +1 -1
- package/src/components/pages/__tests__/home-page.test.tsx +116 -0
- package/src/components/pages/home-page.tsx +164 -91
- package/src/components/scratchpad/scratchpad.tsx +2 -2
- package/src/components/slides/reveal-component.tsx +4 -2
- package/src/components/slides/slide-cell-view.tsx +1 -1
- package/src/components/slides/slide-form.tsx +1 -0
- package/src/components/tracing/tracing.tsx +2 -2
- package/src/components/ui/alert-dialog.tsx +1 -1
- package/src/core/ai/context/providers/datasource.ts +6 -2
- package/src/core/ai/tools/base.ts +16 -7
- package/src/core/ai/tools/edit-notebook-tool.ts +47 -45
- package/src/core/ai/tools/registry.ts +13 -8
- package/src/core/ai/tools/sample-tool.ts +6 -7
- package/src/core/attachments/state.ts +5 -8
- package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -0
- package/src/core/cells/__tests__/cell.test.ts +39 -0
- package/src/core/cells/__tests__/cells.test.ts +3 -1
- package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
- package/src/core/cells/__tests__/notebook-outline.test.ts +113 -0
- package/src/core/cells/__tests__/session.test.ts +117 -36
- package/src/core/cells/cell.ts +14 -3
- package/src/core/cells/cells.ts +3 -1
- package/src/core/cells/pending-delete-service.ts +2 -6
- package/src/core/cells/session.ts +1 -1
- package/src/core/cells/types.ts +10 -1
- package/src/core/codemirror/__tests__/setup.test.ts +29 -29
- package/src/core/codemirror/cells/__tests__/extensions.test.ts +15 -0
- package/src/core/codemirror/cells/extensions.ts +7 -3
- package/src/core/codemirror/keymaps/vim.ts +2 -6
- package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
- package/src/core/codemirror/language/extension.ts +8 -8
- package/src/core/codemirror/language/languages/markdown.ts +8 -6
- package/src/core/codemirror/language/languages/python.ts +16 -10
- package/src/core/codemirror/language/languages/sql/sql.ts +9 -7
- package/src/core/codemirror/language/panel/panel.tsx +1 -0
- package/src/core/codemirror/language/types.ts +7 -7
- package/src/core/codemirror/rtc/extension.ts +24 -12
- package/src/core/codemirror/rtc/loro/awareness.ts +34 -19
- package/src/core/codemirror/rtc/loro/sync.ts +1 -0
- package/src/core/codemirror/utils.ts +1 -0
- package/src/core/datasets/__tests__/data-source-discovery.test.ts +4 -4
- package/src/core/datasets/data-source-discovery.ts +4 -6
- package/src/core/document/__tests__/codemirror.test.ts +483 -0
- package/src/core/document/__tests__/draft.test.ts +322 -0
- package/src/core/document/__tests__/fixtures.ts +92 -0
- package/src/core/document/__tests__/hooks.test.tsx +386 -0
- package/src/core/document/__tests__/lifecycle-scenarios.test.ts +61 -0
- package/src/core/document/__tests__/model.test.ts +158 -0
- package/src/core/document/__tests__/protocol-fixtures.ts +38 -0
- package/src/core/document/__tests__/recovery-scenarios.test.ts +230 -0
- package/src/core/document/__tests__/scenario-fixture.ts +42 -0
- package/src/core/document/__tests__/scenarios.test.ts +205 -0
- package/src/core/document/__tests__/state.test.ts +438 -0
- package/src/core/document/__tests__/submission.test.ts +203 -0
- package/src/core/document/__tests__/test-host.test.ts +92 -0
- package/src/core/document/__tests__/test-host.ts +247 -0
- package/src/core/document/__tests__/test-notebook.ts +139 -0
- package/src/core/document/__tests__/user.ts +61 -0
- package/src/core/document/codemirror.ts +311 -0
- package/src/core/document/draft.ts +472 -0
- package/src/core/document/hooks.tsx +118 -0
- package/src/core/document/index.ts +22 -0
- package/src/core/document/model.ts +52 -0
- package/src/core/document/select.ts +41 -0
- package/src/core/document/state.ts +374 -0
- package/src/core/document/sync.ts +363 -0
- package/src/core/host/AGENTS.md +12 -2
- package/src/core/host/__tests__/attachments.test.ts +56 -0
- package/src/core/host/__tests__/document.test.ts +126 -0
- package/src/core/host/__tests__/fixtures.ts +41 -0
- package/src/core/host/__tests__/notebook-client.test.ts +511 -132
- package/src/core/host/__tests__/static.test.ts +167 -0
- package/src/core/host/__tests__/wasm.test.ts +152 -0
- package/src/core/host/backend.ts +10 -0
- package/src/core/host/connection.ts +1 -40
- package/src/core/host/notebook-client.ts +204 -133
- package/src/core/host/resources/attachments.ts +22 -0
- package/src/core/host/resources/document.ts +101 -0
- package/src/core/host/static.ts +70 -0
- package/src/core/host/wasm.ts +92 -0
- package/src/core/hotkeys/actions.ts +2 -4
- package/src/core/islands/__tests__/bootstrap.test.ts +0 -26
- package/src/core/islands/bootstrap.ts +0 -1
- package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
- package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
- package/src/core/network/connection.ts +4 -2
- package/src/core/network/useConnectionNotice.ts +8 -2
- package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
- package/src/core/runtime/__tests__/runtime.test.ts +15 -58
- package/src/core/runtime/runtime.ts +25 -42
- package/src/core/runtime/types.ts +0 -2
- package/src/core/state/__tests__/jotai.test.tsx +108 -0
- package/src/core/state/jotai.ts +1 -1
- package/src/core/static/__tests__/files.test.ts +38 -10
- package/src/core/static/files.ts +2 -0
- package/src/core/wasm/bridge.ts +38 -10
- package/src/core/wasm/store.ts +3 -3
- package/src/core/wasm/worker/bootstrap.ts +2 -1
- package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
- package/src/core/wasm/worker/types.ts +11 -0
- package/src/core/wasm/worker/worker.ts +48 -0
- package/src/core/websocket/__tests__/connection-state.test.ts +0 -12
- package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +153 -70
- package/src/core/websocket/__tests__/useNotebookSession.hook.test.tsx +151 -428
- package/src/core/websocket/connection-state.ts +0 -10
- package/src/core/websocket/state.ts +7 -0
- package/src/core/websocket/transports/__tests__/notebook.test.ts +502 -0
- package/src/core/websocket/transports/notebook.ts +213 -0
- package/src/core/websocket/useNotebookClient.ts +38 -29
- package/src/core/websocket/useNotebookSession.tsx +1 -14
- package/src/css/globals.css +5 -0
- package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
- package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
- package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
- package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
- package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
- package/src/hooks/__tests__/useScript.test.tsx +77 -0
- package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
- package/src/hooks/useAsyncData.ts +3 -3
- package/src/hooks/useDataSourceDiscovery.ts +6 -4
- package/src/hooks/useDebounce.ts +6 -10
- package/src/hooks/useDeepCompareMemoize.ts +1 -1
- package/src/hooks/useDelayElapsed.ts +14 -10
- package/src/hooks/useElapsedTime.ts +3 -3
- package/src/hooks/useEventListener.ts +1 -2
- package/src/hooks/useInputHistory.ts +4 -7
- package/src/hooks/useInternalStateWithSync.ts +6 -6
- package/src/hooks/useResizeObserver.ts +4 -7
- package/src/hooks/useScript.ts +67 -70
- package/src/hooks/useStateForKey.ts +93 -0
- package/src/mount.tsx +0 -4
- package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
- package/src/plugins/core/registerReactComponent.tsx +1 -1
- package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
- package/src/plugins/impl/DataEditorPlugin.tsx +1 -1
- package/src/plugins/impl/DataTablePlugin.tsx +29 -33
- package/src/plugins/impl/DropdownPlugin.tsx +2 -6
- package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
- package/src/plugins/impl/FormPlugin.tsx +1 -1
- package/src/plugins/impl/RangeSliderPlugin.tsx +0 -1
- package/src/plugins/impl/RefreshPlugin.tsx +1 -0
- package/src/plugins/impl/SliderPlugin.tsx +6 -8
- package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +117 -1
- package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
- package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
- package/src/plugins/impl/anywidget/__tests__/registry.test.ts +2 -0
- package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
- package/src/plugins/impl/anywidget/runtime.ts +21 -9
- package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
- package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
- package/src/plugins/impl/chat/chat-ui.tsx +12 -10
- package/src/plugins/impl/code/any-language-editor.tsx +2 -2
- package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
- package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
- package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
- package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -2
- package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
- package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
- package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
- package/src/plugins/impl/panel/utils.ts +17 -0
- package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
- package/src/plugins/impl/plotly/selection.ts +25 -19
- package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
- package/src/plugins/impl/vega/make-selectable.ts +4 -7
- package/src/plugins/layout/RoutesPlugin.tsx +1 -1
- package/src/stories/__tests__/editor-story.test.tsx +33 -0
- package/src/stories/button.stories.tsx +1 -0
- package/src/stories/editor.stories.tsx +24 -17
- package/src/stories/form-wrapper.stories.tsx +2 -2
- package/src/stories/select.stories.tsx +2 -2
- package/src/stories/switchable-multi-select.stories.tsx +1 -1
- package/src/utils/__tests__/arrays.test.ts +35 -0
- package/src/utils/__tests__/batch-requests.test.ts +3 -3
- package/src/utils/__tests__/numbers.test.ts +48 -1
- package/src/utils/__tests__/objects.test.ts +21 -0
- package/src/utils/arrays.ts +10 -0
- package/src/utils/blob.ts +1 -1
- package/src/utils/numbers.ts +28 -17
- package/src/utils/objects.ts +3 -7
- package/src/utils/once.ts +19 -19
- package/src/utils/tracer.ts +9 -5
- package/src/utils/zod-utils.ts +1 -3
- package/dist/assets/CellStatus-DVOHpdeJ.js +0 -1
- package/dist/assets/JsonOutput-Cx1iyibB.js +0 -11
- package/dist/assets/MarimoErrorOutput-s_5GOX8k.js +0 -10
- package/dist/assets/RunButton-BKoh0zYG.js +0 -1
- package/dist/assets/__vite-browser-external-CYO_P3S8.js +0 -1
- package/dist/assets/__vite-browser-external-FeDVGZU8.js +0 -1
- package/dist/assets/ai-model-dropdown-i1vfGeVi.js +0 -13
- package/dist/assets/any-language-editor-BdTWdMCI.js +0 -1
- package/dist/assets/arrays-BqUx5USx.js +0 -1
- package/dist/assets/cell-editor-BKJ06H5F.js +0 -21
- package/dist/assets/chat-panel-Cau71Ygr.js +0 -4
- package/dist/assets/chat-ui-C5ql1Up-.js +0 -4
- package/dist/assets/circle-play-CYIb0qT6.js +0 -1
- package/dist/assets/column-preview-BZ_iNhtJ.js +0 -1
- package/dist/assets/command-palette-DDC3kBet.js +0 -1
- package/dist/assets/components-YBmtV0p6.js +0 -1
- package/dist/assets/config-Dy28fDwn.js +0 -1
- package/dist/assets/edit-page-D_Rg0gQO.js +0 -9
- package/dist/assets/feedback-button-Kla7i5RT.js +0 -1
- package/dist/assets/file-explorer-panel-Uk4_QIJQ.js +0 -1
- package/dist/assets/home-page-hmvKlc1w.js +0 -4
- package/dist/assets/index-6b4mf8Ai.css +0 -2
- package/dist/assets/index-ptK1gxmo.js +0 -30
- package/dist/assets/kiosk-mode-BZECfg9k.js +0 -1
- package/dist/assets/linear-0eij_aAG.js +0 -1
- package/dist/assets/link-NuFVR7G9.js +0 -1
- package/dist/assets/links-DkkL9DVa.js +0 -1
- package/dist/assets/numbers-Mk3-CcoU.js +0 -1
- package/dist/assets/packages-panel-CI5ff9b-.js +0 -1
- package/dist/assets/panels-BCcZ_yLK.js +0 -107
- package/dist/assets/precisionRound-Bq_nmf5u.js +0 -1
- package/dist/assets/process-output-f3C3PD0Z.js +0 -1
- package/dist/assets/react-vega-C3rYGtP6.js +0 -189
- package/dist/assets/requests-CgSY1X4a.js +0 -1
- package/dist/assets/run-page-AfZhtEh1.js +0 -1
- package/dist/assets/scratchpad-panel-D2rWg4k8.js +0 -1
- package/dist/assets/session-panel-CnANhcTo.js +0 -1
- package/dist/assets/state-BAJYRhmO.js +0 -1
- package/dist/assets/state-CbjBtkdd.js +0 -3
- package/dist/assets/tooltip-mT3CGest.js +0 -61
- package/dist/assets/tracing-Dz2rYOFL.js +0 -1
- package/dist/assets/tracing-panel-DqQY9V91.js +0 -2
- package/dist/assets/useAsyncData-C7aJJz0Y.js +0 -1
- package/dist/assets/useBoolean-d0Tty94N.js +0 -1
- package/dist/assets/useCellActionButton-DmaFZ4oF.js +0 -1
- package/dist/assets/useDebounce-B_ccBZTp.js +0 -1
- package/dist/assets/useNotebookActions-DHt3s-ia.js +0 -1
- package/dist/assets/vega-component-IouMe13t.js +0 -1
- package/dist/assets/vega-loader.browser-CLRkNgm7.js +0 -6
- package/dist/assets/worker-DTQ7oH2A.js +0 -158
- package/dist/assets/ws-BXWY541V.js +0 -22
- package/src/core/host/__tests__/events.test.ts +0 -46
- package/src/core/host/__tests__/protocol.test.ts +0 -214
- package/src/core/host/events.ts +0 -60
- package/src/core/host/protocol.ts +0 -1943
- package/src/core/state/__tests__/jotai.test.ts +0 -25
- package/src/core/websocket/__tests__/createConnectionTransport.test.ts +0 -49
- package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
- package/src/core/websocket/transports/__tests__/sse.test.ts +0 -335
- package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
- package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
- package/src/core/websocket/transports/basic.ts +0 -102
- package/src/core/websocket/transports/create.ts +0 -31
- package/src/core/websocket/transports/sse.ts +0 -308
- package/src/core/websocket/transports/transport.ts +0 -50
- package/src/core/websocket/transports/ws.ts +0 -98
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { render, screen, waitFor } from "@testing-library/react";
|
|
4
|
+
import { Provider } from "jotai";
|
|
5
|
+
import type React from "react";
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { MockRequestClient } from "@/__mocks__/requests";
|
|
8
|
+
import type { SQLTableContext } from "@/core/datasets/data-source-connections";
|
|
9
|
+
import { PreviewSQLTableList } from "@/core/datasets/request-registry";
|
|
10
|
+
import type { SQLTableListPreview } from "@/core/kernel/messages";
|
|
11
|
+
import type { RequestId } from "@/core/network/DeferredRequestRegistry";
|
|
12
|
+
import { requestClientAtom } from "@/core/network/requests";
|
|
13
|
+
import { store } from "@/core/state/jotai";
|
|
14
|
+
import { TableList } from "../datasources";
|
|
15
|
+
|
|
16
|
+
const wrapper = ({ children }: { children: React.ReactNode }) => (
|
|
17
|
+
<Provider store={store}>{children}</Provider>
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
const sqlTableContext: SQLTableContext = {
|
|
21
|
+
engine: "my_engine",
|
|
22
|
+
database: "my_db",
|
|
23
|
+
schema: "public",
|
|
24
|
+
dialect: "postgres",
|
|
25
|
+
schemaPath: ["public"],
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// The kernel answers table-list requests over the websocket, so the mock
|
|
29
|
+
// settles the deferred request instead of returning the response directly.
|
|
30
|
+
function renderDeferredTableList(settle?: (requestId: RequestId) => void) {
|
|
31
|
+
const client = MockRequestClient.create();
|
|
32
|
+
client.previewSQLTableList.mockImplementation(async ({ requestId }) => {
|
|
33
|
+
settle?.(requestId);
|
|
34
|
+
return null;
|
|
35
|
+
});
|
|
36
|
+
store.set(requestClientAtom, client);
|
|
37
|
+
render(
|
|
38
|
+
<TableList
|
|
39
|
+
tables={[]}
|
|
40
|
+
tablesResolved={false}
|
|
41
|
+
sqlTableContext={sqlTableContext}
|
|
42
|
+
/>,
|
|
43
|
+
{ wrapper },
|
|
44
|
+
);
|
|
45
|
+
return client;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
describe("TableList deferred discovery", () => {
|
|
49
|
+
it("shows the error when the request rejects", async () => {
|
|
50
|
+
renderDeferredTableList((requestId) =>
|
|
51
|
+
PreviewSQLTableList.reject(requestId, new Error("engine offline")),
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
expect(screen.getByText("Loading tables...")).toBeInTheDocument();
|
|
55
|
+
|
|
56
|
+
await waitFor(() => {
|
|
57
|
+
expect(screen.getByText("engine offline")).toBeInTheDocument();
|
|
58
|
+
});
|
|
59
|
+
expect(screen.queryByText("Loading tables...")).toBeNull();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("shows the error when the response has no tables field", async () => {
|
|
63
|
+
renderDeferredTableList((requestId) =>
|
|
64
|
+
PreviewSQLTableList.resolve(requestId, {} as SQLTableListPreview),
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
await waitFor(() => {
|
|
68
|
+
expect(screen.getByText("No tables available")).toBeInTheDocument();
|
|
69
|
+
});
|
|
70
|
+
expect(screen.queryByText("Loading tables...")).toBeNull();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("shows the empty state for an empty table list", async () => {
|
|
74
|
+
renderDeferredTableList((requestId) =>
|
|
75
|
+
PreviewSQLTableList.resolve(requestId, {
|
|
76
|
+
tables: [],
|
|
77
|
+
} as unknown as SQLTableListPreview),
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
await waitFor(() => {
|
|
81
|
+
expect(screen.getByText("No tables found")).toBeInTheDocument();
|
|
82
|
+
});
|
|
83
|
+
expect(screen.queryByText("Loading tables...")).toBeNull();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("requests the table list with the table context and waits for the kernel", async () => {
|
|
87
|
+
let pendingRequestId: RequestId | undefined;
|
|
88
|
+
const client = renderDeferredTableList((requestId) => {
|
|
89
|
+
pendingRequestId = requestId;
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
await waitFor(() => {
|
|
93
|
+
expect(client.previewSQLTableList).toHaveBeenCalledTimes(1);
|
|
94
|
+
});
|
|
95
|
+
expect(client.previewSQLTableList).toHaveBeenCalledWith(
|
|
96
|
+
expect.objectContaining({
|
|
97
|
+
engine: "my_engine",
|
|
98
|
+
database: "my_db",
|
|
99
|
+
schema: "public",
|
|
100
|
+
schemaPath: ["public"],
|
|
101
|
+
}),
|
|
102
|
+
);
|
|
103
|
+
expect(screen.getByText("Loading tables...")).toBeInTheDocument();
|
|
104
|
+
|
|
105
|
+
// Settle the request so the process-wide registry does not keep the entry.
|
|
106
|
+
expect(pendingRequestId).toBeDefined();
|
|
107
|
+
PreviewSQLTableList.resolve(
|
|
108
|
+
pendingRequestId as RequestId,
|
|
109
|
+
{
|
|
110
|
+
tables: [],
|
|
111
|
+
} as unknown as SQLTableListPreview,
|
|
112
|
+
);
|
|
113
|
+
await waitFor(() => {
|
|
114
|
+
expect(screen.queryByText("Loading tables...")).toBeNull();
|
|
115
|
+
});
|
|
116
|
+
expect(PreviewSQLTableList.requests.size).toBe(0);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
@@ -112,12 +112,16 @@ export const DatasetColumnPreview: React.FC<{
|
|
|
112
112
|
|
|
113
113
|
const addDataframeChart = preview.chart_code &&
|
|
114
114
|
table.source_type === "local" && (
|
|
115
|
-
<AddDataframeChart
|
|
115
|
+
<AddDataframeChart
|
|
116
|
+
chartCode={preview.chart_code}
|
|
117
|
+
columnName={column.name}
|
|
118
|
+
/>
|
|
116
119
|
);
|
|
117
120
|
|
|
118
121
|
const addSQLChart = table.source_type === "duckdb" && (
|
|
119
122
|
<Tooltip content="Add SQL cell" delayDuration={400}>
|
|
120
123
|
<Button
|
|
124
|
+
aria-label={`Add SQL cell for ${column.name}`}
|
|
121
125
|
variant="outline"
|
|
122
126
|
size="icon"
|
|
123
127
|
className="z-10 bg-background absolute right-1 -top-1"
|
|
@@ -238,7 +242,8 @@ export function renderChart(chartSpec: string, theme: Theme) {
|
|
|
238
242
|
|
|
239
243
|
export const AddDataframeChart: React.FC<{
|
|
240
244
|
chartCode: string;
|
|
241
|
-
|
|
245
|
+
columnName: string;
|
|
246
|
+
}> = ({ chartCode, columnName }) => {
|
|
242
247
|
const autoInstantiate = useAtomValue(autoInstantiateAtom);
|
|
243
248
|
const lastFocusedCellId = useLastFocusedCellId();
|
|
244
249
|
const { createNewCell } = useCellActions();
|
|
@@ -261,6 +266,7 @@ export const AddDataframeChart: React.FC<{
|
|
|
261
266
|
return (
|
|
262
267
|
<Tooltip content="Add chart to notebook" delayDuration={400}>
|
|
263
268
|
<Button
|
|
269
|
+
aria-label={`Add chart to notebook for ${columnName}`}
|
|
264
270
|
variant="outline"
|
|
265
271
|
size="icon"
|
|
266
272
|
className="z-10 bg-background absolute right-1 -top-0.5"
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
VisibilityToggleButton,
|
|
14
14
|
} from "@/components/editor/file-tree/tree-actions";
|
|
15
15
|
import { CopyClipboardIcon } from "@/components/icons/copy-icon";
|
|
16
|
-
import { Button } from "@/components/ui/button";
|
|
16
|
+
import { Button, buttonVariants } from "@/components/ui/button";
|
|
17
17
|
import { Command, CommandInput, CommandItem } from "@/components/ui/command";
|
|
18
18
|
import { Tooltip } from "@/components/ui/tooltip";
|
|
19
19
|
import { maybeAddMarimoImport } from "@/core/cells/add-missing-import";
|
|
@@ -702,7 +702,40 @@ const SchemaNode: React.FC<SchemaNodeProps> = (props) => {
|
|
|
702
702
|
);
|
|
703
703
|
};
|
|
704
704
|
|
|
705
|
-
|
|
705
|
+
// Kept outside the component because the React Compiler does not yet
|
|
706
|
+
// support try/finally inside component bodies.
|
|
707
|
+
async function loadTableList(
|
|
708
|
+
sqlTableContext: SQLTableContext,
|
|
709
|
+
addTableList: ReturnType<typeof useDataSourceActions>["addTableList"],
|
|
710
|
+
setLoading: (loading: boolean) => void,
|
|
711
|
+
) {
|
|
712
|
+
setLoading(true);
|
|
713
|
+
try {
|
|
714
|
+
const { engine, database, schema, schemaPath } = sqlTableContext;
|
|
715
|
+
const previewTableList = await PreviewSQLTableList.request({
|
|
716
|
+
engine: engine,
|
|
717
|
+
database: database,
|
|
718
|
+
schema: schema,
|
|
719
|
+
schemaPath: schemaPath ?? [],
|
|
720
|
+
});
|
|
721
|
+
|
|
722
|
+
if (!previewTableList?.tables) {
|
|
723
|
+
throw new Error("No tables available");
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
addTableList({
|
|
727
|
+
tables: previewTableList.tables,
|
|
728
|
+
sqlTableContext: sqlTableContext,
|
|
729
|
+
});
|
|
730
|
+
} finally {
|
|
731
|
+
setLoading(false);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
/**
|
|
736
|
+
* This is exported for testing purposes only.
|
|
737
|
+
*/
|
|
738
|
+
export const TableList: React.FC<{
|
|
706
739
|
tables: DataTable[];
|
|
707
740
|
sqlTableContext?: SQLTableContext;
|
|
708
741
|
searchValue?: string;
|
|
@@ -731,26 +764,7 @@ const TableList: React.FC<{
|
|
|
731
764
|
// resets tablesResolved to false).
|
|
732
765
|
const { isPending, error } = useAsyncData(async () => {
|
|
733
766
|
if (!tablesResolved && sqlTableContext) {
|
|
734
|
-
setTablesLoading
|
|
735
|
-
|
|
736
|
-
const { engine, database, schema, schemaPath } = sqlTableContext;
|
|
737
|
-
const previewTableList = await PreviewSQLTableList.request({
|
|
738
|
-
engine: engine,
|
|
739
|
-
database: database,
|
|
740
|
-
schema: schema,
|
|
741
|
-
schemaPath: schemaPath ?? [],
|
|
742
|
-
});
|
|
743
|
-
|
|
744
|
-
if (!previewTableList?.tables) {
|
|
745
|
-
setTablesLoading(false);
|
|
746
|
-
throw new Error("No tables available");
|
|
747
|
-
}
|
|
748
|
-
|
|
749
|
-
addTableList({
|
|
750
|
-
tables: previewTableList.tables,
|
|
751
|
-
sqlTableContext: sqlTableContext,
|
|
752
|
-
});
|
|
753
|
-
setTablesLoading(false);
|
|
767
|
+
await loadTableList(sqlTableContext, addTableList, setTablesLoading);
|
|
754
768
|
}
|
|
755
769
|
}, [tablesResolved, sqlTableContext]);
|
|
756
770
|
|
|
@@ -964,6 +978,7 @@ const DatasetTableItem: React.FC<{
|
|
|
964
978
|
{renderRowsByColumns()}
|
|
965
979
|
<Tooltip content="Add table to notebook" delayDuration={400}>
|
|
966
980
|
<Button
|
|
981
|
+
aria-label={`Add table ${table.name} to notebook`}
|
|
967
982
|
className="group-hover:inline-flex hidden"
|
|
968
983
|
variant="text"
|
|
969
984
|
size="icon"
|
|
@@ -1054,19 +1069,16 @@ const DatasetColumnItem: React.FC<{
|
|
|
1054
1069
|
{isIndexed &&
|
|
1055
1070
|
renderItemSubtext({ tooltipContent: "Indexed", content: "IDX" })}
|
|
1056
1071
|
</div>
|
|
1057
|
-
<
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
/>
|
|
1068
|
-
</Button>
|
|
1069
|
-
</Tooltip>
|
|
1072
|
+
<CopyClipboardIcon
|
|
1073
|
+
tooltip="Copy column name"
|
|
1074
|
+
value={column.name}
|
|
1075
|
+
ariaLabel={`Copy column name ${column.name}`}
|
|
1076
|
+
className="h-3 w-3"
|
|
1077
|
+
buttonClassName={cn(
|
|
1078
|
+
buttonVariants({ variant: "text", size: "icon" }),
|
|
1079
|
+
"group-hover:opacity-100 opacity-0 hover:bg-muted text-muted-foreground hover:text-foreground",
|
|
1080
|
+
)}
|
|
1081
|
+
/>
|
|
1070
1082
|
<span className="text-xs text-muted-foreground">
|
|
1071
1083
|
{column.external_type}
|
|
1072
1084
|
</span>
|
|
@@ -162,6 +162,7 @@ export const DebuggerControls: React.FC<{
|
|
|
162
162
|
<div className="flex">
|
|
163
163
|
<Tooltip content="Next line">
|
|
164
164
|
<Button
|
|
165
|
+
aria-label="Next line"
|
|
165
166
|
variant="text"
|
|
166
167
|
size="icon"
|
|
167
168
|
data-testid="debugger-next-button"
|
|
@@ -173,6 +174,7 @@ export const DebuggerControls: React.FC<{
|
|
|
173
174
|
</Tooltip>
|
|
174
175
|
<Tooltip content="Continue execution">
|
|
175
176
|
<Button
|
|
177
|
+
aria-label="Continue execution"
|
|
176
178
|
variant="text"
|
|
177
179
|
size="icon"
|
|
178
180
|
data-testid="debugger-continue-button"
|
|
@@ -187,6 +189,7 @@ export const DebuggerControls: React.FC<{
|
|
|
187
189
|
</Tooltip>
|
|
188
190
|
<Tooltip content="Print stack trace">
|
|
189
191
|
<Button
|
|
192
|
+
aria-label="Print stack trace"
|
|
190
193
|
variant="text"
|
|
191
194
|
size="icon"
|
|
192
195
|
data-testid="debugger-stack-button"
|
|
@@ -198,6 +201,7 @@ export const DebuggerControls: React.FC<{
|
|
|
198
201
|
</Tooltip>
|
|
199
202
|
<Tooltip content="Help">
|
|
200
203
|
<Button
|
|
204
|
+
aria-label="Debugger help"
|
|
201
205
|
variant="text"
|
|
202
206
|
size="icon"
|
|
203
207
|
data-testid="debugger-help-button"
|
|
@@ -210,6 +214,7 @@ export const DebuggerControls: React.FC<{
|
|
|
210
214
|
{onClear && (
|
|
211
215
|
<Tooltip content="Quit and clear">
|
|
212
216
|
<Button
|
|
217
|
+
aria-label="Quit and clear debugger"
|
|
213
218
|
variant="text"
|
|
214
219
|
size="icon"
|
|
215
220
|
data-testid="debugger-clear-button"
|
|
@@ -85,13 +85,13 @@ export const DependencyGraphTree: React.FC<PropsWithChildren<Props>> = ({
|
|
|
85
85
|
|
|
86
86
|
// oxlint-disable-next-line react/hook-use-state
|
|
87
87
|
const [initial] = useState(() => {
|
|
88
|
-
const elements = elementsBuilder.createElements(
|
|
88
|
+
const elements = elementsBuilder.createElements({
|
|
89
89
|
cellIds,
|
|
90
90
|
cellAtoms,
|
|
91
91
|
variables,
|
|
92
|
-
settings.hidePureMarkdown,
|
|
93
|
-
settings.hideReusableFunctions,
|
|
94
|
-
);
|
|
92
|
+
hidePureMarkdown: settings.hidePureMarkdown,
|
|
93
|
+
hideReusableFunctions: settings.hideReusableFunctions,
|
|
94
|
+
});
|
|
95
95
|
return layoutElements({
|
|
96
96
|
nodes: withExpansion(elements.nodes, expandedIds),
|
|
97
97
|
edges: elements.edges,
|
|
@@ -163,13 +163,13 @@ export const DependencyGraphTree: React.FC<PropsWithChildren<Props>> = ({
|
|
|
163
163
|
|
|
164
164
|
// Rebuild + re-layout when the graph inputs or the expand/collapse set change.
|
|
165
165
|
useEffect(() => {
|
|
166
|
-
const elements = elementsBuilder.createElements(
|
|
166
|
+
const elements = elementsBuilder.createElements({
|
|
167
167
|
cellIds,
|
|
168
168
|
cellAtoms,
|
|
169
169
|
variables,
|
|
170
|
-
settings.hidePureMarkdown,
|
|
171
|
-
settings.hideReusableFunctions,
|
|
172
|
-
);
|
|
170
|
+
hidePureMarkdown: settings.hidePureMarkdown,
|
|
171
|
+
hideReusableFunctions: settings.hideReusableFunctions,
|
|
172
|
+
});
|
|
173
173
|
syncChanges({
|
|
174
174
|
nodes: withExpansion(elements.nodes, expandedIds),
|
|
175
175
|
edges: elements.edges,
|
|
@@ -42,6 +42,14 @@ export interface NodeData {
|
|
|
42
42
|
}
|
|
43
43
|
export type CustomNodeProps = NodeProps<NodeData>;
|
|
44
44
|
|
|
45
|
+
interface CreateElementsOptions {
|
|
46
|
+
cellIds: CellId[];
|
|
47
|
+
cellAtoms: Atom<CellData>[];
|
|
48
|
+
variables: Variables;
|
|
49
|
+
hidePureMarkdown: boolean;
|
|
50
|
+
hideReusableFunctions: boolean;
|
|
51
|
+
}
|
|
52
|
+
|
|
45
53
|
const LINE_HEIGHT = 11; // matches TinyCode.css
|
|
46
54
|
|
|
47
55
|
export function getNodeHeight(linesOfCode: number) {
|
|
@@ -176,13 +184,10 @@ export function computeDefsByCell(
|
|
|
176
184
|
}
|
|
177
185
|
|
|
178
186
|
interface ElementsBuilder {
|
|
179
|
-
createElements: (
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
hidePureMarkdown: boolean,
|
|
184
|
-
hideReusableFunctions: boolean,
|
|
185
|
-
) => { nodes: Node<NodeData>[]; edges: Edge[] };
|
|
187
|
+
createElements: (options: CreateElementsOptions) => {
|
|
188
|
+
nodes: Node<NodeData>[];
|
|
189
|
+
edges: Edge[];
|
|
190
|
+
};
|
|
186
191
|
}
|
|
187
192
|
|
|
188
193
|
export class VerticalElementsBuilder implements ElementsBuilder {
|
|
@@ -225,13 +230,11 @@ export class VerticalElementsBuilder implements ElementsBuilder {
|
|
|
225
230
|
};
|
|
226
231
|
}
|
|
227
232
|
|
|
228
|
-
public createElements(
|
|
229
|
-
cellIds
|
|
230
|
-
cellAtoms
|
|
231
|
-
variables
|
|
232
|
-
|
|
233
|
-
_hideReusableFunctions: boolean,
|
|
234
|
-
) {
|
|
233
|
+
public createElements({
|
|
234
|
+
cellIds,
|
|
235
|
+
cellAtoms,
|
|
236
|
+
variables,
|
|
237
|
+
}: CreateElementsOptions) {
|
|
235
238
|
let prevY = 0;
|
|
236
239
|
const nodes: Node<NodeData>[] = [];
|
|
237
240
|
const edges: Edge[] = [];
|
|
@@ -311,13 +314,13 @@ export class TreeElementsBuilder implements ElementsBuilder {
|
|
|
311
314
|
};
|
|
312
315
|
}
|
|
313
316
|
|
|
314
|
-
public createElements(
|
|
315
|
-
cellIds
|
|
316
|
-
cellAtoms
|
|
317
|
-
variables
|
|
318
|
-
hidePureMarkdown
|
|
319
|
-
hideReusableFunctions
|
|
320
|
-
) {
|
|
317
|
+
public createElements({
|
|
318
|
+
cellIds,
|
|
319
|
+
cellAtoms,
|
|
320
|
+
variables,
|
|
321
|
+
hidePureMarkdown,
|
|
322
|
+
hideReusableFunctions,
|
|
323
|
+
}: CreateElementsOptions) {
|
|
321
324
|
const nodes: Node<NodeData>[] = [];
|
|
322
325
|
|
|
323
326
|
const cellRuntime = getNotebook().cellRuntime;
|
|
@@ -216,11 +216,12 @@ export const GraphSelectionPanel: React.FC<{
|
|
|
216
216
|
</Button>
|
|
217
217
|
</Tooltip>
|
|
218
218
|
<ConnectionCellActionsDropdown cellId={selection.id}>
|
|
219
|
-
<Button variant="ghost" size="icon">
|
|
219
|
+
<Button aria-label="Cell actions" variant="ghost" size="icon">
|
|
220
220
|
<MoreVerticalIcon className="w-4 h-4" />
|
|
221
221
|
</Button>
|
|
222
222
|
</ConnectionCellActionsDropdown>
|
|
223
223
|
<Button
|
|
224
|
+
aria-label="Close cell details"
|
|
224
225
|
variant="text"
|
|
225
226
|
size="icon"
|
|
226
227
|
onClick={() => {
|
|
@@ -7,10 +7,12 @@ import { boundingBox, placeIslands } from "../layout";
|
|
|
7
7
|
|
|
8
8
|
function node(
|
|
9
9
|
id: string,
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
{
|
|
11
|
+
x,
|
|
12
|
+
y,
|
|
13
|
+
width,
|
|
14
|
+
height,
|
|
15
|
+
}: { x: number; y: number; width: number; height: number },
|
|
14
16
|
): Node<NodeData> {
|
|
15
17
|
return {
|
|
16
18
|
id,
|
|
@@ -28,8 +30,8 @@ describe("boundingBox", () => {
|
|
|
28
30
|
|
|
29
31
|
it("spans position + size across nodes", () => {
|
|
30
32
|
const box = boundingBox([
|
|
31
|
-
node("a", 0, 0, 50, 50),
|
|
32
|
-
node("b", 10, 20, 100, 40),
|
|
33
|
+
node("a", { x: 0, y: 0, width: 50, height: 50 }),
|
|
34
|
+
node("b", { x: 10, y: 20, width: 100, height: 40 }),
|
|
33
35
|
]);
|
|
34
36
|
expect(box).toEqual({ minX: 0, minY: 0, maxX: 110, maxY: 60 });
|
|
35
37
|
});
|
|
@@ -52,12 +54,17 @@ describe("boundingBox", () => {
|
|
|
52
54
|
|
|
53
55
|
describe("placeIslands", () => {
|
|
54
56
|
it("returns nothing when there are no islands", () => {
|
|
55
|
-
expect(
|
|
57
|
+
expect(
|
|
58
|
+
placeIslands([], [node("a", { x: 0, y: 0, width: 100, height: 100 })]),
|
|
59
|
+
).toEqual([]);
|
|
56
60
|
});
|
|
57
61
|
|
|
58
62
|
it("stacks islands in a column to the right of the placed graph", () => {
|
|
59
|
-
const placed = [node("main", 0, 0, 200, 300)];
|
|
60
|
-
const islands = [
|
|
63
|
+
const placed = [node("main", { x: 0, y: 0, width: 200, height: 300 })];
|
|
64
|
+
const islands = [
|
|
65
|
+
node("i0", { x: 0, y: 0, width: 90, height: 40 }),
|
|
66
|
+
node("i1", { x: 0, y: 0, width: 90, height: 40 }),
|
|
67
|
+
];
|
|
61
68
|
const result = placeIslands(islands, placed);
|
|
62
69
|
// startX = maxX(200) + margin(40) = 240; startY = minY(0).
|
|
63
70
|
expect(result[0].position).toEqual({ x: 240, y: 0 });
|
|
@@ -66,9 +73,9 @@ describe("placeIslands", () => {
|
|
|
66
73
|
});
|
|
67
74
|
|
|
68
75
|
it("wraps into a new column when the column gets too tall", () => {
|
|
69
|
-
const placed = [node("main", 0, 0, 200, 300)];
|
|
76
|
+
const placed = [node("main", { x: 0, y: 0, width: 200, height: 300 })];
|
|
70
77
|
const islands = Array.from({ length: 10 }, (_, i) =>
|
|
71
|
-
node(`i${i}`, 0, 0, 90, 40),
|
|
78
|
+
node(`i${i}`, { x: 0, y: 0, width: 90, height: 40 }),
|
|
72
79
|
);
|
|
73
80
|
const result = placeIslands(islands, placed);
|
|
74
81
|
const firstColumnX = result[0].position.x;
|
|
@@ -71,7 +71,6 @@ export const SortableCell = React.forwardRef(
|
|
|
71
71
|
return (
|
|
72
72
|
<SortableCellInternal
|
|
73
73
|
ref={ref}
|
|
74
|
-
cellId={cellId}
|
|
75
74
|
canMoveX={canMoveX}
|
|
76
75
|
{...props}
|
|
77
76
|
attributes={attributes}
|
|
@@ -86,7 +85,7 @@ export const SortableCell = React.forwardRef(
|
|
|
86
85
|
);
|
|
87
86
|
SortableCell.displayName = "SortableCell";
|
|
88
87
|
|
|
89
|
-
interface SortableCellInternalProps extends Props {
|
|
88
|
+
interface SortableCellInternalProps extends Omit<Props, "cellId"> {
|
|
90
89
|
children: React.ReactNode;
|
|
91
90
|
attributes: DraggableAttributes;
|
|
92
91
|
listeners: SyntheticListenerMap | undefined;
|
|
@@ -99,7 +98,6 @@ interface SortableCellInternalProps extends Props {
|
|
|
99
98
|
const SortableCellInternal = React.forwardRef(
|
|
100
99
|
(
|
|
101
100
|
{
|
|
102
|
-
cellId,
|
|
103
101
|
canMoveX,
|
|
104
102
|
children,
|
|
105
103
|
attributes,
|