@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.
Files changed (463) hide show
  1. package/dist/ClippingMediaViewer-B6WG7Q64.cjs +156 -0
  2. package/dist/ClippingMediaViewer-B6WG7Q64.cjs.map +1 -0
  3. package/dist/ClippingPdfViewer-6GCVTV3V.cjs +79 -0
  4. package/dist/ClippingPdfViewer-6GCVTV3V.cjs.map +1 -0
  5. package/dist/{ConnectedCallDock-WER7R222.cjs → ConnectedCallDock-DC5V5OUJ.cjs} +25 -23
  6. package/dist/ConnectedCallDock-DC5V5OUJ.cjs.map +1 -0
  7. package/dist/{ConnectedCallRoom-T7OBQTYP.cjs → ConnectedCallRoom-FQLXWTFB.cjs} +18 -16
  8. package/dist/{ConnectedCallRoom-T7OBQTYP.cjs.map → ConnectedCallRoom-FQLXWTFB.cjs.map} +1 -1
  9. package/dist/{ConnectedNativeDocxComparison-546ILGLW.cjs → ConnectedNativeDocxComparison-4Q5S7VLD.cjs} +17 -17
  10. package/dist/{ConnectedNativeDocxComparison-546ILGLW.cjs.map → ConnectedNativeDocxComparison-4Q5S7VLD.cjs.map} +1 -1
  11. package/dist/ConnectedPresentation-4HLDZDWV.cjs +183 -0
  12. package/dist/ConnectedPresentation-4HLDZDWV.cjs.map +1 -0
  13. package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs → ConnectedProductionSetDialog-4EAY6KAZ.cjs} +3 -3
  14. package/dist/{ConnectedProductionSetDialog-LHB4VQWC.cjs.map → ConnectedProductionSetDialog-4EAY6KAZ.cjs.map} +1 -1
  15. package/dist/ConnectedSlidesTab-7QDE2CZD.cjs +234 -0
  16. package/dist/ConnectedSlidesTab-7QDE2CZD.cjs.map +1 -0
  17. package/dist/{ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs → ConnectedStreamedWordArtifact-FFOQJBOI.cjs} +17 -17
  18. package/dist/{ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs.map → ConnectedStreamedWordArtifact-FFOQJBOI.cjs.map} +1 -1
  19. package/dist/{DocumentReviewCard-ZSBZBGFK.cjs → DocumentReviewCard-SNWVEZ7S.cjs} +19 -18
  20. package/dist/DocumentReviewCard-SNWVEZ7S.cjs.map +1 -0
  21. package/dist/{FilesViewerDialog-6UKR5WEF.cjs → FilesViewerDialog-IZI63FOV.cjs} +54 -47
  22. package/dist/FilesViewerDialog-IZI63FOV.cjs.map +1 -0
  23. package/dist/{GridViewImpl-ZMJJWTOM.cjs → GridViewImpl-LTYET77Q.cjs} +3 -3
  24. package/dist/GridViewImpl-LTYET77Q.cjs.map +1 -0
  25. package/dist/{WorkspaceTableView-J3C6VH4T.cjs → WorkspaceTableView-TEIRB6VJ.cjs} +11 -10
  26. package/dist/WorkspaceTableView-TEIRB6VJ.cjs.map +1 -0
  27. package/dist/agents/index.cjs +297 -297
  28. package/dist/agents/tasks/ConversationListView.js +10 -2
  29. package/dist/agents/tasks/ConversationListView.js.map +2 -2
  30. package/dist/agents/tasks/TaskTable.js +5 -4
  31. package/dist/agents/tasks/TaskTable.js.map +2 -2
  32. package/dist/agents/tasks/WorkflowsTable.js +4 -5
  33. package/dist/agents/tasks/WorkflowsTable.js.map +2 -2
  34. package/dist/agents/tasks/taskColumns.js +1 -1
  35. package/dist/agents/tasks/taskColumns.js.map +1 -1
  36. package/dist/agents/tasks/taskTableLabels.js +1 -1
  37. package/dist/agents/tasks/taskTableLabels.js.map +1 -1
  38. package/dist/agents/tasks/workflowTableLabels.js +1 -1
  39. package/dist/agents/tasks/workflowTableLabels.js.map +1 -1
  40. package/dist/{ai-IM4A23YT.cjs → ai-KBYNRNZ6.cjs} +28 -26
  41. package/dist/ai-KBYNRNZ6.cjs.map +1 -0
  42. package/dist/calls/connected/CallControls.d.ts +2 -0
  43. package/dist/calls/connected/CallControls.js +71 -9
  44. package/dist/calls/connected/CallControls.js.map +2 -2
  45. package/dist/calls/connected/ShareDocumentDialog.d.ts +14 -0
  46. package/dist/calls/connected/ShareDocumentDialog.js +77 -0
  47. package/dist/calls/connected/ShareDocumentDialog.js.map +7 -0
  48. package/dist/calls/index.cjs +121 -121
  49. package/dist/chat/index.cjs +9 -8
  50. package/dist/{chunk-T23UTIRI.cjs → chunk-2PZT3J34.cjs} +6 -6
  51. package/dist/{chunk-T23UTIRI.cjs.map → chunk-2PZT3J34.cjs.map} +1 -1
  52. package/dist/{chunk-SGYSDABK.cjs → chunk-2W5E62EY.cjs} +6 -6
  53. package/dist/{chunk-SGYSDABK.cjs.map → chunk-2W5E62EY.cjs.map} +1 -1
  54. package/dist/{chunk-TDO5UWXF.cjs → chunk-3SCNXNHI.cjs} +5 -5
  55. package/dist/{chunk-TDO5UWXF.cjs.map → chunk-3SCNXNHI.cjs.map} +1 -1
  56. package/dist/{chunk-KTQOGT2L.cjs → chunk-474GPLCM.cjs} +7 -7
  57. package/dist/{chunk-KTQOGT2L.cjs.map → chunk-474GPLCM.cjs.map} +1 -1
  58. package/dist/{chunk-TP5PGWIO.cjs → chunk-4IOYQLKG.cjs} +3 -3
  59. package/dist/{chunk-TP5PGWIO.cjs.map → chunk-4IOYQLKG.cjs.map} +1 -1
  60. package/dist/{chunk-NY3YUCOW.cjs → chunk-4NPCDS2X.cjs} +3 -3
  61. package/dist/{chunk-NY3YUCOW.cjs.map → chunk-4NPCDS2X.cjs.map} +1 -1
  62. package/dist/{chunk-CPG7II4E.cjs → chunk-4RBQ44RY.cjs} +28 -28
  63. package/dist/chunk-4RBQ44RY.cjs.map +1 -0
  64. package/dist/{chunk-BQ5RIWWT.cjs → chunk-4VZZWYEC.cjs} +3 -3
  65. package/dist/{chunk-BQ5RIWWT.cjs.map → chunk-4VZZWYEC.cjs.map} +1 -1
  66. package/dist/{chunk-Y24V6HPR.cjs → chunk-52KGMAO5.cjs} +15 -15
  67. package/dist/{chunk-Y24V6HPR.cjs.map → chunk-52KGMAO5.cjs.map} +1 -1
  68. package/dist/{chunk-HB2O4THB.cjs → chunk-5534FYXP.cjs} +4 -4
  69. package/dist/{chunk-HB2O4THB.cjs.map → chunk-5534FYXP.cjs.map} +1 -1
  70. package/dist/chunk-5GCCUXMT.cjs +63 -0
  71. package/dist/chunk-5GCCUXMT.cjs.map +1 -0
  72. package/dist/chunk-5LTIZ44D.cjs +95 -0
  73. package/dist/chunk-5LTIZ44D.cjs.map +1 -0
  74. package/dist/{chunk-YGXOKB5Z.cjs → chunk-734NPQNR.cjs} +4 -4
  75. package/dist/{chunk-YGXOKB5Z.cjs.map → chunk-734NPQNR.cjs.map} +1 -1
  76. package/dist/{chunk-SB4M3ITT.cjs → chunk-7VUJGHMY.cjs} +444 -100
  77. package/dist/chunk-7VUJGHMY.cjs.map +1 -0
  78. package/dist/chunk-AFQTQC7A.cjs +35 -0
  79. package/dist/chunk-AFQTQC7A.cjs.map +1 -0
  80. package/dist/{chunk-XKVPSOKP.cjs → chunk-AY6EZSZB.cjs} +4 -4
  81. package/dist/{chunk-XKVPSOKP.cjs.map → chunk-AY6EZSZB.cjs.map} +1 -1
  82. package/dist/{chunk-TT4IF52H.cjs → chunk-BVAT4EVC.cjs} +40 -41
  83. package/dist/chunk-BVAT4EVC.cjs.map +1 -0
  84. package/dist/{chunk-VGCTYTEW.cjs → chunk-C2OICDMI.cjs} +10 -10
  85. package/dist/{chunk-VGCTYTEW.cjs.map → chunk-C2OICDMI.cjs.map} +1 -1
  86. package/dist/{chunk-CPR6EHG7.cjs → chunk-DR2AH7JL.cjs} +179 -55
  87. package/dist/chunk-DR2AH7JL.cjs.map +1 -0
  88. package/dist/{chunk-NJCK6V6U.cjs → chunk-EATIFPKP.cjs} +4 -60
  89. package/dist/chunk-EATIFPKP.cjs.map +1 -0
  90. package/dist/{chunk-B3LZITVF.cjs → chunk-EHP6OH5D.cjs} +11 -451
  91. package/dist/chunk-EHP6OH5D.cjs.map +1 -0
  92. package/dist/{chunk-DDIW4HLU.cjs → chunk-ENGL7P3I.cjs} +46 -37
  93. package/dist/chunk-ENGL7P3I.cjs.map +1 -0
  94. package/dist/{chunk-QHOHDNBU.cjs → chunk-FKFQCK3C.cjs} +4 -4
  95. package/dist/{chunk-QHOHDNBU.cjs.map → chunk-FKFQCK3C.cjs.map} +1 -1
  96. package/dist/{chunk-6UTKM5AB.cjs → chunk-GKVE5JGB.cjs} +76 -76
  97. package/dist/chunk-GKVE5JGB.cjs.map +1 -0
  98. package/dist/{chunk-B2HNNG25.cjs → chunk-GPX5VC57.cjs} +50 -50
  99. package/dist/{chunk-B2HNNG25.cjs.map → chunk-GPX5VC57.cjs.map} +1 -1
  100. package/dist/{chunk-WAV762GP.cjs → chunk-GQXPNIRE.cjs} +6 -6
  101. package/dist/{chunk-WAV762GP.cjs.map → chunk-GQXPNIRE.cjs.map} +1 -1
  102. package/dist/chunk-GX2EBMJW.cjs +133 -0
  103. package/dist/chunk-GX2EBMJW.cjs.map +1 -0
  104. package/dist/{chunk-7OPOPYV6.cjs → chunk-H5OLHP2U.cjs} +3 -3
  105. package/dist/{chunk-7OPOPYV6.cjs.map → chunk-H5OLHP2U.cjs.map} +1 -1
  106. package/dist/chunk-HYUKPHCT.cjs +66 -0
  107. package/dist/chunk-HYUKPHCT.cjs.map +1 -0
  108. package/dist/{chunk-NNUK5ZM7.cjs → chunk-JQLWKNJO.cjs} +29 -27
  109. package/dist/chunk-JQLWKNJO.cjs.map +1 -0
  110. package/dist/{chunk-OEREKAAP.cjs → chunk-JZEYHDWJ.cjs} +75 -75
  111. package/dist/{chunk-OEREKAAP.cjs.map → chunk-JZEYHDWJ.cjs.map} +1 -1
  112. package/dist/{chunk-PGJYD67F.cjs → chunk-KNGZZC4O.cjs} +7 -6
  113. package/dist/chunk-KNGZZC4O.cjs.map +1 -0
  114. package/dist/{chunk-NIE3N6OM.cjs → chunk-KP5AITQ4.cjs} +10 -10
  115. package/dist/{chunk-NIE3N6OM.cjs.map → chunk-KP5AITQ4.cjs.map} +1 -1
  116. package/dist/{chunk-YYPZOEED.cjs → chunk-LHWOKOMP.cjs} +23 -2
  117. package/dist/chunk-LHWOKOMP.cjs.map +1 -0
  118. package/dist/{chunk-57NHXEU2.cjs → chunk-MXBXZXXQ.cjs} +5 -5
  119. package/dist/{chunk-57NHXEU2.cjs.map → chunk-MXBXZXXQ.cjs.map} +1 -1
  120. package/dist/{chunk-WXUU3COI.cjs → chunk-MZ2KZXNU.cjs} +3 -3
  121. package/dist/{chunk-WXUU3COI.cjs.map → chunk-MZ2KZXNU.cjs.map} +1 -1
  122. package/dist/chunk-NAJN32MF.cjs +154 -0
  123. package/dist/chunk-NAJN32MF.cjs.map +1 -0
  124. package/dist/{chunk-557MJ4IH.cjs → chunk-NLOETJCB.cjs} +17 -154
  125. package/dist/chunk-NLOETJCB.cjs.map +1 -0
  126. package/dist/{chunk-4XJEHKVZ.cjs → chunk-PIYYBPHH.cjs} +4 -4
  127. package/dist/{chunk-4XJEHKVZ.cjs.map → chunk-PIYYBPHH.cjs.map} +1 -1
  128. package/dist/chunk-Q3XJUXID.cjs +4774 -0
  129. package/dist/chunk-Q3XJUXID.cjs.map +1 -0
  130. package/dist/{chunk-325GVZE6.cjs → chunk-Q6DQGGP4.cjs} +3 -3
  131. package/dist/{chunk-325GVZE6.cjs.map → chunk-Q6DQGGP4.cjs.map} +1 -1
  132. package/dist/chunk-QFXILJMJ.cjs +458 -0
  133. package/dist/chunk-QFXILJMJ.cjs.map +1 -0
  134. package/dist/{chunk-R7CJEIA5.cjs → chunk-RYVZDFVO.cjs} +8 -9
  135. package/dist/chunk-RYVZDFVO.cjs.map +1 -0
  136. package/dist/{chunk-VLCY46K6.cjs → chunk-TG2GM7WJ.cjs} +4 -3
  137. package/dist/chunk-TG2GM7WJ.cjs.map +1 -0
  138. package/dist/{chunk-EOG6OT5I.cjs → chunk-TXP2N3DC.cjs} +4 -4
  139. package/dist/{chunk-EOG6OT5I.cjs.map → chunk-TXP2N3DC.cjs.map} +1 -1
  140. package/dist/{chunk-KXIRVKCJ.cjs → chunk-UUENH4BJ.cjs} +3 -3
  141. package/dist/{chunk-KXIRVKCJ.cjs.map → chunk-UUENH4BJ.cjs.map} +1 -1
  142. package/dist/chunk-VJ5ZLRBD.cjs +27 -0
  143. package/dist/chunk-VJ5ZLRBD.cjs.map +1 -0
  144. package/dist/{chunk-P77YTTJ3.cjs → chunk-W6B3RYTX.cjs} +4 -4
  145. package/dist/{chunk-P77YTTJ3.cjs.map → chunk-W6B3RYTX.cjs.map} +1 -1
  146. package/dist/chunk-WOOOMTTA.cjs +19 -0
  147. package/dist/chunk-WOOOMTTA.cjs.map +1 -0
  148. package/dist/{chunk-ZPPMAL5P.cjs → chunk-WQMR3O2D.cjs} +6 -10
  149. package/dist/chunk-WQMR3O2D.cjs.map +1 -0
  150. package/dist/{chunk-CJYWHUZR.cjs → chunk-XCKHOXRP.cjs} +4 -4
  151. package/dist/{chunk-CJYWHUZR.cjs.map → chunk-XCKHOXRP.cjs.map} +1 -1
  152. package/dist/{chunk-6WMMZLEV.cjs → chunk-XJEXFEWG.cjs} +2 -27
  153. package/dist/chunk-XJEXFEWG.cjs.map +1 -0
  154. package/dist/chunk-XK4TVJKD.cjs +73 -0
  155. package/dist/chunk-XK4TVJKD.cjs.map +1 -0
  156. package/dist/chunk-XTR26TNE.cjs +1358 -0
  157. package/dist/chunk-XTR26TNE.cjs.map +1 -0
  158. package/dist/{chunk-E7TE2WVT.cjs → chunk-ZVEW3JBT.cjs} +3 -3
  159. package/dist/{chunk-E7TE2WVT.cjs.map → chunk-ZVEW3JBT.cjs.map} +1 -1
  160. package/dist/collaboration/index.cjs +73 -73
  161. package/dist/collaboration/sharing/ShareControl.js +10 -2
  162. package/dist/collaboration/sharing/ShareControl.js.map +2 -2
  163. package/dist/components/SharedCell.d.ts +2 -4
  164. package/dist/components/SharedCell.js +4 -8
  165. package/dist/components/SharedCell.js.map +2 -2
  166. package/dist/components/ZoomSlider.d.ts +25 -0
  167. package/dist/components/ZoomSlider.js +59 -0
  168. package/dist/components/ZoomSlider.js.map +7 -0
  169. package/dist/connect/docx.cjs +20 -20
  170. package/dist/connect/index.cjs +1210 -1264
  171. package/dist/connect/index.cjs.map +1 -1
  172. package/dist/connect/viewer.cjs +42 -36
  173. package/dist/connection/ai.d.ts +1 -1
  174. package/dist/connection/facts/factPageColumns.js +3 -9
  175. package/dist/connection/facts/factPageColumns.js.map +2 -2
  176. package/dist/connection/files/ConnectedNewFileMenu.d.ts +2 -1
  177. package/dist/connection/files/ConnectedNewFileMenu.js +9 -3
  178. package/dist/connection/files/ConnectedNewFileMenu.js.map +2 -2
  179. package/dist/connection/files/explorer/ConnectedFilesExplorer.js +1 -1
  180. package/dist/connection/files/explorer/ConnectedFilesExplorer.js.map +2 -2
  181. package/dist/connection/files/explorer/FileTiles.js +1 -1
  182. package/dist/connection/files/explorer/FileTiles.js.map +2 -2
  183. package/dist/connection/files/fields/documentField.js +1 -1
  184. package/dist/connection/files/fields/documentField.js.map +2 -2
  185. package/dist/connection/files/grid/cells.js +1 -3
  186. package/dist/connection/files/grid/cells.js.map +2 -2
  187. package/dist/connection/files/grid/documentColumns.js +4 -3
  188. package/dist/connection/files/grid/documentColumns.js.map +2 -2
  189. package/dist/connection/files/page/DocumentsFilterBarActions.js +17 -28
  190. package/dist/connection/files/page/DocumentsFilterBarActions.js.map +2 -2
  191. package/dist/connection/mail/useMailboxDefaults.js +1 -1
  192. package/dist/connection/mail/useMailboxDefaults.js.map +2 -2
  193. package/dist/connection/panels/useSessionPanelMode.js +3 -2
  194. package/dist/connection/panels/useSessionPanelMode.js.map +2 -2
  195. package/dist/connection/presentation/ClippingMediaViewer.d.ts +12 -0
  196. package/dist/connection/presentation/ClippingMediaViewer.js +153 -0
  197. package/dist/connection/presentation/ClippingMediaViewer.js.map +7 -0
  198. package/dist/connection/presentation/ClippingPdfViewer.d.ts +22 -0
  199. package/dist/connection/presentation/ClippingPdfViewer.js +75 -0
  200. package/dist/connection/presentation/ClippingPdfViewer.js.map +7 -0
  201. package/dist/connection/presentation/ConnectedPresentation.d.ts +12 -0
  202. package/dist/connection/presentation/ConnectedPresentation.js +100 -0
  203. package/dist/connection/presentation/ConnectedPresentation.js.map +7 -0
  204. package/dist/connection/presentation/ConnectedSlidesTab.d.ts +20 -0
  205. package/dist/connection/presentation/ConnectedSlidesTab.js +220 -0
  206. package/dist/connection/presentation/ConnectedSlidesTab.js.map +7 -0
  207. package/dist/connection/presentation/CropClipDialog.d.ts +11 -0
  208. package/dist/connection/presentation/CropClipDialog.js +86 -0
  209. package/dist/connection/presentation/CropClipDialog.js.map +7 -0
  210. package/dist/connection/presentation/GenerateTile.d.ts +4 -0
  211. package/dist/connection/presentation/GenerateTile.js +24 -0
  212. package/dist/connection/presentation/GenerateTile.js.map +7 -0
  213. package/dist/connection/presentation/LabelColumnMenu.d.ts +8 -0
  214. package/dist/connection/presentation/LabelColumnMenu.js +38 -0
  215. package/dist/connection/presentation/LabelColumnMenu.js.map +7 -0
  216. package/dist/connection/presentation/PresentationDialogs.d.ts +39 -0
  217. package/dist/connection/presentation/PresentationDialogs.js +295 -0
  218. package/dist/connection/presentation/PresentationDialogs.js.map +7 -0
  219. package/dist/connection/presentation/PresentationFileCard.d.ts +10 -0
  220. package/dist/connection/presentation/PresentationFileCard.js +35 -0
  221. package/dist/connection/presentation/PresentationFileCard.js.map +7 -0
  222. package/dist/connection/presentation/PresentationPill.d.ts +8 -0
  223. package/dist/connection/presentation/PresentationPill.js +44 -0
  224. package/dist/connection/presentation/PresentationPill.js.map +7 -0
  225. package/dist/connection/presentation/PresentationSlot.d.ts +7 -0
  226. package/dist/connection/presentation/PresentationSlot.js +35 -0
  227. package/dist/connection/presentation/PresentationSlot.js.map +7 -0
  228. package/dist/connection/presentation/requests.d.ts +16 -0
  229. package/dist/connection/presentation/requests.js +20 -0
  230. package/dist/connection/presentation/requests.js.map +7 -0
  231. package/dist/connection/presentation/useImageGeneration.d.ts +11 -0
  232. package/dist/connection/presentation/useImageGeneration.js +66 -0
  233. package/dist/connection/presentation/useImageGeneration.js.map +7 -0
  234. package/dist/connection/presentation/useLabelColumns.d.ts +15 -0
  235. package/dist/connection/presentation/useLabelColumns.js +33 -0
  236. package/dist/connection/presentation/useLabelColumns.js.map +7 -0
  237. package/dist/connection/presentation/usePresentationController.d.ts +15 -0
  238. package/dist/connection/presentation/usePresentationController.js +118 -0
  239. package/dist/connection/presentation/usePresentationController.js.map +7 -0
  240. package/dist/connection/presentation/usePresentationFiles.d.ts +44 -0
  241. package/dist/connection/presentation/usePresentationFiles.js +307 -0
  242. package/dist/connection/presentation/usePresentationFiles.js.map +7 -0
  243. package/dist/connection/presentation/useViewerClipping.d.ts +14 -0
  244. package/dist/connection/presentation/useViewerClipping.js +18 -0
  245. package/dist/connection/presentation/useViewerClipping.js.map +7 -0
  246. package/dist/connection/sharing/WorkspaceMembersList.d.ts +4 -0
  247. package/dist/connection/sharing/WorkspaceMembersList.js +34 -0
  248. package/dist/connection/sharing/WorkspaceMembersList.js.map +7 -0
  249. package/dist/connection/shell/ConnectedAppShell.js +9 -1
  250. package/dist/connection/shell/ConnectedAppShell.js.map +2 -2
  251. package/dist/connection/viewer/CleanViewControl.d.ts +8 -0
  252. package/dist/connection/viewer/CleanViewControl.js +76 -0
  253. package/dist/connection/viewer/CleanViewControl.js.map +7 -0
  254. package/dist/connection/viewer/ConnectedDocumentViewer.js +31 -31
  255. package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
  256. package/dist/connection/viewer/ViewerCropModal.d.ts +5 -0
  257. package/dist/connection/viewer/ViewerCropModal.js +22 -0
  258. package/dist/connection/viewer/ViewerCropModal.js.map +7 -0
  259. package/dist/connection/viewer/ViewerPdfPane.d.ts +3 -1
  260. package/dist/connection/viewer/ViewerPdfPane.js +57 -2
  261. package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
  262. package/dist/connection/viewer/drafts.js +6 -4
  263. package/dist/connection/viewer/drafts.js.map +2 -2
  264. package/dist/connection/viewer/pdf/PdfPassageHighlights.d.ts +12 -0
  265. package/dist/connection/viewer/pdf/PdfPassageHighlights.js +36 -0
  266. package/dist/connection/viewer/pdf/PdfPassageHighlights.js.map +7 -0
  267. package/dist/connection/viewer/pdf/passageHighlights.d.ts +26 -0
  268. package/dist/connection/viewer/pdf/passageHighlights.js +40 -0
  269. package/dist/connection/viewer/pdf/passageHighlights.js.map +7 -0
  270. package/dist/connection/viewer/pdf/usePdfPassageHighlights.d.ts +9 -0
  271. package/dist/connection/viewer/pdf/usePdfPassageHighlights.js +47 -0
  272. package/dist/connection/viewer/pdf/usePdfPassageHighlights.js.map +7 -0
  273. package/dist/connection/viewer/shareDocument.d.ts +11 -0
  274. package/dist/connection/viewer/shareDocument.js +11 -0
  275. package/dist/connection/viewer/shareDocument.js.map +7 -0
  276. package/dist/connection/viewer/slidesTabChunk.d.ts +2 -0
  277. package/dist/connection/viewer/slidesTabChunk.js +9 -0
  278. package/dist/connection/viewer/slidesTabChunk.js.map +7 -0
  279. package/dist/connection/viewer/useCleanView.d.ts +14 -0
  280. package/dist/connection/viewer/useCleanView.js +29 -0
  281. package/dist/connection/viewer/useCleanView.js.map +7 -0
  282. package/dist/connection/viewer/useViewedDocument.d.ts +1 -0
  283. package/dist/connection/viewer/useViewedDocument.js +9 -1
  284. package/dist/connection/viewer/useViewedDocument.js.map +2 -2
  285. package/dist/connection/viewer/useViewerTabs.js +18 -4
  286. package/dist/connection/viewer/useViewerTabs.js.map +2 -2
  287. package/dist/connection/workflows/ConnectedWorkflowStart.d.ts +14 -2
  288. package/dist/connection/workflows/ConnectedWorkflowStart.js +5 -2
  289. package/dist/connection/workflows/ConnectedWorkflowStart.js.map +2 -2
  290. package/dist/connection/workflows/workflowsPageLabels.js +1 -1
  291. package/dist/connection/workflows/workflowsPageLabels.js.map +1 -1
  292. package/dist/dashboards/index.cjs +1 -1
  293. package/dist/databases/index.cjs +49 -49
  294. package/dist/document-tools/DocumentToolButtons.d.ts +2 -0
  295. package/dist/document-tools/DocumentToolButtons.js +22 -1
  296. package/dist/document-tools/DocumentToolButtons.js.map +2 -2
  297. package/dist/document-tools/index.cjs +16 -12
  298. package/dist/document-tools/index.d.ts +1 -1
  299. package/dist/document-tools/index.js +2 -0
  300. package/dist/document-tools/index.js.map +2 -2
  301. package/dist/embed/index.cjs +43 -41
  302. package/dist/facts/factColumns.js +3 -3
  303. package/dist/facts/factColumns.js.map +1 -1
  304. package/dist/facts/index.cjs +42 -42
  305. package/dist/files/GridViewImpl.js +1 -1
  306. package/dist/files/GridViewImpl.js.map +2 -2
  307. package/dist/files/HtmlViewerParts.js +7 -15
  308. package/dist/files/HtmlViewerParts.js.map +2 -2
  309. package/dist/files/ViewerChrome.d.ts +5 -1
  310. package/dist/files/ViewerChrome.js +16 -6
  311. package/dist/files/ViewerChrome.js.map +2 -2
  312. package/dist/files/index.cjs +226 -226
  313. package/dist/files/navigator/DocumentSearchList.js +1 -1
  314. package/dist/files/navigator/DocumentSearchList.js.map +2 -2
  315. package/dist/index.cjs +1668 -1666
  316. package/dist/index.cjs.map +1 -1
  317. package/dist/presentation/BoxActionBar.d.ts +11 -0
  318. package/dist/presentation/BoxActionBar.js +182 -0
  319. package/dist/presentation/BoxActionBar.js.map +7 -0
  320. package/dist/presentation/ClipActionBar.d.ts +26 -0
  321. package/dist/presentation/ClipActionBar.js +103 -0
  322. package/dist/presentation/ClipActionBar.js.map +7 -0
  323. package/dist/presentation/ClipCaptureOverlay.d.ts +14 -0
  324. package/dist/presentation/ClipCaptureOverlay.js +69 -0
  325. package/dist/presentation/ClipCaptureOverlay.js.map +7 -0
  326. package/dist/presentation/ClipImage.d.ts +21 -0
  327. package/dist/presentation/ClipImage.js +119 -0
  328. package/dist/presentation/ClipImage.js.map +7 -0
  329. package/dist/presentation/ClipTray.d.ts +11 -0
  330. package/dist/presentation/ClipTray.js +152 -0
  331. package/dist/presentation/ClipTray.js.map +7 -0
  332. package/dist/presentation/ClipViewControls.d.ts +11 -0
  333. package/dist/presentation/ClipViewControls.js +142 -0
  334. package/dist/presentation/ClipViewControls.js.map +7 -0
  335. package/dist/presentation/DesignMenu.d.ts +8 -0
  336. package/dist/presentation/DesignMenu.js +199 -0
  337. package/dist/presentation/DesignMenu.js.map +7 -0
  338. package/dist/presentation/LayoutMenu.d.ts +17 -0
  339. package/dist/presentation/LayoutMenu.js +122 -0
  340. package/dist/presentation/LayoutMenu.js.map +7 -0
  341. package/dist/presentation/MediaClip.d.ts +15 -0
  342. package/dist/presentation/MediaClip.js +67 -0
  343. package/dist/presentation/MediaClip.js.map +7 -0
  344. package/dist/presentation/Notice.d.ts +6 -0
  345. package/dist/presentation/Notice.js +43 -0
  346. package/dist/presentation/Notice.js.map +7 -0
  347. package/dist/presentation/PresentationStage.d.ts +32 -0
  348. package/dist/presentation/PresentationStage.js +232 -0
  349. package/dist/presentation/PresentationStage.js.map +7 -0
  350. package/dist/presentation/PresenterView.d.ts +16 -0
  351. package/dist/presentation/PresenterView.js +69 -0
  352. package/dist/presentation/PresenterView.js.map +7 -0
  353. package/dist/presentation/SlideDecor.d.ts +25 -0
  354. package/dist/presentation/SlideDecor.js +189 -0
  355. package/dist/presentation/SlideDecor.js.map +7 -0
  356. package/dist/presentation/SlidesEditor.d.ts +25 -0
  357. package/dist/presentation/SlidesEditor.js +359 -0
  358. package/dist/presentation/SlidesEditor.js.map +7 -0
  359. package/dist/presentation/StageBox.d.ts +30 -0
  360. package/dist/presentation/StageBox.js +281 -0
  361. package/dist/presentation/StageBox.js.map +7 -0
  362. package/dist/presentation/StageItem.d.ts +37 -0
  363. package/dist/presentation/StageItem.js +211 -0
  364. package/dist/presentation/StageItem.js.map +7 -0
  365. package/dist/presentation/box-style.d.ts +6 -0
  366. package/dist/presentation/box-style.js +19 -0
  367. package/dist/presentation/box-style.js.map +7 -0
  368. package/dist/presentation/boxes.d.ts +105 -0
  369. package/dist/presentation/boxes.js +103 -0
  370. package/dist/presentation/boxes.js.map +7 -0
  371. package/dist/presentation/draw-boxes.d.ts +8 -0
  372. package/dist/presentation/draw-boxes.js +130 -0
  373. package/dist/presentation/draw-boxes.js.map +7 -0
  374. package/dist/presentation/export-boxes.d.ts +10 -0
  375. package/dist/presentation/export-boxes.js +74 -0
  376. package/dist/presentation/export-boxes.js.map +7 -0
  377. package/dist/presentation/export-pptx.d.ts +16 -0
  378. package/dist/presentation/export-pptx.js +194 -0
  379. package/dist/presentation/export-pptx.js.map +7 -0
  380. package/dist/presentation/import-pptx.d.ts +35 -0
  381. package/dist/presentation/import-pptx.js +659 -0
  382. package/dist/presentation/import-pptx.js.map +7 -0
  383. package/dist/presentation/merge-outside-edits.d.ts +12 -0
  384. package/dist/presentation/merge-outside-edits.js +35 -0
  385. package/dist/presentation/merge-outside-edits.js.map +7 -0
  386. package/dist/presentation/model.d.ts +201 -0
  387. package/dist/presentation/model.js +271 -0
  388. package/dist/presentation/model.js.map +7 -0
  389. package/dist/presentation/panel-id.d.ts +34 -0
  390. package/dist/presentation/panel-id.js +24 -0
  391. package/dist/presentation/panel-id.js.map +7 -0
  392. package/dist/presentation/persistence.d.ts +121 -0
  393. package/dist/presentation/persistence.js +141 -0
  394. package/dist/presentation/persistence.js.map +7 -0
  395. package/dist/presentation/pptx-data.d.ts +22 -0
  396. package/dist/presentation/pptx-data.js +83 -0
  397. package/dist/presentation/pptx-data.js.map +7 -0
  398. package/dist/presentation/pptx-xml.d.ts +90 -0
  399. package/dist/presentation/pptx-xml.js +333 -0
  400. package/dist/presentation/pptx-xml.js.map +7 -0
  401. package/dist/presentation/render-slides.d.ts +58 -0
  402. package/dist/presentation/render-slides.js +309 -0
  403. package/dist/presentation/render-slides.js.map +7 -0
  404. package/dist/presentation/saved-boxes.d.ts +11 -0
  405. package/dist/presentation/saved-boxes.js +80 -0
  406. package/dist/presentation/saved-boxes.js.map +7 -0
  407. package/dist/presentation/slide-layout.d.ts +54 -0
  408. package/dist/presentation/slide-layout.js +117 -0
  409. package/dist/presentation/slide-layout.js.map +7 -0
  410. package/dist/presentation/stage-videos.d.ts +5 -0
  411. package/dist/presentation/stage-videos.js +19 -0
  412. package/dist/presentation/stage-videos.js.map +7 -0
  413. package/dist/presentation/store.d.ts +203 -0
  414. package/dist/presentation/store.js +429 -0
  415. package/dist/presentation/store.js.map +7 -0
  416. package/dist/presentation/theme.d.ts +102 -0
  417. package/dist/presentation/theme.js +276 -0
  418. package/dist/presentation/theme.js.map +7 -0
  419. package/dist/presentation/useClipDrag.d.ts +26 -0
  420. package/dist/presentation/useClipDrag.js +65 -0
  421. package/dist/presentation/useClipDrag.js.map +7 -0
  422. package/dist/presentation/useObjectUrl.d.ts +6 -0
  423. package/dist/presentation/useObjectUrl.js +15 -0
  424. package/dist/presentation/useObjectUrl.js.map +7 -0
  425. package/dist/presentation/usePresenterKeys.d.ts +13 -0
  426. package/dist/presentation/usePresenterKeys.js +62 -0
  427. package/dist/presentation/usePresenterKeys.js.map +7 -0
  428. package/dist/settings/index.cjs +151 -150
  429. package/dist/shell/PanelPortal.js +1 -0
  430. package/dist/shell/PanelPortal.js.map +2 -2
  431. package/dist/shell/index.cjs +112 -110
  432. package/dist/shell/panel-windows.d.ts +2 -0
  433. package/dist/shell/panel-windows.js +7 -2
  434. package/dist/shell/panel-windows.js.map +2 -2
  435. package/dist/studio/index.cjs +28 -26
  436. package/dist/studio/index.cjs.map +1 -1
  437. package/dist/styles.css +1 -1
  438. package/dist/workflow-canvas/index.cjs +58 -57
  439. package/dist/workflow-canvas/index.cjs.map +1 -1
  440. package/node_modules/@arbidocs/coedit/package.json +1 -1
  441. package/package.json +6 -5
  442. package/dist/ConnectedCallDock-WER7R222.cjs.map +0 -1
  443. package/dist/DocumentReviewCard-ZSBZBGFK.cjs.map +0 -1
  444. package/dist/FilesViewerDialog-6UKR5WEF.cjs.map +0 -1
  445. package/dist/GridViewImpl-ZMJJWTOM.cjs.map +0 -1
  446. package/dist/WorkspaceTableView-J3C6VH4T.cjs.map +0 -1
  447. package/dist/ai-IM4A23YT.cjs.map +0 -1
  448. package/dist/chunk-557MJ4IH.cjs.map +0 -1
  449. package/dist/chunk-6UTKM5AB.cjs.map +0 -1
  450. package/dist/chunk-6WMMZLEV.cjs.map +0 -1
  451. package/dist/chunk-B3LZITVF.cjs.map +0 -1
  452. package/dist/chunk-CPG7II4E.cjs.map +0 -1
  453. package/dist/chunk-CPR6EHG7.cjs.map +0 -1
  454. package/dist/chunk-DDIW4HLU.cjs.map +0 -1
  455. package/dist/chunk-NJCK6V6U.cjs.map +0 -1
  456. package/dist/chunk-NNUK5ZM7.cjs.map +0 -1
  457. package/dist/chunk-PGJYD67F.cjs.map +0 -1
  458. package/dist/chunk-R7CJEIA5.cjs.map +0 -1
  459. package/dist/chunk-SB4M3ITT.cjs.map +0 -1
  460. package/dist/chunk-TT4IF52H.cjs.map +0 -1
  461. package/dist/chunk-VLCY46K6.cjs.map +0 -1
  462. package/dist/chunk-YYPZOEED.cjs.map +0 -1
  463. package/dist/chunk-ZPPMAL5P.cjs.map +0 -1
@@ -226,7 +226,7 @@ const FileTile = memo(function FileTile2({
226
226
  const isOffline = useOfflineDocumentIds().has(doc.external_id);
227
227
  const isViewing = useOpenViewerDocumentId() === doc.external_id;
228
228
  const showStatusMarker = !isProcessing && TERMINAL_STATUSES.has(status);
229
- const Icon = getFileTypeIcon(doc.file_name, { mime: doc.file_type });
229
+ const Icon = getFileTypeIcon(doc.file_name, { mime: doc.file_type, folder: doc.folder });
230
230
  const { data: mailPolicy } = useMailPolicy();
231
231
  const shareAsEmail = async () => {
232
232
  try {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/connection/files/explorer/FileTiles.tsx"],
4
- "sourcesContent": ["/**\n * The explorer's one tile binding. The presentation (`ExplorerFileTile`, `ExplorerFolderTile`,\n * `ExplorerFileTooltip`) is in `files/`; this binds it to the session: @dnd-kit draggable and\n * droppable, the document's live processing status, the copies kept offline, the open viewer, the\n * document pill, the mail handoff and the member / label lookups. `FileTile` is a draggable\n * document, `FolderTile` a droppable folder (separate components so the dnd hooks always run).\n */\n\nimport { memo, useMemo, type ReactNode } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport {\n AlertTriangle,\n BookOpen,\n CheckCircle,\n Download,\n FileX,\n FolderInput,\n Mail,\n MessagesSquare,\n Pencil,\n Play,\n SkipForward,\n Sparkles,\n SquarePen,\n Trash2,\n} from 'lucide-react'\nimport {\n FINISHED_DOCUMENT_STATUSES,\n IN_FLIGHT_DOCUMENT_STATUSES,\n resolveDocumentStatus,\n useMailPolicy,\n useOfflineDocumentIds,\n useOpenViewerDocumentId,\n useProcessingTask,\n useProcessingTasks,\n type DocumentHostActions,\n type DocumentStartItem,\n type WorkspaceDocument,\n} from '@arbidocs/react'\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n DocumentEntity,\n VisibilityIcon,\n cn,\n formatFriendlyDate,\n getEntityLabel,\n getDocumentTitle,\n getFileTypeIcon,\n getUserAvatarColor,\n getUserDisplayName,\n getUserInitials,\n getDocumentSubject,\n} from '@arbidocs/react/ui'\nimport {\n ExplorerFileTile,\n ExplorerFileTooltip,\n ExplorerFolderTile,\n type ExplorerDensity,\n type ExplorerMenuItem,\n} from '../../../files/ExplorerTile'\nimport { StatusPill, type StatusTone } from '../../../files/StatusPill'\nimport { FailedStageIcon } from '../../../files/FailedStageIcon'\nimport { visibilityAudience } from '../../../files/visibility'\nimport {\n FolderProviderIcon,\n formatFolderSegment,\n hasFolderProviderIcon,\n type ExplorerFolder,\n} from '../../../files/folders'\nimport { useBlocksEnvironment } from '../../../provider/environment'\nimport { DocumentSyncGlyph } from '../DocumentSyncGlyph'\n\nexport type { ExplorerDensity }\n\n/** A workspace member as a tile shows them (avatar and name). */\nexport interface FileTileUser {\n external_id: string\n given_name: string\n family_name?: string | null\n email: string\n picture?: string | null\n}\n\n/** A document row as the tiles read it (the session's rows carry these). */\nexport type FileTileDocument = WorkspaceDocument & {\n failed_stage?: string | null\n}\n\nconst NO_ACTIONS: DocumentHostActions = {}\n\n// In-flight processing statuses (the table's status cell has the same) and the terminal ones.\nconst ACTIVE_STATUSES = IN_FLIGHT_DOCUMENT_STATUSES\nconst TERMINAL_STATUSES = FINISHED_DOCUMENT_STATUSES\nconst STATUS_LABEL: Record<string, string> = {\n uploading: 'Uploading',\n queued: 'Queued',\n parsing: 'Parsing',\n encrypting: 'Encrypting',\n indexing: 'Indexing',\n analysing: 'Analysing',\n}\n\n/** Whether a status is still being worked on. */\nexport function isActiveDocumentStatus(status: string): boolean {\n return ACTIVE_STATUSES.has(status.toLowerCase())\n}\n\n/**\n * The document's effective status: the newer of its row and its live processing\n * (`resolveDocumentStatus`). Reads only this document's live processing, so a tile re-renders only\n * when its own status changes.\n */\nfunction useDocStatus(doc: FileTileDocument): string {\n return resolveDocumentStatus(doc, useProcessingTask(doc.external_id))\n}\n\n/** The finished-state marker in the tile's lower-right corner (in-flight files use the overlay). */\nfunction TileStatusBadge({ doc, status }: { doc: FileTileDocument; status: string }): ReactNode {\n let tone: StatusTone = 'neutral'\n let icon: ReactNode = null\n let title = ''\n switch (status) {\n case 'completed':\n tone = 'success'\n icon = <CheckCircle className=\"size-4 text-green-text\" strokeWidth={2.75} />\n title = 'Ready'\n break\n case 'failed':\n tone = 'danger'\n icon = (\n <FailedStageIcon\n stage={doc.failed_stage ?? null}\n errorMessage={doc.error_message}\n className=\"size-4 text-red-text\"\n />\n )\n title = 'Failed'\n break\n case 'skipped':\n icon = <SkipForward className=\"size-4 text-muted-foreground\" strokeWidth={2.75} />\n title = 'Skipped'\n break\n case 'empty':\n tone = 'warning'\n icon = <FileX className=\"size-4 text-yellow-text\" strokeWidth={2.75} />\n title = 'Empty \u2014 no extractable content'\n break\n case 'low-content':\n tone = 'warning'\n icon = <AlertTriangle className=\"size-4 text-yellow-text\" strokeWidth={2.75} />\n title = 'Low content \u2014 minimal extractable content'\n break\n default:\n return null\n }\n return (\n <StatusPill\n tone={tone}\n icon={icon}\n title={title}\n testId={`explorer-file-status-${doc.external_id}`}\n />\n )\n}\n\n/**\n * Who can see the file, printed on the tile itself: a bare \"Shared\" does not say with whom, and a\n * hover title never reaches touch and keyboard users. The label is the audience's short name so it\n * fits beside the status check on narrow tiles; the title keeps the full sentence.\n */\nfunction TileVisibilityBadge({ doc }: { doc: FileTileDocument }): ReactNode {\n const shared = !!doc.shared\n return (\n <StatusPill\n icon={<VisibilityIcon isShared={shared} className=\"size-3.5\" aria-hidden />}\n label={shared ? getEntityLabel('WORKSPACE') : 'Only you'}\n title={visibilityAudience(shared)}\n testId={`explorer-file-visibility-${doc.external_id}`}\n />\n )\n}\n\n/** A tiny avatar (initials, or the picture when set) for the \"last modified by\" line. */\nfunction MiniUserAvatar({ user }: { user: FileTileUser }) {\n return (\n <Avatar className=\"h-4 w-4 border border-white\">\n {user.picture && <AvatarImage src={user.picture} alt={getUserDisplayName(user)} />}\n <AvatarFallback\n className={cn(\n 'text-xs font-semibold leading-none text-white',\n getUserAvatarColor(user.external_id)\n )}\n >\n {getUserInitials(user)}\n </AvatarFallback>\n </Avatar>\n )\n}\n\n/** The hover card of a document: the same in the explorer tiles and the table's name cell. */\nexport function FileTooltipContent({\n doc,\n modifiedBy,\n tagNameById,\n}: {\n doc: FileTileDocument\n modifiedBy?: FileTileUser\n tagNameById: ReadonlyMap<string, string>\n}) {\n const labels = (doc.doctags ?? [])\n .map((dt) => tagNameById.get(dt.tag_ext_id))\n .filter((name): name is string => !!name)\n return (\n <ExplorerFileTooltip\n title={getDocumentTitle(doc, doc.file_name ?? '')}\n summary={getDocumentSubject(doc)}\n modifiedLabel={doc.updated_at ? formatFriendlyDate(doc.updated_at, false) : null}\n modifiedByAvatar={modifiedBy && <MiniUserAvatar user={modifiedBy} />}\n shared={!!doc.shared}\n visibilityIcon={<VisibilityIcon isShared={!!doc.shared} className=\"h-3 w-3\" />}\n labels={labels}\n uiLabels={{ shared: visibilityAudience(true), private: visibilityAudience(false) }}\n />\n )\n}\n\n/** The \"Start\u2026\" submenu: one entry per thing the host can start on the file or folder. */\nexport function startMenuItem(items: readonly DocumentStartItem[]): ExplorerMenuItem[] {\n if (items.length === 0) return []\n return [\n {\n id: 'start',\n label: 'Start\u2026',\n icon: Sparkles,\n testId: 'explorer-start-menu',\n onSelect: () => {},\n submenu: items.map((item) => ({\n id: item.id,\n label: item.title,\n icon: Play,\n onSelect: item.run,\n testId: `explorer-start-${item.id}`,\n })),\n },\n ]\n}\n\ninterface FileTileProps {\n doc: FileTileDocument\n density: ExplorerDensity\n selected: boolean\n /** Part of an in-flight drag (dimmed). */\n dragging: boolean\n /** Any tile is being dragged: no hover card, so it cannot swallow the moves dnd-kit tracks. */\n dndActive: boolean\n /** Being renamed inline. */\n renaming: boolean\n /** The viewer may delete this document. */\n canDelete: boolean\n /** The first-page thumbnail (absent: the file-type icon). */\n thumbnailUrl?: string\n /** Who last changed the document (the hover card's avatar line). */\n modifiedBy?: FileTileUser\n /** Label id \u2192 name, for the document's labels on the hover card. */\n tagNameById: ReadonlyMap<string, string>\n onSelect: (doc: FileTileDocument, e: React.MouseEvent) => void\n onToggle: (doc: FileTileDocument, e: React.MouseEvent) => void\n onOpen: (doc: FileTileDocument) => void\n /** Open the document in the review view. Absent: not offered. */\n onReview?: (doc: FileTileDocument) => void\n onStartRename: (doc: FileTileDocument) => void\n onCommitRename: (doc: FileTileDocument, name: string) => void\n onCancelRename: () => void\n onDownload: (doc: FileTileDocument) => void\n onMove?: (doc: FileTileDocument) => void\n onDelete: (doc: FileTileDocument) => void\n /** The host's actions on documents (read once by the view). */\n actions?: DocumentHostActions\n}\n\nexport const FileTile = memo(function FileTile({\n doc,\n density,\n selected,\n dragging,\n dndActive,\n renaming,\n canDelete,\n thumbnailUrl,\n modifiedBy,\n tagNameById,\n onSelect,\n onToggle,\n onOpen,\n onReview,\n onStartRename,\n onCommitRename,\n onCancelRename,\n onDownload,\n onMove,\n onDelete,\n actions = NO_ACTIONS,\n}: FileTileProps) {\n const { attributes, listeners, setNodeRef } = useDraggable({\n id: `doc:${doc.external_id}`,\n data: { type: 'doc', docId: doc.external_id },\n })\n const { notify } = useBlocksEnvironment()\n const { startItemsForFile, openDocumentChat, emailDocument } = actions\n const status = useDocStatus(doc)\n const isProcessing = ACTIVE_STATUSES.has(status)\n const isOffline = useOfflineDocumentIds().has(doc.external_id)\n const isViewing = useOpenViewerDocumentId() === doc.external_id\n const showStatusMarker = !isProcessing && TERMINAL_STATUSES.has(status)\n const Icon = getFileTypeIcon(doc.file_name, { mime: doc.file_type })\n const { data: mailPolicy } = useMailPolicy()\n\n const shareAsEmail = async () => {\n try {\n await emailDocument?.(doc)\n } catch (error) {\n notify(error instanceof Error ? error.message : 'Could not attach document', 'error')\n }\n }\n const startItems = startItemsForFile?.(doc)\n const menuItems: ExplorerMenuItem[] = [\n { id: 'open', label: 'Open', icon: SquarePen, onSelect: () => onOpen(doc) },\n ...(onReview\n ? [{ id: 'review', label: 'Open in Review', icon: BookOpen, onSelect: () => onReview(doc) }]\n : []),\n ...(openDocumentChat\n ? [\n {\n id: 'chat',\n label: 'Document chat',\n icon: MessagesSquare,\n onSelect: () => openDocumentChat(doc.external_id),\n },\n ]\n : []),\n ...startMenuItem(startItems ?? []),\n {\n id: 'rename',\n label: 'Rename',\n icon: Pencil,\n onSelect: () => onStartRename(doc),\n separatorBefore: true,\n },\n { id: 'download', label: 'Download', icon: Download, onSelect: () => onDownload(doc) },\n ...(emailDocument && mailPolicy?.enabled\n ? [\n {\n id: 'email',\n label: 'Send as email attachment',\n icon: Mail,\n onSelect: () => {\n void shareAsEmail()\n },\n },\n ]\n : []),\n ...(onMove\n ? [{ id: 'move', label: 'Move to\u2026', icon: FolderInput, onSelect: () => onMove(doc) }]\n : []),\n ...(canDelete\n ? [\n {\n id: 'delete',\n label: 'Delete',\n icon: Trash2,\n onSelect: () => onDelete(doc),\n destructive: true,\n separatorBefore: true,\n },\n ]\n : []),\n ]\n\n // No hover card while renaming (it would cover the input) or while anything is dragged: the\n // tooltip trigger merges pointer handlers onto the draggable node and swallows the move events\n // dnd-kit needs to find the drop target.\n const tooltip =\n renaming || dndActive ? undefined : (\n <FileTooltipContent doc={doc} modifiedBy={modifiedBy} tagNameById={tagNameById} />\n )\n\n return (\n <ExplorerFileTile\n id={doc.external_id}\n title={getDocumentTitle(doc, doc.file_name ?? '')}\n density={density}\n selected={selected}\n dragging={dragging}\n renaming={renaming}\n thumbnailUrl={thumbnailUrl}\n renderFileIcon={(size) => <Icon size={size} className=\"drop-shadow-sm\" />}\n progress={\n isProcessing\n ? { label: STATUS_LABEL[status] ?? status, queued: status === 'queued' }\n : undefined\n }\n statusMarker={\n <div className=\"flex items-center gap-1\">\n <TileVisibilityBadge doc={doc} />\n {showStatusMarker && <TileStatusBadge doc={doc} status={status} />}\n </div>\n }\n offlineMarker={\n isOffline ? (\n <DocumentSyncGlyph docExtId={doc.external_id} size={24} bgClassName=\"bg-primary\" />\n ) : undefined\n }\n entity={\n <DocumentEntity\n doc={doc}\n labelMaxWidth=\"max-w-full\"\n noClamp\n // The full name over two lines: \"(redacted)\" / \"(annotated)\" sit at the end, so a one-line\n // ellipsis hides exactly what tells a frozen copy from its original.\n labelClassName=\"whitespace-normal line-clamp-2 break-words\"\n viewing={isViewing}\n tooltipContent={\n <FileTooltipContent doc={doc} modifiedBy={modifiedBy} tagNameById={tagNameById} />\n }\n className={cn(\n 'w-full min-w-0 max-w-full bg-background/90 backdrop-blur-sm',\n density === 'list' ? 'text-xs' : undefined\n )}\n onClick={(e) => {\n e.stopPropagation()\n onOpen(doc)\n }}\n />\n }\n tooltip={tooltip}\n menuItems={menuItems}\n rootRef={setNodeRef}\n rootProps={{ ...listeners, ...attributes }}\n onOpen={() => onOpen(doc)}\n onSelect={(e) => onSelect(doc, e)}\n onToggle={(e) => onToggle(doc, e)}\n onCommitRename={(name) => onCommitRename(doc, name)}\n onCancelRename={onCancelRename}\n />\n )\n})\n\ninterface FolderTileProps {\n folder: ExplorerFolder\n density: ExplorerDensity\n /** Being renamed inline. */\n editing?: boolean\n /** Every document beneath the folder is selected. */\n selected?: boolean\n /** Some (not all) documents beneath the folder are selected. */\n partiallySelected?: boolean\n /** Every document beneath the folder (its count of files still processing). */\n documents: readonly FileTileDocument[]\n onOpen: (folder: ExplorerFolder) => void\n /** Toggle the whole folder (all its documents). */\n onToggleSelect?: (folder: ExplorerFolder, e: React.MouseEvent) => void\n onCommitName?: (folder: ExplorerFolder, name: string) => void\n onCancelName?: () => void\n onStartRename?: (folder: ExplorerFolder) => void\n onDownload?: (folder: ExplorerFolder) => void\n onMove?: (folder: ExplorerFolder) => void\n onDelete?: (folder: ExplorerFolder) => void\n /** The host's actions on documents (read once by the view). */\n actions?: DocumentHostActions\n}\n\nexport const FolderTile = memo(function FolderTile({\n folder,\n density,\n editing,\n selected,\n partiallySelected,\n documents,\n onOpen,\n onToggleSelect,\n onCommitName,\n onCancelName,\n onStartRename,\n onDownload,\n onMove,\n onDelete,\n actions = NO_ACTIONS,\n}: FolderTileProps) {\n const { setNodeRef, isOver } = useDroppable({\n id: `folder:${folder.path.join('/')}`,\n data: { type: 'folder', path: folder.path },\n })\n const { startItemsForFolder } = actions\n // Live processing is read here, not by the explorer, so an upload burst re-renders folder tiles\n // only.\n const tasks = useProcessingTasks()\n const processingCount = useMemo(\n () =>\n documents.filter((doc) =>\n isActiveDocumentStatus(resolveDocumentStatus(doc, tasks[doc.external_id]))\n ).length,\n [documents, tasks]\n )\n const isEmpty = folder.count === 0\n const iconSize = density === 'list' ? 34 : 48\n\n // A folder is not \"opened in review\"; an item is left out when its handler is absent (an empty\n // folder has nothing to start, download or move).\n const menuItems: ExplorerMenuItem[] = [\n ...(onStartRename\n ? [{ id: 'rename', label: 'Rename', icon: Pencil, onSelect: () => onStartRename(folder) }]\n : []),\n ...(!isEmpty ? startMenuItem(startItemsForFolder?.(folder.path.join('/')) ?? []) : []),\n ...(onDownload && !isEmpty\n ? [{ id: 'download', label: 'Download', icon: Download, onSelect: () => onDownload(folder) }]\n : []),\n ...(onMove && !isEmpty\n ? [{ id: 'move', label: 'Move to\u2026', icon: FolderInput, onSelect: () => onMove(folder) }]\n : []),\n ...(onDelete\n ? [\n {\n id: 'delete',\n label: 'Delete',\n icon: Trash2,\n onSelect: () => onDelete(folder),\n destructive: true,\n separatorBefore: true,\n },\n ]\n : []),\n ]\n\n // A provider root shows shortened (the account; the brand mark carries the provider). Rename and\n // the tooltip keep the full stored name.\n const displayName = folder.path.length === 1 ? formatFolderSegment(folder.name) : folder.name\n const providerIcon =\n folder.path.length === 1 && hasFolderProviderIcon(folder.name) ? (\n <span\n className=\"flex items-center justify-center drop-shadow-sm\"\n style={{ width: iconSize, height: iconSize }}\n >\n <FolderProviderIcon folderPath={folder.name} className=\"h-full w-full\" />\n </span>\n ) : undefined\n\n return (\n <ExplorerFolderTile\n name={folder.name}\n displayName={displayName === '' ? null : displayName}\n path={folder.path}\n count={folder.count}\n density={density}\n editing={editing}\n selected={selected}\n partiallySelected={partiallySelected}\n processingCount={processingCount}\n isOver={isOver}\n icon={providerIcon}\n menuItems={menuItems}\n rootRef={setNodeRef}\n onOpen={() => onOpen(folder)}\n onToggleSelect={onToggleSelect ? (e) => onToggleSelect(folder, e) : undefined}\n onCommitName={(name) => onCommitName?.(folder, name)}\n onCancelName={onCancelName}\n />\n )\n})\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * The explorer's one tile binding. The presentation (`ExplorerFileTile`, `ExplorerFolderTile`,\n * `ExplorerFileTooltip`) is in `files/`; this binds it to the session: @dnd-kit draggable and\n * droppable, the document's live processing status, the copies kept offline, the open viewer, the\n * document pill, the mail handoff and the member / label lookups. `FileTile` is a draggable\n * document, `FolderTile` a droppable folder (separate components so the dnd hooks always run).\n */\n\nimport { memo, useMemo, type ReactNode } from 'react'\nimport { useDraggable, useDroppable } from '@dnd-kit/core'\nimport {\n AlertTriangle,\n BookOpen,\n CheckCircle,\n Download,\n FileX,\n FolderInput,\n Mail,\n MessagesSquare,\n Pencil,\n Play,\n SkipForward,\n Sparkles,\n SquarePen,\n Trash2,\n} from 'lucide-react'\nimport {\n FINISHED_DOCUMENT_STATUSES,\n IN_FLIGHT_DOCUMENT_STATUSES,\n resolveDocumentStatus,\n useMailPolicy,\n useOfflineDocumentIds,\n useOpenViewerDocumentId,\n useProcessingTask,\n useProcessingTasks,\n type DocumentHostActions,\n type DocumentStartItem,\n type WorkspaceDocument,\n} from '@arbidocs/react'\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n DocumentEntity,\n VisibilityIcon,\n cn,\n formatFriendlyDate,\n getEntityLabel,\n getDocumentTitle,\n getFileTypeIcon,\n getUserAvatarColor,\n getUserDisplayName,\n getUserInitials,\n getDocumentSubject,\n} from '@arbidocs/react/ui'\nimport {\n ExplorerFileTile,\n ExplorerFileTooltip,\n ExplorerFolderTile,\n type ExplorerDensity,\n type ExplorerMenuItem,\n} from '../../../files/ExplorerTile'\nimport { StatusPill, type StatusTone } from '../../../files/StatusPill'\nimport { FailedStageIcon } from '../../../files/FailedStageIcon'\nimport { visibilityAudience } from '../../../files/visibility'\nimport {\n FolderProviderIcon,\n formatFolderSegment,\n hasFolderProviderIcon,\n type ExplorerFolder,\n} from '../../../files/folders'\nimport { useBlocksEnvironment } from '../../../provider/environment'\nimport { DocumentSyncGlyph } from '../DocumentSyncGlyph'\n\nexport type { ExplorerDensity }\n\n/** A workspace member as a tile shows them (avatar and name). */\nexport interface FileTileUser {\n external_id: string\n given_name: string\n family_name?: string | null\n email: string\n picture?: string | null\n}\n\n/** A document row as the tiles read it (the session's rows carry these). */\nexport type FileTileDocument = WorkspaceDocument & {\n failed_stage?: string | null\n}\n\nconst NO_ACTIONS: DocumentHostActions = {}\n\n// In-flight processing statuses (the table's status cell has the same) and the terminal ones.\nconst ACTIVE_STATUSES = IN_FLIGHT_DOCUMENT_STATUSES\nconst TERMINAL_STATUSES = FINISHED_DOCUMENT_STATUSES\nconst STATUS_LABEL: Record<string, string> = {\n uploading: 'Uploading',\n queued: 'Queued',\n parsing: 'Parsing',\n encrypting: 'Encrypting',\n indexing: 'Indexing',\n analysing: 'Analysing',\n}\n\n/** Whether a status is still being worked on. */\nexport function isActiveDocumentStatus(status: string): boolean {\n return ACTIVE_STATUSES.has(status.toLowerCase())\n}\n\n/**\n * The document's effective status: the newer of its row and its live processing\n * (`resolveDocumentStatus`). Reads only this document's live processing, so a tile re-renders only\n * when its own status changes.\n */\nfunction useDocStatus(doc: FileTileDocument): string {\n return resolveDocumentStatus(doc, useProcessingTask(doc.external_id))\n}\n\n/** The finished-state marker in the tile's lower-right corner (in-flight files use the overlay). */\nfunction TileStatusBadge({ doc, status }: { doc: FileTileDocument; status: string }): ReactNode {\n let tone: StatusTone = 'neutral'\n let icon: ReactNode = null\n let title = ''\n switch (status) {\n case 'completed':\n tone = 'success'\n icon = <CheckCircle className=\"size-4 text-green-text\" strokeWidth={2.75} />\n title = 'Ready'\n break\n case 'failed':\n tone = 'danger'\n icon = (\n <FailedStageIcon\n stage={doc.failed_stage ?? null}\n errorMessage={doc.error_message}\n className=\"size-4 text-red-text\"\n />\n )\n title = 'Failed'\n break\n case 'skipped':\n icon = <SkipForward className=\"size-4 text-muted-foreground\" strokeWidth={2.75} />\n title = 'Skipped'\n break\n case 'empty':\n tone = 'warning'\n icon = <FileX className=\"size-4 text-yellow-text\" strokeWidth={2.75} />\n title = 'Empty \u2014 no extractable content'\n break\n case 'low-content':\n tone = 'warning'\n icon = <AlertTriangle className=\"size-4 text-yellow-text\" strokeWidth={2.75} />\n title = 'Low content \u2014 minimal extractable content'\n break\n default:\n return null\n }\n return (\n <StatusPill\n tone={tone}\n icon={icon}\n title={title}\n testId={`explorer-file-status-${doc.external_id}`}\n />\n )\n}\n\n/**\n * Who can see the file, printed on the tile itself: a bare \"Shared\" does not say with whom, and a\n * hover title never reaches touch and keyboard users. The label is the audience's short name so it\n * fits beside the status check on narrow tiles; the title keeps the full sentence.\n */\nfunction TileVisibilityBadge({ doc }: { doc: FileTileDocument }): ReactNode {\n const shared = !!doc.shared\n return (\n <StatusPill\n icon={<VisibilityIcon isShared={shared} className=\"size-3.5\" aria-hidden />}\n label={shared ? getEntityLabel('WORKSPACE') : 'Only you'}\n title={visibilityAudience(shared)}\n testId={`explorer-file-visibility-${doc.external_id}`}\n />\n )\n}\n\n/** A tiny avatar (initials, or the picture when set) for the \"last modified by\" line. */\nfunction MiniUserAvatar({ user }: { user: FileTileUser }) {\n return (\n <Avatar className=\"h-4 w-4 border border-white\">\n {user.picture && <AvatarImage src={user.picture} alt={getUserDisplayName(user)} />}\n <AvatarFallback\n className={cn(\n 'text-xs font-semibold leading-none text-white',\n getUserAvatarColor(user.external_id)\n )}\n >\n {getUserInitials(user)}\n </AvatarFallback>\n </Avatar>\n )\n}\n\n/** The hover card of a document: the same in the explorer tiles and the table's name cell. */\nexport function FileTooltipContent({\n doc,\n modifiedBy,\n tagNameById,\n}: {\n doc: FileTileDocument\n modifiedBy?: FileTileUser\n tagNameById: ReadonlyMap<string, string>\n}) {\n const labels = (doc.doctags ?? [])\n .map((dt) => tagNameById.get(dt.tag_ext_id))\n .filter((name): name is string => !!name)\n return (\n <ExplorerFileTooltip\n title={getDocumentTitle(doc, doc.file_name ?? '')}\n summary={getDocumentSubject(doc)}\n modifiedLabel={doc.updated_at ? formatFriendlyDate(doc.updated_at, false) : null}\n modifiedByAvatar={modifiedBy && <MiniUserAvatar user={modifiedBy} />}\n shared={!!doc.shared}\n visibilityIcon={<VisibilityIcon isShared={!!doc.shared} className=\"h-3 w-3\" />}\n labels={labels}\n uiLabels={{ shared: visibilityAudience(true), private: visibilityAudience(false) }}\n />\n )\n}\n\n/** The \"Start\u2026\" submenu: one entry per thing the host can start on the file or folder. */\nexport function startMenuItem(items: readonly DocumentStartItem[]): ExplorerMenuItem[] {\n if (items.length === 0) return []\n return [\n {\n id: 'start',\n label: 'Start\u2026',\n icon: Sparkles,\n testId: 'explorer-start-menu',\n onSelect: () => {},\n submenu: items.map((item) => ({\n id: item.id,\n label: item.title,\n icon: Play,\n onSelect: item.run,\n testId: `explorer-start-${item.id}`,\n })),\n },\n ]\n}\n\ninterface FileTileProps {\n doc: FileTileDocument\n density: ExplorerDensity\n selected: boolean\n /** Part of an in-flight drag (dimmed). */\n dragging: boolean\n /** Any tile is being dragged: no hover card, so it cannot swallow the moves dnd-kit tracks. */\n dndActive: boolean\n /** Being renamed inline. */\n renaming: boolean\n /** The viewer may delete this document. */\n canDelete: boolean\n /** The first-page thumbnail (absent: the file-type icon). */\n thumbnailUrl?: string\n /** Who last changed the document (the hover card's avatar line). */\n modifiedBy?: FileTileUser\n /** Label id \u2192 name, for the document's labels on the hover card. */\n tagNameById: ReadonlyMap<string, string>\n onSelect: (doc: FileTileDocument, e: React.MouseEvent) => void\n onToggle: (doc: FileTileDocument, e: React.MouseEvent) => void\n onOpen: (doc: FileTileDocument) => void\n /** Open the document in the review view. Absent: not offered. */\n onReview?: (doc: FileTileDocument) => void\n onStartRename: (doc: FileTileDocument) => void\n onCommitRename: (doc: FileTileDocument, name: string) => void\n onCancelRename: () => void\n onDownload: (doc: FileTileDocument) => void\n onMove?: (doc: FileTileDocument) => void\n onDelete: (doc: FileTileDocument) => void\n /** The host's actions on documents (read once by the view). */\n actions?: DocumentHostActions\n}\n\nexport const FileTile = memo(function FileTile({\n doc,\n density,\n selected,\n dragging,\n dndActive,\n renaming,\n canDelete,\n thumbnailUrl,\n modifiedBy,\n tagNameById,\n onSelect,\n onToggle,\n onOpen,\n onReview,\n onStartRename,\n onCommitRename,\n onCancelRename,\n onDownload,\n onMove,\n onDelete,\n actions = NO_ACTIONS,\n}: FileTileProps) {\n const { attributes, listeners, setNodeRef } = useDraggable({\n id: `doc:${doc.external_id}`,\n data: { type: 'doc', docId: doc.external_id },\n })\n const { notify } = useBlocksEnvironment()\n const { startItemsForFile, openDocumentChat, emailDocument } = actions\n const status = useDocStatus(doc)\n const isProcessing = ACTIVE_STATUSES.has(status)\n const isOffline = useOfflineDocumentIds().has(doc.external_id)\n const isViewing = useOpenViewerDocumentId() === doc.external_id\n const showStatusMarker = !isProcessing && TERMINAL_STATUSES.has(status)\n const Icon = getFileTypeIcon(doc.file_name, { mime: doc.file_type, folder: doc.folder })\n const { data: mailPolicy } = useMailPolicy()\n\n const shareAsEmail = async () => {\n try {\n await emailDocument?.(doc)\n } catch (error) {\n notify(error instanceof Error ? error.message : 'Could not attach document', 'error')\n }\n }\n const startItems = startItemsForFile?.(doc)\n const menuItems: ExplorerMenuItem[] = [\n { id: 'open', label: 'Open', icon: SquarePen, onSelect: () => onOpen(doc) },\n ...(onReview\n ? [{ id: 'review', label: 'Open in Review', icon: BookOpen, onSelect: () => onReview(doc) }]\n : []),\n ...(openDocumentChat\n ? [\n {\n id: 'chat',\n label: 'Document chat',\n icon: MessagesSquare,\n onSelect: () => openDocumentChat(doc.external_id),\n },\n ]\n : []),\n ...startMenuItem(startItems ?? []),\n {\n id: 'rename',\n label: 'Rename',\n icon: Pencil,\n onSelect: () => onStartRename(doc),\n separatorBefore: true,\n },\n { id: 'download', label: 'Download', icon: Download, onSelect: () => onDownload(doc) },\n ...(emailDocument && mailPolicy?.enabled\n ? [\n {\n id: 'email',\n label: 'Send as email attachment',\n icon: Mail,\n onSelect: () => {\n void shareAsEmail()\n },\n },\n ]\n : []),\n ...(onMove\n ? [{ id: 'move', label: 'Move to\u2026', icon: FolderInput, onSelect: () => onMove(doc) }]\n : []),\n ...(canDelete\n ? [\n {\n id: 'delete',\n label: 'Delete',\n icon: Trash2,\n onSelect: () => onDelete(doc),\n destructive: true,\n separatorBefore: true,\n },\n ]\n : []),\n ]\n\n // No hover card while renaming (it would cover the input) or while anything is dragged: the\n // tooltip trigger merges pointer handlers onto the draggable node and swallows the move events\n // dnd-kit needs to find the drop target.\n const tooltip =\n renaming || dndActive ? undefined : (\n <FileTooltipContent doc={doc} modifiedBy={modifiedBy} tagNameById={tagNameById} />\n )\n\n return (\n <ExplorerFileTile\n id={doc.external_id}\n title={getDocumentTitle(doc, doc.file_name ?? '')}\n density={density}\n selected={selected}\n dragging={dragging}\n renaming={renaming}\n thumbnailUrl={thumbnailUrl}\n renderFileIcon={(size) => <Icon size={size} className=\"drop-shadow-sm\" />}\n progress={\n isProcessing\n ? { label: STATUS_LABEL[status] ?? status, queued: status === 'queued' }\n : undefined\n }\n statusMarker={\n <div className=\"flex items-center gap-1\">\n <TileVisibilityBadge doc={doc} />\n {showStatusMarker && <TileStatusBadge doc={doc} status={status} />}\n </div>\n }\n offlineMarker={\n isOffline ? (\n <DocumentSyncGlyph docExtId={doc.external_id} size={24} bgClassName=\"bg-primary\" />\n ) : undefined\n }\n entity={\n <DocumentEntity\n doc={doc}\n labelMaxWidth=\"max-w-full\"\n noClamp\n // The full name over two lines: \"(redacted)\" / \"(annotated)\" sit at the end, so a one-line\n // ellipsis hides exactly what tells a frozen copy from its original.\n labelClassName=\"whitespace-normal line-clamp-2 break-words\"\n viewing={isViewing}\n tooltipContent={\n <FileTooltipContent doc={doc} modifiedBy={modifiedBy} tagNameById={tagNameById} />\n }\n className={cn(\n 'w-full min-w-0 max-w-full bg-background/90 backdrop-blur-sm',\n density === 'list' ? 'text-xs' : undefined\n )}\n onClick={(e) => {\n e.stopPropagation()\n onOpen(doc)\n }}\n />\n }\n tooltip={tooltip}\n menuItems={menuItems}\n rootRef={setNodeRef}\n rootProps={{ ...listeners, ...attributes }}\n onOpen={() => onOpen(doc)}\n onSelect={(e) => onSelect(doc, e)}\n onToggle={(e) => onToggle(doc, e)}\n onCommitRename={(name) => onCommitRename(doc, name)}\n onCancelRename={onCancelRename}\n />\n )\n})\n\ninterface FolderTileProps {\n folder: ExplorerFolder\n density: ExplorerDensity\n /** Being renamed inline. */\n editing?: boolean\n /** Every document beneath the folder is selected. */\n selected?: boolean\n /** Some (not all) documents beneath the folder are selected. */\n partiallySelected?: boolean\n /** Every document beneath the folder (its count of files still processing). */\n documents: readonly FileTileDocument[]\n onOpen: (folder: ExplorerFolder) => void\n /** Toggle the whole folder (all its documents). */\n onToggleSelect?: (folder: ExplorerFolder, e: React.MouseEvent) => void\n onCommitName?: (folder: ExplorerFolder, name: string) => void\n onCancelName?: () => void\n onStartRename?: (folder: ExplorerFolder) => void\n onDownload?: (folder: ExplorerFolder) => void\n onMove?: (folder: ExplorerFolder) => void\n onDelete?: (folder: ExplorerFolder) => void\n /** The host's actions on documents (read once by the view). */\n actions?: DocumentHostActions\n}\n\nexport const FolderTile = memo(function FolderTile({\n folder,\n density,\n editing,\n selected,\n partiallySelected,\n documents,\n onOpen,\n onToggleSelect,\n onCommitName,\n onCancelName,\n onStartRename,\n onDownload,\n onMove,\n onDelete,\n actions = NO_ACTIONS,\n}: FolderTileProps) {\n const { setNodeRef, isOver } = useDroppable({\n id: `folder:${folder.path.join('/')}`,\n data: { type: 'folder', path: folder.path },\n })\n const { startItemsForFolder } = actions\n // Live processing is read here, not by the explorer, so an upload burst re-renders folder tiles\n // only.\n const tasks = useProcessingTasks()\n const processingCount = useMemo(\n () =>\n documents.filter((doc) =>\n isActiveDocumentStatus(resolveDocumentStatus(doc, tasks[doc.external_id]))\n ).length,\n [documents, tasks]\n )\n const isEmpty = folder.count === 0\n const iconSize = density === 'list' ? 34 : 48\n\n // A folder is not \"opened in review\"; an item is left out when its handler is absent (an empty\n // folder has nothing to start, download or move).\n const menuItems: ExplorerMenuItem[] = [\n ...(onStartRename\n ? [{ id: 'rename', label: 'Rename', icon: Pencil, onSelect: () => onStartRename(folder) }]\n : []),\n ...(!isEmpty ? startMenuItem(startItemsForFolder?.(folder.path.join('/')) ?? []) : []),\n ...(onDownload && !isEmpty\n ? [{ id: 'download', label: 'Download', icon: Download, onSelect: () => onDownload(folder) }]\n : []),\n ...(onMove && !isEmpty\n ? [{ id: 'move', label: 'Move to\u2026', icon: FolderInput, onSelect: () => onMove(folder) }]\n : []),\n ...(onDelete\n ? [\n {\n id: 'delete',\n label: 'Delete',\n icon: Trash2,\n onSelect: () => onDelete(folder),\n destructive: true,\n separatorBefore: true,\n },\n ]\n : []),\n ]\n\n // A provider root shows shortened (the account; the brand mark carries the provider). Rename and\n // the tooltip keep the full stored name.\n const displayName = folder.path.length === 1 ? formatFolderSegment(folder.name) : folder.name\n const providerIcon =\n folder.path.length === 1 && hasFolderProviderIcon(folder.name) ? (\n <span\n className=\"flex items-center justify-center drop-shadow-sm\"\n style={{ width: iconSize, height: iconSize }}\n >\n <FolderProviderIcon folderPath={folder.name} className=\"h-full w-full\" />\n </span>\n ) : undefined\n\n return (\n <ExplorerFolderTile\n name={folder.name}\n displayName={displayName === '' ? null : displayName}\n path={folder.path}\n count={folder.count}\n density={density}\n editing={editing}\n selected={selected}\n partiallySelected={partiallySelected}\n processingCount={processingCount}\n isOver={isOver}\n icon={providerIcon}\n menuItems={menuItems}\n rootRef={setNodeRef}\n onOpen={() => onOpen(folder)}\n onToggleSelect={onToggleSelect ? (e) => onToggleSelect(folder, e) : undefined}\n onCommitName={(name) => onCommitName?.(folder, name)}\n onCancelName={onCancelName}\n />\n )\n})\n"],
5
+ "mappings": "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",
6
6
  "names": ["FileTile", "FolderTile"]
7
7
  }
@@ -39,7 +39,7 @@ const READ_ONLY_FIELDS = {
39
39
  n_pages: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", children: doc.n_pages || "N/A" }),
40
40
  created_at: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", children: doc.created_at ? formatFriendlyDate(doc.created_at) : "N/A" }),
41
41
  updated_at: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", children: doc.updated_at ? formatFriendlyDate(doc.updated_at) : "N/A" }),
42
- file_type: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", children: friendlyFileType(doc.file_type, doc.file_name) }),
42
+ file_type: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", children: friendlyFileType(doc.file_type, doc.file_name, doc.folder) }),
43
43
  file_size: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", children: doc.file_size ? `${Math.round(doc.file_size / 1024)} KB` : "N/A" }),
44
44
  doc_id: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", isMono: true, children: doc.external_id || "N/A" }),
45
45
  content_hash: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", isMono: true, isTruncated: true, children: doc.content_hash || "N/A" })
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/connection/files/fields/documentField.tsx"],
4
- "sourcesContent": ["/**\n * One field of a document as the review form shows it (a column of the documents table, one per\n * row): its label, icon and the value, editable where the table's column is. Standard fields,\n * metadata, the folder, related documents, the labels and each annotation (with who last set it).\n */\n\nimport type { ElementType, ReactNode } from 'react'\nimport { isAnnotationTag, isLabelTag, type TagResponse } from '@arbidocs/sdk/browser'\nimport type { DocumentPerson, RelatedDocs, WorkspaceDocument } from '@arbidocs/react'\nimport {\n DebouncedInput,\n formatFriendlyDate,\n friendlyFileType,\n Textarea,\n formatDocDate,\n getDocumentDate,\n getDocumentTitle,\n} from '@arbidocs/react/ui'\nimport {\n FieldFolderSelect,\n FieldFolderValue,\n FieldNativeSelect,\n FieldValue,\n FieldWithAttribution,\n} from '../../../files/FieldParts'\nimport { DocumentUser } from './DocumentUser'\nimport {\n DocTagAttribution,\n FolderPicker,\n LabelsCombobox,\n RelatedDocuments,\n} from './DocumentFieldParts'\n\ntype DocTag = NonNullable<WorkspaceDocument['doctags']>[number]\nexport type DocTagCitations = NonNullable<DocTag['citations']> | null\n\n/** A field as the form lays it out. */\nexport interface DocumentFieldContent {\n label: string\n icon?: ReactNode\n /** The annotation the field is (its pill is shown as the label). */\n tag?: TagResponse\n children: ReactNode\n}\n\nexport interface DocumentFieldOptions {\n /** The column (a standard field's id, or an annotation's tag id). */\n columnId: string\n doc: WorkspaceDocument\n canEdit: boolean\n workspaceTags: TagResponse[]\n /** The workspace's documents (the folders to pick from). */\n allDocuments?: WorkspaceDocument[]\n /** Who uploaded the document. */\n creator?: DocumentPerson\n getColumnLabel: (colId: string) => string\n getColumnIcon: (colId: string) => ElementType | undefined\n isColumnEditable: (colId: string) => boolean\n onUpdateDocumentField: (field: string, value: unknown) => void\n onUpdateTagValue: (tag: TagResponse, value: string | boolean) => void\n onUpdateTagWithCitations: (tag: TagResponse, note: string, citations: DocTagCitations) => void\n /** Create a label and apply it (the labels picker). Absent: the picker only toggles. */\n onCreateAndApplyLabel?: (name: string) => void\n /** The document's related documents (email family, copies, duplicates, similar). */\n relatedDocs?: RelatedDocs<WorkspaceDocument>\n /** Open a related document. */\n onOpenDocument?: (docId: string) => void\n /** Delete a related document (asks first). */\n onDeleteDocument?: (docId: string) => void\n canDeleteRelatedDocument?: (doc: WorkspaceDocument) => boolean\n /** Compare with a similar document. Absent: not offered. */\n onCompareDocuments?: (docId: string, otherDocId: string) => void\n}\n\n/** The document metadata a field edits as text. */\nconst METADATA_FIELDS: Record<string, (doc: WorkspaceDocument) => string> = {\n title: (doc) => getDocumentTitle(doc),\n doc_nature: (doc) => doc.doc_metadata?.doc_nature || '',\n doc_author: (doc) => doc.doc_metadata?.doc_author || '',\n doc_subject: (doc) => doc.doc_metadata?.doc_subject || '',\n // As the table shows it: with the time when the value has one (emails).\n doc_date: (doc) => formatDocDate(getDocumentDate(doc)),\n}\n\nconst INPUT_CLASS = 'text-sm bg-muted/40 focus:bg-background transition-colors'\n\n/** A read-only standard field: its value (muted unless said otherwise). */\nconst READ_ONLY_FIELDS: Record<string, (doc: WorkspaceDocument) => ReactNode> = {\n file_name: (doc) => <FieldValue tone=\"strong\">{doc.file_name || 'N/A'}</FieldValue>,\n status: (doc) => <FieldValue tone=\"muted\">{doc.status || 'N/A'}</FieldValue>,\n n_pages: (doc) => <FieldValue tone=\"muted\">{doc.n_pages || 'N/A'}</FieldValue>,\n created_at: (doc) => (\n <FieldValue tone=\"muted\">\n {doc.created_at ? formatFriendlyDate(doc.created_at) : 'N/A'}\n </FieldValue>\n ),\n updated_at: (doc) => (\n <FieldValue tone=\"muted\">\n {doc.updated_at ? formatFriendlyDate(doc.updated_at) : 'N/A'}\n </FieldValue>\n ),\n file_type: (doc) => (\n <FieldValue tone=\"muted\">{friendlyFileType(doc.file_type, doc.file_name)}</FieldValue>\n ),\n file_size: (doc) => (\n <FieldValue tone=\"muted\">\n {doc.file_size ? `${Math.round(doc.file_size / 1024)} KB` : 'N/A'}\n </FieldValue>\n ),\n doc_id: (doc) => (\n <FieldValue tone=\"muted\" isMono>\n {doc.external_id || 'N/A'}\n </FieldValue>\n ),\n content_hash: (doc) => (\n <FieldValue tone=\"muted\" isMono isTruncated>\n {doc.content_hash || 'N/A'}\n </FieldValue>\n ),\n}\n\n/** The field of `columnId`, or null when the document has none to show there. */\nexport function documentFieldContent(options: DocumentFieldOptions): DocumentFieldContent | null {\n const { columnId, doc, canEdit, workspaceTags, getColumnLabel, getColumnIcon } = options\n const Icon = getColumnIcon(columnId)\n const standard = (children: ReactNode): DocumentFieldContent => ({\n label: getColumnLabel(columnId),\n icon: Icon ? <Icon size={14} /> : undefined,\n children,\n })\n\n const metadata = METADATA_FIELDS[columnId]\n if (metadata) {\n const editable = options.isColumnEditable(columnId) && canEdit\n return standard(\n editable ? (\n <DebouncedInput\n value={metadata(doc)}\n onChange={(value) => options.onUpdateDocumentField(columnId, value)}\n multiline={true}\n placeholder={`Add ${getColumnLabel(columnId).toLowerCase()}\u2026`}\n className={INPUT_CLASS}\n />\n ) : (\n <FieldValue>{metadata(doc) || 'N/A'}</FieldValue>\n )\n )\n }\n\n const readOnly = READ_ONLY_FIELDS[columnId]\n if (readOnly) return standard(readOnly(doc))\n\n if (columnId === 'created_by') return standard(<DocumentUser user={options.creator} />)\n\n if (columnId === 'folder') {\n return standard(\n canEdit ? (\n <FieldFolderSelect\n folder={doc.folder}\n picker={\n <FolderPicker\n documents={options.allDocuments ?? []}\n value={doc.folder}\n onSelect={(folder) => options.onUpdateDocumentField('folder', folder)}\n />\n }\n />\n ) : (\n <FieldFolderValue folder={doc.folder} />\n )\n )\n }\n\n if (columnId === 'related') {\n const related = options.relatedDocs\n if (!related) return null\n return standard(\n <RelatedDocuments\n doc={doc}\n related={related}\n onOpen={options.onOpenDocument}\n onDelete={options.onDeleteDocument}\n canDelete={options.canDeleteRelatedDocument}\n onCompare={options.onCompareDocuments}\n />\n )\n }\n\n if (columnId === 'all_tags') {\n // The labels (and issues), toggled in place.\n const labelTags = workspaceTags.filter(isLabelTag)\n const appliedIds = new Set(\n (doc.doctags ?? [])\n .filter((dt) => labelTags.some((t) => t.external_id === dt.tag_ext_id))\n .map((dt) => dt.tag_ext_id)\n )\n return standard(\n <LabelsCombobox\n labelTags={labelTags}\n appliedTagIds={appliedIds}\n onToggle={(tag) => options.onUpdateTagValue(tag, !appliedIds.has(tag.external_id))}\n onCreateAndApply={options.onCreateAndApplyLabel}\n />\n )\n }\n\n // An annotation (a label is a value of the Labels field, not a field of its own).\n const tag = workspaceTags.find((t) => t.external_id === columnId)\n if (!tag || !isAnnotationTag(tag)) return null\n const doctag = doc.doctags?.find((dt) => dt.tag_ext_id === tag.external_id)\n\n let value: ReactNode\n if (tag.tag_type.type === 'select') {\n value = (\n <FieldNativeSelect\n value={doctag?.note || ''}\n options={tag.tag_type.options}\n onChange={(next) => options.onUpdateTagValue(tag, next)}\n ariaLabel={tag.name}\n />\n )\n } else if (tag.tag_type.type === 'number') {\n value = (\n <DebouncedInput\n type=\"number\"\n value={doctag?.note || ''}\n onChange={(next) => options.onUpdateTagValue(tag, next)}\n placeholder={`Add ${tag.name.toLowerCase()}\u2026`}\n className={INPUT_CLASS}\n />\n )\n } else {\n // A plain note: a value's citations come from generation and are kept as they are.\n value = (\n <Textarea\n value={doctag?.note || ''}\n onChange={(e) =>\n options.onUpdateTagWithCitations(tag, e.target.value, doctag?.citations ?? null)\n }\n placeholder=\"Add a note...\"\n rows={2}\n className={INPUT_CLASS}\n />\n )\n }\n\n return {\n label: tag.name,\n tag,\n children: doctag ? (\n <FieldWithAttribution attribution={<DocTagAttribution doctag={doctag} />}>\n {value}\n </FieldWithAttribution>\n ) : (\n value\n ),\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * One field of a document as the review form shows it (a column of the documents table, one per\n * row): its label, icon and the value, editable where the table's column is. Standard fields,\n * metadata, the folder, related documents, the labels and each annotation (with who last set it).\n */\n\nimport type { ElementType, ReactNode } from 'react'\nimport { isAnnotationTag, isLabelTag, type TagResponse } from '@arbidocs/sdk/browser'\nimport type { DocumentPerson, RelatedDocs, WorkspaceDocument } from '@arbidocs/react'\nimport {\n DebouncedInput,\n formatFriendlyDate,\n friendlyFileType,\n Textarea,\n formatDocDate,\n getDocumentDate,\n getDocumentTitle,\n} from '@arbidocs/react/ui'\nimport {\n FieldFolderSelect,\n FieldFolderValue,\n FieldNativeSelect,\n FieldValue,\n FieldWithAttribution,\n} from '../../../files/FieldParts'\nimport { DocumentUser } from './DocumentUser'\nimport {\n DocTagAttribution,\n FolderPicker,\n LabelsCombobox,\n RelatedDocuments,\n} from './DocumentFieldParts'\n\ntype DocTag = NonNullable<WorkspaceDocument['doctags']>[number]\nexport type DocTagCitations = NonNullable<DocTag['citations']> | null\n\n/** A field as the form lays it out. */\nexport interface DocumentFieldContent {\n label: string\n icon?: ReactNode\n /** The annotation the field is (its pill is shown as the label). */\n tag?: TagResponse\n children: ReactNode\n}\n\nexport interface DocumentFieldOptions {\n /** The column (a standard field's id, or an annotation's tag id). */\n columnId: string\n doc: WorkspaceDocument\n canEdit: boolean\n workspaceTags: TagResponse[]\n /** The workspace's documents (the folders to pick from). */\n allDocuments?: WorkspaceDocument[]\n /** Who uploaded the document. */\n creator?: DocumentPerson\n getColumnLabel: (colId: string) => string\n getColumnIcon: (colId: string) => ElementType | undefined\n isColumnEditable: (colId: string) => boolean\n onUpdateDocumentField: (field: string, value: unknown) => void\n onUpdateTagValue: (tag: TagResponse, value: string | boolean) => void\n onUpdateTagWithCitations: (tag: TagResponse, note: string, citations: DocTagCitations) => void\n /** Create a label and apply it (the labels picker). Absent: the picker only toggles. */\n onCreateAndApplyLabel?: (name: string) => void\n /** The document's related documents (email family, copies, duplicates, similar). */\n relatedDocs?: RelatedDocs<WorkspaceDocument>\n /** Open a related document. */\n onOpenDocument?: (docId: string) => void\n /** Delete a related document (asks first). */\n onDeleteDocument?: (docId: string) => void\n canDeleteRelatedDocument?: (doc: WorkspaceDocument) => boolean\n /** Compare with a similar document. Absent: not offered. */\n onCompareDocuments?: (docId: string, otherDocId: string) => void\n}\n\n/** The document metadata a field edits as text. */\nconst METADATA_FIELDS: Record<string, (doc: WorkspaceDocument) => string> = {\n title: (doc) => getDocumentTitle(doc),\n doc_nature: (doc) => doc.doc_metadata?.doc_nature || '',\n doc_author: (doc) => doc.doc_metadata?.doc_author || '',\n doc_subject: (doc) => doc.doc_metadata?.doc_subject || '',\n // As the table shows it: with the time when the value has one (emails).\n doc_date: (doc) => formatDocDate(getDocumentDate(doc)),\n}\n\nconst INPUT_CLASS = 'text-sm bg-muted/40 focus:bg-background transition-colors'\n\n/** A read-only standard field: its value (muted unless said otherwise). */\nconst READ_ONLY_FIELDS: Record<string, (doc: WorkspaceDocument) => ReactNode> = {\n file_name: (doc) => <FieldValue tone=\"strong\">{doc.file_name || 'N/A'}</FieldValue>,\n status: (doc) => <FieldValue tone=\"muted\">{doc.status || 'N/A'}</FieldValue>,\n n_pages: (doc) => <FieldValue tone=\"muted\">{doc.n_pages || 'N/A'}</FieldValue>,\n created_at: (doc) => (\n <FieldValue tone=\"muted\">\n {doc.created_at ? formatFriendlyDate(doc.created_at) : 'N/A'}\n </FieldValue>\n ),\n updated_at: (doc) => (\n <FieldValue tone=\"muted\">\n {doc.updated_at ? formatFriendlyDate(doc.updated_at) : 'N/A'}\n </FieldValue>\n ),\n file_type: (doc) => (\n <FieldValue tone=\"muted\">\n {friendlyFileType(doc.file_type, doc.file_name, doc.folder)}\n </FieldValue>\n ),\n file_size: (doc) => (\n <FieldValue tone=\"muted\">\n {doc.file_size ? `${Math.round(doc.file_size / 1024)} KB` : 'N/A'}\n </FieldValue>\n ),\n doc_id: (doc) => (\n <FieldValue tone=\"muted\" isMono>\n {doc.external_id || 'N/A'}\n </FieldValue>\n ),\n content_hash: (doc) => (\n <FieldValue tone=\"muted\" isMono isTruncated>\n {doc.content_hash || 'N/A'}\n </FieldValue>\n ),\n}\n\n/** The field of `columnId`, or null when the document has none to show there. */\nexport function documentFieldContent(options: DocumentFieldOptions): DocumentFieldContent | null {\n const { columnId, doc, canEdit, workspaceTags, getColumnLabel, getColumnIcon } = options\n const Icon = getColumnIcon(columnId)\n const standard = (children: ReactNode): DocumentFieldContent => ({\n label: getColumnLabel(columnId),\n icon: Icon ? <Icon size={14} /> : undefined,\n children,\n })\n\n const metadata = METADATA_FIELDS[columnId]\n if (metadata) {\n const editable = options.isColumnEditable(columnId) && canEdit\n return standard(\n editable ? (\n <DebouncedInput\n value={metadata(doc)}\n onChange={(value) => options.onUpdateDocumentField(columnId, value)}\n multiline={true}\n placeholder={`Add ${getColumnLabel(columnId).toLowerCase()}\u2026`}\n className={INPUT_CLASS}\n />\n ) : (\n <FieldValue>{metadata(doc) || 'N/A'}</FieldValue>\n )\n )\n }\n\n const readOnly = READ_ONLY_FIELDS[columnId]\n if (readOnly) return standard(readOnly(doc))\n\n if (columnId === 'created_by') return standard(<DocumentUser user={options.creator} />)\n\n if (columnId === 'folder') {\n return standard(\n canEdit ? (\n <FieldFolderSelect\n folder={doc.folder}\n picker={\n <FolderPicker\n documents={options.allDocuments ?? []}\n value={doc.folder}\n onSelect={(folder) => options.onUpdateDocumentField('folder', folder)}\n />\n }\n />\n ) : (\n <FieldFolderValue folder={doc.folder} />\n )\n )\n }\n\n if (columnId === 'related') {\n const related = options.relatedDocs\n if (!related) return null\n return standard(\n <RelatedDocuments\n doc={doc}\n related={related}\n onOpen={options.onOpenDocument}\n onDelete={options.onDeleteDocument}\n canDelete={options.canDeleteRelatedDocument}\n onCompare={options.onCompareDocuments}\n />\n )\n }\n\n if (columnId === 'all_tags') {\n // The labels (and issues), toggled in place.\n const labelTags = workspaceTags.filter(isLabelTag)\n const appliedIds = new Set(\n (doc.doctags ?? [])\n .filter((dt) => labelTags.some((t) => t.external_id === dt.tag_ext_id))\n .map((dt) => dt.tag_ext_id)\n )\n return standard(\n <LabelsCombobox\n labelTags={labelTags}\n appliedTagIds={appliedIds}\n onToggle={(tag) => options.onUpdateTagValue(tag, !appliedIds.has(tag.external_id))}\n onCreateAndApply={options.onCreateAndApplyLabel}\n />\n )\n }\n\n // An annotation (a label is a value of the Labels field, not a field of its own).\n const tag = workspaceTags.find((t) => t.external_id === columnId)\n if (!tag || !isAnnotationTag(tag)) return null\n const doctag = doc.doctags?.find((dt) => dt.tag_ext_id === tag.external_id)\n\n let value: ReactNode\n if (tag.tag_type.type === 'select') {\n value = (\n <FieldNativeSelect\n value={doctag?.note || ''}\n options={tag.tag_type.options}\n onChange={(next) => options.onUpdateTagValue(tag, next)}\n ariaLabel={tag.name}\n />\n )\n } else if (tag.tag_type.type === 'number') {\n value = (\n <DebouncedInput\n type=\"number\"\n value={doctag?.note || ''}\n onChange={(next) => options.onUpdateTagValue(tag, next)}\n placeholder={`Add ${tag.name.toLowerCase()}\u2026`}\n className={INPUT_CLASS}\n />\n )\n } else {\n // A plain note: a value's citations come from generation and are kept as they are.\n value = (\n <Textarea\n value={doctag?.note || ''}\n onChange={(e) =>\n options.onUpdateTagWithCitations(tag, e.target.value, doctag?.citations ?? null)\n }\n placeholder=\"Add a note...\"\n rows={2}\n className={INPUT_CLASS}\n />\n )\n }\n\n return {\n label: tag.name,\n tag,\n children: doctag ? (\n <FieldWithAttribution attribution={<DocTagAttribution doctag={doctag} />}>\n {value}\n </FieldWithAttribution>\n ) : (\n value\n ),\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["value", "tag"]
7
7
  }
@@ -14,7 +14,6 @@ import {
14
14
  agentAvatarColors,
15
15
  formatFolderLabel,
16
16
  getEntityColor,
17
- getEntityLabel,
18
17
  getUserAvatarColor,
19
18
  getUserDisplayName,
20
19
  getUserInitials,
@@ -180,8 +179,7 @@ const DocumentSharedCell = memo(function DocumentSharedCell2({
180
179
  disabled,
181
180
  disabledTooltip,
182
181
  tooltipActive: visibilityToggleTooltip(true),
183
- tooltipInactive: visibilityToggleTooltip(false),
184
- workspaceLabel: getEntityLabel("WORKSPACE")
182
+ tooltipInactive: visibilityToggleTooltip(false)
185
183
  }
186
184
  );
187
185
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/connection/files/grid/cells.tsx"],
4
- "sourcesContent": ["/**\n * The documents table's cell bindings: the document pill with its row menu, who can see it, its\n * folder, its related documents, its labels and its uploader. The presentation is in `files/`;\n * these bind it to the session. Writes come in through props or the grid's context, never a hook\n * per row, so a large table adds no per-row subscriptions beyond what a cell must show.\n */\n\nimport { memo, useCallback, useEffect, useMemo, useRef } from 'react'\nimport { Eye } from 'lucide-react'\nimport {\n useArbi,\n useIsCreatingTag,\n useOpenViewerDocumentId,\n useTags,\n type DocumentHostActions,\n type RelatedDocs,\n type useAssignDocTags,\n type useCreateTag,\n type useRemoveDocTags,\n} from '@arbidocs/react'\nimport {\n DocumentEntity,\n UserEntity,\n agentAvatarColors,\n formatFolderLabel,\n getEntityColor,\n getEntityLabel,\n getUserAvatarColor,\n getUserDisplayName,\n getUserInitials,\n isAgent,\n} from '@arbidocs/react/ui'\nimport {\n SIGNED_LOCKED_REASON,\n currentHasMarkup,\n downloadBlob,\n fetchMarkupPdf,\n isSignedVersion,\n} from '@arbidocs/react/document-tools/core'\nimport { SharedCell as GenericSharedCell } from '../../../components/SharedCell'\nimport { DocumentNameCellFrame } from '../../../files/cells/DocumentNameCell'\nimport { DocumentRowMenu } from '../../../files/cells/DocumentNameCell'\nimport { FolderCell } from '../../../files/cells/FolderCell'\nimport { RelatedDocsCell } from '../../../files/cells/RelatedDocsCell'\nimport { LabelMultiSelectView, type LabelOption } from '../../../files/cells/LabelMultiSelect'\nimport { FolderCommandList } from '../../../files/FolderPicker'\nimport {\n FolderProviderIcon,\n formatFolderSegment,\n hasFolderProviderIcon,\n} from '../../../files/folders'\nimport { visibilityToggleTooltip } from '../../../files/visibility'\nimport { useBlocksEnvironment } from '../../../provider/environment'\nimport { DocumentSyncGlyph } from '../DocumentSyncGlyph'\nimport { FileTooltipContent, type FileTileDocument, type FileTileUser } from '../explorer/FileTiles'\nimport { DocumentStatusGlyph } from './documentStatus'\n\n/** A person as a table cell shows them. */\nexport type GridUser = FileTileUser & {\n is_identity_verified?: boolean | null\n}\n\n/** A small avatar for a person (initials, or their picture); opens them when the host can. */\nexport const UserAvatar = memo(function UserAvatar({\n user,\n isMe = false,\n onOpen,\n}: {\n user: GridUser | undefined\n isMe?: boolean\n onOpen?: (userId: string) => void\n}) {\n if (!user) return <UserEntity empty size=\"xs\" />\n const colorClass = getUserAvatarColor(user.external_id)\n const agent = isAgent(user)\n return (\n <UserEntity\n size=\"xs\"\n variant=\"icon\"\n showTooltip={false}\n interactive={!!onOpen}\n initials={getUserInitials(user)}\n displayName={isMe ? 'You' : getUserDisplayName(user)}\n picture={user.picture}\n colorClass={colorClass}\n isAgent={agent}\n isVerified={user.is_identity_verified === true}\n agentStyle={agent ? agentAvatarColors(colorClass) : undefined}\n isMe={isMe}\n onClick={\n onOpen\n ? (e) => {\n e.stopPropagation()\n onOpen(user.external_id)\n }\n : undefined\n }\n />\n )\n})\n\n/** The document pill's hover card: rendered only while open, so its lookups run on hover. */\nfunction DocumentSummaryTooltip({\n doc,\n users,\n}: {\n doc: FileTileDocument\n users: readonly GridUser[]\n}) {\n const { data: tags } = useTags()\n const modifiedBy = users.find(\n (u) => u.external_id === (doc.updated_by_ext_id ?? doc.created_by_ext_id)\n )\n const tagNameById = new Map<string, string>()\n for (const tag of tags ?? []) tagNameById.set(tag.external_id, tag.name)\n return <FileTooltipContent doc={doc} modifiedBy={modifiedBy} tagNameById={tagNameById} />\n}\n\n/**\n * How long a click waits before opening: a double-click on the title edits it, so its first click\n * must not open the document before the second one lands.\n */\nconst OPEN_AFTER_DOUBLE_CLICK_WINDOW_MS = 300\n\nexport interface DocumentNameCellProps {\n doc: FileTileDocument\n /** The viewer may rename, move or delete the document. */\n canEdit: boolean\n /** The workspace's members (the hover card's \"last modified by\"). */\n users: readonly GridUser[]\n onOpen: () => void\n /** Open in the review view. Absent: not offered. */\n onReview?: () => void\n /** Start a chat about the document. Absent: not offered. */\n onDocumentChat?: () => void\n onRename: () => void\n onDownload: () => void\n onMove: () => void\n onDelete: () => void\n}\n\n/**\n * The Document column: the document pill (exactly as documents look everywhere), opened by a\n * click, with the offline mark on its icon, its status after the name and the row menu.\n */\nexport const DocumentNameCell = memo(function DocumentNameCell({\n doc,\n canEdit,\n users,\n onOpen,\n onReview,\n onDocumentChat,\n onRename,\n onDownload,\n onMove,\n onDelete,\n}: DocumentNameCellProps) {\n const arbi = useArbi()\n const { notify } = useBlocksEnvironment()\n // The row of the document open in the viewer is marked (the grid styles the row from the cell's\n // `data-viewing`); only the rows whose state flips re-render.\n const isViewing = useOpenViewerDocumentId() === doc.external_id\n const openTimerRef = useRef<number | undefined>(undefined)\n useEffect(() => () => window.clearTimeout(openTimerRef.current), [])\n\n const downloadMarkup = async () => {\n try {\n const { blob, fileName } = await fetchMarkupPdf(arbi.getClient().fetch, doc.external_id)\n downloadBlob(blob, fileName)\n } catch (e) {\n notify(e instanceof Error ? e.message : 'The markup could not be downloaded', 'error')\n }\n }\n\n return (\n <DocumentNameCellFrame\n testId={`open-document-viewer-button-${doc.external_id}`}\n isViewing={isViewing}\n subtitle={[doc.created_at?.slice(0, 10), doc.folder ? formatFolderLabel(doc.folder) : null]\n .filter(Boolean)\n .join(' \u00B7 ')}\n >\n <DocumentEntity\n doc={doc}\n size=\"md\"\n labelMaxWidth=\"max-w-full\"\n fullWidth\n status={<DocumentStatusGlyph doc={doc} />}\n tooltipContent={<DocumentSummaryTooltip doc={doc} users={users} />}\n iconBadge={\n <DocumentSyncGlyph\n docExtId={doc.external_id}\n size={10}\n className=\"absolute -bottom-1 -right-1\"\n />\n }\n onClick={(e) => {\n // Opens; the row is not selected too. Rename is the menu or a double-click.\n e.stopPropagation()\n window.clearTimeout(openTimerRef.current)\n if (e.detail > 1) return\n openTimerRef.current = window.setTimeout(onOpen, OPEN_AFTER_DOUBLE_CLICK_WINDOW_MS)\n }}\n actions={\n <DocumentRowMenu\n canEdit={canEdit}\n onOpen={onOpen}\n onReview={onReview}\n onDocumentChat={onDocumentChat}\n onRename={onRename}\n onDownload={onDownload}\n onDownloadMarkup={currentHasMarkup(doc) ? () => void downloadMarkup() : undefined}\n // A signed version is locked: its markup is never written into its PDF.\n downloadMarkupDisabledReason={isSignedVersion(doc) ? SIGNED_LOCKED_REASON : undefined}\n onMove={onMove}\n onDelete={onDelete}\n />\n }\n // Transparent, so the row's tint (private, selected, hover) shows through.\n className=\"min-w-0 max-w-full border-transparent bg-transparent hover:bg-foreground/5\"\n />\n </DocumentNameCellFrame>\n )\n})\n\n/** Who can see the document: a toggle for its owner. */\nexport const DocumentSharedCell = memo(function DocumentSharedCell({\n document,\n disabled = false,\n disabledTooltip,\n onToggle,\n}: {\n document: FileTileDocument\n disabled?: boolean\n disabledTooltip?: string\n onToggle: (docId: string, shared: boolean) => void\n}) {\n const handleToggle = useCallback(\n (shouldShare: boolean) => onToggle(document.external_id, shouldShare),\n [document.external_id, onToggle]\n )\n return (\n <GenericSharedCell\n item={document}\n onToggle={handleToggle}\n disabled={disabled}\n disabledTooltip={disabledTooltip}\n tooltipActive={visibilityToggleTooltip(true)}\n tooltipInactive={visibilityToggleTooltip(false)}\n workspaceLabel={getEntityLabel('WORKSPACE')}\n />\n )\n})\n\n/** The folders documents are in (and `value`), for a folder picker. */\nexport function useDocumentFolders(\n documents: readonly { folder?: string | null }[],\n value?: string | null\n): string[] {\n return useMemo(() => {\n const paths = new Set<string>()\n for (const doc of documents) if (doc.folder) paths.add(doc.folder)\n if (value) paths.add(value)\n return [...paths].sort((a, b) => a.localeCompare(b))\n }, [documents, value])\n}\n\n/** A provider root displays shortened (its logo carries the name); a bare root is dropped. */\nfunction folderSegments(folder: string): string[] {\n return folder\n .split('/')\n .map((part, i) => (i === 0 ? formatFolderSegment(part) : part))\n .filter((part, i) => i > 0 || part !== '')\n}\n\n/** The document's folder, changed by a picker of the workspace's folders. */\nexport const DocumentFolderCell = memo(\n function DocumentFolderCell({\n document,\n isEditable,\n allDocuments,\n onUpdateFolder,\n }: {\n document: FileTileDocument\n isEditable: boolean\n allDocuments: readonly FileTileDocument[]\n onUpdateFolder: (docId: string, folder: string | null) => void\n }) {\n const folder = document.folder\n const folders = useDocumentFolders(allDocuments, folder)\n return (\n <FolderCell\n folder={folder}\n segments={folder ? folderSegments(folder) : []}\n icon={\n folder && hasFolderProviderIcon(folder) ? (\n <FolderProviderIcon folderPath={folder} className=\"h-3.5 w-3.5 flex-none shrink-0\" />\n ) : undefined\n }\n isEditable={isEditable}\n picker={\n <FolderCommandList\n folders={folders}\n value={folder}\n onSelect={(next) => onUpdateFolder(document.external_id, next)}\n showRemove={!!folder}\n />\n }\n />\n )\n },\n (prev, next) =>\n prev.document.external_id === next.document.external_id &&\n prev.document.folder === next.document.folder &&\n prev.isEditable === next.isEditable &&\n prev.allDocuments === next.allDocuments &&\n prev.onUpdateFolder === next.onUpdateFolder\n)\n\n/** How a made-from or copy document is related, in words (its `derived_from` role). */\nconst RELATION_LABELS: Record<string, string> = {\n redaction: 'Redacted copy',\n annotated: 'Annotated copy',\n production: 'Production',\n crop: 'Crop',\n redline_base: 'Redline',\n redline_revised: 'Redline',\n translation: 'Translation',\n}\nconst relationLabel = (role: string | undefined, version?: number) => {\n const label = role ? RELATION_LABELS[role] : undefined\n return version ? `${label ?? 'Made'} from v${version}` : label\n}\n\n/** The document's related documents: its email family, copies, duplicates and near-duplicates. */\nexport const RelatedDocumentsCell = memo(function RelatedDocumentsCell({\n currentDoc,\n related,\n viewingDocumentId,\n onDocumentClick,\n onDelete,\n canDelete,\n onCompare,\n}: {\n currentDoc: FileTileDocument\n related: RelatedDocs<FileTileDocument>\n /** The document open in the viewer (its pill is marked). */\n viewingDocumentId: string | null\n onDocumentClick: (docId: string) => void\n onDelete: (doc: FileTileDocument) => void\n canDelete?: (doc: FileTileDocument) => boolean\n /** Compare with a similar document. Absent: not offered. */\n onCompare?: (docId: string, otherDocId: string) => void\n}) {\n return (\n <RelatedDocsCell<FileTileDocument>\n parent={related.parent}\n attachments={related.children}\n madeFrom={related.madeFrom}\n copies={related.copies}\n getRelation={(doc) =>\n relationLabel(related.roles[doc.external_id], related.versions?.[doc.external_id])\n }\n duplicates={related.duplicates}\n similar={related.similar.map(({ doc }) => doc)}\n renderDoc={(doc) => (\n <DocumentEntity\n doc={doc}\n icon={\n viewingDocumentId === doc.external_id ? (\n <Eye className=\"h-3.5 w-3.5 flex-shrink-0 text-primary\" />\n ) : undefined\n }\n onClick={() => onDocumentClick(doc.external_id)}\n />\n )}\n getKey={(doc) => doc.external_id}\n onSwitchTo={(doc) => {\n const version = related.versions?.[doc.external_id]\n onDocumentClick(version ? `${doc.external_id}@v${version}` : doc.external_id)\n }}\n onDelete={onDelete}\n canDelete={canDelete}\n onCompare={\n onCompare ? (doc) => onCompare(currentDoc.external_id, doc.external_id) : undefined\n }\n />\n )\n})\n\nconst NOT_A_MEMBER_MESSAGE =\n 'Join this workspace as a collaborator or owner to create or apply labels.'\n\n/** A label as the Labels column offers it. */\nexport interface GridLabel {\n external_id: string\n name: string\n}\n\n/** The document's labels: toggle one, or create one by name and apply it. */\nexport const DocumentLabelsCell = memo(function DocumentLabelsCell({\n doc,\n labels,\n createDocTag,\n deleteDocTag,\n createTag,\n isMember,\n rowHeight,\n actions,\n}: {\n doc: FileTileDocument\n labels: readonly GridLabel[]\n createDocTag: Pick<ReturnType<typeof useAssignDocTags>, 'mutateAsync'>\n deleteDocTag: Pick<ReturnType<typeof useRemoveDocTags>, 'mutateAsync'>\n createTag: Pick<ReturnType<typeof useCreateTag>, 'mutateAsync'>\n isMember: boolean\n /** The row height: the chips are clamped to the rows that fully fit. */\n rowHeight?: number\n actions?: DocumentHostActions\n}) {\n const isCreatingTag = useIsCreatingTag()\n const { notify } = useBlocksEnvironment()\n\n const options: LabelOption[] = useMemo(\n () =>\n labels.map((t) => ({\n id: t.external_id,\n name: t.name,\n color: getEntityColor(t.external_id, 'medium'),\n })),\n [labels]\n )\n const appliedIds = useMemo(\n () =>\n new Set(\n (doc.doctags || [])\n .filter((dt) => labels.some((t) => t.external_id === dt.tag_ext_id))\n .map((dt) => dt.tag_ext_id)\n ),\n [doc.doctags, labels]\n )\n\n const applyTag = useCallback(\n (tagId: string) => createDocTag.mutateAsync({ tagId, docIds: [doc.external_id] }),\n [createDocTag, doc.external_id]\n )\n\n const handleToggle = useCallback(\n async (tagId: string) => {\n if (!isMember) return notify(NOT_A_MEMBER_MESSAGE, 'info')\n if (appliedIds.has(tagId)) {\n await deleteDocTag.mutateAsync({ tagId, docIds: [doc.external_id] })\n } else {\n await applyTag(tagId)\n }\n },\n [isMember, appliedIds, deleteDocTag, applyTag, doc.external_id, notify]\n )\n\n const handleCreate = useCallback(\n async (name: string) => {\n const trimmed = name.trim()\n if (!trimmed) return\n if (!isMember) return notify(NOT_A_MEMBER_MESSAGE, 'info')\n const existing = labels.find((t) => t.name.toLowerCase() === trimmed.toLowerCase())\n if (existing) {\n if (!appliedIds.has(existing.external_id)) await applyTag(existing.external_id)\n return\n }\n // The same name is already being created (a double Enter): one label, not two.\n if (isCreatingTag(trimmed)) return\n const created = await createTag.mutateAsync({\n name: trimmed,\n tagType: { type: 'checkbox', options: [] },\n shared: false,\n })\n if (created?.external_id) await applyTag(created.external_id)\n },\n [isMember, labels, appliedIds, createTag, applyTag, isCreatingTag, notify]\n )\n\n const openFieldsManager = actions?.openFieldsManager\n return (\n <LabelMultiSelectView\n options={options}\n appliedIds={appliedIds}\n onToggle={handleToggle}\n onCreate={handleCreate}\n onEditLabels={openFieldsManager ? () => openFieldsManager() : undefined}\n rowHeight={rowHeight}\n />\n )\n})\n"],
5
- "mappings": ";AAwEoB;AAjEpB,SAAS,MAAM,aAAa,WAAW,SAAS,cAAc;AAC9D,SAAS,WAAW;AACpB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAMK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc,yBAAyB;AAChD,SAAS,6BAA6B;AACtC,SAAS,uBAAuB;AAChC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,4BAA8C;AACvD,SAAS,yBAAyB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,+BAA+B;AACxC,SAAS,4BAA4B;AACrC,SAAS,yBAAyB;AAClC,SAAS,0BAAoE;AAC7E,SAAS,2BAA2B;AAQ7B,MAAM,aAAa,KAAK,SAASA,YAAW;AAAA,EACjD;AAAA,EACA,OAAO;AAAA,EACP;AACF,GAIG;AACD,MAAI,CAAC,KAAM,QAAO,oBAAC,cAAW,OAAK,MAAC,MAAK,MAAK;AAC9C,QAAM,aAAa,mBAAmB,KAAK,WAAW;AACtD,QAAM,QAAQ,QAAQ,IAAI;AAC1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAQ;AAAA,MACR,aAAa;AAAA,MACb,aAAa,CAAC,CAAC;AAAA,MACf,UAAU,gBAAgB,IAAI;AAAA,MAC9B,aAAa,OAAO,QAAQ,mBAAmB,IAAI;AAAA,MACnD,SAAS,KAAK;AAAA,MACd;AAAA,MACA,SAAS;AAAA,MACT,YAAY,KAAK,yBAAyB;AAAA,MAC1C,YAAY,QAAQ,kBAAkB,UAAU,IAAI;AAAA,MACpD;AAAA,MACA,SACE,SACI,CAAC,MAAM;AACL,UAAE,gBAAgB;AAClB,eAAO,KAAK,WAAW;AAAA,MACzB,IACA;AAAA;AAAA,EAER;AAEJ,CAAC;AAGD,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA;AACF,GAGG;AACD,QAAM,EAAE,MAAM,KAAK,IAAI,QAAQ;AAC/B,QAAM,aAAa,MAAM;AAAA,IACvB,CAAC,MAAM,EAAE,iBAAiB,IAAI,qBAAqB,IAAI;AAAA,EACzD;AACA,QAAM,cAAc,oBAAI,IAAoB;AAC5C,aAAW,OAAO,QAAQ,CAAC,EAAG,aAAY,IAAI,IAAI,aAAa,IAAI,IAAI;AACvE,SAAO,oBAAC,sBAAmB,KAAU,YAAwB,aAA0B;AACzF;AAMA,MAAM,oCAAoC;AAuBnC,MAAM,mBAAmB,KAAK,SAASC,kBAAiB;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,OAAO,QAAQ;AACrB,QAAM,EAAE,OAAO,IAAI,qBAAqB;AAGxC,QAAM,YAAY,wBAAwB,MAAM,IAAI;AACpD,QAAM,eAAe,OAA2B,MAAS;AACzD,YAAU,MAAM,MAAM,OAAO,aAAa,aAAa,OAAO,GAAG,CAAC,CAAC;AAEnE,QAAM,iBAAiB,YAAY;AACjC,QAAI;AACF,YAAM,EAAE,MAAM,SAAS,IAAI,MAAM,eAAe,KAAK,UAAU,EAAE,OAAO,IAAI,WAAW;AACvF,mBAAa,MAAM,QAAQ;AAAA,IAC7B,SAAS,GAAG;AACV,aAAO,aAAa,QAAQ,EAAE,UAAU,sCAAsC,OAAO;AAAA,IACvF;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ,+BAA+B,IAAI,WAAW;AAAA,MACtD;AAAA,MACA,UAAU,CAAC,IAAI,YAAY,MAAM,GAAG,EAAE,GAAG,IAAI,SAAS,kBAAkB,IAAI,MAAM,IAAI,IAAI,EACvF,OAAO,OAAO,EACd,KAAK,QAAK;AAAA,MAEb;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,MAAK;AAAA,UACL,eAAc;AAAA,UACd,WAAS;AAAA,UACT,QAAQ,oBAAC,uBAAoB,KAAU;AAAA,UACvC,gBAAgB,oBAAC,0BAAuB,KAAU,OAAc;AAAA,UAChE,WACE;AAAA,YAAC;AAAA;AAAA,cACC,UAAU,IAAI;AAAA,cACd,MAAM;AAAA,cACN,WAAU;AAAA;AAAA,UACZ;AAAA,UAEF,SAAS,CAAC,MAAM;AAEd,cAAE,gBAAgB;AAClB,mBAAO,aAAa,aAAa,OAAO;AACxC,gBAAI,EAAE,SAAS,EAAG;AAClB,yBAAa,UAAU,OAAO,WAAW,QAAQ,iCAAiC;AAAA,UACpF;AAAA,UACA,SACE;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,kBAAkB,iBAAiB,GAAG,IAAI,MAAM,KAAK,eAAe,IAAI;AAAA,cAExE,8BAA8B,gBAAgB,GAAG,IAAI,uBAAuB;AAAA,cAC5E;AAAA,cACA;AAAA;AAAA,UACF;AAAA,UAGF,WAAU;AAAA;AAAA,MACZ;AAAA;AAAA,EACF;AAEJ,CAAC;AAGM,MAAM,qBAAqB,KAAK,SAASC,oBAAmB;AAAA,EACjE;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAKG;AACD,QAAM,eAAe;AAAA,IACnB,CAAC,gBAAyB,SAAS,SAAS,aAAa,WAAW;AAAA,IACpE,CAAC,SAAS,aAAa,QAAQ;AAAA,EACjC;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,eAAe,wBAAwB,IAAI;AAAA,MAC3C,iBAAiB,wBAAwB,KAAK;AAAA,MAC9C,gBAAgB,eAAe,WAAW;AAAA;AAAA,EAC5C;AAEJ,CAAC;AAGM,SAAS,mBACd,WACA,OACU;AACV,SAAO,QAAQ,MAAM;AACnB,UAAM,QAAQ,oBAAI,IAAY;AAC9B,eAAW,OAAO,UAAW,KAAI,IAAI,OAAQ,OAAM,IAAI,IAAI,MAAM;AACjE,QAAI,MAAO,OAAM,IAAI,KAAK;AAC1B,WAAO,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAAA,EACrD,GAAG,CAAC,WAAW,KAAK,CAAC;AACvB;AAGA,SAAS,eAAe,QAA0B;AAChD,SAAO,OACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,MAAO,MAAM,IAAI,oBAAoB,IAAI,IAAI,IAAK,EAC7D,OAAO,CAAC,MAAM,MAAM,IAAI,KAAK,SAAS,EAAE;AAC7C;AAGO,MAAM,qBAAqB;AAAA,EAChC,SAASC,oBAAmB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAKG;AACD,UAAM,SAAS,SAAS;AACxB,UAAM,UAAU,mBAAmB,cAAc,MAAM;AACvD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU,SAAS,eAAe,MAAM,IAAI,CAAC;AAAA,QAC7C,MACE,UAAU,sBAAsB,MAAM,IACpC,oBAAC,sBAAmB,YAAY,QAAQ,WAAU,kCAAiC,IACjF;AAAA,QAEN;AAAA,QACA,QACE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,OAAO;AAAA,YACP,UAAU,CAAC,SAAS,eAAe,SAAS,aAAa,IAAI;AAAA,YAC7D,YAAY,CAAC,CAAC;AAAA;AAAA,QAChB;AAAA;AAAA,IAEJ;AAAA,EAEJ;AAAA,EACA,CAAC,MAAM,SACL,KAAK,SAAS,gBAAgB,KAAK,SAAS,eAC5C,KAAK,SAAS,WAAW,KAAK,SAAS,UACvC,KAAK,eAAe,KAAK,cACzB,KAAK,iBAAiB,KAAK,gBAC3B,KAAK,mBAAmB,KAAK;AACjC;AAGA,MAAM,kBAA0C;AAAA,EAC9C,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,aAAa;AACf;AACA,MAAM,gBAAgB,CAAC,MAA0B,YAAqB;AACpE,QAAM,QAAQ,OAAO,gBAAgB,IAAI,IAAI;AAC7C,SAAO,UAAU,GAAG,SAAS,MAAM,UAAU,OAAO,KAAK;AAC3D;AAGO,MAAM,uBAAuB,KAAK,SAASC,sBAAqB;AAAA,EACrE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ,QAAQ;AAAA,MAChB,aAAa,QAAQ;AAAA,MACrB,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ;AAAA,MAChB,aAAa,CAAC,QACZ,cAAc,QAAQ,MAAM,IAAI,WAAW,GAAG,QAAQ,WAAW,IAAI,WAAW,CAAC;AAAA,MAEnF,YAAY,QAAQ;AAAA,MACpB,SAAS,QAAQ,QAAQ,IAAI,CAAC,EAAE,IAAI,MAAM,GAAG;AAAA,MAC7C,WAAW,CAAC,QACV;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,MACE,sBAAsB,IAAI,cACxB,oBAAC,OAAI,WAAU,0CAAyC,IACtD;AAAA,UAEN,SAAS,MAAM,gBAAgB,IAAI,WAAW;AAAA;AAAA,MAChD;AAAA,MAEF,QAAQ,CAAC,QAAQ,IAAI;AAAA,MACrB,YAAY,CAAC,QAAQ;AACnB,cAAM,UAAU,QAAQ,WAAW,IAAI,WAAW;AAClD,wBAAgB,UAAU,GAAG,IAAI,WAAW,KAAK,OAAO,KAAK,IAAI,WAAW;AAAA,MAC9E;AAAA,MACA;AAAA,MACA;AAAA,MACA,WACE,YAAY,CAAC,QAAQ,UAAU,WAAW,aAAa,IAAI,WAAW,IAAI;AAAA;AAAA,EAE9E;AAEJ,CAAC;AAED,MAAM,uBACJ;AASK,MAAM,qBAAqB,KAAK,SAASC,oBAAmB;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUG;AACD,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,EAAE,OAAO,IAAI,qBAAqB;AAExC,QAAM,UAAyB;AAAA,IAC7B,MACE,OAAO,IAAI,CAAC,OAAO;AAAA,MACjB,IAAI,EAAE;AAAA,MACN,MAAM,EAAE;AAAA,MACR,OAAO,eAAe,EAAE,aAAa,QAAQ;AAAA,IAC/C,EAAE;AAAA,IACJ,CAAC,MAAM;AAAA,EACT;AACA,QAAM,aAAa;AAAA,IACjB,MACE,IAAI;AAAA,OACD,IAAI,WAAW,CAAC,GACd,OAAO,CAAC,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAAC,EAClE,IAAI,CAAC,OAAO,GAAG,UAAU;AAAA,IAC9B;AAAA,IACF,CAAC,IAAI,SAAS,MAAM;AAAA,EACtB;AAEA,QAAM,WAAW;AAAA,IACf,CAAC,UAAkB,aAAa,YAAY,EAAE,OAAO,QAAQ,CAAC,IAAI,WAAW,EAAE,CAAC;AAAA,IAChF,CAAC,cAAc,IAAI,WAAW;AAAA,EAChC;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO,UAAkB;AACvB,UAAI,CAAC,SAAU,QAAO,OAAO,sBAAsB,MAAM;AACzD,UAAI,WAAW,IAAI,KAAK,GAAG;AACzB,cAAM,aAAa,YAAY,EAAE,OAAO,QAAQ,CAAC,IAAI,WAAW,EAAE,CAAC;AAAA,MACrE,OAAO;AACL,cAAM,SAAS,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,CAAC,UAAU,YAAY,cAAc,UAAU,IAAI,aAAa,MAAM;AAAA,EACxE;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO,SAAiB;AACtB,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,QAAS;AACd,UAAI,CAAC,SAAU,QAAO,OAAO,sBAAsB,MAAM;AACzD,YAAM,WAAW,OAAO,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,QAAQ,YAAY,CAAC;AAClF,UAAI,UAAU;AACZ,YAAI,CAAC,WAAW,IAAI,SAAS,WAAW,EAAG,OAAM,SAAS,SAAS,WAAW;AAC9E;AAAA,MACF;AAEA,UAAI,cAAc,OAAO,EAAG;AAC5B,YAAM,UAAU,MAAM,UAAU,YAAY;AAAA,QAC1C,MAAM;AAAA,QACN,SAAS,EAAE,MAAM,YAAY,SAAS,CAAC,EAAE;AAAA,QACzC,QAAQ;AAAA,MACV,CAAC;AACD,UAAI,SAAS,YAAa,OAAM,SAAS,QAAQ,WAAW;AAAA,IAC9D;AAAA,IACA,CAAC,UAAU,QAAQ,YAAY,WAAW,UAAU,eAAe,MAAM;AAAA,EAC3E;AAEA,QAAM,oBAAoB,SAAS;AACnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc,oBAAoB,MAAM,kBAAkB,IAAI;AAAA,MAC9D;AAAA;AAAA,EACF;AAEJ,CAAC;",
4
+ "sourcesContent": ["/**\n * The documents table's cell bindings: the document pill with its row menu, who can see it, its\n * folder, its related documents, its labels and its uploader. The presentation is in `files/`;\n * these bind it to the session. Writes come in through props or the grid's context, never a hook\n * per row, so a large table adds no per-row subscriptions beyond what a cell must show.\n */\n\nimport { memo, useCallback, useEffect, useMemo, useRef } from 'react'\nimport { Eye } from 'lucide-react'\nimport {\n useArbi,\n useIsCreatingTag,\n useOpenViewerDocumentId,\n useTags,\n type DocumentHostActions,\n type RelatedDocs,\n type useAssignDocTags,\n type useCreateTag,\n type useRemoveDocTags,\n} from '@arbidocs/react'\nimport {\n DocumentEntity,\n UserEntity,\n agentAvatarColors,\n formatFolderLabel,\n getEntityColor,\n getUserAvatarColor,\n getUserDisplayName,\n getUserInitials,\n isAgent,\n} from '@arbidocs/react/ui'\nimport {\n SIGNED_LOCKED_REASON,\n currentHasMarkup,\n downloadBlob,\n fetchMarkupPdf,\n isSignedVersion,\n} from '@arbidocs/react/document-tools/core'\nimport { SharedCell as GenericSharedCell } from '../../../components/SharedCell'\nimport { DocumentNameCellFrame } from '../../../files/cells/DocumentNameCell'\nimport { DocumentRowMenu } from '../../../files/cells/DocumentNameCell'\nimport { FolderCell } from '../../../files/cells/FolderCell'\nimport { RelatedDocsCell } from '../../../files/cells/RelatedDocsCell'\nimport { LabelMultiSelectView, type LabelOption } from '../../../files/cells/LabelMultiSelect'\nimport { FolderCommandList } from '../../../files/FolderPicker'\nimport {\n FolderProviderIcon,\n formatFolderSegment,\n hasFolderProviderIcon,\n} from '../../../files/folders'\nimport { visibilityToggleTooltip } from '../../../files/visibility'\nimport { useBlocksEnvironment } from '../../../provider/environment'\nimport { DocumentSyncGlyph } from '../DocumentSyncGlyph'\nimport { FileTooltipContent, type FileTileDocument, type FileTileUser } from '../explorer/FileTiles'\nimport { DocumentStatusGlyph } from './documentStatus'\n\n/** A person as a table cell shows them. */\nexport type GridUser = FileTileUser & {\n is_identity_verified?: boolean | null\n}\n\n/** A small avatar for a person (initials, or their picture); opens them when the host can. */\nexport const UserAvatar = memo(function UserAvatar({\n user,\n isMe = false,\n onOpen,\n}: {\n user: GridUser | undefined\n isMe?: boolean\n onOpen?: (userId: string) => void\n}) {\n if (!user) return <UserEntity empty size=\"xs\" />\n const colorClass = getUserAvatarColor(user.external_id)\n const agent = isAgent(user)\n return (\n <UserEntity\n size=\"xs\"\n variant=\"icon\"\n showTooltip={false}\n interactive={!!onOpen}\n initials={getUserInitials(user)}\n displayName={isMe ? 'You' : getUserDisplayName(user)}\n picture={user.picture}\n colorClass={colorClass}\n isAgent={agent}\n isVerified={user.is_identity_verified === true}\n agentStyle={agent ? agentAvatarColors(colorClass) : undefined}\n isMe={isMe}\n onClick={\n onOpen\n ? (e) => {\n e.stopPropagation()\n onOpen(user.external_id)\n }\n : undefined\n }\n />\n )\n})\n\n/** The document pill's hover card: rendered only while open, so its lookups run on hover. */\nfunction DocumentSummaryTooltip({\n doc,\n users,\n}: {\n doc: FileTileDocument\n users: readonly GridUser[]\n}) {\n const { data: tags } = useTags()\n const modifiedBy = users.find(\n (u) => u.external_id === (doc.updated_by_ext_id ?? doc.created_by_ext_id)\n )\n const tagNameById = new Map<string, string>()\n for (const tag of tags ?? []) tagNameById.set(tag.external_id, tag.name)\n return <FileTooltipContent doc={doc} modifiedBy={modifiedBy} tagNameById={tagNameById} />\n}\n\n/**\n * How long a click waits before opening: a double-click on the title edits it, so its first click\n * must not open the document before the second one lands.\n */\nconst OPEN_AFTER_DOUBLE_CLICK_WINDOW_MS = 300\n\nexport interface DocumentNameCellProps {\n doc: FileTileDocument\n /** The viewer may rename, move or delete the document. */\n canEdit: boolean\n /** The workspace's members (the hover card's \"last modified by\"). */\n users: readonly GridUser[]\n onOpen: () => void\n /** Open in the review view. Absent: not offered. */\n onReview?: () => void\n /** Start a chat about the document. Absent: not offered. */\n onDocumentChat?: () => void\n onRename: () => void\n onDownload: () => void\n onMove: () => void\n onDelete: () => void\n}\n\n/**\n * The Document column: the document pill (exactly as documents look everywhere), opened by a\n * click, with the offline mark on its icon, its status after the name and the row menu.\n */\nexport const DocumentNameCell = memo(function DocumentNameCell({\n doc,\n canEdit,\n users,\n onOpen,\n onReview,\n onDocumentChat,\n onRename,\n onDownload,\n onMove,\n onDelete,\n}: DocumentNameCellProps) {\n const arbi = useArbi()\n const { notify } = useBlocksEnvironment()\n // The row of the document open in the viewer is marked (the grid styles the row from the cell's\n // `data-viewing`); only the rows whose state flips re-render.\n const isViewing = useOpenViewerDocumentId() === doc.external_id\n const openTimerRef = useRef<number | undefined>(undefined)\n useEffect(() => () => window.clearTimeout(openTimerRef.current), [])\n\n const downloadMarkup = async () => {\n try {\n const { blob, fileName } = await fetchMarkupPdf(arbi.getClient().fetch, doc.external_id)\n downloadBlob(blob, fileName)\n } catch (e) {\n notify(e instanceof Error ? e.message : 'The markup could not be downloaded', 'error')\n }\n }\n\n return (\n <DocumentNameCellFrame\n testId={`open-document-viewer-button-${doc.external_id}`}\n isViewing={isViewing}\n subtitle={[doc.created_at?.slice(0, 10), doc.folder ? formatFolderLabel(doc.folder) : null]\n .filter(Boolean)\n .join(' \u00B7 ')}\n >\n <DocumentEntity\n doc={doc}\n size=\"md\"\n labelMaxWidth=\"max-w-full\"\n fullWidth\n status={<DocumentStatusGlyph doc={doc} />}\n tooltipContent={<DocumentSummaryTooltip doc={doc} users={users} />}\n iconBadge={\n <DocumentSyncGlyph\n docExtId={doc.external_id}\n size={10}\n className=\"absolute -bottom-1 -right-1\"\n />\n }\n onClick={(e) => {\n // Opens; the row is not selected too. Rename is the menu or a double-click.\n e.stopPropagation()\n window.clearTimeout(openTimerRef.current)\n if (e.detail > 1) return\n openTimerRef.current = window.setTimeout(onOpen, OPEN_AFTER_DOUBLE_CLICK_WINDOW_MS)\n }}\n actions={\n <DocumentRowMenu\n canEdit={canEdit}\n onOpen={onOpen}\n onReview={onReview}\n onDocumentChat={onDocumentChat}\n onRename={onRename}\n onDownload={onDownload}\n onDownloadMarkup={currentHasMarkup(doc) ? () => void downloadMarkup() : undefined}\n // A signed version is locked: its markup is never written into its PDF.\n downloadMarkupDisabledReason={isSignedVersion(doc) ? SIGNED_LOCKED_REASON : undefined}\n onMove={onMove}\n onDelete={onDelete}\n />\n }\n // Transparent, so the row's tint (private, selected, hover) shows through.\n className=\"min-w-0 max-w-full border-transparent bg-transparent hover:bg-foreground/5\"\n />\n </DocumentNameCellFrame>\n )\n})\n\n/** Who can see the document: a toggle for its owner. */\nexport const DocumentSharedCell = memo(function DocumentSharedCell({\n document,\n disabled = false,\n disabledTooltip,\n onToggle,\n}: {\n document: FileTileDocument\n disabled?: boolean\n disabledTooltip?: string\n onToggle: (docId: string, shared: boolean) => void\n}) {\n const handleToggle = useCallback(\n (shouldShare: boolean) => onToggle(document.external_id, shouldShare),\n [document.external_id, onToggle]\n )\n return (\n <GenericSharedCell\n item={document}\n onToggle={handleToggle}\n disabled={disabled}\n disabledTooltip={disabledTooltip}\n tooltipActive={visibilityToggleTooltip(true)}\n tooltipInactive={visibilityToggleTooltip(false)}\n />\n )\n})\n\n/** The folders documents are in (and `value`), for a folder picker. */\nexport function useDocumentFolders(\n documents: readonly { folder?: string | null }[],\n value?: string | null\n): string[] {\n return useMemo(() => {\n const paths = new Set<string>()\n for (const doc of documents) if (doc.folder) paths.add(doc.folder)\n if (value) paths.add(value)\n return [...paths].sort((a, b) => a.localeCompare(b))\n }, [documents, value])\n}\n\n/** A provider root displays shortened (its logo carries the name); a bare root is dropped. */\nfunction folderSegments(folder: string): string[] {\n return folder\n .split('/')\n .map((part, i) => (i === 0 ? formatFolderSegment(part) : part))\n .filter((part, i) => i > 0 || part !== '')\n}\n\n/** The document's folder, changed by a picker of the workspace's folders. */\nexport const DocumentFolderCell = memo(\n function DocumentFolderCell({\n document,\n isEditable,\n allDocuments,\n onUpdateFolder,\n }: {\n document: FileTileDocument\n isEditable: boolean\n allDocuments: readonly FileTileDocument[]\n onUpdateFolder: (docId: string, folder: string | null) => void\n }) {\n const folder = document.folder\n const folders = useDocumentFolders(allDocuments, folder)\n return (\n <FolderCell\n folder={folder}\n segments={folder ? folderSegments(folder) : []}\n icon={\n folder && hasFolderProviderIcon(folder) ? (\n <FolderProviderIcon folderPath={folder} className=\"h-3.5 w-3.5 flex-none shrink-0\" />\n ) : undefined\n }\n isEditable={isEditable}\n picker={\n <FolderCommandList\n folders={folders}\n value={folder}\n onSelect={(next) => onUpdateFolder(document.external_id, next)}\n showRemove={!!folder}\n />\n }\n />\n )\n },\n (prev, next) =>\n prev.document.external_id === next.document.external_id &&\n prev.document.folder === next.document.folder &&\n prev.isEditable === next.isEditable &&\n prev.allDocuments === next.allDocuments &&\n prev.onUpdateFolder === next.onUpdateFolder\n)\n\n/** How a made-from or copy document is related, in words (its `derived_from` role). */\nconst RELATION_LABELS: Record<string, string> = {\n redaction: 'Redacted copy',\n annotated: 'Annotated copy',\n production: 'Production',\n crop: 'Crop',\n redline_base: 'Redline',\n redline_revised: 'Redline',\n translation: 'Translation',\n}\nconst relationLabel = (role: string | undefined, version?: number) => {\n const label = role ? RELATION_LABELS[role] : undefined\n return version ? `${label ?? 'Made'} from v${version}` : label\n}\n\n/** The document's related documents: its email family, copies, duplicates and near-duplicates. */\nexport const RelatedDocumentsCell = memo(function RelatedDocumentsCell({\n currentDoc,\n related,\n viewingDocumentId,\n onDocumentClick,\n onDelete,\n canDelete,\n onCompare,\n}: {\n currentDoc: FileTileDocument\n related: RelatedDocs<FileTileDocument>\n /** The document open in the viewer (its pill is marked). */\n viewingDocumentId: string | null\n onDocumentClick: (docId: string) => void\n onDelete: (doc: FileTileDocument) => void\n canDelete?: (doc: FileTileDocument) => boolean\n /** Compare with a similar document. Absent: not offered. */\n onCompare?: (docId: string, otherDocId: string) => void\n}) {\n return (\n <RelatedDocsCell<FileTileDocument>\n parent={related.parent}\n attachments={related.children}\n madeFrom={related.madeFrom}\n copies={related.copies}\n getRelation={(doc) =>\n relationLabel(related.roles[doc.external_id], related.versions?.[doc.external_id])\n }\n duplicates={related.duplicates}\n similar={related.similar.map(({ doc }) => doc)}\n renderDoc={(doc) => (\n <DocumentEntity\n doc={doc}\n icon={\n viewingDocumentId === doc.external_id ? (\n <Eye className=\"h-3.5 w-3.5 flex-shrink-0 text-primary\" />\n ) : undefined\n }\n onClick={() => onDocumentClick(doc.external_id)}\n />\n )}\n getKey={(doc) => doc.external_id}\n onSwitchTo={(doc) => {\n const version = related.versions?.[doc.external_id]\n onDocumentClick(version ? `${doc.external_id}@v${version}` : doc.external_id)\n }}\n onDelete={onDelete}\n canDelete={canDelete}\n onCompare={\n onCompare ? (doc) => onCompare(currentDoc.external_id, doc.external_id) : undefined\n }\n />\n )\n})\n\nconst NOT_A_MEMBER_MESSAGE =\n 'Join this workspace as a collaborator or owner to create or apply labels.'\n\n/** A label as the Labels column offers it. */\nexport interface GridLabel {\n external_id: string\n name: string\n}\n\n/** The document's labels: toggle one, or create one by name and apply it. */\nexport const DocumentLabelsCell = memo(function DocumentLabelsCell({\n doc,\n labels,\n createDocTag,\n deleteDocTag,\n createTag,\n isMember,\n rowHeight,\n actions,\n}: {\n doc: FileTileDocument\n labels: readonly GridLabel[]\n createDocTag: Pick<ReturnType<typeof useAssignDocTags>, 'mutateAsync'>\n deleteDocTag: Pick<ReturnType<typeof useRemoveDocTags>, 'mutateAsync'>\n createTag: Pick<ReturnType<typeof useCreateTag>, 'mutateAsync'>\n isMember: boolean\n /** The row height: the chips are clamped to the rows that fully fit. */\n rowHeight?: number\n actions?: DocumentHostActions\n}) {\n const isCreatingTag = useIsCreatingTag()\n const { notify } = useBlocksEnvironment()\n\n const options: LabelOption[] = useMemo(\n () =>\n labels.map((t) => ({\n id: t.external_id,\n name: t.name,\n color: getEntityColor(t.external_id, 'medium'),\n })),\n [labels]\n )\n const appliedIds = useMemo(\n () =>\n new Set(\n (doc.doctags || [])\n .filter((dt) => labels.some((t) => t.external_id === dt.tag_ext_id))\n .map((dt) => dt.tag_ext_id)\n ),\n [doc.doctags, labels]\n )\n\n const applyTag = useCallback(\n (tagId: string) => createDocTag.mutateAsync({ tagId, docIds: [doc.external_id] }),\n [createDocTag, doc.external_id]\n )\n\n const handleToggle = useCallback(\n async (tagId: string) => {\n if (!isMember) return notify(NOT_A_MEMBER_MESSAGE, 'info')\n if (appliedIds.has(tagId)) {\n await deleteDocTag.mutateAsync({ tagId, docIds: [doc.external_id] })\n } else {\n await applyTag(tagId)\n }\n },\n [isMember, appliedIds, deleteDocTag, applyTag, doc.external_id, notify]\n )\n\n const handleCreate = useCallback(\n async (name: string) => {\n const trimmed = name.trim()\n if (!trimmed) return\n if (!isMember) return notify(NOT_A_MEMBER_MESSAGE, 'info')\n const existing = labels.find((t) => t.name.toLowerCase() === trimmed.toLowerCase())\n if (existing) {\n if (!appliedIds.has(existing.external_id)) await applyTag(existing.external_id)\n return\n }\n // The same name is already being created (a double Enter): one label, not two.\n if (isCreatingTag(trimmed)) return\n const created = await createTag.mutateAsync({\n name: trimmed,\n tagType: { type: 'checkbox', options: [] },\n shared: false,\n })\n if (created?.external_id) await applyTag(created.external_id)\n },\n [isMember, labels, appliedIds, createTag, applyTag, isCreatingTag, notify]\n )\n\n const openFieldsManager = actions?.openFieldsManager\n return (\n <LabelMultiSelectView\n options={options}\n appliedIds={appliedIds}\n onToggle={handleToggle}\n onCreate={handleCreate}\n onEditLabels={openFieldsManager ? () => openFieldsManager() : undefined}\n rowHeight={rowHeight}\n />\n )\n})\n"],
5
+ "mappings": "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",
6
6
  "names": ["UserAvatar", "DocumentNameCell", "DocumentSharedCell", "DocumentFolderCell", "RelatedDocumentsCell", "DocumentLabelsCell"]
7
7
  }
@@ -406,7 +406,7 @@ function createDocumentColumns({
406
406
  filter: "agTextColumnFilter",
407
407
  filterParams: FILTER_PARAMS,
408
408
  context: { icon: FileType },
409
- valueGetter: (params) => friendlyFileType(params.data?.file_type, params.data?.file_name)
409
+ valueGetter: (params) => friendlyFileType(params.data?.file_type, params.data?.file_name, params.data?.folder)
410
410
  });
411
411
  allColumns.push({
412
412
  colId: "folder",
@@ -492,9 +492,10 @@ function createDocumentColumns({
492
492
  });
493
493
  allColumns.push({
494
494
  colId: "shared",
495
- headerName: "Shared",
495
+ headerName: "Sharing",
496
496
  field: "shared",
497
- width: 100,
497
+ width: 124,
498
+ minWidth: 124,
498
499
  sortable: true,
499
500
  cellDataType: "boolean",
500
501
  context: { icon: Share2 },