@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
|
@@ -13,8 +13,8 @@ import {
|
|
|
13
13
|
XIcon,
|
|
14
14
|
} from "lucide-react";
|
|
15
15
|
import type { JSX } from "react";
|
|
16
|
-
import React, { useMemo,
|
|
17
|
-
import { type UseFormReturn, useForm } from "react-hook-form";
|
|
16
|
+
import React, { useMemo, useState } from "react";
|
|
17
|
+
import { type UseFormReturn, useForm, useWatch } from "react-hook-form";
|
|
18
18
|
import useResizeObserver from "use-resize-observer";
|
|
19
19
|
import { PythonIcon } from "@/components/editor/cell/code/icons";
|
|
20
20
|
import { Alert, AlertDescription } from "@/components/ui/alert";
|
|
@@ -48,7 +48,12 @@ import { HeatmapForm } from "./forms/heatmap";
|
|
|
48
48
|
import { PieForm } from "./forms/pie";
|
|
49
49
|
import { LazyChart } from "./lazy-chart";
|
|
50
50
|
import { ChartSchema, type ChartSchemaType, getChartDefaults } from "./schemas";
|
|
51
|
-
import {
|
|
51
|
+
import {
|
|
52
|
+
createTabId,
|
|
53
|
+
getChartTabName,
|
|
54
|
+
type TabName,
|
|
55
|
+
tabsStorageAtom,
|
|
56
|
+
} from "./storage";
|
|
52
57
|
import { ChartType } from "./types";
|
|
53
58
|
|
|
54
59
|
const NEW_CHART_TYPE = "bar" as ChartType;
|
|
@@ -103,26 +108,28 @@ export const TablePanel: React.FC<TablePanelProps> = ({
|
|
|
103
108
|
|
|
104
109
|
const [selectedTab, setSelectedTab] = useState(DEFAULT_TAB_NAME);
|
|
105
110
|
const [tabCounter, setTabCounter] = useState(tabs.length);
|
|
106
|
-
const prevDisplayHeader =
|
|
111
|
+
const [prevDisplayHeader, setPrevDisplayHeader] = useState(displayHeader);
|
|
112
|
+
|
|
113
|
+
if (displayHeader !== prevDisplayHeader) {
|
|
114
|
+
setPrevDisplayHeader(displayHeader);
|
|
115
|
+
}
|
|
107
116
|
|
|
108
117
|
// Auto-create a default chart tab when chart builder opens with no tabs
|
|
109
|
-
if (
|
|
110
|
-
displayHeader &&
|
|
111
|
-
!prevDisplayHeader.current &&
|
|
112
|
-
tabs.length === 0 &&
|
|
113
|
-
cellId
|
|
114
|
-
) {
|
|
115
|
-
prevDisplayHeader.current = displayHeader;
|
|
118
|
+
if (displayHeader && !prevDisplayHeader && tabs.length === 0 && cellId) {
|
|
116
119
|
const tabName = getChartTabName(0, NEW_CHART_TYPE);
|
|
117
120
|
const newTabs = new Map(tabsMap);
|
|
118
121
|
newTabs.set(cellId, [
|
|
119
|
-
{
|
|
122
|
+
{
|
|
123
|
+
id: createTabId(),
|
|
124
|
+
tabName,
|
|
125
|
+
chartType: NEW_CHART_TYPE,
|
|
126
|
+
config: getChartDefaults(),
|
|
127
|
+
},
|
|
120
128
|
]);
|
|
121
129
|
saveTabsMap(newTabs);
|
|
122
130
|
setTabCounter(1);
|
|
123
131
|
setSelectedTab(tabName);
|
|
124
132
|
}
|
|
125
|
-
prevDisplayHeader.current = displayHeader;
|
|
126
133
|
|
|
127
134
|
if (!displayHeader || (tabs.length === 0 && !displayHeader)) {
|
|
128
135
|
return dataTable;
|
|
@@ -138,6 +145,7 @@ export const TablePanel: React.FC<TablePanelProps> = ({
|
|
|
138
145
|
newTabs.set(cellId, [
|
|
139
146
|
...tabs,
|
|
140
147
|
{
|
|
148
|
+
id: createTabId(),
|
|
141
149
|
tabName,
|
|
142
150
|
chartType: NEW_CHART_TYPE,
|
|
143
151
|
config: getChartDefaults(),
|
|
@@ -236,9 +244,9 @@ export const TablePanel: React.FC<TablePanelProps> = ({
|
|
|
236
244
|
>
|
|
237
245
|
Table
|
|
238
246
|
</TabsTrigger>
|
|
239
|
-
{tabs.map((tab
|
|
247
|
+
{tabs.map((tab) => (
|
|
240
248
|
<TabsTrigger
|
|
241
|
-
key={
|
|
249
|
+
key={tab.id}
|
|
242
250
|
className="text-xs"
|
|
243
251
|
value={tab.tabName}
|
|
244
252
|
onClick={() => setSelectedTab(tab.tabName)}
|
|
@@ -266,7 +274,7 @@ export const TablePanel: React.FC<TablePanelProps> = ({
|
|
|
266
274
|
<TabsContent className="mt-1 overflow-hidden" value={DEFAULT_TAB_NAME}>
|
|
267
275
|
{dataTable}
|
|
268
276
|
</TabsContent>
|
|
269
|
-
{tabs.map((tab
|
|
277
|
+
{tabs.map((tab) => {
|
|
270
278
|
const saveChart = (formValues: ChartSchemaType) => {
|
|
271
279
|
saveTabChart({
|
|
272
280
|
tabName: tab.tabName,
|
|
@@ -278,7 +286,11 @@ export const TablePanel: React.FC<TablePanelProps> = ({
|
|
|
278
286
|
saveTabChartType(tab.tabName, chartType);
|
|
279
287
|
};
|
|
280
288
|
return (
|
|
281
|
-
<TabsContent
|
|
289
|
+
<TabsContent
|
|
290
|
+
key={tab.id}
|
|
291
|
+
value={tab.tabName}
|
|
292
|
+
className="h-[400px] mt-0"
|
|
293
|
+
>
|
|
282
294
|
<ChartPanel
|
|
283
295
|
tableData={data}
|
|
284
296
|
chartConfig={tab.config}
|
|
@@ -320,9 +332,10 @@ export const ChartPanel: React.FC<{
|
|
|
320
332
|
saveChartType,
|
|
321
333
|
getDataUrl,
|
|
322
334
|
fieldTypes,
|
|
323
|
-
hasSchema
|
|
335
|
+
hasSchema: providedHasSchema,
|
|
324
336
|
isLargeDataset,
|
|
325
337
|
}) => {
|
|
338
|
+
const hasSchema = providedHasSchema ?? Boolean(fieldTypes?.length);
|
|
326
339
|
const { theme } = useTheme();
|
|
327
340
|
const form = useForm<ChartSchemaType>({
|
|
328
341
|
defaultValues: chartConfig ?? getChartDefaults(),
|
|
@@ -370,20 +383,17 @@ export const ChartPanel: React.FC<{
|
|
|
370
383
|
// Re-run when the data table changes
|
|
371
384
|
}, [tableData, renderLargeCharts, csvFieldTypes]);
|
|
372
385
|
|
|
373
|
-
|
|
386
|
+
// useWatch returns a new object only when a value changes. It is typed as
|
|
387
|
+
// deeply partial, but the form always starts from complete defaults.
|
|
388
|
+
const formValues = useWatch({ control: form.control }) as ChartSchemaType;
|
|
374
389
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
}, [formValues]);
|
|
379
|
-
|
|
380
|
-
const specWithoutData = createSpecWithoutData(
|
|
381
|
-
selectedChartType,
|
|
382
|
-
memoizedFormValues,
|
|
390
|
+
const specWithoutData = createSpecWithoutData({
|
|
391
|
+
chartType: selectedChartType,
|
|
392
|
+
formValues,
|
|
383
393
|
theme,
|
|
384
|
-
"container",
|
|
385
|
-
CHART_HEIGHT,
|
|
386
|
-
);
|
|
394
|
+
width: "container",
|
|
395
|
+
height: CHART_HEIGHT,
|
|
396
|
+
});
|
|
387
397
|
|
|
388
398
|
// Prevent unnecessary re-renders of the chart
|
|
389
399
|
const memoizedChart = useMemo(() => {
|
|
@@ -7,13 +7,16 @@ import { Logger } from "@/utils/Logger";
|
|
|
7
7
|
import { NotebookScopedLocalStorage } from "@/utils/storage/typed";
|
|
8
8
|
import { capitalize } from "@/utils/strings";
|
|
9
9
|
import type { TypedString } from "@/utils/typed";
|
|
10
|
+
import { generateUUID } from "@/utils/uuid";
|
|
10
11
|
import { ChartSchema, type ChartSchemaType } from "./schemas";
|
|
11
12
|
import type { ChartType } from "./types";
|
|
12
13
|
|
|
13
14
|
export type TabName = TypedString<"TabName">;
|
|
15
|
+
export type TabId = TypedString<"TabId">;
|
|
14
16
|
export const KEY = "marimo:charts:v2";
|
|
15
17
|
|
|
16
18
|
interface TabStorage {
|
|
19
|
+
id: TabId;
|
|
17
20
|
tabName: TabName; // unique within cell
|
|
18
21
|
chartType: ChartType;
|
|
19
22
|
config: ChartSchemaType;
|
|
@@ -21,11 +24,15 @@ interface TabStorage {
|
|
|
21
24
|
|
|
22
25
|
type TabStorageMap = Map<CellId, TabStorage[]>;
|
|
23
26
|
|
|
24
|
-
const TabStorageSchema = z
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const TabStorageSchema = z
|
|
28
|
+
.object({
|
|
29
|
+
id: z.string().optional(),
|
|
30
|
+
tabName: z.string().transform((name) => name as TabName),
|
|
31
|
+
chartType: z.string().transform((type) => type as ChartType),
|
|
32
|
+
config: ChartSchema,
|
|
33
|
+
})
|
|
34
|
+
// Stored tabs without an id use their name, which is unique within a cell.
|
|
35
|
+
.transform((tab) => ({ ...tab, id: (tab.id ?? tab.tabName) as TabId }));
|
|
29
36
|
const TabStorageEntriesSchema = z.array(
|
|
30
37
|
z.tuple([
|
|
31
38
|
z.string().transform((name) => name as CellId),
|
|
@@ -64,6 +71,10 @@ export const tabsStorageAtom = atomWithStorage<TabStorageMap>(
|
|
|
64
71
|
mapStorage,
|
|
65
72
|
);
|
|
66
73
|
|
|
74
|
+
export function createTabId(): TabId {
|
|
75
|
+
return generateUUID() as TabId;
|
|
76
|
+
}
|
|
77
|
+
|
|
67
78
|
/**
|
|
68
79
|
* Convenience function to get the tab name for a given tab number and chart type
|
|
69
80
|
*/
|
|
@@ -345,7 +345,7 @@ const ColumnPreview = ({
|
|
|
345
345
|
const chart = chart_spec && renderChart(chart_spec, theme);
|
|
346
346
|
|
|
347
347
|
const addDataframeChart = chart_code && (
|
|
348
|
-
<AddDataframeChart chartCode={chart_code} />
|
|
348
|
+
<AddDataframeChart chartCode={chart_code} columnName={columnName} />
|
|
349
349
|
);
|
|
350
350
|
|
|
351
351
|
return (
|
|
@@ -119,16 +119,16 @@ export class ColumnChartSpecModel<T> {
|
|
|
119
119
|
private columnBinValues = new Map<ColumnName, BinValues>();
|
|
120
120
|
private columnValueCounts = new Map<ColumnName, ValueCounts>();
|
|
121
121
|
|
|
122
|
-
public static readonly EMPTY = new ColumnChartSpecModel(
|
|
123
|
-
[],
|
|
124
|
-
new Map(),
|
|
125
|
-
{},
|
|
126
|
-
{},
|
|
127
|
-
{},
|
|
128
|
-
{
|
|
122
|
+
public static readonly EMPTY = new ColumnChartSpecModel({
|
|
123
|
+
data: [],
|
|
124
|
+
fieldTypes: new Map(),
|
|
125
|
+
stats: {},
|
|
126
|
+
binValues: {},
|
|
127
|
+
valueCounts: {},
|
|
128
|
+
opts: {
|
|
129
129
|
includeCharts: false,
|
|
130
130
|
},
|
|
131
|
-
);
|
|
131
|
+
});
|
|
132
132
|
|
|
133
133
|
private dataSpec: TopLevelSpec["data"];
|
|
134
134
|
|
|
@@ -144,16 +144,23 @@ export class ColumnChartSpecModel<T> {
|
|
|
144
144
|
includeCharts: boolean;
|
|
145
145
|
};
|
|
146
146
|
|
|
147
|
-
public constructor(
|
|
148
|
-
data
|
|
149
|
-
fieldTypes
|
|
150
|
-
stats
|
|
151
|
-
binValues
|
|
152
|
-
valueCounts
|
|
147
|
+
public constructor({
|
|
148
|
+
data,
|
|
149
|
+
fieldTypes,
|
|
150
|
+
stats,
|
|
151
|
+
binValues,
|
|
152
|
+
valueCounts,
|
|
153
|
+
opts,
|
|
154
|
+
}: {
|
|
155
|
+
data: T[] | string;
|
|
156
|
+
fieldTypes: FieldTypes;
|
|
157
|
+
stats: Record<ColumnName, Partial<ColumnHeaderStats>>;
|
|
158
|
+
binValues: Record<ColumnName, BinValues>;
|
|
159
|
+
valueCounts: Record<ColumnName, ValueCounts>;
|
|
153
160
|
opts: {
|
|
154
161
|
includeCharts: boolean;
|
|
155
|
-
}
|
|
156
|
-
) {
|
|
162
|
+
};
|
|
163
|
+
}) {
|
|
157
164
|
this.fieldTypes = fieldTypes;
|
|
158
165
|
this.stats = stats;
|
|
159
166
|
this.binValues = binValues;
|
|
@@ -16,7 +16,7 @@ export const ColumnChartContext = React.createContext<
|
|
|
16
16
|
ColumnChartSpecModel<unknown>
|
|
17
17
|
>(ColumnChartSpecModel.EMPTY);
|
|
18
18
|
|
|
19
|
-
interface Props
|
|
19
|
+
interface Props {
|
|
20
20
|
columnId: string;
|
|
21
21
|
}
|
|
22
22
|
|
|
@@ -24,9 +24,7 @@ interface Props<TData, TValue> {
|
|
|
24
24
|
// for all calls with the same key.
|
|
25
25
|
const batchedLoader = createBatchedLoader();
|
|
26
26
|
|
|
27
|
-
export const TableColumnSummary =
|
|
28
|
-
columnId,
|
|
29
|
-
}: Props<TData, TValue>) => {
|
|
27
|
+
export const TableColumnSummary = ({ columnId }: Props) => {
|
|
30
28
|
const { locale } = useLocale();
|
|
31
29
|
|
|
32
30
|
const chartSpecModel = React.use(ColumnChartContext);
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import type { Table } from "@tanstack/react-table";
|
|
8
8
|
import { Columns3Icon, EyeIcon, EyeOffIcon, ScanEyeIcon } from "lucide-react";
|
|
9
|
-
import React
|
|
9
|
+
import React from "react";
|
|
10
10
|
import { ColumnName } from "@/components/datasources/components";
|
|
11
11
|
import { Button } from "@/components/ui/button";
|
|
12
12
|
import {
|
|
@@ -24,6 +24,7 @@ import {
|
|
|
24
24
|
} from "@/components/ui/popover";
|
|
25
25
|
import { type BulkAction, useSelectList } from "@/components/ui/select-core";
|
|
26
26
|
import type { DataType } from "@/core/kernel/messages";
|
|
27
|
+
import { Arrays } from "@/utils/arrays";
|
|
27
28
|
import { cn } from "@/utils/cn";
|
|
28
29
|
import { Events } from "@/utils/events";
|
|
29
30
|
import { smartMatchFilter } from "@/utils/smartMatch";
|
|
@@ -67,9 +68,8 @@ export const ColumnVisibilityDropdown = <TData,>({
|
|
|
67
68
|
const hideableIds = userColumns
|
|
68
69
|
.filter((column) => column.getCanHide())
|
|
69
70
|
.map((column) => column.id);
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
).length;
|
|
71
|
+
const visibleHideableColumnIds = Arrays.difference(hideableIds, hiddenIds);
|
|
72
|
+
const visibleHideableCount = visibleHideableColumnIds.length;
|
|
73
73
|
|
|
74
74
|
const applyHidden = (next: string[] | string | null) => {
|
|
75
75
|
const hidden = new Set(Array.isArray(next) ? next : []);
|
|
@@ -106,15 +106,10 @@ export const ColumnVisibilityDropdown = <TData,>({
|
|
|
106
106
|
.filter((option) => !option.disabled)
|
|
107
107
|
.map((option) => option.value)
|
|
108
108
|
: [];
|
|
109
|
-
const showOnlyColumnState =
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
),
|
|
114
|
-
hideableColumnIdSet: new Set(hideableIds),
|
|
115
|
-
}),
|
|
116
|
-
[hideableIds, hiddenIds],
|
|
117
|
-
);
|
|
109
|
+
const showOnlyColumnState = {
|
|
110
|
+
visibleHideableColumnIds,
|
|
111
|
+
hideableColumnIdSet: new Set(hideableIds),
|
|
112
|
+
};
|
|
118
113
|
const hasSearchBulkActions =
|
|
119
114
|
showOnlyMatchIds.length > 0 || matchingActions.length > 0;
|
|
120
115
|
|
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
isNumericType,
|
|
42
42
|
} from "./types";
|
|
43
43
|
import { SentinelCell, WhitespaceMarkers } from "./sentinel-cell";
|
|
44
|
+
import { highlightMatches } from "./search-highlight";
|
|
44
45
|
import { detectSentinel, splitLeadingTrailingWhitespace } from "./utils";
|
|
45
46
|
import { uniformSample } from "./uniformSample";
|
|
46
47
|
import { MarkdownUrlDetector, UrlDetector } from "./url-detector";
|
|
@@ -135,6 +136,7 @@ export function generateColumns<T>({
|
|
|
135
136
|
}): ColumnDef<T>[] {
|
|
136
137
|
// Row-headers are typically index columns
|
|
137
138
|
const rowHeadersSet = new Set(rowHeaders.map(([columnName]) => columnName));
|
|
139
|
+
const wrappedColumnsSet = new Set(wrappedColumns);
|
|
138
140
|
|
|
139
141
|
const typesByColumn = Maps.keyBy(fieldTypes, (entry) => entry[0]);
|
|
140
142
|
|
|
@@ -277,7 +279,7 @@ export function generateColumns<T>({
|
|
|
277
279
|
);
|
|
278
280
|
},
|
|
279
281
|
|
|
280
|
-
cell: ({ column, renderValue, getValue, cell }) => {
|
|
282
|
+
cell: ({ column, renderValue, getValue, cell, table }) => {
|
|
281
283
|
function selectCell() {
|
|
282
284
|
if (selection !== "single-cell" && selection !== "multi-cell") {
|
|
283
285
|
return;
|
|
@@ -287,7 +289,7 @@ export function generateColumns<T>({
|
|
|
287
289
|
}
|
|
288
290
|
|
|
289
291
|
const justify = getJustify(key);
|
|
290
|
-
const wrapped =
|
|
292
|
+
const wrapped = wrappedColumnsSet.has(key);
|
|
291
293
|
const isCellSelected = cell?.getIsSelected?.() || false;
|
|
292
294
|
const canSelectCell =
|
|
293
295
|
(selection === "single-cell" || selection === "multi-cell") &&
|
|
@@ -309,6 +311,7 @@ export function generateColumns<T>({
|
|
|
309
311
|
getValue,
|
|
310
312
|
selectCell,
|
|
311
313
|
cellStyles,
|
|
314
|
+
highlightPattern: table.options.meta?.highlightPattern,
|
|
312
315
|
});
|
|
313
316
|
|
|
314
317
|
// Row headers are bold
|
|
@@ -585,12 +588,14 @@ function renderDate({
|
|
|
585
588
|
dtype,
|
|
586
589
|
displayValue,
|
|
587
590
|
locale,
|
|
591
|
+
highlightPattern,
|
|
588
592
|
}: {
|
|
589
593
|
value: Date;
|
|
590
594
|
dataType?: DataType;
|
|
591
595
|
dtype?: string;
|
|
592
596
|
displayValue?: string;
|
|
593
597
|
locale: string;
|
|
598
|
+
highlightPattern?: RegExp;
|
|
594
599
|
}): React.ReactNode {
|
|
595
600
|
const type = dataType === "date" ? "date" : "datetime";
|
|
596
601
|
const timezone = extractTimezone(dtype);
|
|
@@ -599,7 +604,7 @@ function renderDate({
|
|
|
599
604
|
|
|
600
605
|
return (
|
|
601
606
|
<DatePopover date={value} type={type}>
|
|
602
|
-
{exactValue}
|
|
607
|
+
{highlightMatches(exactValue, highlightPattern)}
|
|
603
608
|
</DatePopover>
|
|
604
609
|
);
|
|
605
610
|
}
|
|
@@ -610,12 +615,14 @@ export function renderCellValue<TData, TValue>({
|
|
|
610
615
|
getValue,
|
|
611
616
|
selectCell,
|
|
612
617
|
cellStyles,
|
|
618
|
+
highlightPattern,
|
|
613
619
|
}: {
|
|
614
620
|
column: Column<TData, TValue>;
|
|
615
621
|
renderValue: () => TValue | null;
|
|
616
622
|
getValue: () => TValue;
|
|
617
623
|
selectCell?: () => void;
|
|
618
624
|
cellStyles?: string;
|
|
625
|
+
highlightPattern?: RegExp;
|
|
619
626
|
}) {
|
|
620
627
|
const value = getValue();
|
|
621
628
|
const format = column.getColumnFormatting?.();
|
|
@@ -625,6 +632,28 @@ export function renderCellValue<TData, TValue>({
|
|
|
625
632
|
|
|
626
633
|
const isWrapped = column.getColumnWrapping?.() === "wrap";
|
|
627
634
|
|
|
635
|
+
const textCell = (text: string) => (
|
|
636
|
+
<div onClick={selectCell} className={cellStyles}>
|
|
637
|
+
{highlightMatches(text, highlightPattern)}
|
|
638
|
+
</div>
|
|
639
|
+
);
|
|
640
|
+
const dateCell = (date: Date, displayValue?: string) => (
|
|
641
|
+
<div onClick={selectCell} className={cellStyles}>
|
|
642
|
+
<WithLocale>
|
|
643
|
+
{(locale) =>
|
|
644
|
+
renderDate({
|
|
645
|
+
value: date,
|
|
646
|
+
dataType,
|
|
647
|
+
dtype,
|
|
648
|
+
displayValue,
|
|
649
|
+
locale,
|
|
650
|
+
highlightPattern,
|
|
651
|
+
})
|
|
652
|
+
}
|
|
653
|
+
</WithLocale>
|
|
654
|
+
</div>
|
|
655
|
+
);
|
|
656
|
+
|
|
628
657
|
// Sentinel values (null, whitespace, NaN, Infinity, NaT) rendered specially.
|
|
629
658
|
// Empty strings are left as-is
|
|
630
659
|
const sentinel = detectSentinel(value, dataType, dtype);
|
|
@@ -640,23 +669,10 @@ export function renderCellValue<TData, TValue>({
|
|
|
640
669
|
try {
|
|
641
670
|
const date = new Date(value);
|
|
642
671
|
if (!format || !isValid(date)) {
|
|
643
|
-
return (
|
|
644
|
-
<div onClick={selectCell} className={cellStyles}>
|
|
645
|
-
{value}
|
|
646
|
-
</div>
|
|
647
|
-
);
|
|
672
|
+
return textCell(value);
|
|
648
673
|
}
|
|
649
674
|
|
|
650
|
-
|
|
651
|
-
return (
|
|
652
|
-
<div onClick={selectCell} className={cellStyles}>
|
|
653
|
-
<WithLocale>
|
|
654
|
-
{(locale) =>
|
|
655
|
-
renderDate({ value: date, dataType, dtype, displayValue, locale })
|
|
656
|
-
}
|
|
657
|
-
</WithLocale>
|
|
658
|
-
</div>
|
|
659
|
-
);
|
|
675
|
+
return dateCell(date, String(column.applyColumnFormatting(value)));
|
|
660
676
|
} catch (error) {
|
|
661
677
|
Logger.error("Error parsing datetime, fallback to string", error);
|
|
662
678
|
}
|
|
@@ -672,17 +688,9 @@ export function renderCellValue<TData, TValue>({
|
|
|
672
688
|
}
|
|
673
689
|
|
|
674
690
|
// e.g. 2010-10-07 17:15:00
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
: undefined
|
|
678
|
-
return (
|
|
679
|
-
<div onClick={selectCell} className={cellStyles}>
|
|
680
|
-
<WithLocale>
|
|
681
|
-
{(locale) =>
|
|
682
|
-
renderDate({ value, dataType, dtype, displayValue, locale })
|
|
683
|
-
}
|
|
684
|
-
</WithLocale>
|
|
685
|
-
</div>
|
|
691
|
+
return dateCell(
|
|
692
|
+
value,
|
|
693
|
+
format ? String(column.applyColumnFormatting(value)) : undefined,
|
|
686
694
|
);
|
|
687
695
|
}
|
|
688
696
|
|
|
@@ -728,7 +736,7 @@ export function renderCellValue<TData, TValue>({
|
|
|
728
736
|
className={cn(cellStyles, isWrapped && COLUMN_WRAPPING_STYLES)}
|
|
729
737
|
>
|
|
730
738
|
<WhitespaceMarkers value={leading} />
|
|
731
|
-
<UrlDetector parts={parts} />
|
|
739
|
+
<UrlDetector parts={parts} highlightPattern={highlightPattern} />
|
|
732
740
|
<WhitespaceMarkers value={trailing} />
|
|
733
741
|
</div>
|
|
734
742
|
);
|
|
@@ -754,11 +762,7 @@ export function renderCellValue<TData, TValue>({
|
|
|
754
762
|
}
|
|
755
763
|
|
|
756
764
|
if (format) {
|
|
757
|
-
return (
|
|
758
|
-
<div onClick={selectCell} className={cellStyles}>
|
|
759
|
-
{column.applyColumnFormatting(value)}
|
|
760
|
-
</div>
|
|
761
|
-
);
|
|
765
|
+
return textCell(String(column.applyColumnFormatting(value)));
|
|
762
766
|
}
|
|
763
767
|
|
|
764
768
|
// Format to the correct locale
|
|
@@ -768,26 +772,19 @@ export function renderCellValue<TData, TValue>({
|
|
|
768
772
|
<LocaleNumber
|
|
769
773
|
value={value}
|
|
770
774
|
minFractionDigits={column.columnDef.meta?.minFractionDigits}
|
|
775
|
+
highlightPattern={highlightPattern}
|
|
771
776
|
/>
|
|
772
777
|
</div>
|
|
773
778
|
);
|
|
774
779
|
}
|
|
775
780
|
|
|
776
781
|
if (typeof value === "boolean") {
|
|
777
|
-
return (
|
|
778
|
-
<div onClick={selectCell} className={cellStyles}>
|
|
779
|
-
{value ? "True" : "False"}
|
|
780
|
-
</div>
|
|
781
|
-
);
|
|
782
|
+
return textCell(value ? "True" : "False");
|
|
782
783
|
}
|
|
783
784
|
|
|
784
785
|
if (isPrimitiveOrNullish(value)) {
|
|
785
786
|
const rendered = renderValue();
|
|
786
|
-
return (
|
|
787
|
-
<div onClick={selectCell} className={cellStyles}>
|
|
788
|
-
{rendered == null ? "" : String(rendered)}
|
|
789
|
-
</div>
|
|
790
|
-
);
|
|
787
|
+
return textCell(rendered == null ? "" : String(rendered));
|
|
791
788
|
}
|
|
792
789
|
|
|
793
790
|
const mimeValues = getMimeValues(value);
|
|
@@ -825,14 +822,16 @@ export function renderCellValue<TData, TValue>({
|
|
|
825
822
|
export const LocaleNumber = ({
|
|
826
823
|
value,
|
|
827
824
|
minFractionDigits,
|
|
825
|
+
highlightPattern,
|
|
828
826
|
}: {
|
|
829
827
|
value: number;
|
|
830
828
|
minFractionDigits?: number;
|
|
829
|
+
highlightPattern?: RegExp;
|
|
831
830
|
}) => {
|
|
832
831
|
const { locale } = useLocale();
|
|
833
832
|
const format = useNumberFormatter({
|
|
834
833
|
minimumFractionDigits: minFractionDigits,
|
|
835
834
|
maximumFractionDigits: maxFractionalDigits(locale),
|
|
836
835
|
});
|
|
837
|
-
return format.format(value);
|
|
836
|
+
return highlightMatches(format.format(value), highlightPattern);
|
|
838
837
|
};
|
|
@@ -12,7 +12,7 @@ import { Logger } from "@/utils/Logger";
|
|
|
12
12
|
import type { Cell } from "@tanstack/react-table";
|
|
13
13
|
import { useAtomValue } from "jotai";
|
|
14
14
|
import { CopyIcon, FilterIcon, SquareStack } from "lucide-react";
|
|
15
|
-
import type
|
|
15
|
+
import { type RefObject, useRef, useState } from "react";
|
|
16
16
|
import useEvent from "react-use-event-hook";
|
|
17
17
|
import {
|
|
18
18
|
ContextMenu,
|
|
@@ -123,8 +123,21 @@ export const DataTableContextMenu = <TData,>({
|
|
|
123
123
|
tableRef: RefObject<HTMLTableSectionElement | null>;
|
|
124
124
|
copyAllCells: () => void;
|
|
125
125
|
}) => {
|
|
126
|
+
const [activeCell, setActiveCell] = useState<Cell<TData, unknown> | null>(
|
|
127
|
+
null,
|
|
128
|
+
);
|
|
129
|
+
const highlightedCell = useRef<Element | null>(null);
|
|
126
130
|
const handleContextMenuChange = useEvent((open: boolean) => {
|
|
131
|
+
highlightedCell.current?.classList.remove("bg-(--green-4)");
|
|
132
|
+
highlightedCell.current = null;
|
|
133
|
+
if (!open) {
|
|
134
|
+
// Forget the cell so a later right-click outside any cell can't reuse it
|
|
135
|
+
contextMenuRef.current = null;
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
127
139
|
const cell = contextMenuRef.current;
|
|
140
|
+
setActiveCell(cell);
|
|
128
141
|
if (!cell) {
|
|
129
142
|
return;
|
|
130
143
|
}
|
|
@@ -138,42 +151,45 @@ export const DataTableContextMenu = <TData,>({
|
|
|
138
151
|
return;
|
|
139
152
|
}
|
|
140
153
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
} else {
|
|
144
|
-
cellElement.classList.remove("bg-(--green-4)");
|
|
145
|
-
}
|
|
154
|
+
cellElement.classList.add("bg-(--green-4)");
|
|
155
|
+
highlightedCell.current = cellElement;
|
|
146
156
|
});
|
|
147
157
|
|
|
148
158
|
return (
|
|
149
|
-
|
|
150
|
-
|
|
159
|
+
// Open via the trigger so a right-click while already open retargets the
|
|
160
|
+
// menu; Radix only reports open changes, so use it for closing.
|
|
161
|
+
<ContextMenu
|
|
162
|
+
onOpenChange={(open) => {
|
|
163
|
+
if (!open) {
|
|
164
|
+
handleContextMenuChange(false);
|
|
165
|
+
}
|
|
166
|
+
}}
|
|
167
|
+
>
|
|
168
|
+
<ContextMenuTrigger
|
|
169
|
+
asChild={true}
|
|
170
|
+
onContextMenu={() => handleContextMenuChange(true)}
|
|
171
|
+
>
|
|
172
|
+
{tableBody}
|
|
173
|
+
</ContextMenuTrigger>
|
|
151
174
|
<ContextMenuPortal>
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
/>
|
|
175
|
+
{activeCell && (
|
|
176
|
+
<CellContextMenu cell={activeCell} copySelectedCells={copyAllCells} />
|
|
177
|
+
)}
|
|
156
178
|
</ContextMenuPortal>
|
|
157
179
|
</ContextMenu>
|
|
158
180
|
);
|
|
159
181
|
};
|
|
160
182
|
|
|
161
183
|
export const CellContextMenu = <TData,>({
|
|
162
|
-
|
|
184
|
+
cell,
|
|
163
185
|
copySelectedCells,
|
|
164
186
|
}: {
|
|
165
|
-
|
|
187
|
+
cell: Cell<TData, unknown>;
|
|
166
188
|
copySelectedCells: () => void;
|
|
167
189
|
}) => {
|
|
168
190
|
const selectedCells = useAtomValue(selectedCellsAtom);
|
|
169
191
|
const multipleSelectedCells = selectedCells.size > 1;
|
|
170
192
|
|
|
171
|
-
const cell = cellRef.current;
|
|
172
|
-
if (!cell) {
|
|
173
|
-
Logger.error("No cell found in context menu");
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
193
|
const table = cell.getContext().table;
|
|
178
194
|
const displayedValue = cell.getValue();
|
|
179
195
|
const rawValue =
|
|
@@ -58,6 +58,7 @@ import { useColumnPinning } from "./hooks/use-column-pinning";
|
|
|
58
58
|
import { useScrollContainerHeight } from "./hooks/use-scroll-container-height";
|
|
59
59
|
import { CellSelectionProvider } from "./range-focus/provider";
|
|
60
60
|
import { DataTableBody, renderTableHeader } from "./renderers";
|
|
61
|
+
import { buildHighlightPattern } from "./search-highlight";
|
|
61
62
|
import { TableBottomBar } from "./TableBottomBar";
|
|
62
63
|
import { TableTopBar } from "./TableTopBar";
|
|
63
64
|
import {
|
|
@@ -231,6 +232,11 @@ const DataTableInternal = <TData,>({
|
|
|
231
232
|
return idx + offset;
|
|
232
233
|
}
|
|
233
234
|
|
|
235
|
+
const highlightPattern = React.useMemo(
|
|
236
|
+
() => buildHighlightPattern(searchQuery),
|
|
237
|
+
[searchQuery],
|
|
238
|
+
);
|
|
239
|
+
|
|
234
240
|
const table = useReactTable<TData>({
|
|
235
241
|
_features: [
|
|
236
242
|
ColumnPinning,
|
|
@@ -245,7 +251,7 @@ const DataTableInternal = <TData,>({
|
|
|
245
251
|
],
|
|
246
252
|
data,
|
|
247
253
|
columns,
|
|
248
|
-
meta: { rawData },
|
|
254
|
+
meta: { rawData, highlightPattern },
|
|
249
255
|
getCoreRowModel: getCoreRowModel(),
|
|
250
256
|
// pagination
|
|
251
257
|
rowCount: totalRows === "too_many" ? undefined : totalRows,
|