@arbidocs/blocks 0.5.119 → 0.5.121
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/ClippingMediaViewer-B6WG7Q64.cjs +156 -0
- package/dist/ClippingMediaViewer-B6WG7Q64.cjs.map +1 -0
- package/dist/ClippingPdfViewer-6GCVTV3V.cjs +79 -0
- package/dist/ClippingPdfViewer-6GCVTV3V.cjs.map +1 -0
- package/dist/{ConnectedCallDock-WER7R222.cjs → ConnectedCallDock-DC5V5OUJ.cjs} +25 -23
- package/dist/ConnectedCallDock-DC5V5OUJ.cjs.map +1 -0
- package/dist/{ConnectedCallRoom-T7OBQTYP.cjs → ConnectedCallRoom-FQLXWTFB.cjs} +18 -16
- package/dist/{ConnectedCallRoom-T7OBQTYP.cjs.map → ConnectedCallRoom-FQLXWTFB.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-546ILGLW.cjs → ConnectedNativeDocxComparison-4Q5S7VLD.cjs} +17 -17
- package/dist/{ConnectedNativeDocxComparison-546ILGLW.cjs.map → ConnectedNativeDocxComparison-4Q5S7VLD.cjs.map} +1 -1
- package/dist/ConnectedPresentation-4HLDZDWV.cjs +183 -0
- package/dist/ConnectedPresentation-4HLDZDWV.cjs.map +1 -0
- package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs → ConnectedProductionSetDialog-4EAY6KAZ.cjs} +3 -3
- package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs.map → ConnectedProductionSetDialog-4EAY6KAZ.cjs.map} +1 -1
- package/dist/ConnectedSlidesTab-7QDE2CZD.cjs +234 -0
- package/dist/ConnectedSlidesTab-7QDE2CZD.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs → ConnectedStreamedWordArtifact-FFOQJBOI.cjs} +17 -17
- package/dist/{ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs.map → ConnectedStreamedWordArtifact-FFOQJBOI.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-ZSBZBGFK.cjs → DocumentReviewCard-SNWVEZ7S.cjs} +19 -18
- package/dist/DocumentReviewCard-SNWVEZ7S.cjs.map +1 -0
- package/dist/{FilesViewerDialog-6UKR5WEF.cjs → FilesViewerDialog-IZI63FOV.cjs} +54 -47
- package/dist/FilesViewerDialog-IZI63FOV.cjs.map +1 -0
- package/dist/{GridViewImpl-ZMJJWTOM.cjs → GridViewImpl-LTYET77Q.cjs} +3 -3
- package/dist/GridViewImpl-LTYET77Q.cjs.map +1 -0
- package/dist/{WorkspaceTableView-J3C6VH4T.cjs → WorkspaceTableView-TEIRB6VJ.cjs} +11 -10
- package/dist/WorkspaceTableView-TEIRB6VJ.cjs.map +1 -0
- package/dist/agents/index.cjs +297 -297
- package/dist/agents/tasks/ConversationListView.js +10 -2
- package/dist/agents/tasks/ConversationListView.js.map +2 -2
- package/dist/agents/tasks/TaskTable.js +5 -4
- package/dist/agents/tasks/TaskTable.js.map +2 -2
- package/dist/agents/tasks/WorkflowsTable.js +4 -5
- package/dist/agents/tasks/WorkflowsTable.js.map +2 -2
- package/dist/agents/tasks/taskColumns.js +1 -1
- package/dist/agents/tasks/taskColumns.js.map +1 -1
- package/dist/agents/tasks/taskTableLabels.js +1 -1
- package/dist/agents/tasks/taskTableLabels.js.map +1 -1
- package/dist/agents/tasks/workflowTableLabels.js +1 -1
- package/dist/agents/tasks/workflowTableLabels.js.map +1 -1
- package/dist/{ai-IM4A23YT.cjs → ai-KBYNRNZ6.cjs} +28 -26
- package/dist/ai-KBYNRNZ6.cjs.map +1 -0
- package/dist/calls/connected/CallControls.d.ts +2 -0
- package/dist/calls/connected/CallControls.js +71 -9
- package/dist/calls/connected/CallControls.js.map +2 -2
- package/dist/calls/connected/ShareDocumentDialog.d.ts +14 -0
- package/dist/calls/connected/ShareDocumentDialog.js +77 -0
- package/dist/calls/connected/ShareDocumentDialog.js.map +7 -0
- package/dist/calls/index.cjs +121 -121
- package/dist/chat/index.cjs +9 -8
- package/dist/{chunk-T23UTIRI.cjs → chunk-2PZT3J34.cjs} +6 -6
- package/dist/{chunk-T23UTIRI.cjs.map → chunk-2PZT3J34.cjs.map} +1 -1
- package/dist/{chunk-SGYSDABK.cjs → chunk-2W5E62EY.cjs} +6 -6
- package/dist/{chunk-SGYSDABK.cjs.map → chunk-2W5E62EY.cjs.map} +1 -1
- package/dist/{chunk-TDO5UWXF.cjs → chunk-3SCNXNHI.cjs} +5 -5
- package/dist/{chunk-TDO5UWXF.cjs.map → chunk-3SCNXNHI.cjs.map} +1 -1
- package/dist/{chunk-KTQOGT2L.cjs → chunk-474GPLCM.cjs} +7 -7
- package/dist/{chunk-KTQOGT2L.cjs.map → chunk-474GPLCM.cjs.map} +1 -1
- package/dist/{chunk-TP5PGWIO.cjs → chunk-4IOYQLKG.cjs} +3 -3
- package/dist/{chunk-TP5PGWIO.cjs.map → chunk-4IOYQLKG.cjs.map} +1 -1
- package/dist/{chunk-NY3YUCOW.cjs → chunk-4NPCDS2X.cjs} +3 -3
- package/dist/{chunk-NY3YUCOW.cjs.map → chunk-4NPCDS2X.cjs.map} +1 -1
- package/dist/{chunk-CPG7II4E.cjs → chunk-4RBQ44RY.cjs} +28 -28
- package/dist/chunk-4RBQ44RY.cjs.map +1 -0
- package/dist/{chunk-BQ5RIWWT.cjs → chunk-4VZZWYEC.cjs} +3 -3
- package/dist/{chunk-BQ5RIWWT.cjs.map → chunk-4VZZWYEC.cjs.map} +1 -1
- package/dist/{chunk-Y24V6HPR.cjs → chunk-52KGMAO5.cjs} +15 -15
- package/dist/{chunk-Y24V6HPR.cjs.map → chunk-52KGMAO5.cjs.map} +1 -1
- package/dist/{chunk-HB2O4THB.cjs → chunk-5534FYXP.cjs} +4 -4
- package/dist/{chunk-HB2O4THB.cjs.map → chunk-5534FYXP.cjs.map} +1 -1
- package/dist/chunk-5GCCUXMT.cjs +63 -0
- package/dist/chunk-5GCCUXMT.cjs.map +1 -0
- package/dist/chunk-5LTIZ44D.cjs +95 -0
- package/dist/chunk-5LTIZ44D.cjs.map +1 -0
- package/dist/{chunk-YGXOKB5Z.cjs → chunk-734NPQNR.cjs} +4 -4
- package/dist/{chunk-YGXOKB5Z.cjs.map → chunk-734NPQNR.cjs.map} +1 -1
- package/dist/{chunk-SB4M3ITT.cjs → chunk-7VUJGHMY.cjs} +444 -100
- package/dist/chunk-7VUJGHMY.cjs.map +1 -0
- package/dist/chunk-AFQTQC7A.cjs +35 -0
- package/dist/chunk-AFQTQC7A.cjs.map +1 -0
- package/dist/{chunk-XKVPSOKP.cjs → chunk-AY6EZSZB.cjs} +4 -4
- package/dist/{chunk-XKVPSOKP.cjs.map → chunk-AY6EZSZB.cjs.map} +1 -1
- package/dist/{chunk-TT4IF52H.cjs → chunk-BVAT4EVC.cjs} +40 -41
- package/dist/chunk-BVAT4EVC.cjs.map +1 -0
- package/dist/{chunk-VGCTYTEW.cjs → chunk-C2OICDMI.cjs} +10 -10
- package/dist/{chunk-VGCTYTEW.cjs.map → chunk-C2OICDMI.cjs.map} +1 -1
- package/dist/{chunk-CPR6EHG7.cjs → chunk-DR2AH7JL.cjs} +179 -55
- package/dist/chunk-DR2AH7JL.cjs.map +1 -0
- package/dist/{chunk-NJCK6V6U.cjs → chunk-EATIFPKP.cjs} +4 -60
- package/dist/chunk-EATIFPKP.cjs.map +1 -0
- package/dist/{chunk-B3LZITVF.cjs → chunk-EHP6OH5D.cjs} +11 -451
- package/dist/chunk-EHP6OH5D.cjs.map +1 -0
- package/dist/{chunk-DDIW4HLU.cjs → chunk-ENGL7P3I.cjs} +46 -37
- package/dist/chunk-ENGL7P3I.cjs.map +1 -0
- package/dist/{chunk-QHOHDNBU.cjs → chunk-FKFQCK3C.cjs} +4 -4
- package/dist/{chunk-QHOHDNBU.cjs.map → chunk-FKFQCK3C.cjs.map} +1 -1
- package/dist/{chunk-6UTKM5AB.cjs → chunk-GKVE5JGB.cjs} +76 -76
- package/dist/chunk-GKVE5JGB.cjs.map +1 -0
- package/dist/{chunk-B2HNNG25.cjs → chunk-GPX5VC57.cjs} +50 -50
- package/dist/{chunk-B2HNNG25.cjs.map → chunk-GPX5VC57.cjs.map} +1 -1
- package/dist/{chunk-WAV762GP.cjs → chunk-GQXPNIRE.cjs} +6 -6
- package/dist/{chunk-WAV762GP.cjs.map → chunk-GQXPNIRE.cjs.map} +1 -1
- package/dist/chunk-GX2EBMJW.cjs +133 -0
- package/dist/chunk-GX2EBMJW.cjs.map +1 -0
- package/dist/{chunk-7OPOPYV6.cjs → chunk-H5OLHP2U.cjs} +3 -3
- package/dist/{chunk-7OPOPYV6.cjs.map → chunk-H5OLHP2U.cjs.map} +1 -1
- package/dist/chunk-HYUKPHCT.cjs +66 -0
- package/dist/chunk-HYUKPHCT.cjs.map +1 -0
- package/dist/{chunk-NNUK5ZM7.cjs → chunk-JQLWKNJO.cjs} +29 -27
- package/dist/chunk-JQLWKNJO.cjs.map +1 -0
- package/dist/{chunk-OEREKAAP.cjs → chunk-JZEYHDWJ.cjs} +75 -75
- package/dist/{chunk-OEREKAAP.cjs.map → chunk-JZEYHDWJ.cjs.map} +1 -1
- package/dist/{chunk-PGJYD67F.cjs → chunk-KNGZZC4O.cjs} +7 -6
- package/dist/chunk-KNGZZC4O.cjs.map +1 -0
- package/dist/{chunk-NIE3N6OM.cjs → chunk-KP5AITQ4.cjs} +10 -10
- package/dist/{chunk-NIE3N6OM.cjs.map → chunk-KP5AITQ4.cjs.map} +1 -1
- package/dist/{chunk-YYPZOEED.cjs → chunk-LHWOKOMP.cjs} +23 -2
- package/dist/chunk-LHWOKOMP.cjs.map +1 -0
- package/dist/{chunk-57NHXEU2.cjs → chunk-MXBXZXXQ.cjs} +5 -5
- package/dist/{chunk-57NHXEU2.cjs.map → chunk-MXBXZXXQ.cjs.map} +1 -1
- package/dist/{chunk-WXUU3COI.cjs → chunk-MZ2KZXNU.cjs} +3 -3
- package/dist/{chunk-WXUU3COI.cjs.map → chunk-MZ2KZXNU.cjs.map} +1 -1
- package/dist/chunk-NAJN32MF.cjs +154 -0
- package/dist/chunk-NAJN32MF.cjs.map +1 -0
- package/dist/{chunk-557MJ4IH.cjs → chunk-NLOETJCB.cjs} +17 -154
- package/dist/chunk-NLOETJCB.cjs.map +1 -0
- package/dist/{chunk-4XJEHKVZ.cjs → chunk-PIYYBPHH.cjs} +4 -4
- package/dist/{chunk-4XJEHKVZ.cjs.map → chunk-PIYYBPHH.cjs.map} +1 -1
- package/dist/chunk-Q3XJUXID.cjs +4774 -0
- package/dist/chunk-Q3XJUXID.cjs.map +1 -0
- package/dist/{chunk-325GVZE6.cjs → chunk-Q6DQGGP4.cjs} +3 -3
- package/dist/{chunk-325GVZE6.cjs.map → chunk-Q6DQGGP4.cjs.map} +1 -1
- package/dist/chunk-QFXILJMJ.cjs +458 -0
- package/dist/chunk-QFXILJMJ.cjs.map +1 -0
- package/dist/{chunk-R7CJEIA5.cjs → chunk-RYVZDFVO.cjs} +8 -9
- package/dist/chunk-RYVZDFVO.cjs.map +1 -0
- package/dist/{chunk-VLCY46K6.cjs → chunk-TG2GM7WJ.cjs} +4 -3
- package/dist/chunk-TG2GM7WJ.cjs.map +1 -0
- package/dist/{chunk-EOG6OT5I.cjs → chunk-TXP2N3DC.cjs} +4 -4
- package/dist/{chunk-EOG6OT5I.cjs.map → chunk-TXP2N3DC.cjs.map} +1 -1
- package/dist/{chunk-KXIRVKCJ.cjs → chunk-UUENH4BJ.cjs} +3 -3
- package/dist/{chunk-KXIRVKCJ.cjs.map → chunk-UUENH4BJ.cjs.map} +1 -1
- package/dist/chunk-VJ5ZLRBD.cjs +27 -0
- package/dist/chunk-VJ5ZLRBD.cjs.map +1 -0
- package/dist/{chunk-P77YTTJ3.cjs → chunk-W6B3RYTX.cjs} +4 -4
- package/dist/{chunk-P77YTTJ3.cjs.map → chunk-W6B3RYTX.cjs.map} +1 -1
- package/dist/chunk-WOOOMTTA.cjs +19 -0
- package/dist/chunk-WOOOMTTA.cjs.map +1 -0
- package/dist/{chunk-ZPPMAL5P.cjs → chunk-WQMR3O2D.cjs} +6 -10
- package/dist/chunk-WQMR3O2D.cjs.map +1 -0
- package/dist/{chunk-CJYWHUZR.cjs → chunk-XCKHOXRP.cjs} +4 -4
- package/dist/{chunk-CJYWHUZR.cjs.map → chunk-XCKHOXRP.cjs.map} +1 -1
- package/dist/{chunk-6WMMZLEV.cjs → chunk-XJEXFEWG.cjs} +2 -27
- package/dist/chunk-XJEXFEWG.cjs.map +1 -0
- package/dist/chunk-XK4TVJKD.cjs +73 -0
- package/dist/chunk-XK4TVJKD.cjs.map +1 -0
- package/dist/chunk-XTR26TNE.cjs +1358 -0
- package/dist/chunk-XTR26TNE.cjs.map +1 -0
- package/dist/{chunk-E7TE2WVT.cjs → chunk-ZVEW3JBT.cjs} +3 -3
- package/dist/{chunk-E7TE2WVT.cjs.map → chunk-ZVEW3JBT.cjs.map} +1 -1
- package/dist/collaboration/index.cjs +73 -73
- package/dist/collaboration/sharing/ShareControl.js +10 -2
- package/dist/collaboration/sharing/ShareControl.js.map +2 -2
- package/dist/components/SharedCell.d.ts +2 -4
- package/dist/components/SharedCell.js +4 -8
- package/dist/components/SharedCell.js.map +2 -2
- package/dist/components/ZoomSlider.d.ts +25 -0
- package/dist/components/ZoomSlider.js +59 -0
- package/dist/components/ZoomSlider.js.map +7 -0
- package/dist/connect/docx.cjs +20 -20
- package/dist/connect/index.cjs +1210 -1264
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/viewer.cjs +42 -36
- package/dist/connection/ai.d.ts +1 -1
- package/dist/connection/facts/factPageColumns.js +3 -9
- package/dist/connection/facts/factPageColumns.js.map +2 -2
- package/dist/connection/files/ConnectedNewFileMenu.d.ts +2 -1
- package/dist/connection/files/ConnectedNewFileMenu.js +9 -3
- package/dist/connection/files/ConnectedNewFileMenu.js.map +2 -2
- package/dist/connection/files/explorer/ConnectedFilesExplorer.js +1 -1
- package/dist/connection/files/explorer/ConnectedFilesExplorer.js.map +2 -2
- package/dist/connection/files/explorer/FileTiles.js +1 -1
- package/dist/connection/files/explorer/FileTiles.js.map +2 -2
- package/dist/connection/files/fields/documentField.js +1 -1
- package/dist/connection/files/fields/documentField.js.map +2 -2
- package/dist/connection/files/grid/cells.js +1 -3
- package/dist/connection/files/grid/cells.js.map +2 -2
- package/dist/connection/files/grid/documentColumns.js +4 -3
- package/dist/connection/files/grid/documentColumns.js.map +2 -2
- package/dist/connection/files/page/DocumentsFilterBarActions.js +17 -28
- package/dist/connection/files/page/DocumentsFilterBarActions.js.map +2 -2
- package/dist/connection/mail/useMailboxDefaults.js +1 -1
- package/dist/connection/mail/useMailboxDefaults.js.map +2 -2
- package/dist/connection/panels/useSessionPanelMode.js +3 -2
- package/dist/connection/panels/useSessionPanelMode.js.map +2 -2
- package/dist/connection/presentation/ClippingMediaViewer.d.ts +12 -0
- package/dist/connection/presentation/ClippingMediaViewer.js +153 -0
- package/dist/connection/presentation/ClippingMediaViewer.js.map +7 -0
- package/dist/connection/presentation/ClippingPdfViewer.d.ts +22 -0
- package/dist/connection/presentation/ClippingPdfViewer.js +75 -0
- package/dist/connection/presentation/ClippingPdfViewer.js.map +7 -0
- package/dist/connection/presentation/ConnectedPresentation.d.ts +12 -0
- package/dist/connection/presentation/ConnectedPresentation.js +100 -0
- package/dist/connection/presentation/ConnectedPresentation.js.map +7 -0
- package/dist/connection/presentation/ConnectedSlidesTab.d.ts +20 -0
- package/dist/connection/presentation/ConnectedSlidesTab.js +220 -0
- package/dist/connection/presentation/ConnectedSlidesTab.js.map +7 -0
- package/dist/connection/presentation/CropClipDialog.d.ts +11 -0
- package/dist/connection/presentation/CropClipDialog.js +86 -0
- package/dist/connection/presentation/CropClipDialog.js.map +7 -0
- package/dist/connection/presentation/GenerateTile.d.ts +4 -0
- package/dist/connection/presentation/GenerateTile.js +24 -0
- package/dist/connection/presentation/GenerateTile.js.map +7 -0
- package/dist/connection/presentation/LabelColumnMenu.d.ts +8 -0
- package/dist/connection/presentation/LabelColumnMenu.js +38 -0
- package/dist/connection/presentation/LabelColumnMenu.js.map +7 -0
- package/dist/connection/presentation/PresentationDialogs.d.ts +39 -0
- package/dist/connection/presentation/PresentationDialogs.js +295 -0
- package/dist/connection/presentation/PresentationDialogs.js.map +7 -0
- package/dist/connection/presentation/PresentationFileCard.d.ts +10 -0
- package/dist/connection/presentation/PresentationFileCard.js +35 -0
- package/dist/connection/presentation/PresentationFileCard.js.map +7 -0
- package/dist/connection/presentation/PresentationPill.d.ts +8 -0
- package/dist/connection/presentation/PresentationPill.js +44 -0
- package/dist/connection/presentation/PresentationPill.js.map +7 -0
- package/dist/connection/presentation/PresentationSlot.d.ts +7 -0
- package/dist/connection/presentation/PresentationSlot.js +35 -0
- package/dist/connection/presentation/PresentationSlot.js.map +7 -0
- package/dist/connection/presentation/requests.d.ts +16 -0
- package/dist/connection/presentation/requests.js +20 -0
- package/dist/connection/presentation/requests.js.map +7 -0
- package/dist/connection/presentation/useImageGeneration.d.ts +11 -0
- package/dist/connection/presentation/useImageGeneration.js +66 -0
- package/dist/connection/presentation/useImageGeneration.js.map +7 -0
- package/dist/connection/presentation/useLabelColumns.d.ts +15 -0
- package/dist/connection/presentation/useLabelColumns.js +33 -0
- package/dist/connection/presentation/useLabelColumns.js.map +7 -0
- package/dist/connection/presentation/usePresentationController.d.ts +15 -0
- package/dist/connection/presentation/usePresentationController.js +118 -0
- package/dist/connection/presentation/usePresentationController.js.map +7 -0
- package/dist/connection/presentation/usePresentationFiles.d.ts +44 -0
- package/dist/connection/presentation/usePresentationFiles.js +307 -0
- package/dist/connection/presentation/usePresentationFiles.js.map +7 -0
- package/dist/connection/presentation/useViewerClipping.d.ts +14 -0
- package/dist/connection/presentation/useViewerClipping.js +18 -0
- package/dist/connection/presentation/useViewerClipping.js.map +7 -0
- package/dist/connection/sharing/WorkspaceMembersList.d.ts +4 -0
- package/dist/connection/sharing/WorkspaceMembersList.js +34 -0
- package/dist/connection/sharing/WorkspaceMembersList.js.map +7 -0
- package/dist/connection/shell/ConnectedAppShell.js +9 -1
- package/dist/connection/shell/ConnectedAppShell.js.map +2 -2
- package/dist/connection/viewer/CleanViewControl.d.ts +8 -0
- package/dist/connection/viewer/CleanViewControl.js +76 -0
- package/dist/connection/viewer/CleanViewControl.js.map +7 -0
- package/dist/connection/viewer/ConnectedDocumentViewer.js +31 -31
- package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
- package/dist/connection/viewer/ViewerCropModal.d.ts +5 -0
- package/dist/connection/viewer/ViewerCropModal.js +22 -0
- package/dist/connection/viewer/ViewerCropModal.js.map +7 -0
- package/dist/connection/viewer/ViewerPdfPane.d.ts +3 -1
- package/dist/connection/viewer/ViewerPdfPane.js +57 -2
- package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
- package/dist/connection/viewer/drafts.js +6 -4
- package/dist/connection/viewer/drafts.js.map +2 -2
- package/dist/connection/viewer/pdf/PdfPassageHighlights.d.ts +12 -0
- package/dist/connection/viewer/pdf/PdfPassageHighlights.js +36 -0
- package/dist/connection/viewer/pdf/PdfPassageHighlights.js.map +7 -0
- package/dist/connection/viewer/pdf/passageHighlights.d.ts +26 -0
- package/dist/connection/viewer/pdf/passageHighlights.js +40 -0
- package/dist/connection/viewer/pdf/passageHighlights.js.map +7 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.d.ts +9 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.js +47 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.js.map +7 -0
- package/dist/connection/viewer/shareDocument.d.ts +11 -0
- package/dist/connection/viewer/shareDocument.js +11 -0
- package/dist/connection/viewer/shareDocument.js.map +7 -0
- package/dist/connection/viewer/slidesTabChunk.d.ts +2 -0
- package/dist/connection/viewer/slidesTabChunk.js +9 -0
- package/dist/connection/viewer/slidesTabChunk.js.map +7 -0
- package/dist/connection/viewer/useCleanView.d.ts +14 -0
- package/dist/connection/viewer/useCleanView.js +29 -0
- package/dist/connection/viewer/useCleanView.js.map +7 -0
- package/dist/connection/viewer/useViewedDocument.d.ts +1 -0
- package/dist/connection/viewer/useViewedDocument.js +9 -1
- package/dist/connection/viewer/useViewedDocument.js.map +2 -2
- package/dist/connection/viewer/useViewerTabs.js +18 -4
- package/dist/connection/viewer/useViewerTabs.js.map +2 -2
- package/dist/connection/workflows/ConnectedWorkflowStart.d.ts +14 -2
- package/dist/connection/workflows/ConnectedWorkflowStart.js +5 -2
- package/dist/connection/workflows/ConnectedWorkflowStart.js.map +2 -2
- package/dist/connection/workflows/workflowsPageLabels.js +1 -1
- package/dist/connection/workflows/workflowsPageLabels.js.map +1 -1
- package/dist/dashboards/index.cjs +1 -1
- package/dist/databases/index.cjs +49 -49
- package/dist/document-tools/DocumentToolButtons.d.ts +2 -0
- package/dist/document-tools/DocumentToolButtons.js +22 -1
- package/dist/document-tools/DocumentToolButtons.js.map +2 -2
- package/dist/document-tools/index.cjs +16 -12
- package/dist/document-tools/index.d.ts +1 -1
- package/dist/document-tools/index.js +2 -0
- package/dist/document-tools/index.js.map +2 -2
- package/dist/embed/index.cjs +43 -41
- package/dist/facts/factColumns.js +3 -3
- package/dist/facts/factColumns.js.map +1 -1
- package/dist/facts/index.cjs +42 -42
- package/dist/files/GridViewImpl.js +1 -1
- package/dist/files/GridViewImpl.js.map +2 -2
- package/dist/files/HtmlViewerParts.js +7 -15
- package/dist/files/HtmlViewerParts.js.map +2 -2
- package/dist/files/ViewerChrome.d.ts +5 -1
- package/dist/files/ViewerChrome.js +16 -6
- package/dist/files/ViewerChrome.js.map +2 -2
- package/dist/files/index.cjs +226 -226
- package/dist/files/navigator/DocumentSearchList.js +1 -1
- package/dist/files/navigator/DocumentSearchList.js.map +2 -2
- package/dist/index.cjs +1668 -1666
- package/dist/index.cjs.map +1 -1
- package/dist/presentation/BoxActionBar.d.ts +11 -0
- package/dist/presentation/BoxActionBar.js +182 -0
- package/dist/presentation/BoxActionBar.js.map +7 -0
- package/dist/presentation/ClipActionBar.d.ts +26 -0
- package/dist/presentation/ClipActionBar.js +103 -0
- package/dist/presentation/ClipActionBar.js.map +7 -0
- package/dist/presentation/ClipCaptureOverlay.d.ts +14 -0
- package/dist/presentation/ClipCaptureOverlay.js +69 -0
- package/dist/presentation/ClipCaptureOverlay.js.map +7 -0
- package/dist/presentation/ClipImage.d.ts +21 -0
- package/dist/presentation/ClipImage.js +119 -0
- package/dist/presentation/ClipImage.js.map +7 -0
- package/dist/presentation/ClipTray.d.ts +11 -0
- package/dist/presentation/ClipTray.js +152 -0
- package/dist/presentation/ClipTray.js.map +7 -0
- package/dist/presentation/ClipViewControls.d.ts +11 -0
- package/dist/presentation/ClipViewControls.js +142 -0
- package/dist/presentation/ClipViewControls.js.map +7 -0
- package/dist/presentation/DesignMenu.d.ts +8 -0
- package/dist/presentation/DesignMenu.js +199 -0
- package/dist/presentation/DesignMenu.js.map +7 -0
- package/dist/presentation/LayoutMenu.d.ts +17 -0
- package/dist/presentation/LayoutMenu.js +122 -0
- package/dist/presentation/LayoutMenu.js.map +7 -0
- package/dist/presentation/MediaClip.d.ts +15 -0
- package/dist/presentation/MediaClip.js +67 -0
- package/dist/presentation/MediaClip.js.map +7 -0
- package/dist/presentation/Notice.d.ts +6 -0
- package/dist/presentation/Notice.js +43 -0
- package/dist/presentation/Notice.js.map +7 -0
- package/dist/presentation/PresentationStage.d.ts +32 -0
- package/dist/presentation/PresentationStage.js +232 -0
- package/dist/presentation/PresentationStage.js.map +7 -0
- package/dist/presentation/PresenterView.d.ts +16 -0
- package/dist/presentation/PresenterView.js +69 -0
- package/dist/presentation/PresenterView.js.map +7 -0
- package/dist/presentation/SlideDecor.d.ts +25 -0
- package/dist/presentation/SlideDecor.js +189 -0
- package/dist/presentation/SlideDecor.js.map +7 -0
- package/dist/presentation/SlidesEditor.d.ts +25 -0
- package/dist/presentation/SlidesEditor.js +359 -0
- package/dist/presentation/SlidesEditor.js.map +7 -0
- package/dist/presentation/StageBox.d.ts +30 -0
- package/dist/presentation/StageBox.js +281 -0
- package/dist/presentation/StageBox.js.map +7 -0
- package/dist/presentation/StageItem.d.ts +37 -0
- package/dist/presentation/StageItem.js +211 -0
- package/dist/presentation/StageItem.js.map +7 -0
- package/dist/presentation/box-style.d.ts +6 -0
- package/dist/presentation/box-style.js +19 -0
- package/dist/presentation/box-style.js.map +7 -0
- package/dist/presentation/boxes.d.ts +105 -0
- package/dist/presentation/boxes.js +103 -0
- package/dist/presentation/boxes.js.map +7 -0
- package/dist/presentation/draw-boxes.d.ts +8 -0
- package/dist/presentation/draw-boxes.js +130 -0
- package/dist/presentation/draw-boxes.js.map +7 -0
- package/dist/presentation/export-boxes.d.ts +10 -0
- package/dist/presentation/export-boxes.js +74 -0
- package/dist/presentation/export-boxes.js.map +7 -0
- package/dist/presentation/export-pptx.d.ts +16 -0
- package/dist/presentation/export-pptx.js +194 -0
- package/dist/presentation/export-pptx.js.map +7 -0
- package/dist/presentation/import-pptx.d.ts +35 -0
- package/dist/presentation/import-pptx.js +659 -0
- package/dist/presentation/import-pptx.js.map +7 -0
- package/dist/presentation/merge-outside-edits.d.ts +12 -0
- package/dist/presentation/merge-outside-edits.js +35 -0
- package/dist/presentation/merge-outside-edits.js.map +7 -0
- package/dist/presentation/model.d.ts +201 -0
- package/dist/presentation/model.js +271 -0
- package/dist/presentation/model.js.map +7 -0
- package/dist/presentation/panel-id.d.ts +34 -0
- package/dist/presentation/panel-id.js +24 -0
- package/dist/presentation/panel-id.js.map +7 -0
- package/dist/presentation/persistence.d.ts +121 -0
- package/dist/presentation/persistence.js +141 -0
- package/dist/presentation/persistence.js.map +7 -0
- package/dist/presentation/pptx-data.d.ts +22 -0
- package/dist/presentation/pptx-data.js +83 -0
- package/dist/presentation/pptx-data.js.map +7 -0
- package/dist/presentation/pptx-xml.d.ts +90 -0
- package/dist/presentation/pptx-xml.js +333 -0
- package/dist/presentation/pptx-xml.js.map +7 -0
- package/dist/presentation/render-slides.d.ts +58 -0
- package/dist/presentation/render-slides.js +309 -0
- package/dist/presentation/render-slides.js.map +7 -0
- package/dist/presentation/saved-boxes.d.ts +11 -0
- package/dist/presentation/saved-boxes.js +80 -0
- package/dist/presentation/saved-boxes.js.map +7 -0
- package/dist/presentation/slide-layout.d.ts +54 -0
- package/dist/presentation/slide-layout.js +117 -0
- package/dist/presentation/slide-layout.js.map +7 -0
- package/dist/presentation/stage-videos.d.ts +5 -0
- package/dist/presentation/stage-videos.js +19 -0
- package/dist/presentation/stage-videos.js.map +7 -0
- package/dist/presentation/store.d.ts +203 -0
- package/dist/presentation/store.js +429 -0
- package/dist/presentation/store.js.map +7 -0
- package/dist/presentation/theme.d.ts +102 -0
- package/dist/presentation/theme.js +276 -0
- package/dist/presentation/theme.js.map +7 -0
- package/dist/presentation/useClipDrag.d.ts +26 -0
- package/dist/presentation/useClipDrag.js +65 -0
- package/dist/presentation/useClipDrag.js.map +7 -0
- package/dist/presentation/useObjectUrl.d.ts +6 -0
- package/dist/presentation/useObjectUrl.js +15 -0
- package/dist/presentation/useObjectUrl.js.map +7 -0
- package/dist/presentation/usePresenterKeys.d.ts +13 -0
- package/dist/presentation/usePresenterKeys.js +62 -0
- package/dist/presentation/usePresenterKeys.js.map +7 -0
- package/dist/settings/index.cjs +151 -150
- package/dist/shell/PanelPortal.js +1 -0
- package/dist/shell/PanelPortal.js.map +2 -2
- package/dist/shell/index.cjs +112 -110
- package/dist/shell/panel-windows.d.ts +2 -0
- package/dist/shell/panel-windows.js +7 -2
- package/dist/shell/panel-windows.js.map +2 -2
- package/dist/studio/index.cjs +28 -26
- package/dist/studio/index.cjs.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/workflow-canvas/index.cjs +58 -57
- package/dist/workflow-canvas/index.cjs.map +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +6 -5
- package/dist/ConnectedCallDock-WER7R222.cjs.map +0 -1
- package/dist/DocumentReviewCard-ZSBZBGFK.cjs.map +0 -1
- package/dist/FilesViewerDialog-6UKR5WEF.cjs.map +0 -1
- package/dist/GridViewImpl-ZMJJWTOM.cjs.map +0 -1
- package/dist/WorkspaceTableView-J3C6VH4T.cjs.map +0 -1
- package/dist/ai-IM4A23YT.cjs.map +0 -1
- package/dist/chunk-557MJ4IH.cjs.map +0 -1
- package/dist/chunk-6UTKM5AB.cjs.map +0 -1
- package/dist/chunk-6WMMZLEV.cjs.map +0 -1
- package/dist/chunk-B3LZITVF.cjs.map +0 -1
- package/dist/chunk-CPG7II4E.cjs.map +0 -1
- package/dist/chunk-CPR6EHG7.cjs.map +0 -1
- package/dist/chunk-DDIW4HLU.cjs.map +0 -1
- package/dist/chunk-NJCK6V6U.cjs.map +0 -1
- package/dist/chunk-NNUK5ZM7.cjs.map +0 -1
- package/dist/chunk-PGJYD67F.cjs.map +0 -1
- package/dist/chunk-R7CJEIA5.cjs.map +0 -1
- package/dist/chunk-SB4M3ITT.cjs.map +0 -1
- package/dist/chunk-TT4IF52H.cjs.map +0 -1
- package/dist/chunk-VLCY46K6.cjs.map +0 -1
- package/dist/chunk-YYPZOEED.cjs.map +0 -1
- package/dist/chunk-ZPPMAL5P.cjs.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/facts/factColumns.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Column definitions for the Facts grid. Every column has an explicit `colId` (AG Grid persists\n * column state by id: see CLAUDE.md). The app supplies behaviour and app-specific cells through\n * slots; the structure, widths, sorting, filters and presentational cells live here.\n */\nimport type { CSSProperties, ReactNode } from 'react'\nimport type {\n ColDef,\n ICellRendererParams,\n IHeaderParams,\n ValueGetterParams,\n} from 'ag-grid-community'\nimport { CalendarDays, Paperclip, Quote } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatSpan } from '../timeline/span'\nimport { decodeWhitespaceEntities } from './fact-text'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactColumnLabels {\n inChatHeaderTooltip: string\n inChatTitle: string\n notInChatTitle: string\n removeFromChat: string\n addToChat: string\n fact: string\n dates: string\n dateTitle: string\n labels: string\n verified: string\n verifiedTooltip: string\n shared: string\n sharedTooltip: string\n createdBy: string\n sources: string\n /** Tooltip of the Sources cell for `count` cited documents. */\n sourcedFrom: (count: number) => string\n createdAt: string\n updated: string\n id: string\n}\n\nexport const DEFAULT_FACT_COLUMN_LABELS: FactColumnLabels = {\n inChatHeaderTooltip: 'Facts added to this chat are always in context for this chat',\n inChatTitle: 'In this chat \u2014 always in context for it. Click to remove from chat.',\n notInChatTitle: 'Add to chat \u2014 always in context for this chat',\n removeFromChat: 'Remove from chat',\n addToChat: 'Add to chat',\n fact: 'Fact',\n dates: 'Dates',\n dateTitle: 'Date of the fact itself, not when this was saved',\n labels: 'Labels',\n verified: 'Verified',\n verifiedTooltip: 'Verified by a human',\n shared: 'Shared',\n sharedTooltip: 'Shared with the workspace, or private to you & your agents',\n createdBy: 'Created by',\n sources: 'Sources',\n sourcedFrom: (n) => `Sourced from ${n} document${n === 1 ? '' : 's'} \u2014 open the fact to see them`,\n createdAt: 'Created at',\n updated: 'Updated',\n id: 'ID',\n}\n\nexport interface FactColumnTestIds {\n inChat: (factId: string) => string\n text: (factId: string) => string\n date: (factId: string) => string\n}\n\n/** The fields of a fact the grid reads. Callers' richer types are accepted as-is. */\nexport interface FactRowView {\n external_id: string\n text: string\n confirmed: boolean\n shared: boolean\n date_start?: string | null\n date_end?: string | null\n timezone?: string | null\n tags?: Array<{ name: string }> | null\n citations?: unknown[] | null\n created_by_ext_id?: string | null\n created_at?: string | null\n updated_at?: string | null\n}\n\nexport interface FactColumnSlots<T extends FactRowView> {\n /** Whether the fact is in the host's current chat. With `onToggleInChat`, adds the In chat\n * column; a host without chats leaves both out. Read at render time: the host refreshes the\n * column when its chat changes. */\n isInChat?: (fact: T) => boolean\n /** Add the fact to the current chat, or take it out. */\n onToggleInChat?: (fact: T) => void\n /** Custom header (persistent filter button) for the columns that use one. */\n renderHeader: (params: IHeaderParams, colId: string) => ReactNode\n /** Row action menu, shown at the right edge of the Fact cell. */\n renderRowActions: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** Inline label picker for the Labels cell. */\n renderLabels: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** The Verified switch. */\n renderVerified: (fact: T) => ReactNode\n /** The Shared switch. */\n renderShared: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** The creator avatar. */\n renderCreator: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** Sort/filter value for the Created by column (the creator's display name). */\n getCreatorName: (params: ValueGetterParams<T>) => string\n /** Friendly display of an ISO timestamp (Created at / Updated). */\n formatDate: (iso: string) => string\n labels?: Partial<FactColumnLabels>\n testIds?: Partial<FactColumnTestIds>\n}\n\n/**\n * Date-filter params for a column whose value is an ISO string. AG Grid hands the comparator a JS\n * `Date` from the picker and the raw cell value; this compares UTC day components so a filter\n * never shifts a date by a day for viewers west of UTC.\n */\nexport const ISO_DATE_FILTER_PARAMS = {\n browserDatePicker: true,\n comparator: (filterDate: Date, cellValue: unknown): number => {\n if (!cellValue || typeof cellValue !== 'string') return -1\n const cell = new Date(cellValue)\n if (Number.isNaN(cell.getTime())) return -1\n const cellDay = Date.UTC(cell.getUTCFullYear(), cell.getUTCMonth(), cell.getUTCDate())\n const filterDay = Date.UTC(\n filterDate.getFullYear(),\n filterDate.getMonth(),\n filterDate.getDate()\n )\n return cellDay < filterDay ? -1 : cellDay > filterDay ? 1 : 0\n },\n}\n\n/** How many source documents a fact cites (the Sources column counts documents, not passages). */\nexport function sourceDocCount(fact: Pick<FactRowView, 'citations'> | undefined): number {\n return fact?.citations?.length ?? 0\n}\n\n/** Default left-to-right order; default-hidden columns trail. Every colId must be listed. */\nexport const DEFAULT_FACT_COLUMN_ORDER = [\n 'in_chat',\n 'text',\n 'sources',\n 'tags',\n 'date',\n 'confirmed',\n 'shared',\n 'created_by',\n 'created_at',\n 'updated_at',\n 'note_id',\n] as const\n\nexport function createFactColumns<T extends FactRowView>(slots: FactColumnSlots<T>): ColDef<T>[] {\n // AG Grid's `field` is a path type over the row; for a generic row we assert the known keys.\n const fieldOf = (name: keyof FactRowView) => name as ColDef<T>['field']\n const l = { ...DEFAULT_FACT_COLUMN_LABELS, ...slots.labels }\n const ids = slots.testIds\n\n const { isInChat, onToggleInChat } = slots\n const inChatColumn: ColDef<T>[] =\n isInChat && onToggleInChat\n ? [\n {\n colId: 'in_chat',\n headerName: '',\n headerComponent: () => (\n <span className=\"flex size-full items-center justify-center\">\n <Paperclip className=\"size-3.5 text-muted-foreground\" />\n </span>\n ),\n valueGetter: (params: ValueGetterParams<T>) =>\n params.data ? isInChat(params.data) : false,\n width: 44,\n minWidth: 44,\n maxWidth: 44,\n sortable: true,\n resizable: false,\n headerTooltip: l.inChatHeaderTooltip,\n cellClass: 'cell-hcenter',\n // A toggle, not a readout: a fact in the chat rides every message of it, so it flips\n // in place.\n cellRenderer: (params: ICellRendererParams<T>) => {\n if (!params.data) return null\n const fact = params.data\n const inChat = isInChat(fact)\n return (\n <button\n type=\"button\"\n onClick={() => onToggleInChat(fact)}\n title={inChat ? l.inChatTitle : l.notInChatTitle}\n aria-label={inChat ? l.removeFromChat : l.addToChat}\n aria-pressed={inChat}\n data-testid={testIdOr(ids?.inChat?.(fact.external_id), {\n testId: `facts-grid-in-chat-${fact.external_id}`,\n })}\n className=\"flex h-full items-center\"\n >\n <Paperclip\n className={cn(\n 'size-3.5',\n inChat\n ? 'text-primary'\n : 'text-muted-foreground/30 transition-colors hover:text-muted-foreground'\n )}\n />\n </button>\n )\n },\n },\n ]\n : []\n\n const columns: ColDef<T>[] = [\n ...inChatColumn,\n {\n colId: 'text',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'text'),\n headerName: l.fact,\n field: fieldOf('text'),\n flex: 3,\n minWidth: 280,\n sortable: true,\n filter: 'agTextColumnFilter',\n // Decode the editor's whitespace entities (` ` for a trailing space) so the tooltip\n // reads as typed, not as raw markdown references.\n tooltipValueGetter: (p) => decodeWhitespaceEntities(p.data?.text),\n // Editable only via the grid api (Rename in the row's menu); clicks never open the editor\n // (suppressClickEdit on the grid).\n editable: true,\n cellEditor: 'agLargeTextCellEditor',\n cellEditorPopup: true,\n cellEditorParams: { rows: 8, cols: 60 },\n valueSetter: (params) => {\n if (!params.data) return false\n params.data.text = params.newValue\n return true\n },\n // NOT `cell-multiline`: this cell has its OWN clamp (the `.fact-clamp` span below, sized\n // from the row height). A second clamp cut the text in half at the minimum row height.\n cellClass: 'relative',\n cellRenderer: (params: ICellRendererParams<T>) => {\n if (!params.data) return null\n const fact = params.data\n // Clamp to however many WHOLE lines fit the row height (leading-snug ~ 20px/line),\n // top-aligned so the BEGINNING of the fact is always shown. No overflow clip here: the\n // wrapper is the cell's content box, shorter than a line at the density floor.\n const rowH = params.node.rowHeight ?? 52\n const clampLines = Math.max(1, Math.floor(rowH / 20))\n return (\n <div className=\"relative flex size-full items-start pr-6\">\n <span\n className=\"fact-clamp whitespace-normal break-words text-sm leading-snug text-foreground\"\n style={{ ['--fact-clamp-lines' as string]: clampLines } as CSSProperties}\n data-testid={testIdOr(ids?.text?.(fact.external_id), {\n testId: `facts-grid-text-${fact.external_id}`,\n })}\n >\n {decodeWhitespaceEntities(fact.text)}\n </span>\n {/* `facts-row-kebab` (app CSS) keeps the menu always visible: touch has no hover. */}\n <div className=\"facts-row-kebab absolute right-0.5 top-1/2 -translate-y-1/2\">\n {slots.renderRowActions(fact, params)}\n </div>\n </div>\n )\n },\n },\n {\n colId: 'date',\n // AG Grid's DEFAULT header, so the sort arrow and filter button are the native ones,\n // identical to the Files table's Date columns.\n headerName: l.dates,\n // Sort on the raw bound rather than the rendered string (\"Oct 2019\" sorts April first).\n field: fieldOf('date_start'),\n flex: 0.8,\n minWidth: 132,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n // The edit value is the date-only slice: a lexical sort matches a chronological one, and\n // the inline editor shows \"2024-03-12\" rather than a full ISO timestamp. Inline typing\n // accepts YYYY, YYYY-MM or YYYY-MM-DD; clearing the cell undates the fact.\n editable: true,\n singleClickEdit: true,\n valueGetter: (params: ValueGetterParams<T>) =>\n params.data?.date_start ? params.data.date_start.slice(0, 10) : null,\n valueSetter: (params) => {\n if (!params.data) return false\n params.data.date_start = params.newValue\n return true\n },\n cellClass: 'relative cell-tnum',\n cellRenderer: (params: ICellRendererParams<T>) => {\n const when = formatSpan(\n params.data?.date_start,\n params.data?.date_end,\n params.data?.timezone\n )\n if (!when) return <span className=\"text-muted-foreground/50\">\u2014</span>\n return (\n <span\n className=\"inline-flex items-center gap-1\"\n data-testid={testIdOr(ids?.date?.(params.data?.external_id ?? ''), {\n testId: `facts-grid-date-${params.data?.external_id}`,\n })}\n title={l.dateTitle}\n >\n <CalendarDays className=\"size-3 opacity-70\" />\n {when}\n </span>\n )\n },\n },\n {\n colId: 'tags',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'tags'),\n headerName: l.labels,\n flex: 0.9,\n // Never narrower than its own header, even with the filter button and sort indicator.\n minWidth: 160,\n sortable: true,\n filter: 'agTextColumnFilter',\n cellClass: 'overflow-visible',\n valueGetter: (params: ValueGetterParams<T>) =>\n (params.data?.tags ?? []).map((t) => t.name).join(', '),\n // Editable in place: toggling a label persists immediately, no dialog round-trip.\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? slots.renderLabels(params.data, params) : null,\n },\n {\n colId: 'confirmed',\n headerName: l.verified,\n headerTooltip: l.verifiedTooltip,\n field: fieldOf('confirmed'),\n // minWidth matches width so the header can't be clamped narrow enough to ellipsize.\n width: 116,\n minWidth: 116,\n sortable: true,\n cellDataType: 'boolean',\n valueGetter: (params) => params.data?.confirmed ?? false,\n cellClass: 'cell-hcenter',\n headerClass: 'header-hcenter',\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderVerified(params.data)}\n </div>\n ) : null,\n },\n {\n colId: 'shared',\n headerName: l.shared,\n headerTooltip: l.sharedTooltip,\n field: fieldOf('shared'),\n // minWidth (not just width) is raised too: AG Grid clamps any persisted width up to it.\n width: 110,\n minWidth: 110,\n sortable: true,\n headerClass: 'header-hcenter',\n cellDataType: 'boolean',\n valueGetter: (params) => params.data?.shared ?? false,\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderShared(params.data, params)}\n </div>\n ) : null,\n },\n {\n colId: 'created_by',\n headerName: l.createdBy,\n headerTooltip: l.createdBy,\n width: 138,\n minWidth: 138,\n sortable: true,\n valueGetter: (params) => slots.getCreatorName(params),\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderCreator(params.data, params)}\n </div>\n ) : null,\n },\n {\n colId: 'sources',\n headerName: l.sources,\n width: 112,\n minWidth: 104,\n sortable: true,\n // A hand-written fact has no sources, which is information rather than a gap: it reads as\n // an em dash instead of a zero.\n valueGetter: (params) => sourceDocCount(params.data),\n cellRenderer: (params: ICellRendererParams<T>) => {\n const n = sourceDocCount(params.data)\n if (n === 0) return <span className=\"text-muted-foreground/40\">\u2014</span>\n return (\n <span\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\"\n title={l.sourcedFrom(n)}\n >\n <Quote className=\"size-3 opacity-70\" />\n {n}\n </span>\n )\n },\n },\n {\n colId: 'created_at',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'created_at'),\n headerName: l.createdAt,\n field: fieldOf('created_at'),\n width: 162,\n minWidth: 154,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n // Display-only: a valueFormatter avoids mounting a React component per row.\n cellClass: 'text-muted-foreground',\n valueFormatter: (params) => (params.value ? slots.formatDate(params.value) : ''),\n },\n {\n colId: 'updated_at',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'updated_at'),\n headerName: l.updated,\n field: fieldOf('updated_at'),\n width: 140,\n minWidth: 140,\n // Hidden by default: a column-menu opt-in like the documents grid's long tail.\n hide: true,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n valueFormatter: (params) => (params.value ? slots.formatDate(params.value) : ''),\n },\n {\n colId: 'note_id',\n headerName: l.id,\n field: fieldOf('external_id'),\n width: 120,\n minWidth: 100,\n sortable: true,\n filter: 'agTextColumnFilter',\n // Hidden by default like the documents ID column: needed when quoting a fact to support.\n hide: true,\n cellClass: 'font-mono text-xs text-muted-foreground',\n },\n ]\n\n // Persisted per-user column order still wins once set; bump the grid id to apply a new default.\n return DEFAULT_FACT_COLUMN_ORDER.map((id) => columns.find((c) => c.colId === id)).filter(\n (c): c is ColDef<T> => c !== undefined\n )\n}\n"],
|
|
4
|
+
"sourcesContent": ["/**\n * Column definitions for the Facts grid. Every column has an explicit `colId` (AG Grid persists\n * column state by id: see CLAUDE.md). The app supplies behaviour and app-specific cells through\n * slots; the structure, widths, sorting, filters and presentational cells live here.\n */\nimport type { CSSProperties, ReactNode } from 'react'\nimport type {\n ColDef,\n ICellRendererParams,\n IHeaderParams,\n ValueGetterParams,\n} from 'ag-grid-community'\nimport { CalendarDays, Paperclip, Quote } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatSpan } from '../timeline/span'\nimport { decodeWhitespaceEntities } from './fact-text'\nimport { testIdOr } from '../chat/test-id'\n\nexport interface FactColumnLabels {\n inChatHeaderTooltip: string\n inChatTitle: string\n notInChatTitle: string\n removeFromChat: string\n addToChat: string\n fact: string\n dates: string\n dateTitle: string\n labels: string\n verified: string\n verifiedTooltip: string\n shared: string\n sharedTooltip: string\n createdBy: string\n sources: string\n /** Tooltip of the Sources cell for `count` cited documents. */\n sourcedFrom: (count: number) => string\n createdAt: string\n updated: string\n id: string\n}\n\nexport const DEFAULT_FACT_COLUMN_LABELS: FactColumnLabels = {\n inChatHeaderTooltip: 'Facts added to this chat are always in context for this chat',\n inChatTitle: 'In this chat \u2014 always in context for it. Click to remove from chat.',\n notInChatTitle: 'Add to chat \u2014 always in context for this chat',\n removeFromChat: 'Remove from chat',\n addToChat: 'Add to chat',\n fact: 'Fact',\n dates: 'Dates',\n dateTitle: 'Date of the fact itself, not when this was saved',\n labels: 'Labels',\n verified: 'Verified',\n verifiedTooltip: 'Verified by a human',\n shared: 'Sharing',\n sharedTooltip: 'Shared with the workspace, or private to you & your agents',\n createdBy: 'Created by',\n sources: 'Sources',\n sourcedFrom: (n) => `Sourced from ${n} document${n === 1 ? '' : 's'} \u2014 open the fact to see them`,\n createdAt: 'Created at',\n updated: 'Updated',\n id: 'ID',\n}\n\nexport interface FactColumnTestIds {\n inChat: (factId: string) => string\n text: (factId: string) => string\n date: (factId: string) => string\n}\n\n/** The fields of a fact the grid reads. Callers' richer types are accepted as-is. */\nexport interface FactRowView {\n external_id: string\n text: string\n confirmed: boolean\n shared: boolean\n date_start?: string | null\n date_end?: string | null\n timezone?: string | null\n tags?: Array<{ name: string }> | null\n citations?: unknown[] | null\n created_by_ext_id?: string | null\n created_at?: string | null\n updated_at?: string | null\n}\n\nexport interface FactColumnSlots<T extends FactRowView> {\n /** Whether the fact is in the host's current chat. With `onToggleInChat`, adds the In chat\n * column; a host without chats leaves both out. Read at render time: the host refreshes the\n * column when its chat changes. */\n isInChat?: (fact: T) => boolean\n /** Add the fact to the current chat, or take it out. */\n onToggleInChat?: (fact: T) => void\n /** Custom header (persistent filter button) for the columns that use one. */\n renderHeader: (params: IHeaderParams, colId: string) => ReactNode\n /** Row action menu, shown at the right edge of the Fact cell. */\n renderRowActions: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** Inline label picker for the Labels cell. */\n renderLabels: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** The Verified switch. */\n renderVerified: (fact: T) => ReactNode\n /** The Shared switch. */\n renderShared: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** The creator avatar. */\n renderCreator: (fact: T, params: ICellRendererParams<T>) => ReactNode\n /** Sort/filter value for the Created by column (the creator's display name). */\n getCreatorName: (params: ValueGetterParams<T>) => string\n /** Friendly display of an ISO timestamp (Created at / Updated). */\n formatDate: (iso: string) => string\n labels?: Partial<FactColumnLabels>\n testIds?: Partial<FactColumnTestIds>\n}\n\n/**\n * Date-filter params for a column whose value is an ISO string. AG Grid hands the comparator a JS\n * `Date` from the picker and the raw cell value; this compares UTC day components so a filter\n * never shifts a date by a day for viewers west of UTC.\n */\nexport const ISO_DATE_FILTER_PARAMS = {\n browserDatePicker: true,\n comparator: (filterDate: Date, cellValue: unknown): number => {\n if (!cellValue || typeof cellValue !== 'string') return -1\n const cell = new Date(cellValue)\n if (Number.isNaN(cell.getTime())) return -1\n const cellDay = Date.UTC(cell.getUTCFullYear(), cell.getUTCMonth(), cell.getUTCDate())\n const filterDay = Date.UTC(\n filterDate.getFullYear(),\n filterDate.getMonth(),\n filterDate.getDate()\n )\n return cellDay < filterDay ? -1 : cellDay > filterDay ? 1 : 0\n },\n}\n\n/** How many source documents a fact cites (the Sources column counts documents, not passages). */\nexport function sourceDocCount(fact: Pick<FactRowView, 'citations'> | undefined): number {\n return fact?.citations?.length ?? 0\n}\n\n/** Default left-to-right order; default-hidden columns trail. Every colId must be listed. */\nexport const DEFAULT_FACT_COLUMN_ORDER = [\n 'in_chat',\n 'text',\n 'sources',\n 'tags',\n 'date',\n 'confirmed',\n 'shared',\n 'created_by',\n 'created_at',\n 'updated_at',\n 'note_id',\n] as const\n\nexport function createFactColumns<T extends FactRowView>(slots: FactColumnSlots<T>): ColDef<T>[] {\n // AG Grid's `field` is a path type over the row; for a generic row we assert the known keys.\n const fieldOf = (name: keyof FactRowView) => name as ColDef<T>['field']\n const l = { ...DEFAULT_FACT_COLUMN_LABELS, ...slots.labels }\n const ids = slots.testIds\n\n const { isInChat, onToggleInChat } = slots\n const inChatColumn: ColDef<T>[] =\n isInChat && onToggleInChat\n ? [\n {\n colId: 'in_chat',\n headerName: '',\n headerComponent: () => (\n <span className=\"flex size-full items-center justify-center\">\n <Paperclip className=\"size-3.5 text-muted-foreground\" />\n </span>\n ),\n valueGetter: (params: ValueGetterParams<T>) =>\n params.data ? isInChat(params.data) : false,\n width: 44,\n minWidth: 44,\n maxWidth: 44,\n sortable: true,\n resizable: false,\n headerTooltip: l.inChatHeaderTooltip,\n cellClass: 'cell-hcenter',\n // A toggle, not a readout: a fact in the chat rides every message of it, so it flips\n // in place.\n cellRenderer: (params: ICellRendererParams<T>) => {\n if (!params.data) return null\n const fact = params.data\n const inChat = isInChat(fact)\n return (\n <button\n type=\"button\"\n onClick={() => onToggleInChat(fact)}\n title={inChat ? l.inChatTitle : l.notInChatTitle}\n aria-label={inChat ? l.removeFromChat : l.addToChat}\n aria-pressed={inChat}\n data-testid={testIdOr(ids?.inChat?.(fact.external_id), {\n testId: `facts-grid-in-chat-${fact.external_id}`,\n })}\n className=\"flex h-full items-center\"\n >\n <Paperclip\n className={cn(\n 'size-3.5',\n inChat\n ? 'text-primary'\n : 'text-muted-foreground/30 transition-colors hover:text-muted-foreground'\n )}\n />\n </button>\n )\n },\n },\n ]\n : []\n\n const columns: ColDef<T>[] = [\n ...inChatColumn,\n {\n colId: 'text',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'text'),\n headerName: l.fact,\n field: fieldOf('text'),\n flex: 3,\n minWidth: 280,\n sortable: true,\n filter: 'agTextColumnFilter',\n // Decode the editor's whitespace entities (` ` for a trailing space) so the tooltip\n // reads as typed, not as raw markdown references.\n tooltipValueGetter: (p) => decodeWhitespaceEntities(p.data?.text),\n // Editable only via the grid api (Rename in the row's menu); clicks never open the editor\n // (suppressClickEdit on the grid).\n editable: true,\n cellEditor: 'agLargeTextCellEditor',\n cellEditorPopup: true,\n cellEditorParams: { rows: 8, cols: 60 },\n valueSetter: (params) => {\n if (!params.data) return false\n params.data.text = params.newValue\n return true\n },\n // NOT `cell-multiline`: this cell has its OWN clamp (the `.fact-clamp` span below, sized\n // from the row height). A second clamp cut the text in half at the minimum row height.\n cellClass: 'relative',\n cellRenderer: (params: ICellRendererParams<T>) => {\n if (!params.data) return null\n const fact = params.data\n // Clamp to however many WHOLE lines fit the row height (leading-snug ~ 20px/line),\n // top-aligned so the BEGINNING of the fact is always shown. No overflow clip here: the\n // wrapper is the cell's content box, shorter than a line at the density floor.\n const rowH = params.node.rowHeight ?? 52\n const clampLines = Math.max(1, Math.floor(rowH / 20))\n return (\n <div className=\"relative flex size-full items-start pr-6\">\n <span\n className=\"fact-clamp whitespace-normal break-words text-sm leading-snug text-foreground\"\n style={{ ['--fact-clamp-lines' as string]: clampLines } as CSSProperties}\n data-testid={testIdOr(ids?.text?.(fact.external_id), {\n testId: `facts-grid-text-${fact.external_id}`,\n })}\n >\n {decodeWhitespaceEntities(fact.text)}\n </span>\n {/* `facts-row-kebab` (app CSS) keeps the menu always visible: touch has no hover. */}\n <div className=\"facts-row-kebab absolute right-0.5 top-1/2 -translate-y-1/2\">\n {slots.renderRowActions(fact, params)}\n </div>\n </div>\n )\n },\n },\n {\n colId: 'date',\n // AG Grid's DEFAULT header, so the sort arrow and filter button are the native ones,\n // identical to the Files table's Date columns.\n headerName: l.dates,\n // Sort on the raw bound rather than the rendered string (\"Oct 2019\" sorts April first).\n field: fieldOf('date_start'),\n flex: 0.8,\n minWidth: 132,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n // The edit value is the date-only slice: a lexical sort matches a chronological one, and\n // the inline editor shows \"2024-03-12\" rather than a full ISO timestamp. Inline typing\n // accepts YYYY, YYYY-MM or YYYY-MM-DD; clearing the cell undates the fact.\n editable: true,\n singleClickEdit: true,\n valueGetter: (params: ValueGetterParams<T>) =>\n params.data?.date_start ? params.data.date_start.slice(0, 10) : null,\n valueSetter: (params) => {\n if (!params.data) return false\n params.data.date_start = params.newValue\n return true\n },\n cellClass: 'relative cell-tnum',\n cellRenderer: (params: ICellRendererParams<T>) => {\n const when = formatSpan(\n params.data?.date_start,\n params.data?.date_end,\n params.data?.timezone\n )\n if (!when) return <span className=\"text-muted-foreground/50\">\u2014</span>\n return (\n <span\n className=\"inline-flex items-center gap-1\"\n data-testid={testIdOr(ids?.date?.(params.data?.external_id ?? ''), {\n testId: `facts-grid-date-${params.data?.external_id}`,\n })}\n title={l.dateTitle}\n >\n <CalendarDays className=\"size-3 opacity-70\" />\n {when}\n </span>\n )\n },\n },\n {\n colId: 'tags',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'tags'),\n headerName: l.labels,\n flex: 0.9,\n // Never narrower than its own header, even with the filter button and sort indicator.\n minWidth: 160,\n sortable: true,\n filter: 'agTextColumnFilter',\n cellClass: 'overflow-visible',\n valueGetter: (params: ValueGetterParams<T>) =>\n (params.data?.tags ?? []).map((t) => t.name).join(', '),\n // Editable in place: toggling a label persists immediately, no dialog round-trip.\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? slots.renderLabels(params.data, params) : null,\n },\n {\n colId: 'confirmed',\n headerName: l.verified,\n headerTooltip: l.verifiedTooltip,\n field: fieldOf('confirmed'),\n // minWidth matches width so the header can't be clamped narrow enough to ellipsize.\n width: 116,\n minWidth: 116,\n sortable: true,\n cellDataType: 'boolean',\n valueGetter: (params) => params.data?.confirmed ?? false,\n cellClass: 'cell-hcenter',\n headerClass: 'header-hcenter',\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderVerified(params.data)}\n </div>\n ) : null,\n },\n {\n colId: 'shared',\n headerName: l.shared,\n headerTooltip: l.sharedTooltip,\n field: fieldOf('shared'),\n // minWidth (not just width) is raised too: AG Grid clamps any persisted width up to it.\n width: 124,\n minWidth: 124,\n sortable: true,\n headerClass: 'header-hcenter',\n cellDataType: 'boolean',\n valueGetter: (params) => params.data?.shared ?? false,\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderShared(params.data, params)}\n </div>\n ) : null,\n },\n {\n colId: 'created_by',\n headerName: l.createdBy,\n headerTooltip: l.createdBy,\n width: 138,\n minWidth: 138,\n sortable: true,\n valueGetter: (params) => slots.getCreatorName(params),\n cellRenderer: (params: ICellRendererParams<T>) =>\n params.data ? (\n <div className=\"flex h-full items-center justify-center\">\n {slots.renderCreator(params.data, params)}\n </div>\n ) : null,\n },\n {\n colId: 'sources',\n headerName: l.sources,\n width: 112,\n minWidth: 104,\n sortable: true,\n // A hand-written fact has no sources, which is information rather than a gap: it reads as\n // an em dash instead of a zero.\n valueGetter: (params) => sourceDocCount(params.data),\n cellRenderer: (params: ICellRendererParams<T>) => {\n const n = sourceDocCount(params.data)\n if (n === 0) return <span className=\"text-muted-foreground/40\">\u2014</span>\n return (\n <span\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\"\n title={l.sourcedFrom(n)}\n >\n <Quote className=\"size-3 opacity-70\" />\n {n}\n </span>\n )\n },\n },\n {\n colId: 'created_at',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'created_at'),\n headerName: l.createdAt,\n field: fieldOf('created_at'),\n width: 162,\n minWidth: 154,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n // Display-only: a valueFormatter avoids mounting a React component per row.\n cellClass: 'text-muted-foreground',\n valueFormatter: (params) => (params.value ? slots.formatDate(params.value) : ''),\n },\n {\n colId: 'updated_at',\n suppressHeaderFilterButton: true,\n headerComponent: (p: IHeaderParams) => slots.renderHeader(p, 'updated_at'),\n headerName: l.updated,\n field: fieldOf('updated_at'),\n width: 140,\n minWidth: 140,\n // Hidden by default: a column-menu opt-in like the documents grid's long tail.\n hide: true,\n sortable: true,\n filter: 'agDateColumnFilter',\n filterParams: ISO_DATE_FILTER_PARAMS,\n valueFormatter: (params) => (params.value ? slots.formatDate(params.value) : ''),\n },\n {\n colId: 'note_id',\n headerName: l.id,\n field: fieldOf('external_id'),\n width: 120,\n minWidth: 100,\n sortable: true,\n filter: 'agTextColumnFilter',\n // Hidden by default like the documents ID column: needed when quoting a fact to support.\n hide: true,\n cellClass: 'font-mono text-xs text-muted-foreground',\n },\n ]\n\n // Persisted per-user column order still wins once set; bump the grid id to apply a new default.\n return DEFAULT_FACT_COLUMN_ORDER.map((id) => columns.find((c) => c.colId === id)).filter(\n (c): c is ColDef<T> => c !== undefined\n )\n}\n"],
|
|
5
5
|
"mappings": ";AAwKgB,cAmFN,YAnFM;AA5JhB,SAAS,cAAc,WAAW,aAAa;AAC/C,SAAS,UAAU;AACnB,SAAS,kBAAkB;AAC3B,SAAS,gCAAgC;AACzC,SAAS,gBAAgB;AAyBlB,MAAM,6BAA+C;AAAA,EAC1D,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,WAAW;AAAA,EACX,SAAS;AAAA,EACT,aAAa,CAAC,MAAM,gBAAgB,CAAC,YAAY,MAAM,IAAI,KAAK,GAAG;AAAA,EACnE,WAAW;AAAA,EACX,SAAS;AAAA,EACT,IAAI;AACN;AAwDO,MAAM,yBAAyB;AAAA,EACpC,mBAAmB;AAAA,EACnB,YAAY,CAAC,YAAkB,cAA+B;AAC5D,QAAI,CAAC,aAAa,OAAO,cAAc,SAAU,QAAO;AACxD,UAAM,OAAO,IAAI,KAAK,SAAS;AAC/B,QAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AACzC,UAAM,UAAU,KAAK,IAAI,KAAK,eAAe,GAAG,KAAK,YAAY,GAAG,KAAK,WAAW,CAAC;AACrF,UAAM,YAAY,KAAK;AAAA,MACrB,WAAW,YAAY;AAAA,MACvB,WAAW,SAAS;AAAA,MACpB,WAAW,QAAQ;AAAA,IACrB;AACA,WAAO,UAAU,YAAY,KAAK,UAAU,YAAY,IAAI;AAAA,EAC9D;AACF;AAGO,SAAS,eAAe,MAA0D;AACvF,SAAO,MAAM,WAAW,UAAU;AACpC;AAGO,MAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,kBAAyC,OAAwC;AAE/F,QAAM,UAAU,CAAC,SAA4B;AAC7C,QAAM,IAAI,EAAE,GAAG,4BAA4B,GAAG,MAAM,OAAO;AAC3D,QAAM,MAAM,MAAM;AAElB,QAAM,EAAE,UAAU,eAAe,IAAI;AACrC,QAAM,eACJ,YAAY,iBACR;AAAA,IACE;AAAA,MACE,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,iBAAiB,MACf,oBAAC,UAAK,WAAU,8CACd,8BAAC,aAAU,WAAU,kCAAiC,GACxD;AAAA,MAEF,aAAa,CAAC,WACZ,OAAO,OAAO,SAAS,OAAO,IAAI,IAAI;AAAA,MACxC,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MACX,eAAe,EAAE;AAAA,MACjB,WAAW;AAAA;AAAA;AAAA,MAGX,cAAc,CAAC,WAAmC;AAChD,YAAI,CAAC,OAAO,KAAM,QAAO;AACzB,cAAM,OAAO,OAAO;AACpB,cAAM,SAAS,SAAS,IAAI;AAC5B,eACE;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM,eAAe,IAAI;AAAA,YAClC,OAAO,SAAS,EAAE,cAAc,EAAE;AAAA,YAClC,cAAY,SAAS,EAAE,iBAAiB,EAAE;AAAA,YAC1C,gBAAc;AAAA,YACd,eAAa,SAAS,KAAK,SAAS,KAAK,WAAW,GAAG;AAAA,cACrD,QAAQ,sBAAsB,KAAK,WAAW;AAAA,YAChD,CAAC;AAAA,YACD,WAAU;AAAA,YAEV;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA,SACI,iBACA;AAAA,gBACN;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,MAEJ;AAAA,IACF;AAAA,EACF,IACA,CAAC;AAEP,QAAM,UAAuB;AAAA,IAC3B,GAAG;AAAA,IACH;AAAA,MACE,OAAO;AAAA,MACP,4BAA4B;AAAA,MAC5B,iBAAiB,CAAC,MAAqB,MAAM,aAAa,GAAG,MAAM;AAAA,MACnE,YAAY,EAAE;AAAA,MACd,OAAO,QAAQ,MAAM;AAAA,MACrB,MAAM;AAAA,MACN,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA;AAAA;AAAA,MAGR,oBAAoB,CAAC,MAAM,yBAAyB,EAAE,MAAM,IAAI;AAAA;AAAA;AAAA,MAGhE,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,kBAAkB,EAAE,MAAM,GAAG,MAAM,GAAG;AAAA,MACtC,aAAa,CAAC,WAAW;AACvB,YAAI,CAAC,OAAO,KAAM,QAAO;AACzB,eAAO,KAAK,OAAO,OAAO;AAC1B,eAAO;AAAA,MACT;AAAA;AAAA;AAAA,MAGA,WAAW;AAAA,MACX,cAAc,CAAC,WAAmC;AAChD,YAAI,CAAC,OAAO,KAAM,QAAO;AACzB,cAAM,OAAO,OAAO;AAIpB,cAAM,OAAO,OAAO,KAAK,aAAa;AACtC,cAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,EAAE,CAAC;AACpD,eACE,qBAAC,SAAI,WAAU,4CACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,CAAC,oBAA8B,GAAG,WAAW;AAAA,cACtD,eAAa,SAAS,KAAK,OAAO,KAAK,WAAW,GAAG;AAAA,gBACnD,QAAQ,mBAAmB,KAAK,WAAW;AAAA,cAC7C,CAAC;AAAA,cAEA,mCAAyB,KAAK,IAAI;AAAA;AAAA,UACrC;AAAA,UAEA,oBAAC,SAAI,WAAU,+DACZ,gBAAM,iBAAiB,MAAM,MAAM,GACtC;AAAA,WACF;AAAA,MAEJ;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA;AAAA;AAAA,MAGP,YAAY,EAAE;AAAA;AAAA,MAEd,OAAO,QAAQ,YAAY;AAAA,MAC3B,MAAM;AAAA,MACN,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,cAAc;AAAA;AAAA;AAAA;AAAA,MAId,UAAU;AAAA,MACV,iBAAiB;AAAA,MACjB,aAAa,CAAC,WACZ,OAAO,MAAM,aAAa,OAAO,KAAK,WAAW,MAAM,GAAG,EAAE,IAAI;AAAA,MAClE,aAAa,CAAC,WAAW;AACvB,YAAI,CAAC,OAAO,KAAM,QAAO;AACzB,eAAO,KAAK,aAAa,OAAO;AAChC,eAAO;AAAA,MACT;AAAA,MACA,WAAW;AAAA,MACX,cAAc,CAAC,WAAmC;AAChD,cAAM,OAAO;AAAA,UACX,OAAO,MAAM;AAAA,UACb,OAAO,MAAM;AAAA,UACb,OAAO,MAAM;AAAA,QACf;AACA,YAAI,CAAC,KAAM,QAAO,oBAAC,UAAK,WAAU,4BAA2B,oBAAC;AAC9D,eACE;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,eAAa,SAAS,KAAK,OAAO,OAAO,MAAM,eAAe,EAAE,GAAG;AAAA,cACjE,QAAQ,mBAAmB,OAAO,MAAM,WAAW;AAAA,YACrD,CAAC;AAAA,YACD,OAAO,EAAE;AAAA,YAET;AAAA,kCAAC,gBAAa,WAAU,qBAAoB;AAAA,cAC3C;AAAA;AAAA;AAAA,QACH;AAAA,MAEJ;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,4BAA4B;AAAA,MAC5B,iBAAiB,CAAC,MAAqB,MAAM,aAAa,GAAG,MAAM;AAAA,MACnE,YAAY,EAAE;AAAA,MACd,MAAM;AAAA;AAAA,MAEN,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,aAAa,CAAC,YACX,OAAO,MAAM,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AAAA;AAAA,MAExD,cAAc,CAAC,WACb,OAAO,OAAO,MAAM,aAAa,OAAO,MAAM,MAAM,IAAI;AAAA,IAC5D;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,YAAY,EAAE;AAAA,MACd,eAAe,EAAE;AAAA,MACjB,OAAO,QAAQ,WAAW;AAAA;AAAA,MAE1B,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA,MACd,aAAa,CAAC,WAAW,OAAO,MAAM,aAAa;AAAA,MACnD,WAAW;AAAA,MACX,aAAa;AAAA,MACb,cAAc,CAAC,WACb,OAAO,OACL,oBAAC,SAAI,WAAU,2CACZ,gBAAM,eAAe,OAAO,IAAI,GACnC,IACE;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,YAAY,EAAE;AAAA,MACd,eAAe,EAAE;AAAA,MACjB,OAAO,QAAQ,QAAQ;AAAA;AAAA,MAEvB,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,aAAa;AAAA,MACb,cAAc;AAAA,MACd,aAAa,CAAC,WAAW,OAAO,MAAM,UAAU;AAAA,MAChD,cAAc,CAAC,WACb,OAAO,OACL,oBAAC,SAAI,WAAU,2CACZ,gBAAM,aAAa,OAAO,MAAM,MAAM,GACzC,IACE;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,YAAY,EAAE;AAAA,MACd,eAAe,EAAE;AAAA,MACjB,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,aAAa,CAAC,WAAW,MAAM,eAAe,MAAM;AAAA,MACpD,cAAc,CAAC,WACb,OAAO,OACL,oBAAC,SAAI,WAAU,2CACZ,gBAAM,cAAc,OAAO,MAAM,MAAM,GAC1C,IACE;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,YAAY,EAAE;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA;AAAA;AAAA,MAGV,aAAa,CAAC,WAAW,eAAe,OAAO,IAAI;AAAA,MACnD,cAAc,CAAC,WAAmC;AAChD,cAAM,IAAI,eAAe,OAAO,IAAI;AACpC,YAAI,MAAM,EAAG,QAAO,oBAAC,UAAK,WAAU,4BAA2B,oBAAC;AAChE,eACE;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,YAAY,CAAC;AAAA,YAEtB;AAAA,kCAAC,SAAM,WAAU,qBAAoB;AAAA,cACpC;AAAA;AAAA;AAAA,QACH;AAAA,MAEJ;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,4BAA4B;AAAA,MAC5B,iBAAiB,CAAC,MAAqB,MAAM,aAAa,GAAG,YAAY;AAAA,MACzE,YAAY,EAAE;AAAA,MACd,OAAO,QAAQ,YAAY;AAAA,MAC3B,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,cAAc;AAAA;AAAA,MAEd,WAAW;AAAA,MACX,gBAAgB,CAAC,WAAY,OAAO,QAAQ,MAAM,WAAW,OAAO,KAAK,IAAI;AAAA,IAC/E;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,4BAA4B;AAAA,MAC5B,iBAAiB,CAAC,MAAqB,MAAM,aAAa,GAAG,YAAY;AAAA,MACzE,YAAY,EAAE;AAAA,MACd,OAAO,QAAQ,YAAY;AAAA,MAC3B,OAAO;AAAA,MACP,UAAU;AAAA;AAAA,MAEV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,gBAAgB,CAAC,WAAY,OAAO,QAAQ,MAAM,WAAW,OAAO,KAAK,IAAI;AAAA,IAC/E;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,YAAY,EAAE;AAAA,MACd,OAAO,QAAQ,aAAa;AAAA,MAC5B,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA;AAAA,MAER,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,EACF;AAGA,SAAO,0BAA0B,IAAI,CAAC,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE;AAAA,IAChF,CAAC,MAAsB,MAAM;AAAA,EAC/B;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/facts/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkMXBXZXXQ_cjs = require('../chunk-MXBXZXXQ.cjs');
|
|
5
5
|
var chunkTJY7XPDE_cjs = require('../chunk-TJY7XPDE.cjs');
|
|
6
6
|
var chunkDDWLMYRO_cjs = require('../chunk-DDWLMYRO.cjs');
|
|
7
7
|
require('../chunk-SNUBQMIS.cjs');
|
|
@@ -42,167 +42,167 @@ function toFactRows(records) {
|
|
|
42
42
|
|
|
43
43
|
Object.defineProperty(exports, "DEFAULT_FACTS_BULK_BAR_LABELS", {
|
|
44
44
|
enumerable: true,
|
|
45
|
-
get: function () { return
|
|
45
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACTS_BULK_BAR_LABELS; }
|
|
46
46
|
});
|
|
47
47
|
Object.defineProperty(exports, "DEFAULT_FACTS_EMPTY_STATE_LABELS", {
|
|
48
48
|
enumerable: true,
|
|
49
|
-
get: function () { return
|
|
49
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACTS_EMPTY_STATE_LABELS; }
|
|
50
50
|
});
|
|
51
51
|
Object.defineProperty(exports, "DEFAULT_FACTS_FIELDS_BUTTON_LABELS", {
|
|
52
52
|
enumerable: true,
|
|
53
|
-
get: function () { return
|
|
53
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACTS_FIELDS_BUTTON_LABELS; }
|
|
54
54
|
});
|
|
55
55
|
Object.defineProperty(exports, "DEFAULT_FACTS_TOOLBAR_LABELS", {
|
|
56
56
|
enumerable: true,
|
|
57
|
-
get: function () { return
|
|
57
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACTS_TOOLBAR_LABELS; }
|
|
58
58
|
});
|
|
59
59
|
Object.defineProperty(exports, "DEFAULT_FACTS_VIEW_TOGGLE_LABELS", {
|
|
60
60
|
enumerable: true,
|
|
61
|
-
get: function () { return
|
|
61
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACTS_VIEW_TOGGLE_LABELS; }
|
|
62
62
|
});
|
|
63
63
|
Object.defineProperty(exports, "DEFAULT_FACT_COLUMN_LABELS", {
|
|
64
64
|
enumerable: true,
|
|
65
|
-
get: function () { return
|
|
65
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACT_COLUMN_LABELS; }
|
|
66
66
|
});
|
|
67
67
|
Object.defineProperty(exports, "DEFAULT_FACT_COLUMN_ORDER", {
|
|
68
68
|
enumerable: true,
|
|
69
|
-
get: function () { return
|
|
69
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACT_COLUMN_ORDER; }
|
|
70
70
|
});
|
|
71
71
|
Object.defineProperty(exports, "DEFAULT_FACT_COMPOSER_LABELS", {
|
|
72
72
|
enumerable: true,
|
|
73
|
-
get: function () { return
|
|
73
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACT_COMPOSER_LABELS; }
|
|
74
74
|
});
|
|
75
75
|
Object.defineProperty(exports, "DEFAULT_FACT_DATE_INPUT_LABELS", {
|
|
76
76
|
enumerable: true,
|
|
77
|
-
get: function () { return
|
|
77
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACT_DATE_INPUT_LABELS; }
|
|
78
78
|
});
|
|
79
79
|
Object.defineProperty(exports, "DEFAULT_FACT_LABELS_CELL_LABELS", {
|
|
80
80
|
enumerable: true,
|
|
81
|
-
get: function () { return
|
|
81
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACT_LABELS_CELL_LABELS; }
|
|
82
82
|
});
|
|
83
83
|
Object.defineProperty(exports, "DEFAULT_FACT_ROW_ACTIONS_LABELS", {
|
|
84
84
|
enumerable: true,
|
|
85
|
-
get: function () { return
|
|
85
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACT_ROW_ACTIONS_LABELS; }
|
|
86
86
|
});
|
|
87
87
|
Object.defineProperty(exports, "DEFAULT_FACT_SEARCH_BAR_LABELS", {
|
|
88
88
|
enumerable: true,
|
|
89
|
-
get: function () { return
|
|
89
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACT_SEARCH_BAR_LABELS; }
|
|
90
90
|
});
|
|
91
91
|
Object.defineProperty(exports, "DEFAULT_FACT_SEARCH_RESULT_LABELS", {
|
|
92
92
|
enumerable: true,
|
|
93
|
-
get: function () { return
|
|
93
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACT_SEARCH_RESULT_LABELS; }
|
|
94
94
|
});
|
|
95
95
|
Object.defineProperty(exports, "DEFAULT_FACT_SOURCES_ROW_LABELS", {
|
|
96
96
|
enumerable: true,
|
|
97
|
-
get: function () { return
|
|
97
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACT_SOURCES_ROW_LABELS; }
|
|
98
98
|
});
|
|
99
99
|
Object.defineProperty(exports, "DEFAULT_FACT_SOURCE_GROUP_LABELS", {
|
|
100
100
|
enumerable: true,
|
|
101
|
-
get: function () { return
|
|
101
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACT_SOURCE_GROUP_LABELS; }
|
|
102
102
|
});
|
|
103
103
|
Object.defineProperty(exports, "DEFAULT_FACT_TIMELINE_LABELS", {
|
|
104
104
|
enumerable: true,
|
|
105
|
-
get: function () { return
|
|
105
|
+
get: function () { return chunkMXBXZXXQ_cjs.DEFAULT_FACT_TIMELINE_LABELS; }
|
|
106
106
|
});
|
|
107
107
|
Object.defineProperty(exports, "FactComposer", {
|
|
108
108
|
enumerable: true,
|
|
109
|
-
get: function () { return
|
|
109
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactComposer; }
|
|
110
110
|
});
|
|
111
111
|
Object.defineProperty(exports, "FactDateInput", {
|
|
112
112
|
enumerable: true,
|
|
113
|
-
get: function () { return
|
|
113
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactDateInput; }
|
|
114
114
|
});
|
|
115
115
|
Object.defineProperty(exports, "FactFieldRow", {
|
|
116
116
|
enumerable: true,
|
|
117
|
-
get: function () { return
|
|
117
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactFieldRow; }
|
|
118
118
|
});
|
|
119
119
|
Object.defineProperty(exports, "FactLabelsCell", {
|
|
120
120
|
enumerable: true,
|
|
121
|
-
get: function () { return
|
|
121
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactLabelsCell; }
|
|
122
122
|
});
|
|
123
123
|
Object.defineProperty(exports, "FactRowActions", {
|
|
124
124
|
enumerable: true,
|
|
125
|
-
get: function () { return
|
|
125
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactRowActions; }
|
|
126
126
|
});
|
|
127
127
|
Object.defineProperty(exports, "FactSearchBar", {
|
|
128
128
|
enumerable: true,
|
|
129
|
-
get: function () { return
|
|
129
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactSearchBar; }
|
|
130
130
|
});
|
|
131
131
|
Object.defineProperty(exports, "FactSearchNoMatches", {
|
|
132
132
|
enumerable: true,
|
|
133
|
-
get: function () { return
|
|
133
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactSearchNoMatches; }
|
|
134
134
|
});
|
|
135
135
|
Object.defineProperty(exports, "FactSearchPending", {
|
|
136
136
|
enumerable: true,
|
|
137
|
-
get: function () { return
|
|
137
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactSearchPending; }
|
|
138
138
|
});
|
|
139
139
|
Object.defineProperty(exports, "FactSearchResult", {
|
|
140
140
|
enumerable: true,
|
|
141
|
-
get: function () { return
|
|
141
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactSearchResult; }
|
|
142
142
|
});
|
|
143
143
|
Object.defineProperty(exports, "FactSearchTotals", {
|
|
144
144
|
enumerable: true,
|
|
145
|
-
get: function () { return
|
|
145
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactSearchTotals; }
|
|
146
146
|
});
|
|
147
147
|
Object.defineProperty(exports, "FactSourceGroup", {
|
|
148
148
|
enumerable: true,
|
|
149
|
-
get: function () { return
|
|
149
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactSourceGroup; }
|
|
150
150
|
});
|
|
151
151
|
Object.defineProperty(exports, "FactSourcesRow", {
|
|
152
152
|
enumerable: true,
|
|
153
|
-
get: function () { return
|
|
153
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactSourcesRow; }
|
|
154
154
|
});
|
|
155
155
|
Object.defineProperty(exports, "FactsBulkBar", {
|
|
156
156
|
enumerable: true,
|
|
157
|
-
get: function () { return
|
|
157
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactsBulkBar; }
|
|
158
158
|
});
|
|
159
159
|
Object.defineProperty(exports, "FactsCalendar", {
|
|
160
160
|
enumerable: true,
|
|
161
|
-
get: function () { return
|
|
161
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactsCalendar; }
|
|
162
162
|
});
|
|
163
163
|
Object.defineProperty(exports, "FactsEmptyState", {
|
|
164
164
|
enumerable: true,
|
|
165
|
-
get: function () { return
|
|
165
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactsEmptyState; }
|
|
166
166
|
});
|
|
167
167
|
Object.defineProperty(exports, "FactsFieldsButton", {
|
|
168
168
|
enumerable: true,
|
|
169
|
-
get: function () { return
|
|
169
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactsFieldsButton; }
|
|
170
170
|
});
|
|
171
171
|
Object.defineProperty(exports, "FactsGanttPane", {
|
|
172
172
|
enumerable: true,
|
|
173
|
-
get: function () { return
|
|
173
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactsGanttPane; }
|
|
174
174
|
});
|
|
175
175
|
Object.defineProperty(exports, "FactsLoadError", {
|
|
176
176
|
enumerable: true,
|
|
177
|
-
get: function () { return
|
|
177
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactsLoadError; }
|
|
178
178
|
});
|
|
179
179
|
Object.defineProperty(exports, "FactsLoading", {
|
|
180
180
|
enumerable: true,
|
|
181
|
-
get: function () { return
|
|
181
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactsLoading; }
|
|
182
182
|
});
|
|
183
183
|
Object.defineProperty(exports, "FactsToolbar", {
|
|
184
184
|
enumerable: true,
|
|
185
|
-
get: function () { return
|
|
185
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactsToolbar; }
|
|
186
186
|
});
|
|
187
187
|
Object.defineProperty(exports, "FactsViewToggle", {
|
|
188
188
|
enumerable: true,
|
|
189
|
-
get: function () { return
|
|
189
|
+
get: function () { return chunkMXBXZXXQ_cjs.FactsViewToggle; }
|
|
190
190
|
});
|
|
191
191
|
Object.defineProperty(exports, "ISO_DATE_FILTER_PARAMS", {
|
|
192
192
|
enumerable: true,
|
|
193
|
-
get: function () { return
|
|
193
|
+
get: function () { return chunkMXBXZXXQ_cjs.ISO_DATE_FILTER_PARAMS; }
|
|
194
194
|
});
|
|
195
195
|
Object.defineProperty(exports, "createFactColumns", {
|
|
196
196
|
enumerable: true,
|
|
197
|
-
get: function () { return
|
|
197
|
+
get: function () { return chunkMXBXZXXQ_cjs.createFactColumns; }
|
|
198
198
|
});
|
|
199
199
|
Object.defineProperty(exports, "enableFactTableColumnResize", {
|
|
200
200
|
enumerable: true,
|
|
201
|
-
get: function () { return
|
|
201
|
+
get: function () { return chunkMXBXZXXQ_cjs.enableFactTableColumnResize; }
|
|
202
202
|
});
|
|
203
203
|
Object.defineProperty(exports, "sourceDocCount", {
|
|
204
204
|
enumerable: true,
|
|
205
|
-
get: function () { return
|
|
205
|
+
get: function () { return chunkMXBXZXXQ_cjs.sourceDocCount; }
|
|
206
206
|
});
|
|
207
207
|
Object.defineProperty(exports, "EMPTY_FACT_DATE_FIELDS", {
|
|
208
208
|
enumerable: true,
|
|
@@ -276,7 +276,7 @@ function GridView({
|
|
|
276
276
|
);
|
|
277
277
|
const handleFirstDataRendered = useCallback(() => {
|
|
278
278
|
ensureSelectionColumnVisible();
|
|
279
|
-
snapshotDesiredHidden();
|
|
279
|
+
if (!desiredHiddenRef.current) snapshotDesiredHidden();
|
|
280
280
|
}, [ensureSelectionColumnVisible, snapshotDesiredHidden]);
|
|
281
281
|
const handleModelUpdated = useCallback(() => {
|
|
282
282
|
}, []);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/files/GridViewImpl.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * GridView \u2014 a flexible AG Grid presentational core.\n *\n * Pure and app-agnostic: it owns no global state and pulls in no store. Column\n * state persistence (order / width / visibility / sort / filter) is exposed as a\n * controlled/uncontrolled prop pair \u2014 `gridState` (initial state, read once at\n * mount) and `onGridStateChange` (called whenever AG Grid's state changes). An\n * app wires those to wherever it keeps the state (Zustand, localStorage, a URL,\n * a server) via a thin adapter; the core stays decoupled.\n *\n * Themed here (colours/fonts/borders via the host CSS variables, so it inherits the host's\n * light/dark theme). The structural helper classes (cell-numeric, multiline clamp, scrollbars,\n * row kebabs) live in `@arbidocs/blocks/grid.css`, which the consuming app imports globally.\n */\n\nimport React, { useRef, useCallback, useMemo, useEffect } from 'react'\nimport { AgGridReact } from 'ag-grid-react'\nimport {\n ColDef,\n GridOptions,\n GridApi,\n IRowNode,\n GridState,\n themeQuartz,\n CellValueChangedEvent,\n ColumnVisibleEvent,\n GridReadyEvent,\n RowClickedEvent,\n} from 'ag-grid-community'\nimport { AllCommunityModule } from 'ag-grid-community'\nimport { BREAKPOINT_QUERIES, useMediaQuery } from '../lib/use-media-query'\nimport { watchGridTestIds } from './grid-test-ids'\n\n// Create the custom ARBI theme using themeQuartz\n// Colours reference the host CSS variables (hsl(var(--token))), so dark mode follows the app.\n// This enables dark mode support and consistent theming\nconst cssVar = (name: string, alpha?: number): string =>\n alpha === undefined ? `hsl(var(--${name}))` : `hsl(var(--${name}) / ${alpha})`\n\nconst arbiTheme = themeQuartz.withParams({\n // Match TagTable: a plain canvas, muted header, fine row borders and a rounded frame.\n // Every colour is a host CSS variable, so light/dark follow the app with no .dark overrides.\n backgroundColor: cssVar('background'),\n foregroundColor: cssVar('foreground'),\n borderColor: cssVar('border'),\n headerBackgroundColor: cssVar('muted', 0.4),\n headerTextColor: cssVar('foreground'),\n oddRowBackgroundColor: cssVar('background'),\n rowHoverColor: cssVar('muted', 0.6),\n // Checkbox-selected rows: a light accent tint. A row opened elsewhere (e.g. the viewer) may take\n // the full accent, so the two states stay distinguishable.\n selectedRowBackgroundColor: cssVar('accent', 0.6),\n rangeSelectionBackgroundColor: cssVar('accent'),\n accentColor: cssVar('primary'),\n inputFocusBorder: { color: cssVar('primary') },\n headerColumnBorder: false,\n // Keep the header as quiet as TagTable; reveal resize handles on hover (see grid.css).\n headerColumnResizeHandleColor: 'transparent',\n headerColumnResizeHandleHeight: '40%',\n headerColumnResizeHandleWidth: 1,\n\n // Font settings \u2014 inherit the host app's font. A googleFont here never\n // loaded under the apps' CSP, so every grid silently fell back to the\n // browser's default SERIF and read as unstyled.\n fontFamily: 'inherit',\n fontSize: 14,\n headerFontSize: 14,\n headerFontWeight: 500,\n\n // Sizing\n headerHeight: 37,\n rowHeight: 40,\n cellHorizontalPadding: 12,\n\n // Borders - structural settings only.\n // Row border is a real hairline in the theme border colour (not hardcoded\n // white, which was invisible on the light-mode background and wrong in dark\n // mode) so adjacent rows are clearly separated \u2014 important now that rows can\n // be tall and multi-line (e.g. the Abstract column).\n rowBorder: { style: 'solid', width: 1, color: 'hsl(var(--border))' },\n columnBorder: false, // Row hairlines only\n wrapperBorder: { style: 'solid', width: 1, color: cssVar('border') },\n\n // Use the same radius token as TagTable's rounded-lg container.\n borderRadius: 'var(--radius-lg, 8px)',\n wrapperBorderRadius: 'var(--radius-lg, 8px)',\n checkboxBorderRadius: 2, // Keep checkboxes square\n})\n\n// Selection configuration\nexport interface GridViewSelection<T> {\n mode: 'single' | 'multiple'\n selected: T[]\n onSelectionChange: (items: T[]) => void\n /**\n * Keep the grid's ticked rows equal to `selected` after mount (default: `selected` only seeds the\n * grid). For a host that changes the selection itself, e.g. ticking a parent ticks its sub-tasks.\n */\n controlled?: boolean\n}\n\n// Empty state configuration\nexport interface GridViewEmptyState {\n icon?: React.ReactNode\n title?: string\n message?: string\n action?: React.ReactNode\n}\n\n/** Grid events GridView binds itself; `gridOptions` may not override them. */\ntype GridViewOwnedEvent =\n | 'onGridReady'\n | 'onFirstDataRendered'\n | 'onModelUpdated'\n | 'onSelectionChanged'\n | 'onCellValueChanged'\n | 'onRowClicked'\n | 'onStateUpdated'\n | 'onColumnVisible'\n\n// Generic props to make this grid reusable with different data types\nexport interface GridViewProps<T> {\n // Core data\n items: T[]\n // Column configuration\n columnDefs: ColDef<T>[]\n // Row identity function\n getItemId: (item: T) => string\n // Selection handling\n selection?: GridViewSelection<T>\n // Empty state\n emptyState?: GridViewEmptyState\n // Loading state\n isLoading?: boolean\n loadingMessage?: string\n // Grid options. The events GridView handles itself are left out: they are spread over its own\n // handlers, so passing one here silently replaced them (an `onGridReady` here left the grid api\n // unset and selection never reached `selection.onSelectionChange`). Use the dedicated props.\n gridOptions?: Partial<Omit<GridOptions<T>, GridViewOwnedEvent>>\n // Grid initialization\n onGridReady?: (params: { api: GridApi<T> }) => void\n // Cell value changes\n onCellValueChanged?: (event: CellValueChangedEvent<T>) => void\n // Row click handler\n onRowClick?: (item: T) => void\n // State persistence.\n // The core is decoupled from any store: when `persistState` is on it seeds\n // AG Grid from `gridState` (read once at mount) and reports every subsequent\n // state change through `onGridStateChange`. An app-adapter wires these to its\n // own store. `gridId` is retained as an opaque identity hint for adapters\n // (the core itself does not read it).\n persistState?: boolean\n gridId?: string\n // Persisted column/sort/filter state to restore at mount (controlled input).\n gridState?: GridState\n // Called whenever AG Grid's state changes so an adapter can persist it.\n onGridStateChange?: (state: GridState) => void\n // Initial visible columns (applied when no saved state exists)\n initialVisibleColumns?: string[]\n // Basic styling\n className?: string\n height?: string | number\n // Per-instance row height. Applied via the theme (not just gridOptions) so the\n // theme's calculated line-height tracks it and cell content stays vertically\n // centered. Fixed height \u2014 keeps row virtualization on the fast path.\n rowHeight?: number\n testId?: string\n // Pinned rows\n pinnedBottomRowData?: T[]\n pinnedTopRowData?: T[]\n // Pagination (disabled by default)\n pagination?: boolean\n paginationPageSizeSelector?: number[]\n // Test-id hooks: the grid owns its row/cell DOM, so ids are stamped onto it after render.\n // `getRowTestId` names a row; `getCellTestId` a cell (by colId). Without them AG Grid's own\n // `row-id` / `col-id` attributes are still there to select by.\n getRowTestId?: (item: T) => string\n getCellTestId?: (colId: string, item: T) => string\n // Force empty-state UI even when items.length > 0.\n // Used when rows are present but all hidden by an external filter.\n showEmpty?: boolean\n}\n\n/** Minimum row height on coarse pointers: 44px touch target + the 1px row border + breathing room. */\nconst TOUCH_ROW_HEIGHT = 52\n\nexport function GridView<T>({\n items,\n columnDefs,\n getItemId,\n selection,\n emptyState,\n isLoading = false,\n loadingMessage = 'Loading...',\n gridOptions,\n onGridReady,\n onCellValueChanged,\n onRowClick,\n persistState = false,\n gridState,\n onGridStateChange,\n initialVisibleColumns,\n className = 'w-full',\n height = 500,\n rowHeight: rowHeightProp,\n testId = 'grid-view',\n pinnedBottomRowData,\n pinnedTopRowData,\n pagination = false,\n paginationPageSizeSelector,\n getRowTestId,\n getCellTestId,\n showEmpty,\n}: GridViewProps<T>) {\n // Reference to the grid API\n const gridApiRef = useRef<GridApi<T> | null>(null)\n\n // On touch screens rows grow to a 44px-hit-area-friendly height: AG Grid clips cell content\n // (pills, filename buttons, avatar chips) to the row, so a taller hit area needs a taller row.\n const isCoarsePointer = useMediaQuery(BREAKPOINT_QUERIES.coarsePointer)\n const rowHeight = isCoarsePointer\n ? Math.max(rowHeightProp ?? gridOptions?.rowHeight ?? 40, TOUCH_ROW_HEIGHT)\n : rowHeightProp\n\n // Initial row height, captured once so it can live in the (stable) default\n // grid options. rowHeight is NOT passed as a reactive prop \u2014 that would make\n // the AgGridReact wrapper re-process grid options on every change and snap\n // manually-resized columns back to their colDef widths. Subsequent changes are\n // applied imperatively (see effect below).\n const initialRowHeightRef = useRef(rowHeight)\n\n // Persisted state to seed the grid with \u2014 captured once at mount so a reactive\n // `gridState` prop (e.g. an adapter re-reading its store each render) can never\n // re-initialise the grid mid-session. Mirrors AG Grid's own initialState,\n // which is read once.\n const initialGridStateRef = useRef(gridState)\n\n // Get initial state for the grid (read once at mount)\n const initialState = useMemo(() => {\n if (!persistState) return undefined\n return initialGridStateRef.current\n }, [persistState])\n\n // Save grid state via the adapter using modern AG Grid state API\n const saveGridState = useCallback(() => {\n if (!persistState || !onGridStateChange || !gridApiRef.current) return\n\n // Use AG Grid's comprehensive state API to capture complete state\n // This includes: filters, sort, column order, column visibility, column widths, etc.\n const state = gridApiRef.current.getState()\n\n onGridStateChange(state)\n }, [persistState, onGridStateChange])\n\n // Ensure selection column is visible after grid initialization\n const ensureSelectionColumnVisible = useCallback(() => {\n if (!gridApiRef.current || !selection?.mode) return\n\n // IMPORTANT: Force selection column to be visible after state restoration\n // This ensures even old saved states don't hide the selection column\n // Also handles case where selection column is completely missing from state\n const currentState = gridApiRef.current.getColumnState()\n const selectionColumn = currentState.find((col) => col.colId === 'ag-Grid-SelectionColumn')\n const selectionColumnIndex = currentState.findIndex(\n (col) => col.colId === 'ag-Grid-SelectionColumn'\n )\n\n // Fix if column is hidden OR missing entirely OR not in first position\n if (!selectionColumn || selectionColumn.hide || selectionColumnIndex !== 0) {\n // Use setColumnsVisible for more reliable visibility control\n gridApiRef.current.setColumnsVisible(['ag-Grid-SelectionColumn'], true)\n\n // Also apply state to ensure proper width\n gridApiRef.current.applyColumnState({\n state: [\n {\n colId: 'ag-Grid-SelectionColumn',\n hide: false,\n width: selectionColumn?.width || 48,\n pinned: null, // Ensure not pinned in wrong position\n },\n ],\n defaultState: { hide: undefined },\n applyOrder: false,\n })\n\n // Move selection column to first position if it's not there\n if (selectionColumnIndex !== 0) {\n gridApiRef.current.moveColumns(['ag-Grid-SelectionColumn'], 0)\n }\n }\n }, [selection?.mode])\n\n // Stamp host test ids onto AG Grid's rows and cells (it virtualises, so keep watching).\n const containerRef = useRef<HTMLDivElement>(null)\n const itemsRef = useRef(items)\n itemsRef.current = items\n const getItemIdRef = useRef(getItemId)\n getItemIdRef.current = getItemId\n const hasTestIdHooks = Boolean(getRowTestId || getCellTestId)\n useEffect(() => {\n const root = containerRef.current\n if (!root || !hasTestIdHooks) return\n return watchGridTestIds(\n root,\n () => new Map(itemsRef.current.map((item) => [getItemIdRef.current(item), item])),\n { getRowTestId, getCellTestId }\n )\n }, [hasTestIdHooks, getRowTestId, getCellTestId, isLoading])\n\n // Row identity, stable for the grid's life (through the latest `getItemId`): an inline\n // `getItemId` used to change it, and with it the default options and their `defaultColDef`, on\n // every host render; AG Grid then re-applied the columns and recreated every header's label.\n const getRowId = useCallback((params: { data: T }) => getItemIdRef.current(params.data), [])\n\n // Refs for selection \u2014 avoids handleGridReady/handleSelectionChanged recreating\n // when selection object changes (which happens on every selectionConfig recompute)\n const selectionRef = useRef(selection)\n selectionRef.current = selection\n\n const onSelectionChangeRef = useRef(selection?.onSelectionChange)\n onSelectionChangeRef.current = selection?.onSelectionChange\n\n const syncingSelectionRef = useRef(false)\n\n const handleSelectionChanged = useCallback(() => {\n if (syncingSelectionRef.current) return\n if (!onSelectionChangeRef.current || !gridApiRef.current) return\n\n const selectedNodes = gridApiRef.current.getSelectedNodes()\n const selectedData = selectedNodes\n .map((node) => node.data)\n .filter((item): item is T => item !== undefined)\n\n onSelectionChangeRef.current(selectedData)\n }, [])\n\n // Handle row clicks\n // A controlled selection: tick and untick rows so the grid shows exactly `selection.selected`.\n const controlledSelected = selection?.controlled ? selection.selected : undefined\n useEffect(() => {\n const api = gridApiRef.current\n if (!api || api.isDestroyed() || !controlledSelected) return\n const wanted = new Set(controlledSelected.map(getItemId))\n const tick: IRowNode<T>[] = []\n const untick: IRowNode<T>[] = []\n api.forEachNode((node) => {\n if (!node.data) return\n const want = wanted.has(getItemId(node.data))\n if (want && !node.isSelected()) tick.push(node)\n else if (!want && node.isSelected()) untick.push(node)\n })\n syncingSelectionRef.current = true\n try {\n if (tick.length) api.setNodesSelected({ nodes: tick, newValue: true, source: 'api' })\n if (untick.length) api.setNodesSelected({ nodes: untick, newValue: false, source: 'api' })\n } finally {\n syncingSelectionRef.current = false\n }\n }, [controlledSelected, getItemId])\n\n const handleRowClicked = useCallback(\n (event: RowClickedEvent<T>) => {\n if (!onRowClick || !event.data) return\n // Don't fire when the click originated from an interactive element inside the cell\n // (e.g. action buttons). AG Grid fires rowClicked regardless of DOM stopPropagation.\n const target = event.event?.target as HTMLElement | null\n if (target?.closest('button, input, a, select, textarea, [role=\"button\"]')) return\n onRowClick(event.data)\n },\n [onRowClick]\n )\n\n // The visibility the user actually intends, per colId. AG Grid re-processes the\n // column definitions on some React re-renders even when the `columnDefs`\n // reference is unchanged, and that reset restores each colDef's `hide` \u2014 so a\n // column the user turned on (e.g. via a fields menu) silently disappears the\n // next time the host re-renders (opening an editor, selecting a row, \u2026). We\n // remember the intended visibility and restore it whenever such a reset fires.\n // A Map (not a Set of hidden ids) so a genuinely NEW column from a real\n // columnDefs change \u2014 one we've never seen \u2014 is left at its colDef default\n // rather than force-shown.\n const desiredHiddenRef = useRef<Map<string, boolean> | null>(null)\n\n const snapshotDesiredHidden = useCallback(() => {\n const api = gridApiRef.current\n if (!api) return\n desiredHiddenRef.current = new Map(api.getColumnState().map((c) => [c.colId, !!c.hide]))\n }, [])\n\n // Handle grid ready\n const handleGridReady = useCallback(\n (event: GridReadyEvent<T>) => {\n gridApiRef.current = event.api\n\n // Apply initial visible columns when no saved state exists\n // This prevents showing all columns by default for new users\n if (!initialState && initialVisibleColumns?.length) {\n const currentState = event.api.getColumnState()\n const stateMap = new Map(currentState.map((col) => [col.colId, col]))\n const visibleSet = new Set(initialVisibleColumns)\n\n // Build ordered state: selection column first (always visible), then visible columns, then hidden\n const selectionCol = stateMap.get('ag-Grid-SelectionColumn')\n const orderedState = [\n // Selection column first - ALWAYS visible, create if not in state\n selectionCol\n ? { ...selectionCol, hide: false }\n : { colId: 'ag-Grid-SelectionColumn', hide: false, width: 48 },\n // Visible columns in specified order\n ...initialVisibleColumns\n .filter((colId) => colId !== 'ag-Grid-SelectionColumn') // Don't duplicate selection column\n .map((colId) => {\n const col = stateMap.get(colId)\n return col ? { ...col, hide: false } : undefined\n }),\n // Hidden columns (everything else)\n ...currentState\n .filter((col) => col.colId !== 'ag-Grid-SelectionColumn' && !visibleSet.has(col.colId))\n .map((col) => ({ ...col, hide: true })),\n ].filter((col): col is NonNullable<typeof col> => col !== undefined)\n\n event.api.applyColumnState({ state: orderedState, applyOrder: true })\n }\n\n // When restoring persisted state, detect columns from columnDefs that\n // aren't in the saved state (e.g. newly added columns) and append them.\n // AG Grid's maintainColumnOrder adds them but may place them inconsistently;\n // this ensures they appear as hidden at the end so the navigator picks them up.\n if (initialState && initialVisibleColumns?.length) {\n const currentState = event.api.getColumnState()\n const savedColIds = new Set(\n initialState.columnOrder?.orderedColIds ?? currentState.map((c) => c.colId)\n )\n const newCols = currentState.filter(\n (col) => !savedColIds.has(col.colId) && col.colId !== 'ag-Grid-SelectionColumn'\n )\n if (newCols.length > 0) {\n // Make new columns visible if they're in the default visible set\n const defaultVisible = new Set(initialVisibleColumns)\n event.api.applyColumnState({\n state: newCols.map((col) => ({\n ...col,\n hide: !defaultVisible.has(col.colId),\n })),\n })\n }\n }\n\n // Ensure selection column is visible (in case saved state hides it)\n ensureSelectionColumnVisible()\n\n // Seed the intended column visibility from the state AG Grid settled on\n // (colDefs + restored persisted state) so a later colDef-driven reset can\n // be undone rather than silently hiding a user-shown column.\n snapshotDesiredHidden()\n\n // Call the provided onGridReady callback\n if (onGridReady) {\n onGridReady({ api: event.api })\n }\n\n // Restore selection state if needed (read from ref to keep callback stable)\n const sel = selectionRef.current\n if (sel && sel.selected.length > 0) {\n const selectedIds = new Set(sel.selected.map(getItemId))\n event.api.forEachNode((node) => {\n if (node.data && selectedIds.has(getItemId(node.data))) {\n node.setSelected(true)\n }\n })\n }\n },\n [\n onGridReady,\n getItemId,\n ensureSelectionColumnVisible,\n snapshotDesiredHidden,\n initialState,\n initialVisibleColumns,\n ]\n )\n\n // Undo AG Grid's colDef-driven visibility reset; record genuine user changes.\n const handleColumnVisible = useCallback(\n (event: ColumnVisibleEvent<T>) => {\n const api = gridApiRef.current\n if (!api) return\n // A columnDefs re-apply reports `gridOptionsChanged`; a real toggle reports\n // an interaction source (api, toolPanelUi, columnMenu, \u2026).\n if (event.source === 'gridOptionsChanged') {\n const desired = desiredHiddenRef.current\n if (!desired) return\n // Only correct columns we've seen before (in the snapshot); a brand-new\n // column keeps its colDef default.\n const fixes = api\n .getColumnState()\n .filter(\n (c) =>\n c.colId !== 'ag-Grid-SelectionColumn' &&\n desired.has(c.colId) &&\n desired.get(c.colId) !== !!c.hide\n )\n .map((c) => ({ colId: c.colId, hide: desired.get(c.colId) }))\n if (fixes.length) api.applyColumnState({ state: fixes })\n } else if (desiredHiddenRef.current && event.visible !== undefined && event.columns) {\n // Genuine change \u2014 this is now the intended visibility. Taken from the event itself: the\n // column state can still report the previous visibility while it is being dispatched\n // (seen for a change made before the grid's first data render).\n for (const column of event.columns) {\n desiredHiddenRef.current.set(column.getColId(), !event.visible)\n }\n } else {\n // A mixed change (applied column state): read the whole visibility back.\n snapshotDesiredHidden()\n }\n },\n [snapshotDesiredHidden]\n )\n\n // Handle first data rendered - no auto-sizing, let flex columns handle it\n const handleFirstDataRendered = useCallback(() => {\n // Columns with flex will auto-fill, columns with width stay fixed\n // Also ensure selection column is visible as a backup (handles timing issues with initialState)\n ensureSelectionColumnVisible()\n // Seed the intended visibility from the state AG Grid settled on (colDefs +\n // any restored persisted state), so later resets can be undone.\n snapshotDesiredHidden()\n }, [ensureSelectionColumnVisible, snapshotDesiredHidden])\n\n // Track when AG Grid processes row updates\n const handleModelUpdated = useCallback(() => {\n // AG Grid handles model updates internally\n }, [])\n\n // Track row data changes for AG Grid updates\n const prevItemsRef = useRef<T[]>([])\n useEffect(() => {\n prevItemsRef.current = items\n }, [items])\n\n // Handle state updates - save state when it changes (modern AG Grid approach)\n const handleStateUpdated = useCallback(() => {\n saveGridState()\n }, [saveGridState])\n\n // Removed problematic useEffect that caused unnecessary re-renders\n // AG Grid handles selection internally, only sync on initial load\n\n // Default grid options with minimal settings - memoized to prevent re-renders\n const defaultOptions: GridOptions<T> = useMemo(() => {\n return {\n // Initial row height (stable \u2014 captured once). Live changes go through the\n // imperative effect, not this option, to avoid column-state churn.\n rowHeight: initialRowHeightRef.current,\n suppressMenuHide: true, // Prevent hiding columns since we don't have enterprise sidebar\n maintainColumnOrder: true, // Preserve column order when columns are added/removed\n\n // Row virtualization: Render rows as needed for performance\n // rowBuffer renders extra rows above/below viewport for smoother scrolling\n rowBuffer: 10, // Render 10 extra rows above/below viewport for smooth scrolling\n suppressColumnVirtualisation: false, // Keep column virtualization enabled\n suppressRowVirtualisation: false, // ENABLE row virtualization - only render visible rows\n animateRows: false, // Disable row animations\n suppressColumnMoveAnimation: true, // Disable column move/resize animations\n\n // Efficient updates with React Query cache\n // getRowId enables change detection - grid only re-renders changed rows\n // Works perfectly with React Query's cache updates\n getRowId: getRowId,\n\n rowSelection: selection?.mode\n ? {\n mode: selection.mode === 'single' ? 'singleRow' : 'multiRow',\n selectAll: 'filtered', // Header checkbox selects all filtered rows (across all pages)\n // In multi-row mode, only checkboxes should toggle selection (clicking row body would replace selection)\n enableClickSelection: selection.mode === 'single',\n checkboxes: true,\n headerCheckbox: selection.mode === 'multiple',\n }\n : undefined,\n selectionColumnDef: selection?.mode\n ? {\n sortable: selection.mode === 'multiple',\n width: 48,\n lockVisible: true, // Cannot be hidden\n suppressMovable: true, // Cannot be moved\n }\n : undefined,\n // Use normal layout for better performance - autoHeight causes forced reflows\n domLayout: 'normal',\n // Stop editing when clicking outside the cell/grid\n stopEditingWhenCellsLoseFocus: true,\n // Additional performance optimizations\n suppressCellFocus: true, // Don't focus cells on click (faster)\n suppressRowHoverHighlight: true, // Disable hover highlight - reduces DOM manipulation during scroll\n suppressScrollOnNewData: true, // Don't scroll when data updates\n suppressAggFuncInHeader: true, // Don't show aggregation functions (faster)\n // Tooltip UX: the AG Grid default show-delay is 2 s which hurts\n // discoverability for cells where tooltips carry the \"reveal full\n // content\" affordance for non-editable users. 300 ms is snappy\n // without being accidental. tooltipInteraction lets users hover\n // onto the tooltip itself (e.g. to select / copy long text).\n // These are AG Grid's native tooltip controls \u2014 no React / Radix\n // provider involved, zero per-row cost; tooltip DOM is created on\n // demand when hover-delay elapses and destroyed on mouseout.\n tooltipShowDelay: 300,\n tooltipHideDelay: 4000,\n tooltipInteraction: true,\n // Pagination (disabled by default)\n pagination,\n paginationPageSizeSelector,\n defaultColDef: {\n sortable: true,\n resizable: true,\n unSortIcon: false, // Sort glyph only on the sorted column (every header carrying one was noise)\n sortingOrder: ['asc', 'desc', null], // 3-way sorting: asc \u2192 desc \u2192 unsorted (AG Grid default)\n wrapText: false, // Disable text wrapping for cleaner display\n autoHeight: false, // Use fixed row height from theme\n wrapHeaderText: false, // Disable header text wrapping for cleaner look\n autoHeaderHeight: false, // Fixed header height\n filterParams: {\n maxNumConditions: 1,\n buttons: ['reset'],\n },\n },\n }\n }, [selection?.mode, getRowId, pagination, paginationPageSizeSelector])\n\n // Combine default options with passed options - memoized to prevent re-renders\n const combinedOptions = useMemo(\n () => ({ ...defaultOptions, ...gridOptions }),\n [defaultOptions, gridOptions]\n )\n\n // Apply fixed height for better performance \u2014 autoHeight causes forced\n // reflows by measuring all rows, avoid it.\n //\n // Also derive the geometry the wrapping multiline columns (.cell-multiline \u2014\n // Abstract, Author, custom text fields) need so their overflow clip lands on\n // a WHOLE-line boundary (never mid-line, which reads as a half-line\n // \"bleeding\" into the neighbouring row). All computed once here per\n // row-height change and handed to CSS as variables \u2014 zero per-row cost on the\n // million-row grid:\n // --multiline-line-clamp : whole number of lines that fit \u2014 drives the CSS\n // line-clamp that hides overflow lines entirely.\n // --multiline-pad-y : vertical cell padding, shrunk on very short rows so\n // at least one whole line always fits.\n // --multiline-max-h : cap of exactly N whole lines + TOP padding + borders.\n // Deliberately excludes the bottom padding: AG Grid\n // forces cell height, so overflow clips at the\n // padding-box edge and any bottom padding becomes a\n // window onto the next (clamped-away) line. Ending the\n // box right at line N's bottom puts the clip on the\n // line boundary; the row supplies the visual gap below.\n const containerStyle = useMemo(() => {\n const style: React.CSSProperties = { height }\n if (rowHeight) {\n const LINE_PX = 14 * 1.35 // grid font-size \u00D7 multiline line-height (18.9px)\n const BORDER = 2 // multiline cell top + bottom border (1px each, border-box)\n const PREFERRED_PAD = 16 // preferred total vertical padding (8px top + 8px bottom)\n // Don't let padding eat the room a single line needs on short rows.\n const padTotal = Math.max(0, Math.min(PREFERRED_PAD, rowHeight - BORDER - LINE_PX))\n const lines = Math.max(1, Math.floor((rowHeight - BORDER - padTotal) / LINE_PX))\n const vars = style as Record<string, string | number>\n vars['--multiline-line-clamp'] = `${lines}`\n vars['--multiline-pad-y'] = `${padTotal / 2}px`\n vars['--multiline-max-h'] = `${lines * LINE_PX + padTotal / 2 + BORDER}px`\n }\n return style\n }, [height, rowHeight])\n\n // Apply rowHeight changes imperatively via the grid option (not the theme \u2014\n // recreating the theme would re-initialise the grid). This only re-lays-out\n // rows; columns, row virtualization, and the transaction bus are untouched.\n useEffect(() => {\n const api = gridApiRef.current\n if (!api || api.isDestroyed() || !rowHeight) return\n api.setGridOption('rowHeight', rowHeight)\n api.resetRowHeights()\n }, [rowHeight])\n\n const containerClassName = useMemo(() => {\n const baseClass = className || ''\n // Height-adjustable grids vertically center cell content (CSS) so a\n // one-line cell or a lone pill sits in the middle of the row, and multi-line\n // text (e.g. Abstract) is balanced top-to-bottom \u2014 flagged here, applied in\n // grid.css.\n const alignClass = rowHeight ? 'ag-cells-centered' : ''\n return [baseClass, alignClass].filter(Boolean).join(' ')\n }, [className, rowHeight])\n\n // Show loading state \u2014 grey skeleton rows so the page transition feels instant\n if (isLoading) {\n const skeletonRowCount = 12\n return (\n <div\n data-testid={`${testId}-loading`}\n className={`${containerClassName} overflow-hidden rounded-lg border border-border`}\n style={containerStyle}\n aria-busy=\"true\"\n aria-label={loadingMessage}\n >\n {/* Header skeleton */}\n <div className=\"flex h-[37px] items-center gap-4 border-b border-border bg-muted/40 px-3\">\n <div className=\"h-3 w-6 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-32 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-24 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-20 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-28 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-16 rounded bg-muted animate-pulse ml-auto\" />\n </div>\n {/* Row skeletons */}\n {Array.from({ length: skeletonRowCount }).map((_, rowIdx) => (\n <div key={rowIdx} className=\"flex h-10 items-center gap-4 border-b border-border px-3\">\n <div className=\"h-4 w-4 rounded-sm bg-muted/70 animate-pulse\" />\n <div\n className=\"h-3 rounded bg-muted/70 animate-pulse\"\n style={{ width: `${20 + ((rowIdx * 17) % 40)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/60 animate-pulse\"\n style={{ width: `${8 + ((rowIdx * 11) % 12)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/60 animate-pulse\"\n style={{ width: `${6 + ((rowIdx * 7) % 10)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/50 animate-pulse ml-auto\"\n style={{ width: `${5 + ((rowIdx * 5) % 8)}%` }}\n />\n </div>\n ))}\n </div>\n )\n }\n\n // Show empty state\n // showEmpty lets callers force this UI (e.g. when an external filter hid\n // every row but the underlying items array is non-empty).\n if ((showEmpty ?? items.length === 0) && emptyState) {\n return (\n <div\n data-testid={`${testId}-empty`}\n // Capped by its container (a landscape phone is shorter than 24rem) and scrollable, with the\n // content centred by auto margins so a tall one still starts at the top.\n className=\"flex h-96 max-h-full flex-col items-center overflow-y-auto p-6 text-center\"\n >\n <div className=\"my-auto flex flex-col items-center\">\n {emptyState.icon && (\n <div className=\"text-muted-foreground/60 mb-4\">{emptyState.icon}</div>\n )}\n {emptyState.title && <h3 className=\"text-xl font-medium mb-2\">{emptyState.title}</h3>}\n {emptyState.message && (\n <p className=\"text-muted-foreground mb-6 max-w-md\">{emptyState.message}</p>\n )}\n {emptyState.action}\n </div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className={containerClassName}\n style={containerStyle}\n data-testid={testId}\n >\n <AgGridReact\n theme={arbiTheme}\n modules={[AllCommunityModule]}\n columnDefs={columnDefs}\n rowData={items}\n pinnedBottomRowData={pinnedBottomRowData}\n pinnedTopRowData={pinnedTopRowData}\n getRowId={getRowId}\n initialState={initialState}\n {...combinedOptions}\n // The events GridView binds itself come after the host's options, so an options object\n // that names one anyway (it is typed out, but untyped objects slip through) cannot replace\n // them: a no-op `onColumnVisible` there used to switch off the visibility guard.\n onGridReady={handleGridReady}\n onFirstDataRendered={handleFirstDataRendered}\n onModelUpdated={handleModelUpdated}\n onSelectionChanged={handleSelectionChanged}\n onCellValueChanged={onCellValueChanged}\n onRowClicked={handleRowClicked}\n onStateUpdated={handleStateUpdated}\n onColumnVisible={handleColumnVisible}\n />\n </div>\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * GridView \u2014 a flexible AG Grid presentational core.\n *\n * Pure and app-agnostic: it owns no global state and pulls in no store. Column\n * state persistence (order / width / visibility / sort / filter) is exposed as a\n * controlled/uncontrolled prop pair \u2014 `gridState` (initial state, read once at\n * mount) and `onGridStateChange` (called whenever AG Grid's state changes). An\n * app wires those to wherever it keeps the state (Zustand, localStorage, a URL,\n * a server) via a thin adapter; the core stays decoupled.\n *\n * Themed here (colours/fonts/borders via the host CSS variables, so it inherits the host's\n * light/dark theme). The structural helper classes (cell-numeric, multiline clamp, scrollbars,\n * row kebabs) live in `@arbidocs/blocks/grid.css`, which the consuming app imports globally.\n */\n\nimport React, { useRef, useCallback, useMemo, useEffect } from 'react'\nimport { AgGridReact } from 'ag-grid-react'\nimport {\n ColDef,\n GridOptions,\n GridApi,\n IRowNode,\n GridState,\n themeQuartz,\n CellValueChangedEvent,\n ColumnVisibleEvent,\n GridReadyEvent,\n RowClickedEvent,\n} from 'ag-grid-community'\nimport { AllCommunityModule } from 'ag-grid-community'\nimport { BREAKPOINT_QUERIES, useMediaQuery } from '../lib/use-media-query'\nimport { watchGridTestIds } from './grid-test-ids'\n\n// Create the custom ARBI theme using themeQuartz\n// Colours reference the host CSS variables (hsl(var(--token))), so dark mode follows the app.\n// This enables dark mode support and consistent theming\nconst cssVar = (name: string, alpha?: number): string =>\n alpha === undefined ? `hsl(var(--${name}))` : `hsl(var(--${name}) / ${alpha})`\n\nconst arbiTheme = themeQuartz.withParams({\n // Match TagTable: a plain canvas, muted header, fine row borders and a rounded frame.\n // Every colour is a host CSS variable, so light/dark follow the app with no .dark overrides.\n backgroundColor: cssVar('background'),\n foregroundColor: cssVar('foreground'),\n borderColor: cssVar('border'),\n headerBackgroundColor: cssVar('muted', 0.4),\n headerTextColor: cssVar('foreground'),\n oddRowBackgroundColor: cssVar('background'),\n rowHoverColor: cssVar('muted', 0.6),\n // Checkbox-selected rows: a light accent tint. A row opened elsewhere (e.g. the viewer) may take\n // the full accent, so the two states stay distinguishable.\n selectedRowBackgroundColor: cssVar('accent', 0.6),\n rangeSelectionBackgroundColor: cssVar('accent'),\n accentColor: cssVar('primary'),\n inputFocusBorder: { color: cssVar('primary') },\n headerColumnBorder: false,\n // Keep the header as quiet as TagTable; reveal resize handles on hover (see grid.css).\n headerColumnResizeHandleColor: 'transparent',\n headerColumnResizeHandleHeight: '40%',\n headerColumnResizeHandleWidth: 1,\n\n // Font settings \u2014 inherit the host app's font. A googleFont here never\n // loaded under the apps' CSP, so every grid silently fell back to the\n // browser's default SERIF and read as unstyled.\n fontFamily: 'inherit',\n fontSize: 14,\n headerFontSize: 14,\n headerFontWeight: 500,\n\n // Sizing\n headerHeight: 37,\n rowHeight: 40,\n cellHorizontalPadding: 12,\n\n // Borders - structural settings only.\n // Row border is a real hairline in the theme border colour (not hardcoded\n // white, which was invisible on the light-mode background and wrong in dark\n // mode) so adjacent rows are clearly separated \u2014 important now that rows can\n // be tall and multi-line (e.g. the Abstract column).\n rowBorder: { style: 'solid', width: 1, color: 'hsl(var(--border))' },\n columnBorder: false, // Row hairlines only\n wrapperBorder: { style: 'solid', width: 1, color: cssVar('border') },\n\n // Use the same radius token as TagTable's rounded-lg container.\n borderRadius: 'var(--radius-lg, 8px)',\n wrapperBorderRadius: 'var(--radius-lg, 8px)',\n checkboxBorderRadius: 2, // Keep checkboxes square\n})\n\n// Selection configuration\nexport interface GridViewSelection<T> {\n mode: 'single' | 'multiple'\n selected: T[]\n onSelectionChange: (items: T[]) => void\n /**\n * Keep the grid's ticked rows equal to `selected` after mount (default: `selected` only seeds the\n * grid). For a host that changes the selection itself, e.g. ticking a parent ticks its sub-tasks.\n */\n controlled?: boolean\n}\n\n// Empty state configuration\nexport interface GridViewEmptyState {\n icon?: React.ReactNode\n title?: string\n message?: string\n action?: React.ReactNode\n}\n\n/** Grid events GridView binds itself; `gridOptions` may not override them. */\ntype GridViewOwnedEvent =\n | 'onGridReady'\n | 'onFirstDataRendered'\n | 'onModelUpdated'\n | 'onSelectionChanged'\n | 'onCellValueChanged'\n | 'onRowClicked'\n | 'onStateUpdated'\n | 'onColumnVisible'\n\n// Generic props to make this grid reusable with different data types\nexport interface GridViewProps<T> {\n // Core data\n items: T[]\n // Column configuration\n columnDefs: ColDef<T>[]\n // Row identity function\n getItemId: (item: T) => string\n // Selection handling\n selection?: GridViewSelection<T>\n // Empty state\n emptyState?: GridViewEmptyState\n // Loading state\n isLoading?: boolean\n loadingMessage?: string\n // Grid options. The events GridView handles itself are left out: they are spread over its own\n // handlers, so passing one here silently replaced them (an `onGridReady` here left the grid api\n // unset and selection never reached `selection.onSelectionChange`). Use the dedicated props.\n gridOptions?: Partial<Omit<GridOptions<T>, GridViewOwnedEvent>>\n // Grid initialization\n onGridReady?: (params: { api: GridApi<T> }) => void\n // Cell value changes\n onCellValueChanged?: (event: CellValueChangedEvent<T>) => void\n // Row click handler\n onRowClick?: (item: T) => void\n // State persistence.\n // The core is decoupled from any store: when `persistState` is on it seeds\n // AG Grid from `gridState` (read once at mount) and reports every subsequent\n // state change through `onGridStateChange`. An app-adapter wires these to its\n // own store. `gridId` is retained as an opaque identity hint for adapters\n // (the core itself does not read it).\n persistState?: boolean\n gridId?: string\n // Persisted column/sort/filter state to restore at mount (controlled input).\n gridState?: GridState\n // Called whenever AG Grid's state changes so an adapter can persist it.\n onGridStateChange?: (state: GridState) => void\n // Initial visible columns (applied when no saved state exists)\n initialVisibleColumns?: string[]\n // Basic styling\n className?: string\n height?: string | number\n // Per-instance row height. Applied via the theme (not just gridOptions) so the\n // theme's calculated line-height tracks it and cell content stays vertically\n // centered. Fixed height \u2014 keeps row virtualization on the fast path.\n rowHeight?: number\n testId?: string\n // Pinned rows\n pinnedBottomRowData?: T[]\n pinnedTopRowData?: T[]\n // Pagination (disabled by default)\n pagination?: boolean\n paginationPageSizeSelector?: number[]\n // Test-id hooks: the grid owns its row/cell DOM, so ids are stamped onto it after render.\n // `getRowTestId` names a row; `getCellTestId` a cell (by colId). Without them AG Grid's own\n // `row-id` / `col-id` attributes are still there to select by.\n getRowTestId?: (item: T) => string\n getCellTestId?: (colId: string, item: T) => string\n // Force empty-state UI even when items.length > 0.\n // Used when rows are present but all hidden by an external filter.\n showEmpty?: boolean\n}\n\n/** Minimum row height on coarse pointers: 44px touch target + the 1px row border + breathing room. */\nconst TOUCH_ROW_HEIGHT = 52\n\nexport function GridView<T>({\n items,\n columnDefs,\n getItemId,\n selection,\n emptyState,\n isLoading = false,\n loadingMessage = 'Loading...',\n gridOptions,\n onGridReady,\n onCellValueChanged,\n onRowClick,\n persistState = false,\n gridState,\n onGridStateChange,\n initialVisibleColumns,\n className = 'w-full',\n height = 500,\n rowHeight: rowHeightProp,\n testId = 'grid-view',\n pinnedBottomRowData,\n pinnedTopRowData,\n pagination = false,\n paginationPageSizeSelector,\n getRowTestId,\n getCellTestId,\n showEmpty,\n}: GridViewProps<T>) {\n // Reference to the grid API\n const gridApiRef = useRef<GridApi<T> | null>(null)\n\n // On touch screens rows grow to a 44px-hit-area-friendly height: AG Grid clips cell content\n // (pills, filename buttons, avatar chips) to the row, so a taller hit area needs a taller row.\n const isCoarsePointer = useMediaQuery(BREAKPOINT_QUERIES.coarsePointer)\n const rowHeight = isCoarsePointer\n ? Math.max(rowHeightProp ?? gridOptions?.rowHeight ?? 40, TOUCH_ROW_HEIGHT)\n : rowHeightProp\n\n // Initial row height, captured once so it can live in the (stable) default\n // grid options. rowHeight is NOT passed as a reactive prop \u2014 that would make\n // the AgGridReact wrapper re-process grid options on every change and snap\n // manually-resized columns back to their colDef widths. Subsequent changes are\n // applied imperatively (see effect below).\n const initialRowHeightRef = useRef(rowHeight)\n\n // Persisted state to seed the grid with \u2014 captured once at mount so a reactive\n // `gridState` prop (e.g. an adapter re-reading its store each render) can never\n // re-initialise the grid mid-session. Mirrors AG Grid's own initialState,\n // which is read once.\n const initialGridStateRef = useRef(gridState)\n\n // Get initial state for the grid (read once at mount)\n const initialState = useMemo(() => {\n if (!persistState) return undefined\n return initialGridStateRef.current\n }, [persistState])\n\n // Save grid state via the adapter using modern AG Grid state API\n const saveGridState = useCallback(() => {\n if (!persistState || !onGridStateChange || !gridApiRef.current) return\n\n // Use AG Grid's comprehensive state API to capture complete state\n // This includes: filters, sort, column order, column visibility, column widths, etc.\n const state = gridApiRef.current.getState()\n\n onGridStateChange(state)\n }, [persistState, onGridStateChange])\n\n // Ensure selection column is visible after grid initialization\n const ensureSelectionColumnVisible = useCallback(() => {\n if (!gridApiRef.current || !selection?.mode) return\n\n // IMPORTANT: Force selection column to be visible after state restoration\n // This ensures even old saved states don't hide the selection column\n // Also handles case where selection column is completely missing from state\n const currentState = gridApiRef.current.getColumnState()\n const selectionColumn = currentState.find((col) => col.colId === 'ag-Grid-SelectionColumn')\n const selectionColumnIndex = currentState.findIndex(\n (col) => col.colId === 'ag-Grid-SelectionColumn'\n )\n\n // Fix if column is hidden OR missing entirely OR not in first position\n if (!selectionColumn || selectionColumn.hide || selectionColumnIndex !== 0) {\n // Use setColumnsVisible for more reliable visibility control\n gridApiRef.current.setColumnsVisible(['ag-Grid-SelectionColumn'], true)\n\n // Also apply state to ensure proper width\n gridApiRef.current.applyColumnState({\n state: [\n {\n colId: 'ag-Grid-SelectionColumn',\n hide: false,\n width: selectionColumn?.width || 48,\n pinned: null, // Ensure not pinned in wrong position\n },\n ],\n defaultState: { hide: undefined },\n applyOrder: false,\n })\n\n // Move selection column to first position if it's not there\n if (selectionColumnIndex !== 0) {\n gridApiRef.current.moveColumns(['ag-Grid-SelectionColumn'], 0)\n }\n }\n }, [selection?.mode])\n\n // Stamp host test ids onto AG Grid's rows and cells (it virtualises, so keep watching).\n const containerRef = useRef<HTMLDivElement>(null)\n const itemsRef = useRef(items)\n itemsRef.current = items\n const getItemIdRef = useRef(getItemId)\n getItemIdRef.current = getItemId\n const hasTestIdHooks = Boolean(getRowTestId || getCellTestId)\n useEffect(() => {\n const root = containerRef.current\n if (!root || !hasTestIdHooks) return\n return watchGridTestIds(\n root,\n () => new Map(itemsRef.current.map((item) => [getItemIdRef.current(item), item])),\n { getRowTestId, getCellTestId }\n )\n }, [hasTestIdHooks, getRowTestId, getCellTestId, isLoading])\n\n // Row identity, stable for the grid's life (through the latest `getItemId`): an inline\n // `getItemId` used to change it, and with it the default options and their `defaultColDef`, on\n // every host render; AG Grid then re-applied the columns and recreated every header's label.\n const getRowId = useCallback((params: { data: T }) => getItemIdRef.current(params.data), [])\n\n // Refs for selection \u2014 avoids handleGridReady/handleSelectionChanged recreating\n // when selection object changes (which happens on every selectionConfig recompute)\n const selectionRef = useRef(selection)\n selectionRef.current = selection\n\n const onSelectionChangeRef = useRef(selection?.onSelectionChange)\n onSelectionChangeRef.current = selection?.onSelectionChange\n\n const syncingSelectionRef = useRef(false)\n\n const handleSelectionChanged = useCallback(() => {\n if (syncingSelectionRef.current) return\n if (!onSelectionChangeRef.current || !gridApiRef.current) return\n\n const selectedNodes = gridApiRef.current.getSelectedNodes()\n const selectedData = selectedNodes\n .map((node) => node.data)\n .filter((item): item is T => item !== undefined)\n\n onSelectionChangeRef.current(selectedData)\n }, [])\n\n // Handle row clicks\n // A controlled selection: tick and untick rows so the grid shows exactly `selection.selected`.\n const controlledSelected = selection?.controlled ? selection.selected : undefined\n useEffect(() => {\n const api = gridApiRef.current\n if (!api || api.isDestroyed() || !controlledSelected) return\n const wanted = new Set(controlledSelected.map(getItemId))\n const tick: IRowNode<T>[] = []\n const untick: IRowNode<T>[] = []\n api.forEachNode((node) => {\n if (!node.data) return\n const want = wanted.has(getItemId(node.data))\n if (want && !node.isSelected()) tick.push(node)\n else if (!want && node.isSelected()) untick.push(node)\n })\n syncingSelectionRef.current = true\n try {\n if (tick.length) api.setNodesSelected({ nodes: tick, newValue: true, source: 'api' })\n if (untick.length) api.setNodesSelected({ nodes: untick, newValue: false, source: 'api' })\n } finally {\n syncingSelectionRef.current = false\n }\n }, [controlledSelected, getItemId])\n\n const handleRowClicked = useCallback(\n (event: RowClickedEvent<T>) => {\n if (!onRowClick || !event.data) return\n // Don't fire when the click originated from an interactive element inside the cell\n // (e.g. action buttons). AG Grid fires rowClicked regardless of DOM stopPropagation.\n const target = event.event?.target as HTMLElement | null\n if (target?.closest('button, input, a, select, textarea, [role=\"button\"]')) return\n onRowClick(event.data)\n },\n [onRowClick]\n )\n\n // The visibility the user actually intends, per colId. AG Grid re-processes the\n // column definitions on some React re-renders even when the `columnDefs`\n // reference is unchanged, and that reset restores each colDef's `hide` \u2014 so a\n // column the user turned on (e.g. via a fields menu) silently disappears the\n // next time the host re-renders (opening an editor, selecting a row, \u2026). We\n // remember the intended visibility and restore it whenever such a reset fires.\n // A Map (not a Set of hidden ids) so a genuinely NEW column from a real\n // columnDefs change \u2014 one we've never seen \u2014 is left at its colDef default\n // rather than force-shown.\n const desiredHiddenRef = useRef<Map<string, boolean> | null>(null)\n\n const snapshotDesiredHidden = useCallback(() => {\n const api = gridApiRef.current\n if (!api) return\n desiredHiddenRef.current = new Map(api.getColumnState().map((c) => [c.colId, !!c.hide]))\n }, [])\n\n // Handle grid ready\n const handleGridReady = useCallback(\n (event: GridReadyEvent<T>) => {\n gridApiRef.current = event.api\n\n // Apply initial visible columns when no saved state exists\n // This prevents showing all columns by default for new users\n if (!initialState && initialVisibleColumns?.length) {\n const currentState = event.api.getColumnState()\n const stateMap = new Map(currentState.map((col) => [col.colId, col]))\n const visibleSet = new Set(initialVisibleColumns)\n\n // Build ordered state: selection column first (always visible), then visible columns, then hidden\n const selectionCol = stateMap.get('ag-Grid-SelectionColumn')\n const orderedState = [\n // Selection column first - ALWAYS visible, create if not in state\n selectionCol\n ? { ...selectionCol, hide: false }\n : { colId: 'ag-Grid-SelectionColumn', hide: false, width: 48 },\n // Visible columns in specified order\n ...initialVisibleColumns\n .filter((colId) => colId !== 'ag-Grid-SelectionColumn') // Don't duplicate selection column\n .map((colId) => {\n const col = stateMap.get(colId)\n return col ? { ...col, hide: false } : undefined\n }),\n // Hidden columns (everything else)\n ...currentState\n .filter((col) => col.colId !== 'ag-Grid-SelectionColumn' && !visibleSet.has(col.colId))\n .map((col) => ({ ...col, hide: true })),\n ].filter((col): col is NonNullable<typeof col> => col !== undefined)\n\n event.api.applyColumnState({ state: orderedState, applyOrder: true })\n }\n\n // When restoring persisted state, detect columns from columnDefs that\n // aren't in the saved state (e.g. newly added columns) and append them.\n // AG Grid's maintainColumnOrder adds them but may place them inconsistently;\n // this ensures they appear as hidden at the end so the navigator picks them up.\n if (initialState && initialVisibleColumns?.length) {\n const currentState = event.api.getColumnState()\n const savedColIds = new Set(\n initialState.columnOrder?.orderedColIds ?? currentState.map((c) => c.colId)\n )\n const newCols = currentState.filter(\n (col) => !savedColIds.has(col.colId) && col.colId !== 'ag-Grid-SelectionColumn'\n )\n if (newCols.length > 0) {\n // Make new columns visible if they're in the default visible set\n const defaultVisible = new Set(initialVisibleColumns)\n event.api.applyColumnState({\n state: newCols.map((col) => ({\n ...col,\n hide: !defaultVisible.has(col.colId),\n })),\n })\n }\n }\n\n // Ensure selection column is visible (in case saved state hides it)\n ensureSelectionColumnVisible()\n\n // Seed the intended column visibility from the state AG Grid settled on\n // (colDefs + restored persisted state) so a later colDef-driven reset can\n // be undone rather than silently hiding a user-shown column.\n snapshotDesiredHidden()\n\n // Call the provided onGridReady callback\n if (onGridReady) {\n onGridReady({ api: event.api })\n }\n\n // Restore selection state if needed (read from ref to keep callback stable)\n const sel = selectionRef.current\n if (sel && sel.selected.length > 0) {\n const selectedIds = new Set(sel.selected.map(getItemId))\n event.api.forEachNode((node) => {\n if (node.data && selectedIds.has(getItemId(node.data))) {\n node.setSelected(true)\n }\n })\n }\n },\n [\n onGridReady,\n getItemId,\n ensureSelectionColumnVisible,\n snapshotDesiredHidden,\n initialState,\n initialVisibleColumns,\n ]\n )\n\n // Undo AG Grid's colDef-driven visibility reset; record genuine user changes.\n const handleColumnVisible = useCallback(\n (event: ColumnVisibleEvent<T>) => {\n const api = gridApiRef.current\n if (!api) return\n // A columnDefs re-apply reports `gridOptionsChanged`; a real toggle reports\n // an interaction source (api, toolPanelUi, columnMenu, \u2026).\n if (event.source === 'gridOptionsChanged') {\n const desired = desiredHiddenRef.current\n if (!desired) return\n // Only correct columns we've seen before (in the snapshot); a brand-new\n // column keeps its colDef default.\n const fixes = api\n .getColumnState()\n .filter(\n (c) =>\n c.colId !== 'ag-Grid-SelectionColumn' &&\n desired.has(c.colId) &&\n desired.get(c.colId) !== !!c.hide\n )\n .map((c) => ({ colId: c.colId, hide: desired.get(c.colId) }))\n if (fixes.length) api.applyColumnState({ state: fixes })\n } else if (desiredHiddenRef.current && event.visible !== undefined && event.columns) {\n // Genuine change \u2014 this is now the intended visibility. Taken from the event itself: the\n // column state can still report the previous visibility while it is being dispatched\n // (seen for a change made before the grid's first data render).\n for (const column of event.columns) {\n desiredHiddenRef.current.set(column.getColId(), !event.visible)\n }\n } else {\n // A mixed change (applied column state): read the whole visibility back.\n snapshotDesiredHidden()\n }\n },\n [snapshotDesiredHidden]\n )\n\n // Handle first data rendered - no auto-sizing, let flex columns handle it\n const handleFirstDataRendered = useCallback(() => {\n // Columns with flex will auto-fill, columns with width stay fixed\n // Also ensure selection column is visible as a backup (handles timing issues with initialState)\n ensureSelectionColumnVisible()\n // Seed the intended visibility if grid-ready did not. Never re-read it here: grid-ready already\n // seeded it (colDefs + restored state) and every change since is recorded from its event, while\n // the column state read now can still show the visibility from before a change just made.\n if (!desiredHiddenRef.current) snapshotDesiredHidden()\n }, [ensureSelectionColumnVisible, snapshotDesiredHidden])\n\n // Track when AG Grid processes row updates\n const handleModelUpdated = useCallback(() => {\n // AG Grid handles model updates internally\n }, [])\n\n // Track row data changes for AG Grid updates\n const prevItemsRef = useRef<T[]>([])\n useEffect(() => {\n prevItemsRef.current = items\n }, [items])\n\n // Handle state updates - save state when it changes (modern AG Grid approach)\n const handleStateUpdated = useCallback(() => {\n saveGridState()\n }, [saveGridState])\n\n // Removed problematic useEffect that caused unnecessary re-renders\n // AG Grid handles selection internally, only sync on initial load\n\n // Default grid options with minimal settings - memoized to prevent re-renders\n const defaultOptions: GridOptions<T> = useMemo(() => {\n return {\n // Initial row height (stable \u2014 captured once). Live changes go through the\n // imperative effect, not this option, to avoid column-state churn.\n rowHeight: initialRowHeightRef.current,\n suppressMenuHide: true, // Prevent hiding columns since we don't have enterprise sidebar\n maintainColumnOrder: true, // Preserve column order when columns are added/removed\n\n // Row virtualization: Render rows as needed for performance\n // rowBuffer renders extra rows above/below viewport for smoother scrolling\n rowBuffer: 10, // Render 10 extra rows above/below viewport for smooth scrolling\n suppressColumnVirtualisation: false, // Keep column virtualization enabled\n suppressRowVirtualisation: false, // ENABLE row virtualization - only render visible rows\n animateRows: false, // Disable row animations\n suppressColumnMoveAnimation: true, // Disable column move/resize animations\n\n // Efficient updates with React Query cache\n // getRowId enables change detection - grid only re-renders changed rows\n // Works perfectly with React Query's cache updates\n getRowId: getRowId,\n\n rowSelection: selection?.mode\n ? {\n mode: selection.mode === 'single' ? 'singleRow' : 'multiRow',\n selectAll: 'filtered', // Header checkbox selects all filtered rows (across all pages)\n // In multi-row mode, only checkboxes should toggle selection (clicking row body would replace selection)\n enableClickSelection: selection.mode === 'single',\n checkboxes: true,\n headerCheckbox: selection.mode === 'multiple',\n }\n : undefined,\n selectionColumnDef: selection?.mode\n ? {\n sortable: selection.mode === 'multiple',\n width: 48,\n lockVisible: true, // Cannot be hidden\n suppressMovable: true, // Cannot be moved\n }\n : undefined,\n // Use normal layout for better performance - autoHeight causes forced reflows\n domLayout: 'normal',\n // Stop editing when clicking outside the cell/grid\n stopEditingWhenCellsLoseFocus: true,\n // Additional performance optimizations\n suppressCellFocus: true, // Don't focus cells on click (faster)\n suppressRowHoverHighlight: true, // Disable hover highlight - reduces DOM manipulation during scroll\n suppressScrollOnNewData: true, // Don't scroll when data updates\n suppressAggFuncInHeader: true, // Don't show aggregation functions (faster)\n // Tooltip UX: the AG Grid default show-delay is 2 s which hurts\n // discoverability for cells where tooltips carry the \"reveal full\n // content\" affordance for non-editable users. 300 ms is snappy\n // without being accidental. tooltipInteraction lets users hover\n // onto the tooltip itself (e.g. to select / copy long text).\n // These are AG Grid's native tooltip controls \u2014 no React / Radix\n // provider involved, zero per-row cost; tooltip DOM is created on\n // demand when hover-delay elapses and destroyed on mouseout.\n tooltipShowDelay: 300,\n tooltipHideDelay: 4000,\n tooltipInteraction: true,\n // Pagination (disabled by default)\n pagination,\n paginationPageSizeSelector,\n defaultColDef: {\n sortable: true,\n resizable: true,\n unSortIcon: false, // Sort glyph only on the sorted column (every header carrying one was noise)\n sortingOrder: ['asc', 'desc', null], // 3-way sorting: asc \u2192 desc \u2192 unsorted (AG Grid default)\n wrapText: false, // Disable text wrapping for cleaner display\n autoHeight: false, // Use fixed row height from theme\n wrapHeaderText: false, // Disable header text wrapping for cleaner look\n autoHeaderHeight: false, // Fixed header height\n filterParams: {\n maxNumConditions: 1,\n buttons: ['reset'],\n },\n },\n }\n }, [selection?.mode, getRowId, pagination, paginationPageSizeSelector])\n\n // Combine default options with passed options - memoized to prevent re-renders\n const combinedOptions = useMemo(\n () => ({ ...defaultOptions, ...gridOptions }),\n [defaultOptions, gridOptions]\n )\n\n // Apply fixed height for better performance \u2014 autoHeight causes forced\n // reflows by measuring all rows, avoid it.\n //\n // Also derive the geometry the wrapping multiline columns (.cell-multiline \u2014\n // Abstract, Author, custom text fields) need so their overflow clip lands on\n // a WHOLE-line boundary (never mid-line, which reads as a half-line\n // \"bleeding\" into the neighbouring row). All computed once here per\n // row-height change and handed to CSS as variables \u2014 zero per-row cost on the\n // million-row grid:\n // --multiline-line-clamp : whole number of lines that fit \u2014 drives the CSS\n // line-clamp that hides overflow lines entirely.\n // --multiline-pad-y : vertical cell padding, shrunk on very short rows so\n // at least one whole line always fits.\n // --multiline-max-h : cap of exactly N whole lines + TOP padding + borders.\n // Deliberately excludes the bottom padding: AG Grid\n // forces cell height, so overflow clips at the\n // padding-box edge and any bottom padding becomes a\n // window onto the next (clamped-away) line. Ending the\n // box right at line N's bottom puts the clip on the\n // line boundary; the row supplies the visual gap below.\n const containerStyle = useMemo(() => {\n const style: React.CSSProperties = { height }\n if (rowHeight) {\n const LINE_PX = 14 * 1.35 // grid font-size \u00D7 multiline line-height (18.9px)\n const BORDER = 2 // multiline cell top + bottom border (1px each, border-box)\n const PREFERRED_PAD = 16 // preferred total vertical padding (8px top + 8px bottom)\n // Don't let padding eat the room a single line needs on short rows.\n const padTotal = Math.max(0, Math.min(PREFERRED_PAD, rowHeight - BORDER - LINE_PX))\n const lines = Math.max(1, Math.floor((rowHeight - BORDER - padTotal) / LINE_PX))\n const vars = style as Record<string, string | number>\n vars['--multiline-line-clamp'] = `${lines}`\n vars['--multiline-pad-y'] = `${padTotal / 2}px`\n vars['--multiline-max-h'] = `${lines * LINE_PX + padTotal / 2 + BORDER}px`\n }\n return style\n }, [height, rowHeight])\n\n // Apply rowHeight changes imperatively via the grid option (not the theme \u2014\n // recreating the theme would re-initialise the grid). This only re-lays-out\n // rows; columns, row virtualization, and the transaction bus are untouched.\n useEffect(() => {\n const api = gridApiRef.current\n if (!api || api.isDestroyed() || !rowHeight) return\n api.setGridOption('rowHeight', rowHeight)\n api.resetRowHeights()\n }, [rowHeight])\n\n const containerClassName = useMemo(() => {\n const baseClass = className || ''\n // Height-adjustable grids vertically center cell content (CSS) so a\n // one-line cell or a lone pill sits in the middle of the row, and multi-line\n // text (e.g. Abstract) is balanced top-to-bottom \u2014 flagged here, applied in\n // grid.css.\n const alignClass = rowHeight ? 'ag-cells-centered' : ''\n return [baseClass, alignClass].filter(Boolean).join(' ')\n }, [className, rowHeight])\n\n // Show loading state \u2014 grey skeleton rows so the page transition feels instant\n if (isLoading) {\n const skeletonRowCount = 12\n return (\n <div\n data-testid={`${testId}-loading`}\n className={`${containerClassName} overflow-hidden rounded-lg border border-border`}\n style={containerStyle}\n aria-busy=\"true\"\n aria-label={loadingMessage}\n >\n {/* Header skeleton */}\n <div className=\"flex h-[37px] items-center gap-4 border-b border-border bg-muted/40 px-3\">\n <div className=\"h-3 w-6 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-32 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-24 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-20 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-28 rounded bg-muted animate-pulse\" />\n <div className=\"h-3 w-16 rounded bg-muted animate-pulse ml-auto\" />\n </div>\n {/* Row skeletons */}\n {Array.from({ length: skeletonRowCount }).map((_, rowIdx) => (\n <div key={rowIdx} className=\"flex h-10 items-center gap-4 border-b border-border px-3\">\n <div className=\"h-4 w-4 rounded-sm bg-muted/70 animate-pulse\" />\n <div\n className=\"h-3 rounded bg-muted/70 animate-pulse\"\n style={{ width: `${20 + ((rowIdx * 17) % 40)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/60 animate-pulse\"\n style={{ width: `${8 + ((rowIdx * 11) % 12)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/60 animate-pulse\"\n style={{ width: `${6 + ((rowIdx * 7) % 10)}%` }}\n />\n <div\n className=\"h-3 rounded bg-muted/50 animate-pulse ml-auto\"\n style={{ width: `${5 + ((rowIdx * 5) % 8)}%` }}\n />\n </div>\n ))}\n </div>\n )\n }\n\n // Show empty state\n // showEmpty lets callers force this UI (e.g. when an external filter hid\n // every row but the underlying items array is non-empty).\n if ((showEmpty ?? items.length === 0) && emptyState) {\n return (\n <div\n data-testid={`${testId}-empty`}\n // Capped by its container (a landscape phone is shorter than 24rem) and scrollable, with the\n // content centred by auto margins so a tall one still starts at the top.\n className=\"flex h-96 max-h-full flex-col items-center overflow-y-auto p-6 text-center\"\n >\n <div className=\"my-auto flex flex-col items-center\">\n {emptyState.icon && (\n <div className=\"text-muted-foreground/60 mb-4\">{emptyState.icon}</div>\n )}\n {emptyState.title && <h3 className=\"text-xl font-medium mb-2\">{emptyState.title}</h3>}\n {emptyState.message && (\n <p className=\"text-muted-foreground mb-6 max-w-md\">{emptyState.message}</p>\n )}\n {emptyState.action}\n </div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className={containerClassName}\n style={containerStyle}\n data-testid={testId}\n >\n <AgGridReact\n theme={arbiTheme}\n modules={[AllCommunityModule]}\n columnDefs={columnDefs}\n rowData={items}\n pinnedBottomRowData={pinnedBottomRowData}\n pinnedTopRowData={pinnedTopRowData}\n getRowId={getRowId}\n initialState={initialState}\n {...combinedOptions}\n // The events GridView binds itself come after the host's options, so an options object\n // that names one anyway (it is typed out, but untyped objects slip through) cannot replace\n // them: a no-op `onColumnVisible` there used to switch off the visibility guard.\n onGridReady={handleGridReady}\n onFirstDataRendered={handleFirstDataRendered}\n onModelUpdated={handleModelUpdated}\n onSelectionChanged={handleSelectionChanged}\n onCellValueChanged={onCellValueChanged}\n onRowClicked={handleRowClicked}\n onStateUpdated={handleStateUpdated}\n onColumnVisible={handleColumnVisible}\n />\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|