@arbidocs/blocks 0.5.98 → 0.5.99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -3
- package/dist/ConnectedCallDock-OJ4UR5PR.js +2 -2
- package/dist/ConnectedCallDock-OKH3FT2U.cjs +2 -2
- package/dist/ConnectedCallRoom-NB7I6RLQ.cjs +2 -2
- package/dist/ConnectedCallRoom-OX7ZIF76.js +2 -2
- package/dist/{ConnectedNativeDocxComparison-3UJZR52S.cjs → ConnectedNativeDocxComparison-F4XKHVTI.cjs} +9 -9
- package/dist/{ConnectedNativeDocxComparison-3UJZR52S.cjs.map → ConnectedNativeDocxComparison-F4XKHVTI.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-VGJLNVM4.js → ConnectedNativeDocxComparison-TDWHGYQX.js} +8 -8
- package/dist/{ConnectedStreamedWordArtifact-MJAVZ3NR.js.map → ConnectedNativeDocxComparison-TDWHGYQX.js.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-A6PGFR35.cjs → ConnectedNativeDocxEditor-J3E3QDFA.cjs} +9 -9
- package/dist/{ConnectedNativeDocxEditor-A6PGFR35.cjs.map → ConnectedNativeDocxEditor-J3E3QDFA.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-O7QEWYGG.js → ConnectedNativeDocxEditor-O7QB6DVI.js} +7 -7
- package/dist/{ConnectedNativeDocxEditor-O7QEWYGG.js.map → ConnectedNativeDocxEditor-O7QB6DVI.js.map} +1 -1
- package/dist/{ConnectedProductionSetDialog-34UV5VH2.js → ConnectedProductionSetDialog-34NEZNEQ.js} +3 -3
- package/dist/{ConnectedProductionSetDialog-34UV5VH2.js.map → ConnectedProductionSetDialog-34NEZNEQ.js.map} +1 -1
- package/dist/{ConnectedProductionSetDialog-XH725VSO.cjs → ConnectedProductionSetDialog-NFASXSLG.cjs} +3 -3
- package/dist/{ConnectedProductionSetDialog-XH725VSO.cjs.map → ConnectedProductionSetDialog-NFASXSLG.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-Q7TWGK4B.cjs → ConnectedStreamedWordArtifact-UR4LM4RB.cjs} +9 -9
- package/dist/ConnectedStreamedWordArtifact-UR4LM4RB.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-MJAVZ3NR.js → ConnectedStreamedWordArtifact-ZPFR5HFS.js} +8 -8
- package/dist/{ConnectedNativeDocxComparison-VGJLNVM4.js.map → ConnectedStreamedWordArtifact-ZPFR5HFS.js.map} +1 -1
- package/dist/{DocumentReviewCard-LGBI472S.js → DocumentReviewCard-5NZM6FOB.js} +10 -10
- package/dist/{DocumentReviewCard-LGBI472S.js.map → DocumentReviewCard-5NZM6FOB.js.map} +1 -1
- package/dist/{DocumentReviewCard-CJ5VQM45.cjs → DocumentReviewCard-7VJ3MMYG.cjs} +15 -15
- package/dist/{DocumentReviewCard-CJ5VQM45.cjs.map → DocumentReviewCard-7VJ3MMYG.cjs.map} +1 -1
- package/dist/{FilesViewerDialog-KP3IHDSS.js → FilesViewerDialog-EQ4UT6LW.js} +13 -13
- package/dist/{FilesViewerDialog-KP3IHDSS.js.map → FilesViewerDialog-EQ4UT6LW.js.map} +1 -1
- package/dist/{FilesViewerDialog-AFIM2SCB.cjs → FilesViewerDialog-XIJAGQAU.cjs} +14 -14
- package/dist/{FilesViewerDialog-AFIM2SCB.cjs.map → FilesViewerDialog-XIJAGQAU.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-YPESFW25.cjs → WorkspaceTableView-6MLEC6I6.cjs} +4 -4
- package/dist/{WorkspaceTableView-YPESFW25.cjs.map → WorkspaceTableView-6MLEC6I6.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-2FL5OX6M.js → WorkspaceTableView-YGLOQ6JA.js} +4 -4
- package/dist/{WorkspaceTableView-2FL5OX6M.js.map → WorkspaceTableView-YGLOQ6JA.js.map} +1 -1
- package/dist/agents/index.cjs +178 -178
- package/dist/agents/index.js +5 -5
- package/dist/ai-5JTBFZAO.js +1 -1
- package/dist/ai-ZLZNDUUS.cjs +1 -1
- package/dist/calls/index.cjs +1 -1
- package/dist/calls/index.js +1 -1
- package/dist/chat/index.cjs +2 -2
- package/dist/chat/index.js +2 -2
- package/dist/{chunk-PNDWMFVL.cjs → chunk-3BCKTFOP.cjs} +54 -54
- package/dist/{chunk-PNDWMFVL.cjs.map → chunk-3BCKTFOP.cjs.map} +1 -1
- package/dist/{chunk-FADUFGZD.js → chunk-3CV4M6MB.js} +3 -3
- package/dist/{chunk-FADUFGZD.js.map → chunk-3CV4M6MB.js.map} +1 -1
- package/dist/{chunk-3SBMU4LB.js → chunk-3VKULQEG.js} +6 -6
- package/dist/{chunk-3SBMU4LB.js.map → chunk-3VKULQEG.js.map} +1 -1
- package/dist/{chunk-Z4VWLWFX.js → chunk-4WW34DPM.js} +3 -3
- package/dist/{chunk-Z4VWLWFX.js.map → chunk-4WW34DPM.js.map} +1 -1
- package/dist/{chunk-3PV25ICC.js → chunk-6KKVJ2V6.js} +3 -3
- package/dist/{chunk-3PV25ICC.js.map → chunk-6KKVJ2V6.js.map} +1 -1
- package/dist/{chunk-WGAGIF4F.cjs → chunk-CS4KQSLY.cjs} +3 -3
- package/dist/{chunk-WGAGIF4F.cjs.map → chunk-CS4KQSLY.cjs.map} +1 -1
- package/dist/{chunk-JLTPQDQB.js → chunk-EMTRPNYB.js} +3 -3
- package/dist/{chunk-JLTPQDQB.js.map → chunk-EMTRPNYB.js.map} +1 -1
- package/dist/{chunk-VJTDTWNZ.cjs → chunk-ERDQ4DAX.cjs} +3 -3
- package/dist/{chunk-VJTDTWNZ.cjs.map → chunk-ERDQ4DAX.cjs.map} +1 -1
- package/dist/{chunk-F3IRNQIB.cjs → chunk-HJBVSG6H.cjs} +4 -4
- package/dist/{chunk-F3IRNQIB.cjs.map → chunk-HJBVSG6H.cjs.map} +1 -1
- package/dist/{chunk-VYW4YXDB.js → chunk-I44X7O6X.js} +4 -4
- package/dist/{chunk-VYW4YXDB.js.map → chunk-I44X7O6X.js.map} +1 -1
- package/dist/{chunk-ERVXJW7P.cjs → chunk-J24LYNTY.cjs} +35 -35
- package/dist/{chunk-ERVXJW7P.cjs.map → chunk-J24LYNTY.cjs.map} +1 -1
- package/dist/{chunk-LDGVJI7D.cjs → chunk-JL6MDUV7.cjs} +28 -28
- package/dist/{chunk-LDGVJI7D.cjs.map → chunk-JL6MDUV7.cjs.map} +1 -1
- package/dist/{chunk-5HPLUT4M.cjs → chunk-KBXATCF4.cjs} +4 -4
- package/dist/{chunk-5HPLUT4M.cjs.map → chunk-KBXATCF4.cjs.map} +1 -1
- package/dist/{chunk-6FLDM72D.js → chunk-KYR3TXHS.js} +3 -3
- package/dist/{chunk-6FLDM72D.js.map → chunk-KYR3TXHS.js.map} +1 -1
- package/dist/{chunk-JGC3EPPF.js → chunk-L3V2ANBD.js} +3 -3
- package/dist/{chunk-JGC3EPPF.js.map → chunk-L3V2ANBD.js.map} +1 -1
- package/dist/{chunk-SVQTUHPE.cjs → chunk-LT2RPGKW.cjs} +16 -16
- package/dist/{chunk-SVQTUHPE.cjs.map → chunk-LT2RPGKW.cjs.map} +1 -1
- package/dist/{chunk-VYTEEQ4C.cjs → chunk-MT3RPUQC.cjs} +4 -4
- package/dist/{chunk-VYTEEQ4C.cjs.map → chunk-MT3RPUQC.cjs.map} +1 -1
- package/dist/{chunk-YMNKMIFG.cjs → chunk-OC5K2J6V.cjs} +3 -3
- package/dist/{chunk-YMNKMIFG.cjs.map → chunk-OC5K2J6V.cjs.map} +1 -1
- package/dist/{chunk-KA6TKTIT.js → chunk-OOYT5A7W.js} +3 -3
- package/dist/{chunk-KA6TKTIT.js.map → chunk-OOYT5A7W.js.map} +1 -1
- package/dist/{chunk-U3FUFNNR.js → chunk-OYSTBNNA.js} +3 -3
- package/dist/{chunk-U3FUFNNR.js.map → chunk-OYSTBNNA.js.map} +1 -1
- package/dist/{chunk-Y7QIZGZA.js → chunk-POEWHRQV.js} +7 -7
- package/dist/{chunk-Y7QIZGZA.js.map → chunk-POEWHRQV.js.map} +1 -1
- package/dist/{chunk-E35SHIUT.cjs → chunk-RAF72BBC.cjs} +4 -4
- package/dist/{chunk-E35SHIUT.cjs.map → chunk-RAF72BBC.cjs.map} +1 -1
- package/dist/{chunk-5SQJTWD3.cjs → chunk-SWILV6LT.cjs} +4 -4
- package/dist/{chunk-5SQJTWD3.cjs.map → chunk-SWILV6LT.cjs.map} +1 -1
- package/dist/{chunk-7OMLHP7B.js → chunk-SWW3KBH2.js} +4 -4
- package/dist/{chunk-7OMLHP7B.js.map → chunk-SWW3KBH2.js.map} +1 -1
- package/dist/{chunk-5CKKWKEJ.js → chunk-TVJAVK2G.js} +3 -3
- package/dist/{chunk-5CKKWKEJ.js.map → chunk-TVJAVK2G.js.map} +1 -1
- package/dist/{chunk-37J6OLML.js → chunk-UBI4HXT6.js} +5 -5
- package/dist/{chunk-37J6OLML.js.map → chunk-UBI4HXT6.js.map} +1 -1
- package/dist/{chunk-6KQVTMRL.cjs → chunk-UOGXKHTJ.cjs} +3 -3
- package/dist/{chunk-6KQVTMRL.cjs.map → chunk-UOGXKHTJ.cjs.map} +1 -1
- package/dist/{chunk-65MSYISI.cjs → chunk-VD33HXFZ.cjs} +28 -28
- package/dist/{chunk-65MSYISI.cjs.map → chunk-VD33HXFZ.cjs.map} +1 -1
- package/dist/{chunk-5ZUA3JRB.js → chunk-WYLY5UQ4.js} +3 -3
- package/dist/{chunk-5ZUA3JRB.js.map → chunk-WYLY5UQ4.js.map} +1 -1
- package/dist/{chunk-7GPQBAIL.cjs → chunk-X426D2LX.cjs} +4 -4
- package/dist/{chunk-7GPQBAIL.cjs.map → chunk-X426D2LX.cjs.map} +1 -1
- package/dist/{chunk-3LZ7JL3N.js → chunk-YG4S7OCD.js} +3 -3
- package/dist/{chunk-3LZ7JL3N.js.map → chunk-YG4S7OCD.js.map} +1 -1
- package/dist/{chunk-YOCKX2OP.cjs → chunk-YHNTGQSW.cjs} +6 -6
- package/dist/{chunk-YOCKX2OP.cjs.map → chunk-YHNTGQSW.cjs.map} +1 -1
- package/dist/{chunk-CYIL3N2M.js → chunk-ZARYAYQO.js} +13 -13
- package/dist/{chunk-CYIL3N2M.js.map → chunk-ZARYAYQO.js.map} +1 -1
- package/dist/{chunk-R4JGE2XT.cjs → chunk-ZXEGVXEV.cjs} +4 -4
- package/dist/{chunk-R4JGE2XT.cjs.map → chunk-ZXEGVXEV.cjs.map} +1 -1
- package/dist/connect/docx.cjs +12 -12
- package/dist/connect/docx.js +8 -8
- package/dist/connect/index.cjs +1150 -631
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +1 -0
- package/dist/connect/index.js +626 -110
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +12 -12
- package/dist/connect/viewer.js +11 -11
- package/dist/connection/command/ConnectedCommandPalette.d.ts +16 -0
- package/dist/connection/command/actions.d.ts +21 -0
- package/dist/connection/command/icons.d.ts +7 -0
- package/dist/connection/command/index.d.ts +3 -0
- package/dist/connection/command/palette-state.d.ts +22 -0
- package/dist/embed/index.cjs +18 -18
- package/dist/embed/index.js +12 -12
- package/dist/facts/index.cjs +43 -43
- package/dist/facts/index.js +2 -2
- package/dist/files/index.cjs +224 -224
- package/dist/files/index.js +3 -3
- package/dist/index.cjs +305 -305
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +11 -11
- package/dist/index.js.map +1 -1
- package/dist/nav/actions.d.ts +23 -1
- package/dist/settings/index.cjs +1 -1
- package/dist/settings/index.js +1 -1
- package/dist/studio/index.cjs +1 -1
- package/dist/studio/index.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/workflow-canvas/index.cjs +25 -25
- package/dist/workflow-canvas/index.js +14 -14
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/ConnectedStreamedWordArtifact-Q7TWGK4B.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/files/fields/useMemberLookup.ts","../src/connection/files/grid/ConnectedTagEntity.tsx","../src/connection/files/fields/DocumentFieldParts.tsx","../src/connection/files/fields/documentField.tsx"],"names":["useWorkspaceUsers","SharedTagEntity","jsx","formatFriendlyDate","useMemo","getEntityColor","value","tag"],"mappings":"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","file":"chunk-37J6OLML.js","sourcesContent":["import { useCallback } from 'react'\nimport { useWorkspaceUsers, type DocumentPerson } from '@arbidocs/react'\n\n/** Finds a workspace member by id (undefined for anyone else, or no id). */\nexport function useMemberLookup(): (\n userId: string | null | undefined\n) => DocumentPerson | undefined {\n const { data: members = [] } = useWorkspaceUsers()\n return useCallback(\n (userId) => (userId ? members.find((m) => m.user.external_id === userId)?.user : undefined),\n [members]\n )\n}\n","/**\n * A label or field as a pill, with the rich hover card: its type, how many documents carry it, who\n * can see it (a toggle for its owner), and who created and last changed it. The pill itself is the\n * shared `TagEntity` of `@arbidocs/react/ui`; this adds what it reads from the session.\n */\n\nimport { useMemo } from 'react'\nimport { useTags, useWorkspaceUsers } from '@arbidocs/react'\nimport type { TagResponse } from '@arbidocs/sdk/browser'\nimport {\n Badge,\n formatFriendlyDate,\n getEntityColor,\n getTagTypeIcon,\n getTagTypeLabel,\n TagEntity as SharedTagEntity,\n VisibilityToggle,\n} from '@arbidocs/react/ui'\nimport { EntityTooltip, EntityTooltipHeader } from '../../../components/EntityTooltip'\nimport { UserAvatar } from './cells'\n\nexport interface ConnectedTagEntityProps {\n tag: TagResponse\n size?: 'sm' | 'md' | 'lg'\n className?: string\n onClick?: (e: React.MouseEvent) => void\n /** Whether to show the detailed tooltip (default: true) */\n showTooltip?: boolean\n /** Whether current user can edit this tag (owner) */\n canEdit?: boolean\n /** Callback when edit is requested (clicking visibility toggle as owner) */\n onEditClick?: () => void\n}\n\nexport function ConnectedTagEntity({\n tag,\n size = 'md',\n className = '',\n onClick,\n showTooltip = true,\n canEdit = false,\n onEditClick,\n}: ConnectedTagEntityProps) {\n // Get fresh tag data from React Query cache for accurate doctag_count\n const { data: workspaceTags } = useTags()\n\n // The workspace's members: who created and last changed it.\n const { data: members = [] } = useWorkspaceUsers()\n const byId = (id: string | null | undefined) =>\n id ? members.find((m) => m.user.external_id === id)?.user : undefined\n\n // Look up fresh tag from query cache, fall back to prop if not found\n const freshTag = useMemo(() => {\n if (!workspaceTags) return tag\n const found = workspaceTags.find((t) => t.external_id === tag.external_id)\n return found || tag\n }, [workspaceTags, tag])\n\n // Look up creator and updater from the people you know\n const creator = byId(tag.created_by_ext_id) ?? null\n const updater = byId(tag.updated_by_ext_id) ?? null\n\n const Icon = getTagTypeIcon(tag.tag_type.type)\n const tagColor = getEntityColor(tag.external_id, 'medium')\n\n // Handle visibility toggle click for owner\n const handleVisibilityToggle = () => {\n if (canEdit && onEditClick) {\n onEditClick()\n }\n }\n\n // Rich, store-coupled tooltip — injected into the shared pill.\n const tooltipContent = showTooltip ? (\n <EntityTooltip>\n <EntityTooltipHeader\n lead={\n <span\n className=\"inline-flex items-center justify-center rounded-md text-white p-1\"\n style={{ backgroundColor: tagColor }}\n >\n <Icon size={16} />\n </span>\n }\n title={tag.name}\n />\n\n <div className=\"flex flex-col gap-1.5 text-sm\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Type:</span>\n <span>{getTagTypeLabel(tag.tag_type.type)}</span>\n </div>\n\n {/* Files count - use freshTag for accurate count */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Documents:</span>\n <Badge variant=\"secondary\" className=\"h-5 min-w-[20px] justify-center\">\n {freshTag.doctag_count ?? 0}\n </Badge>\n </div>\n\n {/* Visibility with toggle */}\n <div className=\"flex items-center gap-2\">\n <VisibilityToggle\n items={freshTag}\n onToggle={handleVisibilityToggle}\n disabled={!canEdit}\n showLabel={false}\n showTooltip={canEdit}\n tooltipActive=\"Click to edit\"\n tooltipInactive=\"Click to edit\"\n />\n <span className=\"text-muted-foreground\">{freshTag.shared ? 'Shared' : 'Private'}</span>\n </div>\n\n {/* Created at/by */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Created:</span>\n <span>{formatFriendlyDate(tag.created_at)}</span>\n <span className=\"text-muted-foreground\">by</span>\n <UserAvatar user={creator ?? undefined} />\n </div>\n\n {/* Updated at/by */}\n {tag.updated_at && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Updated:</span>\n <span>{formatFriendlyDate(tag.updated_at)}</span>\n {updater && (\n <>\n <span className=\"text-muted-foreground\">by</span>\n <UserAvatar user={updater} />\n </>\n )}\n </div>\n )}\n </div>\n </EntityTooltip>\n ) : undefined\n\n return (\n <SharedTagEntity\n tag={{ ...tag, color: tagColor }}\n size={size}\n className={className}\n onClick={onClick}\n showTooltip={showTooltip}\n tooltipContent={tooltipContent}\n />\n )\n}\n","/**\n * The parts of the review form's fields: the folder picker, the related documents, who last set a\n * value, and the labels picker.\n */\n\nimport { useMemo } from 'react'\nimport type { TagResponse } from '@arbidocs/sdk/browser'\nimport { useOpenViewerDocumentId, type RelatedDocs, type WorkspaceDocument } from '@arbidocs/react'\nimport { formatFriendlyDate, getEntityColor } from '@arbidocs/react/ui'\nimport { FieldAttribution, FieldLabelsSelect } from '../../../files/FieldParts'\nimport type { LabelOption } from '../../../files/cells/LabelMultiSelect'\nimport { FolderCommandList } from '../../../files/FolderPicker'\nimport { RelatedDocumentsCell, useDocumentFolders } from '../grid/cells'\nimport { DocumentUser } from './DocumentUser'\nimport { useMemberLookup } from './useMemberLookup'\n\ntype DocTag = NonNullable<WorkspaceDocument['doctags']>[number]\n\n/** The workspace's folders to move the document to. */\nexport function FolderPicker({\n documents,\n value,\n onSelect,\n}: {\n documents: WorkspaceDocument[]\n value: string | null | undefined\n onSelect: (folder: string | null) => void\n}) {\n const folders = useDocumentFolders(documents, value)\n return (\n <FolderCommandList folders={folders} value={value} onSelect={onSelect} showRemove={!!value} />\n )\n}\n\n/** The related documents, the one open in the viewer marked. */\nexport function RelatedDocuments({\n doc,\n related,\n onOpen,\n onDelete,\n canDelete,\n onCompare,\n}: {\n doc: WorkspaceDocument\n related: RelatedDocs<WorkspaceDocument>\n onOpen?: (docId: string) => void\n onDelete?: (docId: string) => void\n canDelete?: (doc: WorkspaceDocument) => boolean\n onCompare?: (docId: string, otherDocId: string) => void\n}) {\n const viewingDocumentId = useOpenViewerDocumentId()\n return (\n <RelatedDocumentsCell\n currentDoc={doc}\n related={related}\n viewingDocumentId={viewingDocumentId}\n onDocumentClick={(id) => onOpen?.(id)}\n onDelete={(other) => onDelete?.(other.external_id)}\n canDelete={canDelete}\n onCompare={onCompare}\n />\n )\n}\n\n/** Who last set a value, and when: shown on hover. */\nexport function DocTagAttribution({ doctag }: { doctag: DocTag }) {\n const memberById = useMemberLookup()\n const creator = memberById(doctag.created_by_ext_id)\n const updater =\n doctag.updated_by_ext_id && doctag.updated_by_ext_id !== doctag.created_by_ext_id\n ? memberById(doctag.updated_by_ext_id)\n : undefined\n const lastUser = updater || creator\n if (!lastUser) return null\n const lines = [\n creator &&\n `Created ${formatFriendlyDate(doctag.created_at)} by ${creator.given_name || creator.email}`,\n updater &&\n `Updated ${formatFriendlyDate(doctag.updated_at)} by ${updater.given_name || updater.email}`,\n ].filter((line): line is string => !!line)\n return (\n <FieldAttribution\n avatar={<DocumentUser user={lastUser} tooltip={false} />}\n date={formatFriendlyDate(updater ? doctag.updated_at : doctag.created_at)}\n lines={lines}\n />\n )\n}\n\n/** The labels as a picker: toggle one, or create one by name and apply it. */\nexport function LabelsCombobox({\n labelTags,\n appliedTagIds,\n onToggle,\n onCreateAndApply,\n}: {\n labelTags: TagResponse[]\n appliedTagIds: ReadonlySet<string>\n onToggle: (tag: TagResponse) => void\n onCreateAndApply?: (name: string) => void\n}) {\n const options: LabelOption[] = useMemo(\n () =>\n labelTags.map((t) => ({\n id: t.external_id,\n name: t.name,\n color: getEntityColor(t.external_id, 'medium'),\n })),\n [labelTags]\n )\n\n // An existing label of that name (any case) is applied rather than made again.\n const handleCreate = (name: string) => {\n const trimmed = name.trim()\n if (!trimmed) return\n const existing = labelTags.find((t) => t.name.toLowerCase() === trimmed.toLowerCase())\n if (!existing) onCreateAndApply?.(trimmed)\n else if (!appliedTagIds.has(existing.external_id)) onToggle(existing)\n }\n\n return (\n <FieldLabelsSelect\n options={options}\n appliedIds={appliedTagIds}\n onToggle={(id) => {\n const tag = labelTags.find((t) => t.external_id === id)\n if (tag) onToggle(tag)\n }}\n onCreate={onCreateAndApply ? handleCreate : undefined}\n />\n )\n}\n","/**\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()}…`}\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()}…`}\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/connection/files/fields/useMemberLookup.ts","../src/connection/files/grid/ConnectedTagEntity.tsx","../src/connection/files/fields/DocumentFieldParts.tsx","../src/connection/files/fields/documentField.tsx"],"names":["useWorkspaceUsers","SharedTagEntity","jsx","formatFriendlyDate","useMemo","getEntityColor","value","tag"],"mappings":"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","file":"chunk-UBI4HXT6.js","sourcesContent":["import { useCallback } from 'react'\nimport { useWorkspaceUsers, type DocumentPerson } from '@arbidocs/react'\n\n/** Finds a workspace member by id (undefined for anyone else, or no id). */\nexport function useMemberLookup(): (\n userId: string | null | undefined\n) => DocumentPerson | undefined {\n const { data: members = [] } = useWorkspaceUsers()\n return useCallback(\n (userId) => (userId ? members.find((m) => m.user.external_id === userId)?.user : undefined),\n [members]\n )\n}\n","/**\n * A label or field as a pill, with the rich hover card: its type, how many documents carry it, who\n * can see it (a toggle for its owner), and who created and last changed it. The pill itself is the\n * shared `TagEntity` of `@arbidocs/react/ui`; this adds what it reads from the session.\n */\n\nimport { useMemo } from 'react'\nimport { useTags, useWorkspaceUsers } from '@arbidocs/react'\nimport type { TagResponse } from '@arbidocs/sdk/browser'\nimport {\n Badge,\n formatFriendlyDate,\n getEntityColor,\n getTagTypeIcon,\n getTagTypeLabel,\n TagEntity as SharedTagEntity,\n VisibilityToggle,\n} from '@arbidocs/react/ui'\nimport { EntityTooltip, EntityTooltipHeader } from '../../../components/EntityTooltip'\nimport { UserAvatar } from './cells'\n\nexport interface ConnectedTagEntityProps {\n tag: TagResponse\n size?: 'sm' | 'md' | 'lg'\n className?: string\n onClick?: (e: React.MouseEvent) => void\n /** Whether to show the detailed tooltip (default: true) */\n showTooltip?: boolean\n /** Whether current user can edit this tag (owner) */\n canEdit?: boolean\n /** Callback when edit is requested (clicking visibility toggle as owner) */\n onEditClick?: () => void\n}\n\nexport function ConnectedTagEntity({\n tag,\n size = 'md',\n className = '',\n onClick,\n showTooltip = true,\n canEdit = false,\n onEditClick,\n}: ConnectedTagEntityProps) {\n // Get fresh tag data from React Query cache for accurate doctag_count\n const { data: workspaceTags } = useTags()\n\n // The workspace's members: who created and last changed it.\n const { data: members = [] } = useWorkspaceUsers()\n const byId = (id: string | null | undefined) =>\n id ? members.find((m) => m.user.external_id === id)?.user : undefined\n\n // Look up fresh tag from query cache, fall back to prop if not found\n const freshTag = useMemo(() => {\n if (!workspaceTags) return tag\n const found = workspaceTags.find((t) => t.external_id === tag.external_id)\n return found || tag\n }, [workspaceTags, tag])\n\n // Look up creator and updater from the people you know\n const creator = byId(tag.created_by_ext_id) ?? null\n const updater = byId(tag.updated_by_ext_id) ?? null\n\n const Icon = getTagTypeIcon(tag.tag_type.type)\n const tagColor = getEntityColor(tag.external_id, 'medium')\n\n // Handle visibility toggle click for owner\n const handleVisibilityToggle = () => {\n if (canEdit && onEditClick) {\n onEditClick()\n }\n }\n\n // Rich, store-coupled tooltip — injected into the shared pill.\n const tooltipContent = showTooltip ? (\n <EntityTooltip>\n <EntityTooltipHeader\n lead={\n <span\n className=\"inline-flex items-center justify-center rounded-md text-white p-1\"\n style={{ backgroundColor: tagColor }}\n >\n <Icon size={16} />\n </span>\n }\n title={tag.name}\n />\n\n <div className=\"flex flex-col gap-1.5 text-sm\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Type:</span>\n <span>{getTagTypeLabel(tag.tag_type.type)}</span>\n </div>\n\n {/* Files count - use freshTag for accurate count */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Documents:</span>\n <Badge variant=\"secondary\" className=\"h-5 min-w-[20px] justify-center\">\n {freshTag.doctag_count ?? 0}\n </Badge>\n </div>\n\n {/* Visibility with toggle */}\n <div className=\"flex items-center gap-2\">\n <VisibilityToggle\n items={freshTag}\n onToggle={handleVisibilityToggle}\n disabled={!canEdit}\n showLabel={false}\n showTooltip={canEdit}\n tooltipActive=\"Click to edit\"\n tooltipInactive=\"Click to edit\"\n />\n <span className=\"text-muted-foreground\">{freshTag.shared ? 'Shared' : 'Private'}</span>\n </div>\n\n {/* Created at/by */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Created:</span>\n <span>{formatFriendlyDate(tag.created_at)}</span>\n <span className=\"text-muted-foreground\">by</span>\n <UserAvatar user={creator ?? undefined} />\n </div>\n\n {/* Updated at/by */}\n {tag.updated_at && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Updated:</span>\n <span>{formatFriendlyDate(tag.updated_at)}</span>\n {updater && (\n <>\n <span className=\"text-muted-foreground\">by</span>\n <UserAvatar user={updater} />\n </>\n )}\n </div>\n )}\n </div>\n </EntityTooltip>\n ) : undefined\n\n return (\n <SharedTagEntity\n tag={{ ...tag, color: tagColor }}\n size={size}\n className={className}\n onClick={onClick}\n showTooltip={showTooltip}\n tooltipContent={tooltipContent}\n />\n )\n}\n","/**\n * The parts of the review form's fields: the folder picker, the related documents, who last set a\n * value, and the labels picker.\n */\n\nimport { useMemo } from 'react'\nimport type { TagResponse } from '@arbidocs/sdk/browser'\nimport { useOpenViewerDocumentId, type RelatedDocs, type WorkspaceDocument } from '@arbidocs/react'\nimport { formatFriendlyDate, getEntityColor } from '@arbidocs/react/ui'\nimport { FieldAttribution, FieldLabelsSelect } from '../../../files/FieldParts'\nimport type { LabelOption } from '../../../files/cells/LabelMultiSelect'\nimport { FolderCommandList } from '../../../files/FolderPicker'\nimport { RelatedDocumentsCell, useDocumentFolders } from '../grid/cells'\nimport { DocumentUser } from './DocumentUser'\nimport { useMemberLookup } from './useMemberLookup'\n\ntype DocTag = NonNullable<WorkspaceDocument['doctags']>[number]\n\n/** The workspace's folders to move the document to. */\nexport function FolderPicker({\n documents,\n value,\n onSelect,\n}: {\n documents: WorkspaceDocument[]\n value: string | null | undefined\n onSelect: (folder: string | null) => void\n}) {\n const folders = useDocumentFolders(documents, value)\n return (\n <FolderCommandList folders={folders} value={value} onSelect={onSelect} showRemove={!!value} />\n )\n}\n\n/** The related documents, the one open in the viewer marked. */\nexport function RelatedDocuments({\n doc,\n related,\n onOpen,\n onDelete,\n canDelete,\n onCompare,\n}: {\n doc: WorkspaceDocument\n related: RelatedDocs<WorkspaceDocument>\n onOpen?: (docId: string) => void\n onDelete?: (docId: string) => void\n canDelete?: (doc: WorkspaceDocument) => boolean\n onCompare?: (docId: string, otherDocId: string) => void\n}) {\n const viewingDocumentId = useOpenViewerDocumentId()\n return (\n <RelatedDocumentsCell\n currentDoc={doc}\n related={related}\n viewingDocumentId={viewingDocumentId}\n onDocumentClick={(id) => onOpen?.(id)}\n onDelete={(other) => onDelete?.(other.external_id)}\n canDelete={canDelete}\n onCompare={onCompare}\n />\n )\n}\n\n/** Who last set a value, and when: shown on hover. */\nexport function DocTagAttribution({ doctag }: { doctag: DocTag }) {\n const memberById = useMemberLookup()\n const creator = memberById(doctag.created_by_ext_id)\n const updater =\n doctag.updated_by_ext_id && doctag.updated_by_ext_id !== doctag.created_by_ext_id\n ? memberById(doctag.updated_by_ext_id)\n : undefined\n const lastUser = updater || creator\n if (!lastUser) return null\n const lines = [\n creator &&\n `Created ${formatFriendlyDate(doctag.created_at)} by ${creator.given_name || creator.email}`,\n updater &&\n `Updated ${formatFriendlyDate(doctag.updated_at)} by ${updater.given_name || updater.email}`,\n ].filter((line): line is string => !!line)\n return (\n <FieldAttribution\n avatar={<DocumentUser user={lastUser} tooltip={false} />}\n date={formatFriendlyDate(updater ? doctag.updated_at : doctag.created_at)}\n lines={lines}\n />\n )\n}\n\n/** The labels as a picker: toggle one, or create one by name and apply it. */\nexport function LabelsCombobox({\n labelTags,\n appliedTagIds,\n onToggle,\n onCreateAndApply,\n}: {\n labelTags: TagResponse[]\n appliedTagIds: ReadonlySet<string>\n onToggle: (tag: TagResponse) => void\n onCreateAndApply?: (name: string) => void\n}) {\n const options: LabelOption[] = useMemo(\n () =>\n labelTags.map((t) => ({\n id: t.external_id,\n name: t.name,\n color: getEntityColor(t.external_id, 'medium'),\n })),\n [labelTags]\n )\n\n // An existing label of that name (any case) is applied rather than made again.\n const handleCreate = (name: string) => {\n const trimmed = name.trim()\n if (!trimmed) return\n const existing = labelTags.find((t) => t.name.toLowerCase() === trimmed.toLowerCase())\n if (!existing) onCreateAndApply?.(trimmed)\n else if (!appliedTagIds.has(existing.external_id)) onToggle(existing)\n }\n\n return (\n <FieldLabelsSelect\n options={options}\n appliedIds={appliedTagIds}\n onToggle={(id) => {\n const tag = labelTags.find((t) => t.external_id === id)\n if (tag) onToggle(tag)\n }}\n onCreate={onCreateAndApply ? handleCreate : undefined}\n />\n )\n}\n","/**\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()}…`}\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()}…`}\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"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var chunkBZFCD6A6_cjs = require('./chunk-BZFCD6A6.cjs');
|
|
5
4
|
var chunkZ2XZ2D4N_cjs = require('./chunk-Z2XZ2D4N.cjs');
|
|
6
5
|
var chunkMCXS6X37_cjs = require('./chunk-MCXS6X37.cjs');
|
|
7
6
|
var chunk75BNMCUX_cjs = require('./chunk-75BNMCUX.cjs');
|
|
7
|
+
var chunkBZFCD6A6_cjs = require('./chunk-BZFCD6A6.cjs');
|
|
8
8
|
var chunkWGWP4ATS_cjs = require('./chunk-WGWP4ATS.cjs');
|
|
9
9
|
var React = require('react');
|
|
10
10
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -284,5 +284,5 @@ exports.InternalDocLink = InternalDocLink;
|
|
|
284
284
|
exports.MermaidDiagram = MermaidDiagram;
|
|
285
285
|
exports.WorkspaceDocumentReference = WorkspaceDocumentReference;
|
|
286
286
|
exports.useDocumentWorkspace = useDocumentWorkspace;
|
|
287
|
-
//# sourceMappingURL=chunk-
|
|
288
|
-
//# sourceMappingURL=chunk-
|
|
287
|
+
//# sourceMappingURL=chunk-UOGXKHTJ.cjs.map
|
|
288
|
+
//# sourceMappingURL=chunk-UOGXKHTJ.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chat/mermaid-normalize.ts","../src/connection/conversation/MermaidDiagram.tsx","../src/connection/conversation/DocumentWorkspaceContext.tsx","../src/connection/conversation/ConnectedMarkdown.tsx"],"names":["useState","useId","useEffect","jsxs","jsx","createContext","useContext","useBlocksEnvironment","React","useArbiSession","MentionChip","QuietLink","useArbiHost","Fragment","useCompactChat","useDocument","EntityPill","FileText","DocumentEntity","Mail","mentionFromHref","MarkdownLink","workspaceDocIdFromHref","MarkdownStreamingContext","MarkdownCode","rehypeDocEntityPills","useMemo","KitMarkdownRenderer"],"mappings":"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","file":"chunk-6KQVTMRL.cjs","sourcesContent":["/**\n * Defensive normalizer for single-line `graph` / `flowchart` Mermaid source.\n *\n * Some LLMs emit the entire diagram on one line. Mermaid's parser splits\n * statements on newlines, so a single-line graph fails outright. This helper\n * inserts newlines on safe statement boundaries so the diagram has a chance\n * of parsing. Only attempts normalization when:\n * 1. The source has no embedded newlines (i.e. is genuinely single-line), and\n * 2. The first directive is `graph` or `flowchart`.\n *\n * Other diagram types (sequenceDiagram, classDiagram, gantt, …) have very\n * different syntaxes — applying these heuristics to them would corrupt valid\n * input, so they're left untouched.\n *\n * Boundaries we split on:\n * - After the diagram-type header (`graph TD`, `flowchart LR`, …).\n * - Before each `style` / `classDef` / `class` / `linkStyle` / `click`\n * / `subgraph` keyword.\n * - Before/after `end` (closes a subgraph block).\n * - After a `]` (label close) that's followed by another node identifier\n * starting a new edge or node declaration.\n */\nexport function normalizeMermaidGraph(source: string): string {\n // Already multi-line — assume it's well-formed; don't touch it.\n if (/\\n/.test(source)) return source\n\n const headerMatch = source.match(/^\\s*(graph|flowchart)\\s+\\w+\\s+/)\n if (!headerMatch) return source\n\n const header = headerMatch[0].trimEnd()\n let body = source.slice(headerMatch[0].length)\n\n // Insert newline before keywords that always start a new statement.\n body = body.replace(/\\s+(style|classDef|class|linkStyle|click|subgraph)\\s/g, '\\n$1 ')\n\n // `end` closes a subgraph: put it on its own line, with a break after it\n // too so any trailing statements don't stay attached.\n body = body.replace(/\\s+end\\b\\s*/g, '\\nend\\n')\n\n // After a label close (`]`), if the next token looks like a Mermaid node id\n // followed by another `[` or `-->`, that's a new statement starting.\n body = body.replace(/\\]\\s+(?=[A-Za-z_][\\w-]*\\s*(?:\\[|-->))/g, ']\\n')\n\n // Collapse any accidental runs of blank lines we may have produced.\n body = body.replace(/\\n{2,}/g, '\\n')\n\n return `${header}\\n${body.trimStart()}`\n}\n","/**\n * MermaidDiagram Component\n *\n * Renders a Mermaid diagram from source code.\n * Used inside MarkdownRenderer to handle ```mermaid code blocks.\n * Lazy-loads the mermaid library to avoid bloating the initial bundle.\n */\n\nimport { useState, useEffect, useId } from 'react'\nimport { normalizeMermaidGraph } from '../../chat/mermaid-normalize'\n\ninterface MermaidDiagramProps {\n /** Mermaid diagram source code */\n chart: string\n}\n\n// Lazy-load and initialize mermaid once\nlet mermaidInstance: typeof import('mermaid').default | null = null\nlet mermaidLoadPromise: Promise<typeof import('mermaid').default> | null = null\n\nasync function getMermaid() {\n if (mermaidInstance) return mermaidInstance\n if (!mermaidLoadPromise) {\n mermaidLoadPromise = import('mermaid').then((mod) => {\n const m = mod.default\n m.initialize({\n startOnLoad: false,\n theme: 'default',\n securityLevel: 'strict',\n flowchart: { useMaxWidth: true, curve: 'basis' },\n })\n mermaidInstance = m\n return m\n })\n }\n return mermaidLoadPromise\n}\n\nexport function MermaidDiagram({ chart }: MermaidDiagramProps) {\n const [svg, setSvg] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const uniqueId = useId().replace(/:/g, '-')\n\n useEffect(() => {\n let cancelled = false\n\n async function render() {\n const mermaid = await getMermaid()\n const diagramId = `mermaid${uniqueId}`\n\n // Validate with parse() before render(). In Mermaid v11 a render() with\n // bad source can return a \"Syntax error in text\" bomb SVG instead of\n // throwing — and it appends DOM side-effects of its own — so a try/catch\n // around render() doesn't reliably catch failures and the bomb leaks\n // into the page (especially under React StrictMode where effects run\n // twice). parse() throws cleanly with no DOM side-effects.\n //\n // Defensive rescue: some LLMs emit single-line `graph`/`flowchart`\n // source. If the original parse fails, try a normalized variant. The\n // normalizer is a no-op on already-multi-line source and on non-graph\n // diagram types, so this only helps the bad-source case and never\n // corrupts valid input.\n let validSource: string | null = null\n let firstErr: unknown\n try {\n await mermaid.parse(chart)\n validSource = chart\n } catch (err) {\n firstErr = err\n const normalized = normalizeMermaidGraph(chart)\n if (normalized !== chart) {\n try {\n await mermaid.parse(normalized)\n validSource = normalized\n } catch (retryErr) {\n console.warn('Mermaid normalized parse also failed', retryErr)\n }\n }\n }\n\n if (cancelled) return\n\n if (!validSource) {\n console.warn('Mermaid parse failed, showing source', firstErr)\n setError('Failed to render diagram')\n setSvg(null)\n return\n }\n\n try {\n const { svg: renderedSvg } = await mermaid.render(diagramId, validSource)\n if (!cancelled) {\n setSvg(renderedSvg)\n setError(null)\n }\n } catch (renderErr) {\n if (!cancelled) {\n console.warn('Mermaid render failed despite parse success', renderErr)\n setError('Failed to render diagram')\n setSvg(null)\n }\n }\n }\n\n render()\n return () => {\n cancelled = true\n }\n }, [chart, uniqueId])\n\n if (error) {\n // Fall back to showing the raw source in a code block\n return (\n <div className=\"code-block\" data-testid=\"mermaid-error\">\n <div className=\"text-sm text-muted-foreground mb-1\">{error}</div>\n <code className=\"language-mermaid\">{chart}</code>\n </div>\n )\n }\n\n if (!svg) {\n return (\n <div\n className=\"flex items-center justify-center py-8 text-muted-foreground text-sm\"\n data-testid=\"mermaid-loading\"\n >\n Rendering diagram...\n </div>\n )\n }\n\n return (\n <div\n className=\"mermaid-diagram my-4 overflow-x-auto rounded-md border border-border bg-background p-4\"\n data-testid=\"mermaid-diagram\"\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n )\n}\n","/**\n * The workspace a conversation's document references belong to, when it is not the open one: an\n * agent's direct-message thread runs in the agent's workspace, so the documents it names are there.\n * A reference then opens that workspace first (`openDocument(id, { workspaceId })`).\n */\n\nimport { createContext, useContext, type ReactNode } from 'react'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\n/** The workspace of the documents referenced inside it (null: the open workspace). */\nexport const DocumentWorkspaceContext = createContext<string | null>(null)\nexport const useDocumentWorkspace = () => useContext(DocumentWorkspaceContext)\n\n/** A reference to a document of another workspace: opening it opens that workspace first. */\nexport function WorkspaceDocumentReference({\n workspaceId,\n docId,\n children,\n className = 'inline-flex rounded-full border px-2 py-0.5 text-xs hover:bg-muted',\n}: {\n workspaceId: string\n docId: string\n children?: ReactNode\n className?: string\n}) {\n const { openDocument } = useBlocksEnvironment()\n return (\n <button\n type=\"button\"\n className={className}\n onClick={() => openDocument(docId, { workspaceId })}\n >\n {children ?? docId}\n </button>\n )\n}\n","/**\n * The conversation's markdown: the kit's `MarkdownRenderer` (`@arbidocs/react`: sanitised HTML,\n * slugs, lazy KaTeX, streaming blocks, tables, code) with what a conversation adds: @mention chips,\n * workspace documents opening in the viewer, quiet external links, document and email pills (the\n * host's chips, `ArbiChatHost.renderDocumentChip` / `renderMailChip`) and Mermaid diagrams.\n */\nimport { useArbiHost, useArbiSession, useDocument } from '@arbidocs/react'\nimport { mentionFromHref, type MentionKind } from '@arbidocs/react/shell'\nimport {\n EntityPill,\n getDocumentTitle,\n MarkdownCode,\n MarkdownLink,\n MarkdownRenderer as KitMarkdownRenderer,\n MarkdownStreamingContext,\n type MarkdownRendererProps as KitMarkdownRendererProps,\n DocumentEntity,\n} from '@arbidocs/react/ui'\nimport React, { useContext, useMemo } from 'react'\nimport { FileText, Mail } from 'lucide-react'\n\n/** The markdown element overrides, as the kit's renderer takes them. */\ntype Components = NonNullable<KitMarkdownRendererProps['components']>\nimport { useCompactChat } from '../../chat/CompactChatContext'\nimport { MentionChip } from '../../chat/MentionMenu'\nimport { QuietLink } from '../../citations/QuietMarks'\nimport { rehypeDocEntityPills } from '../../chat/rehype-doc-entity-pills'\nimport { workspaceDocIdFromHref } from '../../chat/doc-links'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { MermaidDiagram } from './MermaidDiagram'\nimport { useDocumentWorkspace, WorkspaceDocumentReference } from './DocumentWorkspaceContext'\n\n/** Plain text of a link's children (the `@Label` of a mention link). */\nfunction childrenText(children: React.ReactNode): string {\n return React.Children.toArray(children)\n .map((child) => (typeof child === 'string' || typeof child === 'number' ? String(child) : ''))\n .join('')\n}\n\n/** A mention chip; a mention of the reader stands out. */\nfunction MentionLink({ kind, id, text }: { kind: MentionKind; id: string; text: string }) {\n const currentUserId = useArbiSession().user?.external_id\n return (\n <MentionChip\n kind={kind}\n id={id}\n label={text.replace(/^@/, '')}\n isSelf={kind === 'user' && id === currentUserId}\n />\n )\n}\n\n/**\n * A link to elsewhere, as quiet text. Its menu (Open link / Copy link) is the deliberate step\n * the old confirmation dialog used to be; nothing opens until the menu's primary row is chosen.\n */\nexport function ExternalLink({ href, children }: React.ComponentPropsWithoutRef<'a'>) {\n return (\n <QuietLink href={href} kind=\"external\">\n {children}\n </QuietLink>\n )\n}\n\n/**\n * A workspace document referenced by a link's href rather than by its text.\n *\n * `rehypeDocEntityPills` turns a bare `doc-…` id into a pill, but it only walks\n * TEXT nodes — so `[NVDA DCF Valuation Report](…doc-abc12345…)`, which is how an\n * answer links an artifact it just saved, keeps the id in the href where the\n * plugin never looks. The link then fell through to `ExternalLink`, and opening\n * your own workspace document asked you to confirm an \"external link\" and\n * launched a new tab. It opens in the document viewer, like the pill and the\n * artifact card already do.\n */\nexport function InternalDocLink({\n docId,\n href,\n children,\n}: React.ComponentPropsWithoutRef<'a'> & { docId: string }) {\n const { openDocument } = useBlocksEnvironment()\n const workspaceId = useDocumentWorkspace()\n if (workspaceId) {\n return (\n <WorkspaceDocumentReference workspaceId={workspaceId} docId={docId}>\n {children}\n </WorkspaceDocumentReference>\n )\n }\n\n return (\n <QuietLink href={href} kind=\"document\" onOpen={() => openDocument(docId)}>\n {children}\n </QuietLink>\n )\n}\n\n/** A document of the workspace, as a pill: the host's chip, else the document entity. */\nexport function DocumentChip({ docId }: { docId: string }) {\n const render = useArbiHost().chat?.renderDocumentChip\n const workspaceId = useDocumentWorkspace()\n if (workspaceId) return <WorkspaceDocumentReference workspaceId={workspaceId} docId={docId} />\n return render ? <>{render(docId)}</> : <DefaultDocumentChip docId={docId} />\n}\n\nfunction DefaultDocumentChip({ docId }: { docId: string }) {\n const compact = useCompactChat()\n const { data: doc } = useDocument(docId)\n const { openDocument } = useBlocksEnvironment()\n if (compact && doc)\n return (\n <button\n type=\"button\"\n className=\"inline text-left text-primary underline decoration-primary/30 underline-offset-2 hover:decoration-primary\"\n onClick={() => openDocument(docId)}\n >\n {getDocumentTitle(doc)}\n </button>\n )\n if (!doc)\n return (\n <EntityPill\n icon={<FileText className=\"w-3.5 h-3.5 flex-shrink-0\" />}\n label={docId}\n size=\"sm\"\n onClick={() => openDocument(docId)}\n data-testid=\"doc-entity-pill\"\n />\n )\n return (\n <DocumentEntity doc={doc} onClick={() => openDocument(docId)} data-testid=\"doc-entity-pill\" />\n )\n}\n\n/** An email of the person's mailbox, as a pill: the host's chip, else a plain \"Email\". */\nfunction MailChip({ mailId }: { mailId: string }) {\n const render = useArbiHost().chat?.renderMailChip\n if (render) return <>{render(mailId)}</>\n return (\n <EntityPill\n icon={<Mail className=\"w-3.5 h-3.5 flex-shrink-0\" />}\n label=\"Email\"\n size=\"sm\"\n data-testid=\"mail-entity-pill\"\n />\n )\n}\n\n/**\n * The conversation's overrides, layered on the kit's defaults. Module scope, so the reference is stable\n * and memoised markdown blocks do not re-parse.\n */\nconst conversationMarkdownComponents: Partial<Components> = {\n a: function ConversationMarkdownLink({\n href,\n children,\n ...props\n }: React.ComponentPropsWithoutRef<'a'>) {\n const deploymentDomain = useBlocksEnvironment().runtimeConfig.deploymentDomain\n // @mentions: `linkMentions` turned them into `#mention-<id>` links; draw them as chips.\n const mention = mentionFromHref(href)\n if (mention) {\n return <MentionLink kind={mention.kind} id={mention.id} text={childrenText(children)} />\n }\n // Bookmarks: in-page anchors are near-invisible text; the menu jumps or copies the place.\n if (href?.startsWith('#') && !href.startsWith('#cite-')) {\n return (\n <QuietLink href={href} kind=\"anchor\">\n {children}\n </QuietLink>\n )\n }\n // Citations, `cite:` references and bare links: the kit's link.\n if (!href || href.startsWith('#') || href.startsWith('cite:')) {\n return (\n <MarkdownLink href={href} {...props}>\n {children}\n </MarkdownLink>\n )\n }\n // A workspace document is not an external link, wherever it is hosted: it opens in the viewer.\n const docId = workspaceDocIdFromHref(href, deploymentDomain)\n if (docId) {\n return (\n <InternalDocLink docId={docId} href={href} {...props}>\n {children}\n </InternalDocLink>\n )\n }\n return (\n <ExternalLink href={href} {...props}>\n {children}\n </ExternalLink>\n )\n },\n code: function ConversationMarkdownCode(\n props: React.ComponentPropsWithoutRef<'code'> & { inline?: boolean }\n ) {\n const isStreaming = useContext(MarkdownStreamingContext)\n const { className, children } = props\n const language = /language-(\\w+)/.exec(className || '')?.[1]\n if (!language) {\n // Answers often backtick a bare doc id (`doc-f7b3eeb5`). The text-node pass skips code, so\n // the id would stay monospace text; show it as the document pill. Only a whole id (eight\n // alphanumerics): while streaming, a partial one (\"doc-e\") would be looked up and 404.\n const codeText = typeof children === 'string' ? children.trim() : ''\n if (/^doc-[a-zA-Z0-9]{8}$/.test(codeText)) return <DocumentChip docId={codeText} />\n if (/^eml-[a-zA-Z0-9]{8}$/.test(codeText)) return <MailChip mailId={codeText} />\n }\n // Mermaid lazy-loads its own bundle and re-renders SVG on every change. While streaming the\n // fence is almost always partial, so it stays a code block until generation completes.\n if (language === 'mermaid' && !isStreaming) {\n return <MermaidDiagram chart={String(children).replace(/\\n$/, '')} />\n }\n return <MarkdownCode {...props} />\n },\n span: ({ children, className, ...props }: React.ComponentPropsWithoutRef<'span'>) => {\n const docId = (props as Record<string, unknown>)['data-doc-id'] as string | undefined\n if (docId) return <DocumentChip docId={docId} />\n const mailId = (props as Record<string, unknown>)['data-mail-id'] as string | undefined\n if (mailId) return <MailChip mailId={mailId} />\n return (\n <span className={className} {...props}>\n {children}\n </span>\n )\n },\n}\n\n/** Bare `doc-…` / `eml-…` ids in text become `<span data-doc-id>` / `<span data-mail-id>` pills. */\nconst conversationRehypePlugins = [rehypeDocEntityPills]\n\nexport type ConnectedMarkdownProps = Omit<\n KitMarkdownRendererProps,\n 'rehypePlugins' | 'allowHtml' | 'renderCitation'\n>\n\n/**\n * The kit's renderer with the conversation's overrides; a caller's `components` (e.g. the citation\n * core's) still win over both.\n */\nfunction ConnectedMarkdownComponent({ components, ...props }: ConnectedMarkdownProps) {\n const merged = useMemo(\n () =>\n components\n ? { ...conversationMarkdownComponents, ...components }\n : conversationMarkdownComponents,\n [components]\n )\n return (\n <KitMarkdownRenderer {...props} components={merged} rehypePlugins={conversationRehypePlugins} />\n )\n}\n\nexport const ConnectedMarkdown = React.memo(ConnectedMarkdownComponent)\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/chat/mermaid-normalize.ts","../src/connection/conversation/MermaidDiagram.tsx","../src/connection/conversation/DocumentWorkspaceContext.tsx","../src/connection/conversation/ConnectedMarkdown.tsx"],"names":["useState","useId","useEffect","jsxs","jsx","createContext","useContext","useBlocksEnvironment","React","useArbiSession","MentionChip","QuietLink","useArbiHost","Fragment","useCompactChat","useDocument","EntityPill","FileText","DocumentEntity","Mail","mentionFromHref","MarkdownLink","workspaceDocIdFromHref","MarkdownStreamingContext","MarkdownCode","rehypeDocEntityPills","useMemo","KitMarkdownRenderer"],"mappings":"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","file":"chunk-UOGXKHTJ.cjs","sourcesContent":["/**\n * Defensive normalizer for single-line `graph` / `flowchart` Mermaid source.\n *\n * Some LLMs emit the entire diagram on one line. Mermaid's parser splits\n * statements on newlines, so a single-line graph fails outright. This helper\n * inserts newlines on safe statement boundaries so the diagram has a chance\n * of parsing. Only attempts normalization when:\n * 1. The source has no embedded newlines (i.e. is genuinely single-line), and\n * 2. The first directive is `graph` or `flowchart`.\n *\n * Other diagram types (sequenceDiagram, classDiagram, gantt, …) have very\n * different syntaxes — applying these heuristics to them would corrupt valid\n * input, so they're left untouched.\n *\n * Boundaries we split on:\n * - After the diagram-type header (`graph TD`, `flowchart LR`, …).\n * - Before each `style` / `classDef` / `class` / `linkStyle` / `click`\n * / `subgraph` keyword.\n * - Before/after `end` (closes a subgraph block).\n * - After a `]` (label close) that's followed by another node identifier\n * starting a new edge or node declaration.\n */\nexport function normalizeMermaidGraph(source: string): string {\n // Already multi-line — assume it's well-formed; don't touch it.\n if (/\\n/.test(source)) return source\n\n const headerMatch = source.match(/^\\s*(graph|flowchart)\\s+\\w+\\s+/)\n if (!headerMatch) return source\n\n const header = headerMatch[0].trimEnd()\n let body = source.slice(headerMatch[0].length)\n\n // Insert newline before keywords that always start a new statement.\n body = body.replace(/\\s+(style|classDef|class|linkStyle|click|subgraph)\\s/g, '\\n$1 ')\n\n // `end` closes a subgraph: put it on its own line, with a break after it\n // too so any trailing statements don't stay attached.\n body = body.replace(/\\s+end\\b\\s*/g, '\\nend\\n')\n\n // After a label close (`]`), if the next token looks like a Mermaid node id\n // followed by another `[` or `-->`, that's a new statement starting.\n body = body.replace(/\\]\\s+(?=[A-Za-z_][\\w-]*\\s*(?:\\[|-->))/g, ']\\n')\n\n // Collapse any accidental runs of blank lines we may have produced.\n body = body.replace(/\\n{2,}/g, '\\n')\n\n return `${header}\\n${body.trimStart()}`\n}\n","/**\n * MermaidDiagram Component\n *\n * Renders a Mermaid diagram from source code.\n * Used inside MarkdownRenderer to handle ```mermaid code blocks.\n * Lazy-loads the mermaid library to avoid bloating the initial bundle.\n */\n\nimport { useState, useEffect, useId } from 'react'\nimport { normalizeMermaidGraph } from '../../chat/mermaid-normalize'\n\ninterface MermaidDiagramProps {\n /** Mermaid diagram source code */\n chart: string\n}\n\n// Lazy-load and initialize mermaid once\nlet mermaidInstance: typeof import('mermaid').default | null = null\nlet mermaidLoadPromise: Promise<typeof import('mermaid').default> | null = null\n\nasync function getMermaid() {\n if (mermaidInstance) return mermaidInstance\n if (!mermaidLoadPromise) {\n mermaidLoadPromise = import('mermaid').then((mod) => {\n const m = mod.default\n m.initialize({\n startOnLoad: false,\n theme: 'default',\n securityLevel: 'strict',\n flowchart: { useMaxWidth: true, curve: 'basis' },\n })\n mermaidInstance = m\n return m\n })\n }\n return mermaidLoadPromise\n}\n\nexport function MermaidDiagram({ chart }: MermaidDiagramProps) {\n const [svg, setSvg] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const uniqueId = useId().replace(/:/g, '-')\n\n useEffect(() => {\n let cancelled = false\n\n async function render() {\n const mermaid = await getMermaid()\n const diagramId = `mermaid${uniqueId}`\n\n // Validate with parse() before render(). In Mermaid v11 a render() with\n // bad source can return a \"Syntax error in text\" bomb SVG instead of\n // throwing — and it appends DOM side-effects of its own — so a try/catch\n // around render() doesn't reliably catch failures and the bomb leaks\n // into the page (especially under React StrictMode where effects run\n // twice). parse() throws cleanly with no DOM side-effects.\n //\n // Defensive rescue: some LLMs emit single-line `graph`/`flowchart`\n // source. If the original parse fails, try a normalized variant. The\n // normalizer is a no-op on already-multi-line source and on non-graph\n // diagram types, so this only helps the bad-source case and never\n // corrupts valid input.\n let validSource: string | null = null\n let firstErr: unknown\n try {\n await mermaid.parse(chart)\n validSource = chart\n } catch (err) {\n firstErr = err\n const normalized = normalizeMermaidGraph(chart)\n if (normalized !== chart) {\n try {\n await mermaid.parse(normalized)\n validSource = normalized\n } catch (retryErr) {\n console.warn('Mermaid normalized parse also failed', retryErr)\n }\n }\n }\n\n if (cancelled) return\n\n if (!validSource) {\n console.warn('Mermaid parse failed, showing source', firstErr)\n setError('Failed to render diagram')\n setSvg(null)\n return\n }\n\n try {\n const { svg: renderedSvg } = await mermaid.render(diagramId, validSource)\n if (!cancelled) {\n setSvg(renderedSvg)\n setError(null)\n }\n } catch (renderErr) {\n if (!cancelled) {\n console.warn('Mermaid render failed despite parse success', renderErr)\n setError('Failed to render diagram')\n setSvg(null)\n }\n }\n }\n\n render()\n return () => {\n cancelled = true\n }\n }, [chart, uniqueId])\n\n if (error) {\n // Fall back to showing the raw source in a code block\n return (\n <div className=\"code-block\" data-testid=\"mermaid-error\">\n <div className=\"text-sm text-muted-foreground mb-1\">{error}</div>\n <code className=\"language-mermaid\">{chart}</code>\n </div>\n )\n }\n\n if (!svg) {\n return (\n <div\n className=\"flex items-center justify-center py-8 text-muted-foreground text-sm\"\n data-testid=\"mermaid-loading\"\n >\n Rendering diagram...\n </div>\n )\n }\n\n return (\n <div\n className=\"mermaid-diagram my-4 overflow-x-auto rounded-md border border-border bg-background p-4\"\n data-testid=\"mermaid-diagram\"\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n )\n}\n","/**\n * The workspace a conversation's document references belong to, when it is not the open one: an\n * agent's direct-message thread runs in the agent's workspace, so the documents it names are there.\n * A reference then opens that workspace first (`openDocument(id, { workspaceId })`).\n */\n\nimport { createContext, useContext, type ReactNode } from 'react'\nimport { useBlocksEnvironment } from '../../provider/environment'\n\n/** The workspace of the documents referenced inside it (null: the open workspace). */\nexport const DocumentWorkspaceContext = createContext<string | null>(null)\nexport const useDocumentWorkspace = () => useContext(DocumentWorkspaceContext)\n\n/** A reference to a document of another workspace: opening it opens that workspace first. */\nexport function WorkspaceDocumentReference({\n workspaceId,\n docId,\n children,\n className = 'inline-flex rounded-full border px-2 py-0.5 text-xs hover:bg-muted',\n}: {\n workspaceId: string\n docId: string\n children?: ReactNode\n className?: string\n}) {\n const { openDocument } = useBlocksEnvironment()\n return (\n <button\n type=\"button\"\n className={className}\n onClick={() => openDocument(docId, { workspaceId })}\n >\n {children ?? docId}\n </button>\n )\n}\n","/**\n * The conversation's markdown: the kit's `MarkdownRenderer` (`@arbidocs/react`: sanitised HTML,\n * slugs, lazy KaTeX, streaming blocks, tables, code) with what a conversation adds: @mention chips,\n * workspace documents opening in the viewer, quiet external links, document and email pills (the\n * host's chips, `ArbiChatHost.renderDocumentChip` / `renderMailChip`) and Mermaid diagrams.\n */\nimport { useArbiHost, useArbiSession, useDocument } from '@arbidocs/react'\nimport { mentionFromHref, type MentionKind } from '@arbidocs/react/shell'\nimport {\n EntityPill,\n getDocumentTitle,\n MarkdownCode,\n MarkdownLink,\n MarkdownRenderer as KitMarkdownRenderer,\n MarkdownStreamingContext,\n type MarkdownRendererProps as KitMarkdownRendererProps,\n DocumentEntity,\n} from '@arbidocs/react/ui'\nimport React, { useContext, useMemo } from 'react'\nimport { FileText, Mail } from 'lucide-react'\n\n/** The markdown element overrides, as the kit's renderer takes them. */\ntype Components = NonNullable<KitMarkdownRendererProps['components']>\nimport { useCompactChat } from '../../chat/CompactChatContext'\nimport { MentionChip } from '../../chat/MentionMenu'\nimport { QuietLink } from '../../citations/QuietMarks'\nimport { rehypeDocEntityPills } from '../../chat/rehype-doc-entity-pills'\nimport { workspaceDocIdFromHref } from '../../chat/doc-links'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { MermaidDiagram } from './MermaidDiagram'\nimport { useDocumentWorkspace, WorkspaceDocumentReference } from './DocumentWorkspaceContext'\n\n/** Plain text of a link's children (the `@Label` of a mention link). */\nfunction childrenText(children: React.ReactNode): string {\n return React.Children.toArray(children)\n .map((child) => (typeof child === 'string' || typeof child === 'number' ? String(child) : ''))\n .join('')\n}\n\n/** A mention chip; a mention of the reader stands out. */\nfunction MentionLink({ kind, id, text }: { kind: MentionKind; id: string; text: string }) {\n const currentUserId = useArbiSession().user?.external_id\n return (\n <MentionChip\n kind={kind}\n id={id}\n label={text.replace(/^@/, '')}\n isSelf={kind === 'user' && id === currentUserId}\n />\n )\n}\n\n/**\n * A link to elsewhere, as quiet text. Its menu (Open link / Copy link) is the deliberate step\n * the old confirmation dialog used to be; nothing opens until the menu's primary row is chosen.\n */\nexport function ExternalLink({ href, children }: React.ComponentPropsWithoutRef<'a'>) {\n return (\n <QuietLink href={href} kind=\"external\">\n {children}\n </QuietLink>\n )\n}\n\n/**\n * A workspace document referenced by a link's href rather than by its text.\n *\n * `rehypeDocEntityPills` turns a bare `doc-…` id into a pill, but it only walks\n * TEXT nodes — so `[NVDA DCF Valuation Report](…doc-abc12345…)`, which is how an\n * answer links an artifact it just saved, keeps the id in the href where the\n * plugin never looks. The link then fell through to `ExternalLink`, and opening\n * your own workspace document asked you to confirm an \"external link\" and\n * launched a new tab. It opens in the document viewer, like the pill and the\n * artifact card already do.\n */\nexport function InternalDocLink({\n docId,\n href,\n children,\n}: React.ComponentPropsWithoutRef<'a'> & { docId: string }) {\n const { openDocument } = useBlocksEnvironment()\n const workspaceId = useDocumentWorkspace()\n if (workspaceId) {\n return (\n <WorkspaceDocumentReference workspaceId={workspaceId} docId={docId}>\n {children}\n </WorkspaceDocumentReference>\n )\n }\n\n return (\n <QuietLink href={href} kind=\"document\" onOpen={() => openDocument(docId)}>\n {children}\n </QuietLink>\n )\n}\n\n/** A document of the workspace, as a pill: the host's chip, else the document entity. */\nexport function DocumentChip({ docId }: { docId: string }) {\n const render = useArbiHost().chat?.renderDocumentChip\n const workspaceId = useDocumentWorkspace()\n if (workspaceId) return <WorkspaceDocumentReference workspaceId={workspaceId} docId={docId} />\n return render ? <>{render(docId)}</> : <DefaultDocumentChip docId={docId} />\n}\n\nfunction DefaultDocumentChip({ docId }: { docId: string }) {\n const compact = useCompactChat()\n const { data: doc } = useDocument(docId)\n const { openDocument } = useBlocksEnvironment()\n if (compact && doc)\n return (\n <button\n type=\"button\"\n className=\"inline text-left text-primary underline decoration-primary/30 underline-offset-2 hover:decoration-primary\"\n onClick={() => openDocument(docId)}\n >\n {getDocumentTitle(doc)}\n </button>\n )\n if (!doc)\n return (\n <EntityPill\n icon={<FileText className=\"w-3.5 h-3.5 flex-shrink-0\" />}\n label={docId}\n size=\"sm\"\n onClick={() => openDocument(docId)}\n data-testid=\"doc-entity-pill\"\n />\n )\n return (\n <DocumentEntity doc={doc} onClick={() => openDocument(docId)} data-testid=\"doc-entity-pill\" />\n )\n}\n\n/** An email of the person's mailbox, as a pill: the host's chip, else a plain \"Email\". */\nfunction MailChip({ mailId }: { mailId: string }) {\n const render = useArbiHost().chat?.renderMailChip\n if (render) return <>{render(mailId)}</>\n return (\n <EntityPill\n icon={<Mail className=\"w-3.5 h-3.5 flex-shrink-0\" />}\n label=\"Email\"\n size=\"sm\"\n data-testid=\"mail-entity-pill\"\n />\n )\n}\n\n/**\n * The conversation's overrides, layered on the kit's defaults. Module scope, so the reference is stable\n * and memoised markdown blocks do not re-parse.\n */\nconst conversationMarkdownComponents: Partial<Components> = {\n a: function ConversationMarkdownLink({\n href,\n children,\n ...props\n }: React.ComponentPropsWithoutRef<'a'>) {\n const deploymentDomain = useBlocksEnvironment().runtimeConfig.deploymentDomain\n // @mentions: `linkMentions` turned them into `#mention-<id>` links; draw them as chips.\n const mention = mentionFromHref(href)\n if (mention) {\n return <MentionLink kind={mention.kind} id={mention.id} text={childrenText(children)} />\n }\n // Bookmarks: in-page anchors are near-invisible text; the menu jumps or copies the place.\n if (href?.startsWith('#') && !href.startsWith('#cite-')) {\n return (\n <QuietLink href={href} kind=\"anchor\">\n {children}\n </QuietLink>\n )\n }\n // Citations, `cite:` references and bare links: the kit's link.\n if (!href || href.startsWith('#') || href.startsWith('cite:')) {\n return (\n <MarkdownLink href={href} {...props}>\n {children}\n </MarkdownLink>\n )\n }\n // A workspace document is not an external link, wherever it is hosted: it opens in the viewer.\n const docId = workspaceDocIdFromHref(href, deploymentDomain)\n if (docId) {\n return (\n <InternalDocLink docId={docId} href={href} {...props}>\n {children}\n </InternalDocLink>\n )\n }\n return (\n <ExternalLink href={href} {...props}>\n {children}\n </ExternalLink>\n )\n },\n code: function ConversationMarkdownCode(\n props: React.ComponentPropsWithoutRef<'code'> & { inline?: boolean }\n ) {\n const isStreaming = useContext(MarkdownStreamingContext)\n const { className, children } = props\n const language = /language-(\\w+)/.exec(className || '')?.[1]\n if (!language) {\n // Answers often backtick a bare doc id (`doc-f7b3eeb5`). The text-node pass skips code, so\n // the id would stay monospace text; show it as the document pill. Only a whole id (eight\n // alphanumerics): while streaming, a partial one (\"doc-e\") would be looked up and 404.\n const codeText = typeof children === 'string' ? children.trim() : ''\n if (/^doc-[a-zA-Z0-9]{8}$/.test(codeText)) return <DocumentChip docId={codeText} />\n if (/^eml-[a-zA-Z0-9]{8}$/.test(codeText)) return <MailChip mailId={codeText} />\n }\n // Mermaid lazy-loads its own bundle and re-renders SVG on every change. While streaming the\n // fence is almost always partial, so it stays a code block until generation completes.\n if (language === 'mermaid' && !isStreaming) {\n return <MermaidDiagram chart={String(children).replace(/\\n$/, '')} />\n }\n return <MarkdownCode {...props} />\n },\n span: ({ children, className, ...props }: React.ComponentPropsWithoutRef<'span'>) => {\n const docId = (props as Record<string, unknown>)['data-doc-id'] as string | undefined\n if (docId) return <DocumentChip docId={docId} />\n const mailId = (props as Record<string, unknown>)['data-mail-id'] as string | undefined\n if (mailId) return <MailChip mailId={mailId} />\n return (\n <span className={className} {...props}>\n {children}\n </span>\n )\n },\n}\n\n/** Bare `doc-…` / `eml-…` ids in text become `<span data-doc-id>` / `<span data-mail-id>` pills. */\nconst conversationRehypePlugins = [rehypeDocEntityPills]\n\nexport type ConnectedMarkdownProps = Omit<\n KitMarkdownRendererProps,\n 'rehypePlugins' | 'allowHtml' | 'renderCitation'\n>\n\n/**\n * The kit's renderer with the conversation's overrides; a caller's `components` (e.g. the citation\n * core's) still win over both.\n */\nfunction ConnectedMarkdownComponent({ components, ...props }: ConnectedMarkdownProps) {\n const merged = useMemo(\n () =>\n components\n ? { ...conversationMarkdownComponents, ...components }\n : conversationMarkdownComponents,\n [components]\n )\n return (\n <KitMarkdownRenderer {...props} components={merged} rehypePlugins={conversationRehypePlugins} />\n )\n}\n\nexport const ConnectedMarkdown = React.memo(ConnectedMarkdownComponent)\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
4
|
+
var chunkMT3RPUQC_cjs = require('./chunk-MT3RPUQC.cjs');
|
|
5
|
+
var chunkJ24LYNTY_cjs = require('./chunk-J24LYNTY.cjs');
|
|
6
|
+
var chunkERDQ4DAX_cjs = require('./chunk-ERDQ4DAX.cjs');
|
|
7
7
|
var chunkTMX7YFVM_cjs = require('./chunk-TMX7YFVM.cjs');
|
|
8
8
|
var react$1 = require('react');
|
|
9
9
|
var react = require('@arbidocs/react');
|
|
@@ -87,14 +87,14 @@ function ConnectedTagEntity({
|
|
|
87
87
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "Created:" }),
|
|
88
88
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: ui.formatFriendlyDate(tag.created_at) }),
|
|
89
89
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "by" }),
|
|
90
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
90
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkJ24LYNTY_cjs.UserAvatar, { user: creator ?? void 0 })
|
|
91
91
|
] }),
|
|
92
92
|
tag.updated_at && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
93
93
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "Updated:" }),
|
|
94
94
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: ui.formatFriendlyDate(tag.updated_at) }),
|
|
95
95
|
updater && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
96
96
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "by" }),
|
|
97
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
97
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkJ24LYNTY_cjs.UserAvatar, { user: updater })
|
|
98
98
|
] })
|
|
99
99
|
] })
|
|
100
100
|
] })
|
|
@@ -116,8 +116,8 @@ function FolderPicker({
|
|
|
116
116
|
value,
|
|
117
117
|
onSelect
|
|
118
118
|
}) {
|
|
119
|
-
const folders =
|
|
120
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
119
|
+
const folders = chunkJ24LYNTY_cjs.useDocumentFolders(documents, value);
|
|
120
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkERDQ4DAX_cjs.FolderCommandList, { folders, value, onSelect, showRemove: !!value });
|
|
121
121
|
}
|
|
122
122
|
function RelatedDocuments({
|
|
123
123
|
doc,
|
|
@@ -129,7 +129,7 @@ function RelatedDocuments({
|
|
|
129
129
|
}) {
|
|
130
130
|
const viewingDocumentId = react.useOpenViewerDocumentId();
|
|
131
131
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
132
|
-
|
|
132
|
+
chunkJ24LYNTY_cjs.RelatedDocumentsCell,
|
|
133
133
|
{
|
|
134
134
|
currentDoc: doc,
|
|
135
135
|
related,
|
|
@@ -152,9 +152,9 @@ function DocTagAttribution({ doctag }) {
|
|
|
152
152
|
updater && `Updated ${ui.formatFriendlyDate(doctag.updated_at)} by ${updater.given_name || updater.email}`
|
|
153
153
|
].filter((line) => !!line);
|
|
154
154
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
155
|
-
|
|
155
|
+
chunkERDQ4DAX_cjs.FieldAttribution,
|
|
156
156
|
{
|
|
157
|
-
avatar: /* @__PURE__ */ jsxRuntime.jsx(
|
|
157
|
+
avatar: /* @__PURE__ */ jsxRuntime.jsx(chunkMT3RPUQC_cjs.DocumentUser, { user: lastUser, tooltip: false }),
|
|
158
158
|
date: ui.formatFriendlyDate(updater ? doctag.updated_at : doctag.created_at),
|
|
159
159
|
lines
|
|
160
160
|
}
|
|
@@ -182,7 +182,7 @@ function LabelsCombobox({
|
|
|
182
182
|
else if (!appliedTagIds.has(existing.external_id)) onToggle(existing);
|
|
183
183
|
};
|
|
184
184
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
185
|
-
|
|
185
|
+
chunkERDQ4DAX_cjs.FieldLabelsSelect,
|
|
186
186
|
{
|
|
187
187
|
options,
|
|
188
188
|
appliedIds: appliedTagIds,
|
|
@@ -204,15 +204,15 @@ var METADATA_FIELDS = {
|
|
|
204
204
|
};
|
|
205
205
|
var INPUT_CLASS = "text-sm bg-muted/40 focus:bg-background transition-colors";
|
|
206
206
|
var READ_ONLY_FIELDS = {
|
|
207
|
-
file_name: (doc) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
208
|
-
status: (doc) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
209
|
-
n_pages: (doc) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
210
|
-
created_at: (doc) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
211
|
-
updated_at: (doc) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
212
|
-
file_type: (doc) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
213
|
-
file_size: (doc) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
214
|
-
doc_id: (doc) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
215
|
-
content_hash: (doc) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
207
|
+
file_name: (doc) => /* @__PURE__ */ jsxRuntime.jsx(chunkERDQ4DAX_cjs.FieldValue, { tone: "strong", children: doc.file_name || "N/A" }),
|
|
208
|
+
status: (doc) => /* @__PURE__ */ jsxRuntime.jsx(chunkERDQ4DAX_cjs.FieldValue, { tone: "muted", children: doc.status || "N/A" }),
|
|
209
|
+
n_pages: (doc) => /* @__PURE__ */ jsxRuntime.jsx(chunkERDQ4DAX_cjs.FieldValue, { tone: "muted", children: doc.n_pages || "N/A" }),
|
|
210
|
+
created_at: (doc) => /* @__PURE__ */ jsxRuntime.jsx(chunkERDQ4DAX_cjs.FieldValue, { tone: "muted", children: doc.created_at ? ui.formatFriendlyDate(doc.created_at) : "N/A" }),
|
|
211
|
+
updated_at: (doc) => /* @__PURE__ */ jsxRuntime.jsx(chunkERDQ4DAX_cjs.FieldValue, { tone: "muted", children: doc.updated_at ? ui.formatFriendlyDate(doc.updated_at) : "N/A" }),
|
|
212
|
+
file_type: (doc) => /* @__PURE__ */ jsxRuntime.jsx(chunkERDQ4DAX_cjs.FieldValue, { tone: "muted", children: ui.friendlyFileType(doc.file_type, doc.file_name) }),
|
|
213
|
+
file_size: (doc) => /* @__PURE__ */ jsxRuntime.jsx(chunkERDQ4DAX_cjs.FieldValue, { tone: "muted", children: doc.file_size ? `${Math.round(doc.file_size / 1024)} KB` : "N/A" }),
|
|
214
|
+
doc_id: (doc) => /* @__PURE__ */ jsxRuntime.jsx(chunkERDQ4DAX_cjs.FieldValue, { tone: "muted", isMono: true, children: doc.external_id || "N/A" }),
|
|
215
|
+
content_hash: (doc) => /* @__PURE__ */ jsxRuntime.jsx(chunkERDQ4DAX_cjs.FieldValue, { tone: "muted", isMono: true, isTruncated: true, children: doc.content_hash || "N/A" })
|
|
216
216
|
};
|
|
217
217
|
function documentFieldContent(options) {
|
|
218
218
|
const { columnId, doc, canEdit, workspaceTags, getColumnLabel, getColumnIcon } = options;
|
|
@@ -235,16 +235,16 @@ function documentFieldContent(options) {
|
|
|
235
235
|
placeholder: `Add ${getColumnLabel(columnId).toLowerCase()}\u2026`,
|
|
236
236
|
className: INPUT_CLASS
|
|
237
237
|
}
|
|
238
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
238
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(chunkERDQ4DAX_cjs.FieldValue, { children: metadata(doc) || "N/A" })
|
|
239
239
|
);
|
|
240
240
|
}
|
|
241
241
|
const readOnly = READ_ONLY_FIELDS[columnId];
|
|
242
242
|
if (readOnly) return standard(readOnly(doc));
|
|
243
|
-
if (columnId === "created_by") return standard(/* @__PURE__ */ jsxRuntime.jsx(
|
|
243
|
+
if (columnId === "created_by") return standard(/* @__PURE__ */ jsxRuntime.jsx(chunkMT3RPUQC_cjs.DocumentUser, { user: options.creator }));
|
|
244
244
|
if (columnId === "folder") {
|
|
245
245
|
return standard(
|
|
246
246
|
canEdit ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
247
|
-
|
|
247
|
+
chunkERDQ4DAX_cjs.FieldFolderSelect,
|
|
248
248
|
{
|
|
249
249
|
folder: doc.folder,
|
|
250
250
|
picker: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -256,7 +256,7 @@ function documentFieldContent(options) {
|
|
|
256
256
|
}
|
|
257
257
|
)
|
|
258
258
|
}
|
|
259
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
259
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(chunkERDQ4DAX_cjs.FieldFolderValue, { folder: doc.folder })
|
|
260
260
|
);
|
|
261
261
|
}
|
|
262
262
|
if (columnId === "related") {
|
|
@@ -299,7 +299,7 @@ function documentFieldContent(options) {
|
|
|
299
299
|
let value;
|
|
300
300
|
if (tag.tag_type.type === "select") {
|
|
301
301
|
value = /* @__PURE__ */ jsxRuntime.jsx(
|
|
302
|
-
|
|
302
|
+
chunkERDQ4DAX_cjs.FieldNativeSelect,
|
|
303
303
|
{
|
|
304
304
|
value: doctag?.note || "",
|
|
305
305
|
options: tag.tag_type.options,
|
|
@@ -333,12 +333,12 @@ function documentFieldContent(options) {
|
|
|
333
333
|
return {
|
|
334
334
|
label: tag.name,
|
|
335
335
|
tag,
|
|
336
|
-
children: doctag ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
336
|
+
children: doctag ? /* @__PURE__ */ jsxRuntime.jsx(chunkERDQ4DAX_cjs.FieldWithAttribution, { attribution: /* @__PURE__ */ jsxRuntime.jsx(DocTagAttribution, { doctag }), children: value }) : value
|
|
337
337
|
};
|
|
338
338
|
}
|
|
339
339
|
|
|
340
340
|
exports.ConnectedTagEntity = ConnectedTagEntity;
|
|
341
341
|
exports.documentFieldContent = documentFieldContent;
|
|
342
342
|
exports.useMemberLookup = useMemberLookup;
|
|
343
|
-
//# sourceMappingURL=chunk-
|
|
344
|
-
//# sourceMappingURL=chunk-
|
|
343
|
+
//# sourceMappingURL=chunk-VD33HXFZ.cjs.map
|
|
344
|
+
//# sourceMappingURL=chunk-VD33HXFZ.cjs.map
|