@arbidocs/blocks 0.5.48 → 0.5.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DocumentReviewCard-DLR4XOIZ.cjs +516 -0
- package/dist/DocumentReviewCard-DLR4XOIZ.cjs.map +1 -0
- package/dist/DocumentReviewCard-Y67FFRPC.js +514 -0
- package/dist/DocumentReviewCard-Y67FFRPC.js.map +1 -0
- package/dist/calls/connected/ConnectedCallPage.d.ts +23 -0
- package/dist/calls/connected/index.d.ts +1 -0
- package/dist/calls/index.cjs +172 -0
- package/dist/calls/index.cjs.map +1 -1
- package/dist/calls/index.js +175 -4
- package/dist/calls/index.js.map +1 -1
- package/dist/chunk-3Y4UTPCD.js +1521 -0
- package/dist/chunk-3Y4UTPCD.js.map +1 -0
- package/dist/chunk-5TDGVOR5.js +142 -0
- package/dist/chunk-5TDGVOR5.js.map +1 -0
- package/dist/{chunk-QKOFQMAY.cjs → chunk-5YX3R6CK.cjs} +5 -4
- package/dist/chunk-5YX3R6CK.cjs.map +1 -0
- package/dist/chunk-63IH7V5F.js +13 -0
- package/dist/chunk-63IH7V5F.js.map +1 -0
- package/dist/chunk-C3VTWM74.js +123 -0
- package/dist/chunk-C3VTWM74.js.map +1 -0
- package/dist/chunk-DVE6NNZ2.cjs +15 -0
- package/dist/chunk-DVE6NNZ2.cjs.map +1 -0
- package/dist/{chunk-XBITXJZU.js → chunk-EQ433QPZ.js} +4 -3
- package/dist/chunk-EQ433QPZ.js.map +1 -0
- package/dist/{chunk-UAEYU2NN.cjs → chunk-H32DV7XS.cjs} +2 -136
- package/dist/chunk-H32DV7XS.cjs.map +1 -0
- package/dist/{chunk-EARQ2CUX.js → chunk-IQ3VDTR7.js} +6 -119
- package/dist/chunk-IQ3VDTR7.js.map +1 -0
- package/dist/chunk-NUQ3RY7M.cjs +130 -0
- package/dist/chunk-NUQ3RY7M.cjs.map +1 -0
- package/dist/{chunk-V2UQR7P6.cjs → chunk-QLY22ZZW.cjs} +9 -8
- package/dist/chunk-QLY22ZZW.cjs.map +1 -0
- package/dist/chunk-REH7PX3N.cjs +145 -0
- package/dist/chunk-REH7PX3N.cjs.map +1 -0
- package/dist/{chunk-VQHXVY26.cjs → chunk-RTS3B2W7.cjs} +2 -121
- package/dist/chunk-RTS3B2W7.cjs.map +1 -0
- package/dist/chunk-S7B5E3RU.cjs +1553 -0
- package/dist/chunk-S7B5E3RU.cjs.map +1 -0
- package/dist/{chunk-WZ63HE2C.js → chunk-XRL4R2TT.js} +4 -136
- package/dist/chunk-XRL4R2TT.js.map +1 -0
- package/dist/{chunk-E6EYRQC2.js → chunk-YYZH6VRP.js} +6 -5
- package/dist/chunk-YYZH6VRP.js.map +1 -0
- package/dist/connect/index.cjs +464 -1861
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.js +55 -1538
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +39 -39
- package/dist/connect/viewer.js +1 -1
- package/dist/connection/config/useDeveloperConfig.d.ts +1 -1
- package/dist/connection/files/fields/DocumentFieldParts.d.ts +2 -1
- package/dist/connection/files/fields/documentField.d.ts +1 -0
- package/dist/connection/files/grid/cells.d.ts +1 -0
- package/dist/connection/files/page/ConnectedFilesPage.d.ts +5 -2
- package/dist/connection/files/review/DocumentReviewCard.d.ts +32 -0
- package/dist/connection/files/review/useDocumentValueWrites.d.ts +15 -0
- package/dist/connection/files/review/useReviewColumns.d.ts +33 -0
- package/dist/files/cells/RelatedDocsCell.d.ts +3 -1
- package/dist/files/index.cjs +221 -221
- package/dist/files/index.js +1 -1
- package/dist/home/index.cjs +7 -6
- package/dist/home/index.cjs.map +1 -1
- package/dist/home/index.js +2 -1
- package/dist/home/index.js.map +1 -1
- package/dist/index.cjs +82 -82
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -8
- package/dist/index.js.map +1 -1
- package/dist/workspaces/index.cjs +29 -28
- package/dist/workspaces/index.cjs.map +1 -1
- package/dist/workspaces/index.js +4 -3
- package/dist/workspaces/index.js.map +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/chunk-E6EYRQC2.js.map +0 -1
- package/dist/chunk-EARQ2CUX.js.map +0 -1
- package/dist/chunk-QKOFQMAY.cjs.map +0 -1
- package/dist/chunk-UAEYU2NN.cjs.map +0 -1
- package/dist/chunk-V2UQR7P6.cjs.map +0 -1
- package/dist/chunk-VQHXVY26.cjs.map +0 -1
- package/dist/chunk-WZ63HE2C.js.map +0 -1
- package/dist/chunk-XBITXJZU.js.map +0 -1
package/dist/connect/index.js
CHANGED
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { DEFAULT_SPEND_CAP_PENCE, useBillingSupport, findProPrices, packPrice, calcSavingsPercent, parseBudgetPounds, formatMoney, isProProject, useSelfExtId, addonCharge, formatPeriodEnd, quoteParts, taxDetail, money2, ANNUAL_PREMIUM_AI_NOTE, totalWithTaxWord, planBadgeView, isAddonBudgetZero, useRewardBalance, getQuotaItems, aiUsageResetTimestamp, formatResetDate, ZERO_BUDGET_MESSAGE, CAP_REACHED_MESSAGE, quoteError, POSTCODE_COUNTRIES, addonPrice, checkoutBlockPriceText, ADDON_BLOCK_AI_GBP, STORAGE_BLOCK_GB, quoteTotalLine, PRO_PACKS, apiErrorDetail, checkoutItemsLabel, planNameForPacks, proTierName, projectGroupBilling, SUGGESTED_DAILY_CAP_PER_USER, TAX_LOCATION_INVALID, FREE_COLLABORATORS, FREE_AI_GBP, FREE_STORAGE_MB, MAX_CHECKOUT_BLOCKS, PRO_AI_GBP, PRO_STORAGE_GB, plusVat, planPreviewLines, PAY_TODAY_UNPRICED, PLAN_CHOICE_PACKS, reduceBounds, splitBlocks, autoRoom, nextRemovedBlockSize, stepLabel, addStepCaption, blocksLabel, MIN_AUTO_TOPUP_THRESHOLD_GBP, USAGE_CAP_LABEL, USAGE_CAP_HELP, nextPeriodBody, addonSettingsBody, budgetSavedMessage } from '../chunk-ZAYUJFPI.js';
|
|
3
3
|
export { CAP_REACHED_MESSAGE, ZERO_BUDGET_MESSAGE, aiUsageResetTimestamp, formatMoney, formatResetDate, getQuotaItems, isAddonBudgetZero, isProProject, planBadgeView, planName, projectGroupBilling, useBillingSupport, useRewardBalance } from '../chunk-ZAYUJFPI.js';
|
|
4
|
-
import {
|
|
4
|
+
import { usePendingFolders, useFilesStore, FolderTile, FileTile, ConnectedTagEntity, DocumentUser, useMemberLookup, useFilesPrefs, UserAvatar, useAiReviewStore, useDocumentFolders, useFilesGridStates, filesViewMode, FILES_PREFS_KEY, useFilesDialogs, DocumentNameCell, DocumentSharedCell, DocumentLabelsCell, RelatedDocumentsCell, DocumentFolderCell, StatusCell } from '../chunk-3Y4UTPCD.js';
|
|
5
|
+
export { ConnectedPendingSyncDialog, ConnectedTagEntity, DocumentFolderCell, DocumentLabelsCell, DocumentNameCell, DocumentSharedCell, DocumentStatusGlyph, DocumentSyncGlyph, DocumentUser, FILES_PREFS_KEY, FileTooltipContent, RelatedDocumentsCell, StatusCell, UserAvatar, documentFieldContent, filesViewMode, isActiveDocumentStatus, openPendingSyncDialog, parseQuotaError, startMenuItem, useAiReviewStore, useDocumentFolders, useFilesDialogs, useFilesGridStates, useFilesPrefs, useFilesStore, useMemberLookup, usePendingFolders, useResolvedDocStatus } from '../chunk-3Y4UTPCD.js';
|
|
6
|
+
import { getRoleBadgeClass, formatRole, getRoleDescription, PageLoading, WorkspacePageFrame, WorkspaceIdentityPanel, WorkspaceProjectSlot, WorkspaceAudienceLine, CommonWorkspaceToggle, ExpandableSection, LeaveFooter, WorkspaceTypeBadge, ProjectPicker, ProjectOptionRow, WorkspaceFormModal, FormErrorBanner, WorkspaceFieldsView, FormActions, WorkspaceList, WorkspaceGroup, WorkspaceCard } from '../chunk-EQ433QPZ.js';
|
|
5
7
|
import { isAgentAccount, workspaceConversationCount, workspaceDocumentCount, isListedWorkspace, WORKSPACE_CATEGORY_FILTERS, projectFilterId, workspaceFilterAttributes, groupWorkspacesByProject, workspaceGroupStats, byRecentUpdate } from '../chunk-57CG33XJ.js';
|
|
6
8
|
import { SharedFileView, SharedFilesInbox } from '../chunk-4ML5AMMO.js';
|
|
7
9
|
import { buildFactCitations, citedVersionRef, chronologyFactBodies, docIdsOf, toFactCitations, FactsToolbar, FactsFieldsButton, FactComposer, FactDateInput, FactSourcesRow, FactsLoading, FactsLoadError, FactsEmptyState, FactsCalendar, FactsGanttPane, FactsBulkBar, FactSourceGroup, EMPTY_FACT_DATE_FIELDS, withoutChunk, factDateSpanToFields, FactFieldRow, FactLabelsCell, enableFactTableColumnResize, withChunk, factDateFieldsToSpan, createFactColumns, FactRowActions, withoutDoc, withDoc, sourceDocCount, DEFAULT_FACT_COLUMN_LABELS } from '../chunk-75Z5AUMM.js';
|
|
8
10
|
import { HomeLoadError, HomeFrame, HomeMain, HomeCenteredScroll, HomeCenteredColumn, DashboardRoot, DashboardBand, DashboardColumns, RecentList, DashboardAction, FactsStrip, FactMark, CreateTile } from '../chunk-NQA6P7XB.js';
|
|
9
11
|
import { ProjectBandTitle, PlainBandTitle } from '../chunk-RQKWYKZY.js';
|
|
10
|
-
import '../chunk-
|
|
12
|
+
import '../chunk-5TDGVOR5.js';
|
|
13
|
+
import '../chunk-XRL4R2TT.js';
|
|
11
14
|
import { MessageJsonTree, DraggableHeader, ProfileCard, AvatarPicker, IdentityVerificationCard, IdentityVerificationDialog, RequireVerified, PasswordChangeDialog, EMAIL_NOTIFICATION_KEYS, EMAIL_NOTIFICATION_CATEGORIES, NotificationCategoryList, toNotificationCategories, toActiveSessionViews, ActiveSessionsDialog, LogoutDialog, toLogoutSessionViews, DeleteAccountDialog, toDeleteBlockerViews, PremiumModelsFrame, ConnectionsLoading, ConnectionsError, ConnectionsEmpty, UsageToggle, SettingsPage, UsageSummary, AppearanceSettings, UsageLineChart, PlanStack, PlanNotice, PlanPickerCard, PlanPickerHeader, PricingToggle, PromoCodeInput, PlanActionButton, SyncDialogBody, SyncField, SyncSelect, SyncSmallNote, SyncLoading, SyncReconnectNotice, SyncNote, SyncTreeFrame, SyncLinkRow, SyncLinkButton, SyncOptions, SyncOptionToggle, SyncDialogFooter, InvoicesDialog, PlanDialogFrame, ProjectList, RenameDialog, SharedProjectsSection, SharedProjectRow, MoreInfo, MoreInfoList, UsagePanel, UsageQuotaHint, UsageSection, UsageLegend, UsageProportionBar, UsageActionButton, ProjectDetailHeader, PlanBadge, ProjectDetailSection, QuotaExceededDialogView, InviteContactsDialog, WelcomeDialog, applyTriStateFilters, PanelFrame, PanelAddButton, PanelFrameBody, PanelScroll, PanelActionsRow, applyInvertedIndexFilter, ConfigSwitcherBar, PanelNote, FloatingPanel, ProjectRow, QuotaMeter, FilterChip, buildInvertedIndex, serverConnectionView, ServerConnectionButton, ModelProviderLabel, PlanInfoPopover, PlanCardGrid, ReferralRewardSummary, CheckoutDialogFrame, SyncFolderRow, SyncFolderStatus, PlanTierOption, PlanActionRow, SubscriptionStatusView, DailyCapField, ConnectionCard, ReferralRewardNote } from '../chunk-ICCBNHPU.js';
|
|
12
15
|
export { ConnectedAssistantDock, redlineStats, textToArtifact, toRedlineMarkdown, useConnectedAiTask, useConnectedChat, useSemanticSearch, useWorkspaceDocs } from '../chunk-PP3LWBIH.js';
|
|
13
16
|
import { useConnectedWorkspaceRole, ConnectedWorkflowLauncher, useConnectedWorkflowScopeSource, ConnectedWorkflowDocumentsField, ConnectedNativeDocxEditor, toWorkflowFieldDocument } from '../chunk-6D3XKIEB.js';
|
|
14
17
|
export { ConnectedWorkflowDocumentsField, ConnectedWorkflowLauncher, ConnectedWorkflowsTable, DEFAULT_CONNECTED_WORKFLOWS_TABLE_LABELS, toWorkflowFieldDocument, useConnectedAgentOptions, useConnectedWorkflowScopeSource, useConnectedWorkspaceRole, useDocxCommentTarget, useNativeDocxSupport } from '../chunk-6D3XKIEB.js';
|
|
15
18
|
import { ConnectedMarkdown, InternalDocLink, ExternalLink, DocumentWorkspaceContext } from '../chunk-A54WLQQA.js';
|
|
16
19
|
export { ConnectedDocumentToolsProvider, ConnectedMarkdown, DocumentChip, DocumentWorkspaceContext, ExternalLink, InternalDocLink, MailChip, MermaidDiagram, WorkspaceDocumentReference, useDocumentViewerSupport, useDocumentWorkspace, useViewerDraftDocument, useViewerIsDetached, useViewerPassageCitation, useViewerStreamingDocument } from '../chunk-A54WLQQA.js';
|
|
17
|
-
import {
|
|
20
|
+
import { FilterButton, searchExplorerDocuments, buildExplorerEntries, collectFolderDocs, joinFolderPath, getExplorerDisplayName, RECENTLY_DELETED_HINT, RECENTLY_DELETED_HINT_PLURAL, canDeleteDocument, ExplorerFrame, ExplorerStage, ExplorerScroller, ExplorerLoadingTiles, ExplorerEmpty, ExplorerMarquee, ExplorerDropOverlay, ExplorerDragPreview, CheckboxCell, TagColumnHeader, TagFormRoot, TagFormNameField, TagFormSelectField, TagFormNote, TagFormOptionsEditor, TagFormInstructionField, TagFormMeta, TagFormFooter, TagFormSharedToggle, FilesViewCenter, FilesFilterBar, TransferProgressView, TransferResumeBanner, ExportResultsReport, TransferScopeChooser, TransferKindsPicker, TransferReferencesChooser, ExportMethodChooser, ExportWorkspacePicker, TransferConflictChooser, TransferPlanSummary, ExportFooter, ExportModalTitle, ROW_MIN, rowHeightForLines, linesForRowHeight, RowDensityControl, VendorLogo, FolderFilterButton, FolderPickerRow, UploadFrame, UploadContainer, SelectedFilesList, RejectedFilesList, UploadErrorMessage, UploadProgress, PrivacyExplainerModal, MultiSelectCellEditor, DOCUMENT_TYPE_OPTIONS, DEFAULT_DOCUMENT_COLUMNS, shareStateOf, BulkActionsBar, shareTooltipFor, parseFolderSegments, AiReviewDialogView, MoveToFolderDialog, FolderCommandList, sortFields, filterFieldsByName, fieldsApplyBarCopy, FieldsEditorRoot, FieldsEditorToolbar, FieldsEditorList, FieldRow, FieldsEmptyState, fieldsEmptyText, FieldsApplyBar, FieldsManagerDefinition, FieldsManagerBody, FieldsManagerTitle, BulkTagEditorDialog, BulkReplaceDialog, DOCUMENTS_ROW_HEIGHT_INITIAL, EMAIL_VIEW_COLUMNS, useGridViews, ViewSelectorMenu, FilesAddMenu, applyColumnLayout, applyViewColumns, sortExplorerFiles, FilesPage, UrlInputDialog, FilesPageHeader, FilesToolbar, ExplorerFileNavigator, NavigatorPickerBar, FilesPageMain, DocumentGrid, resolveDocumentGridLayout, FilesModalFooter, BulkLabelSelectView, confirmHideFromMembers, DocumentsFolderButton, FilesTagsButton, UploadSourceSection, UploadSourcePicker, UploadBrowseButtons, canEditDocumentFields, FieldLabelsSelect, ShareToggle, ImportPanel, ImportFamilySection, ImportList, ImportRow, TaskSection, UploadDropArea, canChangeVisibility, ImportSummary, ImportAside, FolderSummary, ImportProgress, ImportRunActions, ImportHint, ImportActionButton, UploadUrlButton } from '../chunk-YYZH6VRP.js';
|
|
18
21
|
import { ViewToggle, DocumentViewToggle } from '../chunk-JJA6GQKH.js';
|
|
19
22
|
import { ModalBreadcrumbHeader, ModalCrumbs } from '../chunk-RC6VTY2H.js';
|
|
20
23
|
import { DatabaseList, NewDatabaseDialog, DatabaseToolbar, DatabaseTable, DatabaseRowDetail, DatabaseColumnDialog, rowTitle, OPEN_ROW_COL_ID, ADD_COLUMN_COL_ID } from '../chunk-PTYERKEU.js';
|
|
@@ -25,7 +28,8 @@ import '../chunk-MTSKK3BN.js';
|
|
|
25
28
|
import '../chunk-BTTUZZN3.js';
|
|
26
29
|
import { FactSourcesPanel, FactPassageItem } from '../chunk-HFZ45FD3.js';
|
|
27
30
|
import '../chunk-IA5BYEO7.js';
|
|
28
|
-
import {
|
|
31
|
+
import { WorkspaceActivityList, WorkspaceNotificationMenu, ThreadFollowMenuItem, ThreadFollowButton, TagTable, TagPicker, tagsPageNouns, entitiesPhrase, ExtractEntitiesDialog, GridRowNavigator, LoadingIndicator, EntityIdentityBar, IDENTITY_NAME_MAX_LENGTH, documentCount, TIPS_VISIBILITY_OVERRIDE, tagTableDocx, setHintsSessionOverride, tagTableLabels, TagDetail, tagDetailLabels, tagNoteLabel, tagKindDescription, Toolbar, glossaryEntries, glossaryDocx, glossaryMarkdown, glossaryFileName } from '../chunk-IQ3VDTR7.js';
|
|
32
|
+
import { EntityTooltip, EntityTooltipHeader, EntityTooltipSection, EntityTooltipHint, EntityTooltipStats } from '../chunk-C3VTWM74.js';
|
|
29
33
|
import { MemberAvatarStack } from '../chunk-FUPAGAZB.js';
|
|
30
34
|
import { renderSearchSnippet, SearchGroupHeader, isMeaningMatch, extractHighlightTerms, passesRelevanceCutoff, groupSearchResults, SearchPillToggle, SearchPagination, SearchPageFrame, SearchPageHeader, ApplyLabelDialog, SearchPageBody, SearchToolbarRow, SearchBar, SearchControlsBar, RelevanceThreshold, SearchTotalsHeadline, ApplyLabelButton, getSearchMatchHint, SearchResultsMain, SearchResultsInner, SearchErrorBanner, SearchResultList, SearchGroupCard, SearchNoResults, SearchEmptyState } from '../chunk-G4IYES7G.js';
|
|
31
35
|
import { SearchHit } from '../chunk-IKZWEPG4.js';
|
|
@@ -90,24 +94,23 @@ import '../chunk-NPLYHR2E.js';
|
|
|
90
94
|
import { useBlocksEnvironment, useOpenWorkflow, useRequestedSettingsSection, useIntentRequest, mailDraftRequest, useCalendarViewStore, conversationStartRequest } from '../chunk-KOOC6VD3.js';
|
|
91
95
|
export { requestCalendarComposer, requestCalendarEvent, useCalendarViewStore } from '../chunk-KOOC6VD3.js';
|
|
92
96
|
import { openDialog, closeDialog, useDialogProps, ConfirmDialog } from '../chunk-3VCTVCAX.js';
|
|
93
|
-
import {
|
|
97
|
+
import { ModalHeader, ModalScaffold, ModalSection, ModalSectionTitle } from '../chunk-TX2ZICS7.js';
|
|
94
98
|
import '../chunk-7F6CBP3Z.js';
|
|
95
99
|
import '../chunk-VUNV25KB.js';
|
|
96
100
|
import { QueryClient, useQueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
97
|
-
import { useWorkspaces, ArbiBotHeadIcon,
|
|
101
|
+
import { useWorkspaces, ArbiBotHeadIcon, useUpdateDocuments, useDeleteDocuments, useRenameFolder, useDownloadDocuments, useTags, useDocumentHostActions, useDocumentThumbnails, HtmlIcon, useArbiSessionState, selectDraft, useArbi, useArbiSessionStore, useAudioRecorder, MicRecordingOverlay, useArbiWsStatus, useArbiWsStore, useUserSettings, useMessageTimer, useDocuments, useAvailableModels, formatGbp, CitationRenderer, useWorkspaceUsers, useArbiSession, buildMentionCandidates, useConversations, ASSISTANT_MENTION_LABEL, useConversationItems, useDeleteMessage, useArbiHost, transcriptSegmentOf, useConfig, useThinkingContent, useCreateFact, useCreateFacts, workflowStepOf, stripSpeakerPrefix, MessageArtifactCard, useConversationData, useBranchNavigation, useSkills, useBuiltinCommands, useConversationActivity, useMessageDetails, useWorkflows, getWorkspaceKind, resolveConfigModel, useRunConversation, useWorkspaceActivity, callLink, openCall, startDmCall, calendarQueryKeys, mailQueryKeys, arbiQueryKeys, invalidateConversationLists, isWorkspaceNotificationType, useNotifications, useDeleteNotifications, useMarkNotificationsRead, useCallsEnabled, serverNotificationBellEntry, documentDisplayName, useArbiWebSocket, isNotificationRow, useWorkspaceNotificationLevel, useFollowThread, useUploadSkillFiles, useSaveSkill, useSetSkillVisibility, useDeleteSkill, useSkillSource, useAgentModels, useMcpTools, useAgentConfig, useAgentWorkspaces, useCreateAgent, useSaveAgentConfig, useGrantAgentAccess, useRevokeAgentAccess, useGenerateAgentAvatar, useAgents, useDeleteAgents, useWorkflowRuns, ArtifactCanvas, ConversationScope, useConversation, useTagKindSchema, useCreateTag, useSetTagValues, useUpdateTagKindSchema, useUpdateTag, useFacts, useDeleteTag, useExtractEntities, useEntityExtractionDocIds, useStartWorkspaceTransfer, useResumeWorkspaceTransfer, useCancelWorkspaceTransfer, useWorkspaceTransfer, useWorkspaceTransfers, useWorkspaceExportDownload, usePlanWorkspaceTransfer, isTransferResumable, isTransferFinished, useShellWorkspaces, useProfile, useUpdateProfile, useRequestEmailChange, useConfirmEmailChange, useNameEditor, useAvatarCrop, useEmailChange, ImageCropModal, useIdentityVerification, usePasswordChange, usePasswordChangeForm, useNotificationPreferences, useSessions, useCurrentSessionId, useTerminateSession, useSignOut, useDeleteAccount, useDeleteAccountFlow, useMailClient, defaultMailAlias, useClaimNativeAlias, useMailOnline, useConnectMailAccount, useDisconnectMailAccount, useMailPolicy, useMailAccounts, useUpdateUserSettings, useDismissedTips, useConnectorVendorVisibility, useConnectorCatalog, useMyConnectors, useDisconnectConnector, useSlackConnection, useDisconnectSlack, isMailboxSyncVendor, isSharePointVendor, useWorkspaceTrash, useInvalidateStorage, useStorageActions, useStorageItems, useStorageItemNames, useStorageProjects, useUserUsageToday, useStorageSnapshots, useUpdateWorkspace, useAddWorkspaceMembers, useRemoveWorkspaceMembers, useSetWorkspaceMemberRoles, toShellWorkspace, useIsSlow, useProducts, useCreateProject, useDeleteProject, useCanCreateProjects, PROJECT_CREATION_DENIED_REASON, useEnableMailboxSync, useMailboxFolders, useEnableDriveSync, useDriveFolderChildren, connectorErrorStatus, useProjectInvoices, useProjects, useUpdateProjectFields, useChargeWatch, useAddonQuote, STILL_WORKING, useProjectBillingPortal, useProjectUsage, useRefreshProject, useBoxRole, useContacts, useInviteContacts, useDeleteWorkspaces, useCreateContact, useUpdateContact, useLinkContact, useEntitlements, useImportContacts, entitlementRefusal, useDeleteContact, MAX_RETRIEVE_DOC_IDS, useSemanticSearch, useAssignDocTags, useMailUnlock, useMailFolders, useMailMessages, useMailDraftCompose, useMailMessage, useMailCache, MailOfflineUnavailableError, accountPath, useCalendarEvents, useCalendars, useCanHostCalls, useOpenCallMeetingChat, usePeople, useFetchCalendarEvent, useCalendarSettings, useCalendarOverlays, useCalendarOutbox, useCalendarAccounts, useSyncAccountsOnOpen, useResumeCalendarAccountConnect, useCreateEvent, useUpdateEvent, useDeleteEvent, useMoveEvent, useRespondToEvent, useCreateCalendar, useUpdateCalendar, useDeleteCalendar, useImportCalendar, useSaveCalendarSettings, useRefreshCalendar, useCalendarEvent, useMailAttachmentText, useCalendarEventByUid, getPublicBookingPage, bookPublicSlot, PublicBookingError, useDocumentsSupport, isZipFile, prepareUploadFiles, UPLOAD_MAX_FILE_SIZE, filesFromDrop, UPLOAD_ACCEPT, useUploadFromUrls, useUploadFiles, useUpdateDocTag, useRemoveDocTags, useOfflineDocumentIds, useKeepDocumentsOffline, useRemoveDocumentsOffline, useOpenViewerDocumentId, subscribeDocumentRows, useGenerateDocTags, useRefreshDocuments, useDocumentsLoading, selectViewingDocumentId, useRelatedDocuments, useWorkspaceProcessing, DISMISSED_TASK_TTL_MS, useDatabases, useCreateDatabase, useImportDatabase, myChatId, useChatThread, useChatPost, useDeleteChatMessage, useMarkChatRead, setOpenChat, useAgentDmStatus, annotateThread, userDisplayName, DmComposer, TypingIndicator, useRenameChat, useAddChatMembers, useRemoveChatMember, useChats, useChatSummaries, useCreateGroupChat, useChatArrivals, useApplyChatModel, AUTO_CHAT_MODEL, formatGbpPerMillionTokens, useConfigSchema, useSaveConfig, useConversationPendingAuth, openAccessRequest, useRequestWorkspaceAccess, useIsEntitled, ImageCropper, useCreateWork, useRunWorkflow, useStartTaskQuery, useCreateWorkflow, useUpdateConversation, useUpdateWorkflow, usePeopleSearch, threadTabId, useCanEditShared, useActOnStep, usePlanWork, useWorkItems, TaskThreadPendingError, useMentionCandidates, useAgentRunControl, useTransientView, useDeleteConversation, useIsWorkspaceOwner, useConversationTurn, useAgentSession, useStartAgentSession, useCloseAgentSession, downloadRecoveryFile, LinkedInIcon, GoogleIcon, AppleIcon, useCurrentUser, isQueuedCalendarWrite, DateSeparator, ChatBubble, isAliasTakenError, nextAliasSuggestion, aliasTakenMessage, mailJson, connectorReturnTo, DmAvatar, ConversationList, GitHubIcon, cropImage, getRelatedTotal, isDeploymentUserNotification, describeServerNotification, getWorkspaceActionText, getWorkspaceSentPhrase, BOX_SEAT_REFUSED, BOX_SEAT_REFUSED_TITLE, documentActivityPhrase, isSignatureNotificationType, inputRequestTitle, WORK_NOTIFICATION_LABELS, useConversationThreads, usePassageQuotes, useUpdateFact, useDeleteFact, useAccountClient, usePlanQuote, useCreateProjectCheckout, useInvalidateProjects, useCreateWorkspace, useDriveFolderDocCount, useChangeProjectPlan, useCancelProjectSubscription, usePreviewProjectPlanChange, useAddProjectAddonBlock, useSwitchWorkspace, fileAttachment, useMailProjects, useSaveMailDraft, useSendMail, useMailDraftReplaced, useCalendarInvitations, useDecideCounter, useSearchContacts, usePublishCalendar, useCalendarShares, useShareCalendar, useUnshareCalendar, useSubscribeCalendar, useHolidayCountries, useAddHolidayCalendar, cancelPublicBooking, SHAREPOINT_VENDORS, isDriveSyncVendor, useDatabase, useDatabaseRows, useUpdateDatabase, useDeleteDatabase, useAddDatabaseRows, useUpdateDatabaseRow, useDeleteDatabaseRows, useImportDatabaseRows, useExportDatabase, DATABASE_ROWS_PAGE, useInvalidateAfterTransfer, useConfigs, useSaveConfigField, useDeleteConfig, isFullConfig, useChatUnreadTotal, useUnreadByPeer, useMarkDocumentShared, useConversationSearch, useWorkspaceRole, useConversationDocuments, useConnectRunStream, useAnswerAgentQuestion, useConversationIsShared, buildPendingFirstTurn, useAskAgain, getOrphanedLastMessage, refuseChatWhenOffline, useThreadDocument, useDocumentAutoAdd, useAutoSendDraft, READ_ONLY_MEETING_TEXT, useProjectConversationUsage, AiAnswer, ArbiWebSocketProvider, signatureNotificationPhrase, signatureRequestMeta, getNotificationTypeMeta, useMailDraftEditor, useFreeBusy, useFindTime, useCalendarSupport, useStartCalendarAccountOAuth, useConnectOAuthAccount, useBookingPages, useDeleteBookingPage, useRooms, useCancelMailboxSync, useMailboxSyncProgress, useRefreshConnectorsOnRunEnd, useCancelDriveSync, useDriveFolders, useDriveSyncProgress, useDriveSyncEstimate, useSearchDatabaseRows, isReplayableArbiMutation, useUpdateProjectNextPeriodAddons, useUpdateProjectAddonSettings, useSyncCalendarAccount, useUpdateCalendarAccount, useDisconnectCalendarAccount, ACCOUNT_VENDOR, useCalDavProfiles, useConnectCalDavAccount, useSaveBookingPage, useCreateRoom, useTriggerMailboxSync, useTriggerDriveSync } from '@arbidocs/react';
|
|
98
102
|
import { mergeAgentSteps, extractSubagentLanes, getCurrentStep, computeRunStats, formatTokens, isNearAiUsageBudget, getSubagentBranchRecord, buildCitationChunkData, topLevelAgentSteps, findMainSiblingLeaf, sliceToSubagentThread, getAgentStepLabel, subagentJobLabel, getStepDisplay, getStepTool, findLeafForTaskMessage, Arbi, FLAT_TAG_KINDS, getEligibleParentTags, canTagHaveParent, isFlatKind, TAG_NESTING_MAX_DEPTH, TAG_KINDS, formatFileSize, filterDocumentTags, isLabelTag, refusalReason, isPresenceTag, isAnnotationTag, flattenTagTree, tagsForScope, tagsOfGroup, chats, buildRetrievalFullContextTool, buildRetrievalChunkTool, getChildTags, tagUseCount, ArbiApiError, PRESENCE_KINDS, isEntityTag, DuplicateContactError, wouldCreateTagCycle, getTagDescendantIds } from '@arbidocs/sdk/browser';
|
|
99
103
|
import { isAbortError, browserSessionStateStorage, parseCallFragment, isMessageType, validateRecoveryKeyFile, RECOVERY_KEY_ERRORS, parseRecoveryUrl, prewarmKeyPairs, decryptRecoveryKey, unlockIdentityWithPassword, createRecoveryUrl, bytesToBase64, initSodium } from '@arbidocs/client';
|
|
100
|
-
import React9, { memo, useMemo, lazy,
|
|
101
|
-
import { Users, MessageCircleMore,
|
|
102
|
-
import { isAgent, UserEntity, getUserInitials, getUserDisplayName, getUserAvatarColor, agentAvatarColors, Avatar, AvatarImage, AvatarFallback, cn, ShieldIcon, getWorkspaceColor, getFileTypeIcon,
|
|
104
|
+
import React9, { memo, useMemo, lazy, useState, useEffect, forwardRef, useRef, useLayoutEffect, useCallback, useImperativeHandle, createContext, useContext, Suspense, useSyncExternalStore, createElement, Fragment as Fragment$1, useId } from 'react';
|
|
105
|
+
import { Users, MessageCircleMore, ArrowUpRight, Send, Settings, Edit3, Copy, Link, Share2, Trash2, Check, Milestone, Clock, RotateCcw, FileText, Loader2, Network, ChevronRight, Download, Bell, Activity, Info, UserCheck, Upload, Link2, Search, Plus, ArrowLeft, ExternalLink as ExternalLink$1, Tags, CheckCircle2, Monitor, UserCircle, KeyRound, Radio, LogOut, Wifi, Mail, Lock, HardDrive, User, HatGlasses, MessageSquare, PlugZap, Gauge, Cloud, XCircle, Building2, Palette, Type, FolderInput, Printer, SquareStack, Table, FolderKanban, Sparkles, Cake, X, UserRound, Star, MessagesSquare, Tag, Video, CalendarDays, MapPin, Globe, Calendar, Hash, File as File$1, FileType, FolderOpen, Fingerprint, Paperclip, CircleCheck, CheckCircle, TriangleAlert, LoaderCircle, NotebookPen, Columns3, EyeOff, Eye, ArrowUp, ArrowDown, ZoomOut, Camera, FilePlus2, Eraser, UserMinus, UserPlus, UsersRound, Code2, Infinity, Bug, Crop, Undo2, ImageUp, ChevronDown, MoreHorizontal, Wrench, RotateCw, Square, BadgeCheck, Shield, ClipboardList, Table2, KeySquare, BellOff, CheckCheck, FolderUp, ArrowUpCircle, Contact, Scale, Pencil, BookA, Quote, Inbox, CalendarX, CalendarCheck, Phone, LogIn, Play, Pause, Workflow, Minimize2, Maximize2, Minus, CalendarSearch, DoorOpen, AlertCircle, RefreshCw, ClockFading, AlertTriangle } from 'lucide-react';
|
|
106
|
+
import { isAgent, UserEntity, getUserInitials, getUserDisplayName, getUserAvatarColor, agentAvatarColors, Avatar, AvatarImage, AvatarFallback, cn, ShieldIcon, getWorkspaceColor, getFileTypeIcon, getDocumentTitle, getEntityLabel, Badge, ThreadVisibilityIcon, Button, isImageDocument, formatFriendlyDate, Tooltip, TooltipTrigger, TooltipContent, Dialog, DialogContent, formatRelativeTime, ProviderIcon, EntityIcon, createUserAvatarIcon, Label, Input, Textarea, DialogHeader, DialogTitle, DialogDescription, tagKindNouns, tagKindTitle, getTagTypeLabel, VisibilityToggle, getEntityColor, IconToggle, Switch, Checkbox, entityNoun, DialogTrigger, EntityPill, ProjectEntity, DialogFooter, Tabs, TabsList, TabsTrigger, TabsContent, getDocIcon, getDocumentNature, getDocumentAuthor, markdownToPlainText, getDocumentSubject, formatDocDate, getDocumentDate, friendlyFileType, formatFolderLabel, canonicalFolderPath, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Slider, AgentBadge, PresenceLabel, TooltipProvider, UserMenu, CommandGroup, CommandItem, Popover, PopoverAnchor, PopoverTrigger, PopoverContent, Command, CommandInput, CommandList, CommandEmpty, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, ScrollArea, ArbiIcon, DocumentEntity, ARBI_MARK_SRC, Card, CardHeader, CardTitle, CardContent, VerifiedToggle, Progress } from '@arbidocs/react/ui';
|
|
103
107
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
104
108
|
import { hasMessageBody, notify, linkMentions, useNotify, sharedSearchSession, takePendingSearch, selectUnread, NotificationBell, useTurnDocumentId, useOpenDocumentId, useRegisterOpenDocument } from '@arbidocs/react/shell';
|
|
105
|
-
import {
|
|
106
|
-
import { create } from 'zustand';
|
|
109
|
+
import { downloadBlob, useIsOnline, DocumentToolsProvider, useOptionalDocumentTools, fetchDocumentPdf, useSignatureVerification, SignatureVerificationError } from '@arbidocs/react/document-tools';
|
|
107
110
|
import { artifactKindFromFileName, viewerTabForArtifactMode, useStreamedArtifact, parseVersionRef } from '@arbidocs/react/artifacts';
|
|
108
|
-
import {
|
|
111
|
+
import { create } from 'zustand';
|
|
112
|
+
import { useSensors, useSensor, MouseSensor, TouchSensor, pointerWithin, rectIntersection, DndContext, DragOverlay } from '@dnd-kit/core';
|
|
109
113
|
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
110
|
-
import { persist, createJSONStorage } from 'zustand/middleware';
|
|
111
114
|
import { createPortal } from 'react-dom';
|
|
112
115
|
|
|
113
116
|
function useDisplayStatus(user, isMe, showPresence) {
|
|
@@ -1418,126 +1421,6 @@ function useNotificationToasts(options2 = {}) {
|
|
|
1418
1421
|
});
|
|
1419
1422
|
});
|
|
1420
1423
|
}
|
|
1421
|
-
var usePendingSyncDialog = create((set) => ({
|
|
1422
|
-
open: false,
|
|
1423
|
-
setOpen: (open) => set({ open })
|
|
1424
|
-
}));
|
|
1425
|
-
function openPendingSyncDialog() {
|
|
1426
|
-
usePendingSyncDialog.getState().setOpen(true);
|
|
1427
|
-
}
|
|
1428
|
-
var STATUS_META = {
|
|
1429
|
-
queued: { dot: "bg-yellow-text", text: "Waiting to sync", tone: "text-yellow-text" },
|
|
1430
|
-
syncing: { dot: "bg-blue-text", text: "Syncing\u2026", tone: "text-blue-text" },
|
|
1431
|
-
error: { dot: "bg-red-text", text: "Failed", tone: "text-red-text" }
|
|
1432
|
-
};
|
|
1433
|
-
function StatusCell({ data }) {
|
|
1434
|
-
if (!data) return null;
|
|
1435
|
-
const meta = STATUS_META[data.status];
|
|
1436
|
-
return /* @__PURE__ */ jsxs("span", { className: `inline-flex items-center gap-1.5 text-sm font-medium ${meta.tone}`, children: [
|
|
1437
|
-
/* @__PURE__ */ jsx("span", { className: `h-1.5 w-1.5 rounded-full ${meta.dot}` }),
|
|
1438
|
-
meta.text
|
|
1439
|
-
] });
|
|
1440
|
-
}
|
|
1441
|
-
function ConnectedPendingSyncDialog() {
|
|
1442
|
-
const isOpen = usePendingSyncDialog((s) => s.open);
|
|
1443
|
-
const setOpen = usePendingSyncDialog((s) => s.setOpen);
|
|
1444
|
-
const isOnline = useIsOnline();
|
|
1445
|
-
const items = usePendingSyncItems();
|
|
1446
|
-
const cancelMany = useCancelManyPendingSync();
|
|
1447
|
-
const [selected, setSelected] = useState([]);
|
|
1448
|
-
const undoableIds = useMemo(
|
|
1449
|
-
() => items.filter((i) => i.status !== "syncing").map((i) => i.mutationId),
|
|
1450
|
-
[items]
|
|
1451
|
-
);
|
|
1452
|
-
const selectedUndoableIds = useMemo(
|
|
1453
|
-
() => selected.filter((i) => i.status !== "syncing").map((i) => i.mutationId),
|
|
1454
|
-
[selected]
|
|
1455
|
-
);
|
|
1456
|
-
const columnDefs = useMemo(
|
|
1457
|
-
() => [
|
|
1458
|
-
{
|
|
1459
|
-
colId: "document",
|
|
1460
|
-
headerName: "Document",
|
|
1461
|
-
field: "document",
|
|
1462
|
-
flex: 1,
|
|
1463
|
-
minWidth: 140,
|
|
1464
|
-
tooltipField: "document"
|
|
1465
|
-
},
|
|
1466
|
-
{
|
|
1467
|
-
colId: "change",
|
|
1468
|
-
headerName: "Change",
|
|
1469
|
-
field: "change",
|
|
1470
|
-
flex: 1.4,
|
|
1471
|
-
minWidth: 160,
|
|
1472
|
-
tooltipField: "change"
|
|
1473
|
-
},
|
|
1474
|
-
{
|
|
1475
|
-
colId: "when",
|
|
1476
|
-
headerName: "When",
|
|
1477
|
-
width: 120,
|
|
1478
|
-
// Sort by the raw timestamp; display the friendly relative string.
|
|
1479
|
-
valueGetter: (p) => p.data?.at ?? 0,
|
|
1480
|
-
valueFormatter: (p) => p.value ? formatRelativeTime(new Date(Number(p.value)).toISOString(), { style: "short" }) : ""
|
|
1481
|
-
},
|
|
1482
|
-
{
|
|
1483
|
-
colId: "status",
|
|
1484
|
-
headerName: "Status",
|
|
1485
|
-
width: 150,
|
|
1486
|
-
valueGetter: (p) => p.data?.status ?? "",
|
|
1487
|
-
cellRenderer: StatusCell
|
|
1488
|
-
}
|
|
1489
|
-
],
|
|
1490
|
-
[]
|
|
1491
|
-
);
|
|
1492
|
-
const hasFailed = items.some((i) => i.status === "error");
|
|
1493
|
-
const title = !isOnline ? "Offline changes" : hasFailed ? "Some changes didn\u2019t sync" : items.length > 0 ? "Syncing your changes" : "No changes waiting";
|
|
1494
|
-
const description = !isOnline ? "These edits are saved on this device and will sync automatically when you reconnect." : hasFailed ? "These edits didn\u2019t reach the server, so they\u2019re only saved on this device. Undo to discard them." : "Edits you made offline are syncing to the server.";
|
|
1495
|
-
const undoSelected = () => {
|
|
1496
|
-
cancelMany(selectedUndoableIds);
|
|
1497
|
-
setSelected([]);
|
|
1498
|
-
};
|
|
1499
|
-
const undoAll = () => {
|
|
1500
|
-
cancelMany(undoableIds);
|
|
1501
|
-
setSelected([]);
|
|
1502
|
-
};
|
|
1503
|
-
return /* @__PURE__ */ jsx(Dialog, { open: isOpen, onOpenChange: setOpen, children: /* @__PURE__ */ jsxs(DialogContent, { presentation: "sheet", className: "sm:max-w-2xl", "data-testid": "pending-sync-modal", children: [
|
|
1504
|
-
/* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
1505
|
-
/* @__PURE__ */ jsxs(DialogTitle, { className: "flex items-center gap-2", children: [
|
|
1506
|
-
isOnline ? /* @__PURE__ */ jsx(RefreshCw, { className: "h-5 w-5 text-primary" }) : /* @__PURE__ */ jsx(WifiOff, { className: "h-5 w-5 text-yellow-text" }),
|
|
1507
|
-
title
|
|
1508
|
-
] }),
|
|
1509
|
-
/* @__PURE__ */ jsx(DialogDescription, { children: description })
|
|
1510
|
-
] }),
|
|
1511
|
-
items.length === 0 ? /* @__PURE__ */ jsxs(ModalSection, { className: "flex flex-col items-center gap-2 py-10 text-center text-muted-foreground", children: [
|
|
1512
|
-
/* @__PURE__ */ jsx(CircleCheck, { className: "h-6 w-6 text-green-text opacity-70" }),
|
|
1513
|
-
/* @__PURE__ */ jsx("p", { className: "text-sm", children: "Everything is up to date." })
|
|
1514
|
-
] }) : /* @__PURE__ */ jsx(ModalSection, { children: /* @__PURE__ */ jsx(
|
|
1515
|
-
GridView,
|
|
1516
|
-
{
|
|
1517
|
-
items,
|
|
1518
|
-
columnDefs,
|
|
1519
|
-
getItemId: (item) => String(item.mutationId),
|
|
1520
|
-
selection: { mode: "multiple", selected, onSelectionChange: setSelected },
|
|
1521
|
-
height: "320px",
|
|
1522
|
-
gridId: "pending-sync-grid-v1"
|
|
1523
|
-
}
|
|
1524
|
-
) }),
|
|
1525
|
-
undoableIds.length > 0 && /* @__PURE__ */ jsx(DialogFooter, { children: /* @__PURE__ */ jsxs(
|
|
1526
|
-
Button,
|
|
1527
|
-
{
|
|
1528
|
-
variant: "outline",
|
|
1529
|
-
className: "gap-1.5",
|
|
1530
|
-
"data-testid": "pending-sync-undo",
|
|
1531
|
-
disabled: selected.length > 0 && selectedUndoableIds.length === 0,
|
|
1532
|
-
onClick: selected.length > 0 ? undoSelected : undoAll,
|
|
1533
|
-
children: [
|
|
1534
|
-
/* @__PURE__ */ jsx(RotateCcw, { className: "h-4 w-4" }),
|
|
1535
|
-
selected.length > 0 ? `Undo selected (${selectedUndoableIds.length})` : `Undo all (${undoableIds.length})`
|
|
1536
|
-
]
|
|
1537
|
-
}
|
|
1538
|
-
) })
|
|
1539
|
-
] }) });
|
|
1540
|
-
}
|
|
1541
1424
|
function ConnectedWorkspaceNotificationMenu({
|
|
1542
1425
|
workspaceId: workspaceProp,
|
|
1543
1426
|
...menuProps
|
|
@@ -2310,7 +2193,7 @@ function useConnectedAgentManagement({
|
|
|
2310
2193
|
const onEditorOpenChange = (open) => {
|
|
2311
2194
|
setEditorOpen(open);
|
|
2312
2195
|
};
|
|
2313
|
-
const
|
|
2196
|
+
const create2 = () => {
|
|
2314
2197
|
setEditing(null);
|
|
2315
2198
|
setEditorOpen(true);
|
|
2316
2199
|
};
|
|
@@ -2344,7 +2227,7 @@ function useConnectedAgentManagement({
|
|
|
2344
2227
|
return {
|
|
2345
2228
|
agents,
|
|
2346
2229
|
isLoading,
|
|
2347
|
-
create:
|
|
2230
|
+
create: create2,
|
|
2348
2231
|
edit,
|
|
2349
2232
|
assign,
|
|
2350
2233
|
remove,
|
|
@@ -3748,958 +3631,6 @@ function GlossaryExport({ labelId, nameOf }) {
|
|
|
3748
3631
|
] })
|
|
3749
3632
|
] });
|
|
3750
3633
|
}
|
|
3751
|
-
function DocumentSyncGlyph({
|
|
3752
|
-
docExtId,
|
|
3753
|
-
size = 13,
|
|
3754
|
-
className,
|
|
3755
|
-
bgClassName = "bg-muted-foreground"
|
|
3756
|
-
}) {
|
|
3757
|
-
const isAvailableOffline = useOfflineDocumentIds().has(docExtId);
|
|
3758
|
-
if (!isAvailableOffline) return null;
|
|
3759
|
-
return /* @__PURE__ */ jsx(
|
|
3760
|
-
"span",
|
|
3761
|
-
{
|
|
3762
|
-
title: "Available offline (saved on this device)",
|
|
3763
|
-
"aria-label": "Available offline",
|
|
3764
|
-
"data-testid": `offline-available-badge-${docExtId}`,
|
|
3765
|
-
className: cn(
|
|
3766
|
-
"inline-flex items-center justify-center rounded-full text-white ring-1 ring-white",
|
|
3767
|
-
bgClassName,
|
|
3768
|
-
className
|
|
3769
|
-
),
|
|
3770
|
-
style: { width: size, height: size },
|
|
3771
|
-
children: /* @__PURE__ */ jsx(ArrowDownToLine, { size: Math.round(size * 0.7), strokeWidth: 2.75 })
|
|
3772
|
-
}
|
|
3773
|
-
);
|
|
3774
|
-
}
|
|
3775
|
-
var NO_ACTIONS = {};
|
|
3776
|
-
var ACTIVE_STATUSES = IN_FLIGHT_DOCUMENT_STATUSES;
|
|
3777
|
-
var TERMINAL_STATUSES = FINISHED_DOCUMENT_STATUSES;
|
|
3778
|
-
var STATUS_LABEL = {
|
|
3779
|
-
uploading: "Uploading",
|
|
3780
|
-
queued: "Queued",
|
|
3781
|
-
parsing: "Parsing",
|
|
3782
|
-
encrypting: "Encrypting",
|
|
3783
|
-
indexing: "Indexing",
|
|
3784
|
-
analysing: "Analysing"
|
|
3785
|
-
};
|
|
3786
|
-
function isActiveDocumentStatus(status) {
|
|
3787
|
-
return ACTIVE_STATUSES.has(status.toLowerCase());
|
|
3788
|
-
}
|
|
3789
|
-
function useDocStatus(doc) {
|
|
3790
|
-
return resolveDocumentStatus(doc, useProcessingTask(doc.external_id));
|
|
3791
|
-
}
|
|
3792
|
-
function TileStatusBadge({ doc, status }) {
|
|
3793
|
-
let tone = "neutral";
|
|
3794
|
-
let icon2 = null;
|
|
3795
|
-
let title = "";
|
|
3796
|
-
switch (status) {
|
|
3797
|
-
case "completed":
|
|
3798
|
-
tone = "success";
|
|
3799
|
-
icon2 = /* @__PURE__ */ jsx(CheckCircle, { className: "size-4 text-green-text", strokeWidth: 2.75 });
|
|
3800
|
-
title = "Ready";
|
|
3801
|
-
break;
|
|
3802
|
-
case "failed":
|
|
3803
|
-
tone = "danger";
|
|
3804
|
-
icon2 = /* @__PURE__ */ jsx(
|
|
3805
|
-
FailedStageIcon,
|
|
3806
|
-
{
|
|
3807
|
-
stage: doc.failed_stage ?? null,
|
|
3808
|
-
errorMessage: doc.error_message,
|
|
3809
|
-
className: "size-4 text-red-text"
|
|
3810
|
-
}
|
|
3811
|
-
);
|
|
3812
|
-
title = "Failed";
|
|
3813
|
-
break;
|
|
3814
|
-
case "skipped":
|
|
3815
|
-
icon2 = /* @__PURE__ */ jsx(SkipForward, { className: "size-4 text-muted-foreground", strokeWidth: 2.75 });
|
|
3816
|
-
title = "Skipped";
|
|
3817
|
-
break;
|
|
3818
|
-
case "empty":
|
|
3819
|
-
tone = "warning";
|
|
3820
|
-
icon2 = /* @__PURE__ */ jsx(FileX, { className: "size-4 text-yellow-text", strokeWidth: 2.75 });
|
|
3821
|
-
title = "Empty \u2014 no extractable content";
|
|
3822
|
-
break;
|
|
3823
|
-
case "low-content":
|
|
3824
|
-
tone = "warning";
|
|
3825
|
-
icon2 = /* @__PURE__ */ jsx(AlertTriangle, { className: "size-4 text-yellow-text", strokeWidth: 2.75 });
|
|
3826
|
-
title = "Low content \u2014 minimal extractable content";
|
|
3827
|
-
break;
|
|
3828
|
-
default:
|
|
3829
|
-
return null;
|
|
3830
|
-
}
|
|
3831
|
-
return /* @__PURE__ */ jsx(
|
|
3832
|
-
StatusPill,
|
|
3833
|
-
{
|
|
3834
|
-
tone,
|
|
3835
|
-
icon: icon2,
|
|
3836
|
-
title,
|
|
3837
|
-
testId: `explorer-file-status-${doc.external_id}`
|
|
3838
|
-
}
|
|
3839
|
-
);
|
|
3840
|
-
}
|
|
3841
|
-
function TileVisibilityBadge({ doc }) {
|
|
3842
|
-
const shared = !!doc.shared;
|
|
3843
|
-
return /* @__PURE__ */ jsx(
|
|
3844
|
-
StatusPill,
|
|
3845
|
-
{
|
|
3846
|
-
icon: /* @__PURE__ */ jsx(VisibilityIcon, { isShared: shared, className: "size-3.5", "aria-hidden": true }),
|
|
3847
|
-
label: shared ? getEntityLabel("WORKSPACE") : "Only you",
|
|
3848
|
-
title: visibilityAudience(shared),
|
|
3849
|
-
testId: `explorer-file-visibility-${doc.external_id}`
|
|
3850
|
-
}
|
|
3851
|
-
);
|
|
3852
|
-
}
|
|
3853
|
-
function MiniUserAvatar({ user }) {
|
|
3854
|
-
return /* @__PURE__ */ jsxs(Avatar, { className: "h-4 w-4 border border-white", children: [
|
|
3855
|
-
user.picture && /* @__PURE__ */ jsx(AvatarImage, { src: user.picture, alt: getUserDisplayName(user) }),
|
|
3856
|
-
/* @__PURE__ */ jsx(
|
|
3857
|
-
AvatarFallback,
|
|
3858
|
-
{
|
|
3859
|
-
className: cn(
|
|
3860
|
-
"text-xs font-semibold leading-none text-white",
|
|
3861
|
-
getUserAvatarColor(user.external_id)
|
|
3862
|
-
),
|
|
3863
|
-
children: getUserInitials(user)
|
|
3864
|
-
}
|
|
3865
|
-
)
|
|
3866
|
-
] });
|
|
3867
|
-
}
|
|
3868
|
-
function FileTooltipContent({
|
|
3869
|
-
doc,
|
|
3870
|
-
modifiedBy,
|
|
3871
|
-
tagNameById
|
|
3872
|
-
}) {
|
|
3873
|
-
const labels = (doc.doctags ?? []).map((dt) => tagNameById.get(dt.tag_ext_id)).filter((name) => !!name);
|
|
3874
|
-
return /* @__PURE__ */ jsx(
|
|
3875
|
-
ExplorerFileTooltip,
|
|
3876
|
-
{
|
|
3877
|
-
title: getDocumentTitle(doc, doc.file_name ?? ""),
|
|
3878
|
-
summary: getDocumentSubject(doc),
|
|
3879
|
-
modifiedLabel: doc.updated_at ? formatFriendlyDate(doc.updated_at, false) : null,
|
|
3880
|
-
modifiedByAvatar: modifiedBy && /* @__PURE__ */ jsx(MiniUserAvatar, { user: modifiedBy }),
|
|
3881
|
-
shared: !!doc.shared,
|
|
3882
|
-
visibilityIcon: /* @__PURE__ */ jsx(VisibilityIcon, { isShared: !!doc.shared, className: "h-3 w-3" }),
|
|
3883
|
-
labels,
|
|
3884
|
-
uiLabels: { shared: visibilityAudience(true), private: visibilityAudience(false) }
|
|
3885
|
-
}
|
|
3886
|
-
);
|
|
3887
|
-
}
|
|
3888
|
-
function startMenuItem(items) {
|
|
3889
|
-
if (items.length === 0) return [];
|
|
3890
|
-
return [
|
|
3891
|
-
{
|
|
3892
|
-
id: "start",
|
|
3893
|
-
label: "Start\u2026",
|
|
3894
|
-
icon: Sparkles,
|
|
3895
|
-
testId: "explorer-start-menu",
|
|
3896
|
-
onSelect: () => {
|
|
3897
|
-
},
|
|
3898
|
-
submenu: items.map((item) => ({
|
|
3899
|
-
id: item.id,
|
|
3900
|
-
label: item.title,
|
|
3901
|
-
icon: Play,
|
|
3902
|
-
onSelect: item.run,
|
|
3903
|
-
testId: `explorer-start-${item.id}`
|
|
3904
|
-
}))
|
|
3905
|
-
}
|
|
3906
|
-
];
|
|
3907
|
-
}
|
|
3908
|
-
var FileTile = memo(function FileTile2({
|
|
3909
|
-
doc,
|
|
3910
|
-
density,
|
|
3911
|
-
selected,
|
|
3912
|
-
dragging,
|
|
3913
|
-
dndActive,
|
|
3914
|
-
renaming,
|
|
3915
|
-
canDelete,
|
|
3916
|
-
thumbnailUrl,
|
|
3917
|
-
modifiedBy,
|
|
3918
|
-
tagNameById,
|
|
3919
|
-
onSelect,
|
|
3920
|
-
onToggle,
|
|
3921
|
-
onOpen,
|
|
3922
|
-
onReview,
|
|
3923
|
-
onStartRename,
|
|
3924
|
-
onCommitRename,
|
|
3925
|
-
onCancelRename,
|
|
3926
|
-
onDownload,
|
|
3927
|
-
onMove,
|
|
3928
|
-
onDelete,
|
|
3929
|
-
actions = NO_ACTIONS
|
|
3930
|
-
}) {
|
|
3931
|
-
const { attributes, listeners: listeners2, setNodeRef } = useDraggable({
|
|
3932
|
-
id: `doc:${doc.external_id}`,
|
|
3933
|
-
data: { type: "doc", docId: doc.external_id }
|
|
3934
|
-
});
|
|
3935
|
-
const { notify: notify18 } = useBlocksEnvironment();
|
|
3936
|
-
const { startItemsForFile, openDocumentChat, emailDocument } = actions;
|
|
3937
|
-
const status = useDocStatus(doc);
|
|
3938
|
-
const isProcessing = ACTIVE_STATUSES.has(status);
|
|
3939
|
-
const isOffline = useOfflineDocumentIds().has(doc.external_id);
|
|
3940
|
-
const isViewing = useOpenViewerDocumentId() === doc.external_id;
|
|
3941
|
-
const showStatusMarker = !isProcessing && TERMINAL_STATUSES.has(status);
|
|
3942
|
-
const Icon = getFileTypeIcon(doc.file_name, { mime: doc.file_type });
|
|
3943
|
-
const { data: mailPolicy } = useMailPolicy();
|
|
3944
|
-
const shareAsEmail = async () => {
|
|
3945
|
-
try {
|
|
3946
|
-
await emailDocument?.(doc);
|
|
3947
|
-
} catch (error) {
|
|
3948
|
-
notify18(error instanceof Error ? error.message : "Could not attach document", "error");
|
|
3949
|
-
}
|
|
3950
|
-
};
|
|
3951
|
-
const startItems = startItemsForFile?.(doc);
|
|
3952
|
-
const menuItems = [
|
|
3953
|
-
{ id: "open", label: "Open", icon: SquarePen, onSelect: () => onOpen(doc) },
|
|
3954
|
-
...onReview ? [{ id: "review", label: "Open in Review", icon: BookOpen, onSelect: () => onReview(doc) }] : [],
|
|
3955
|
-
...openDocumentChat ? [
|
|
3956
|
-
{
|
|
3957
|
-
id: "chat",
|
|
3958
|
-
label: "Document chat",
|
|
3959
|
-
icon: MessagesSquare,
|
|
3960
|
-
onSelect: () => openDocumentChat(doc.external_id)
|
|
3961
|
-
}
|
|
3962
|
-
] : [],
|
|
3963
|
-
...startMenuItem(startItems ?? []),
|
|
3964
|
-
{
|
|
3965
|
-
id: "rename",
|
|
3966
|
-
label: "Rename",
|
|
3967
|
-
icon: Pencil,
|
|
3968
|
-
onSelect: () => onStartRename(doc),
|
|
3969
|
-
separatorBefore: true
|
|
3970
|
-
},
|
|
3971
|
-
{ id: "download", label: "Download", icon: Download, onSelect: () => onDownload(doc) },
|
|
3972
|
-
...emailDocument && mailPolicy?.enabled ? [
|
|
3973
|
-
{
|
|
3974
|
-
id: "email",
|
|
3975
|
-
label: "Send as email attachment",
|
|
3976
|
-
icon: Mail,
|
|
3977
|
-
onSelect: () => {
|
|
3978
|
-
void shareAsEmail();
|
|
3979
|
-
}
|
|
3980
|
-
}
|
|
3981
|
-
] : [],
|
|
3982
|
-
...onMove ? [{ id: "move", label: "Move to\u2026", icon: FolderInput, onSelect: () => onMove(doc) }] : [],
|
|
3983
|
-
...canDelete ? [
|
|
3984
|
-
{
|
|
3985
|
-
id: "delete",
|
|
3986
|
-
label: "Delete",
|
|
3987
|
-
icon: Trash2,
|
|
3988
|
-
onSelect: () => onDelete(doc),
|
|
3989
|
-
destructive: true,
|
|
3990
|
-
separatorBefore: true
|
|
3991
|
-
}
|
|
3992
|
-
] : []
|
|
3993
|
-
];
|
|
3994
|
-
const tooltip = renaming || dndActive ? void 0 : /* @__PURE__ */ jsx(FileTooltipContent, { doc, modifiedBy, tagNameById });
|
|
3995
|
-
return /* @__PURE__ */ jsx(
|
|
3996
|
-
ExplorerFileTile,
|
|
3997
|
-
{
|
|
3998
|
-
id: doc.external_id,
|
|
3999
|
-
title: getDocumentTitle(doc, doc.file_name ?? ""),
|
|
4000
|
-
density,
|
|
4001
|
-
selected,
|
|
4002
|
-
dragging,
|
|
4003
|
-
renaming,
|
|
4004
|
-
thumbnailUrl,
|
|
4005
|
-
renderFileIcon: (size) => /* @__PURE__ */ jsx(Icon, { size, className: "drop-shadow-sm" }),
|
|
4006
|
-
progress: isProcessing ? { label: STATUS_LABEL[status] ?? status, queued: status === "queued" } : void 0,
|
|
4007
|
-
statusMarker: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
4008
|
-
/* @__PURE__ */ jsx(TileVisibilityBadge, { doc }),
|
|
4009
|
-
showStatusMarker && /* @__PURE__ */ jsx(TileStatusBadge, { doc, status })
|
|
4010
|
-
] }),
|
|
4011
|
-
offlineMarker: isOffline ? /* @__PURE__ */ jsx(DocumentSyncGlyph, { docExtId: doc.external_id, size: 24, bgClassName: "bg-primary" }) : void 0,
|
|
4012
|
-
entity: /* @__PURE__ */ jsx(
|
|
4013
|
-
DocumentEntity,
|
|
4014
|
-
{
|
|
4015
|
-
doc,
|
|
4016
|
-
labelMaxWidth: "max-w-full",
|
|
4017
|
-
noClamp: true,
|
|
4018
|
-
labelClassName: "whitespace-normal line-clamp-2 break-words",
|
|
4019
|
-
viewing: isViewing,
|
|
4020
|
-
tooltipContent: /* @__PURE__ */ jsx(FileTooltipContent, { doc, modifiedBy, tagNameById }),
|
|
4021
|
-
className: cn(
|
|
4022
|
-
"w-full min-w-0 max-w-full bg-background/90 backdrop-blur-sm",
|
|
4023
|
-
density === "list" ? "text-xs" : void 0
|
|
4024
|
-
),
|
|
4025
|
-
onClick: (e) => {
|
|
4026
|
-
e.stopPropagation();
|
|
4027
|
-
onOpen(doc);
|
|
4028
|
-
}
|
|
4029
|
-
}
|
|
4030
|
-
),
|
|
4031
|
-
tooltip,
|
|
4032
|
-
menuItems,
|
|
4033
|
-
rootRef: setNodeRef,
|
|
4034
|
-
rootProps: { ...listeners2, ...attributes },
|
|
4035
|
-
onOpen: () => onOpen(doc),
|
|
4036
|
-
onSelect: (e) => onSelect(doc, e),
|
|
4037
|
-
onToggle: (e) => onToggle(doc, e),
|
|
4038
|
-
onCommitRename: (name) => onCommitRename(doc, name),
|
|
4039
|
-
onCancelRename
|
|
4040
|
-
}
|
|
4041
|
-
);
|
|
4042
|
-
});
|
|
4043
|
-
var FolderTile = memo(function FolderTile2({
|
|
4044
|
-
folder,
|
|
4045
|
-
density,
|
|
4046
|
-
editing,
|
|
4047
|
-
selected,
|
|
4048
|
-
partiallySelected,
|
|
4049
|
-
documents,
|
|
4050
|
-
onOpen,
|
|
4051
|
-
onToggleSelect,
|
|
4052
|
-
onCommitName,
|
|
4053
|
-
onCancelName,
|
|
4054
|
-
onStartRename,
|
|
4055
|
-
onDownload,
|
|
4056
|
-
onMove,
|
|
4057
|
-
onDelete,
|
|
4058
|
-
actions = NO_ACTIONS
|
|
4059
|
-
}) {
|
|
4060
|
-
const { setNodeRef, isOver } = useDroppable({
|
|
4061
|
-
id: `folder:${folder.path.join("/")}`,
|
|
4062
|
-
data: { type: "folder", path: folder.path }
|
|
4063
|
-
});
|
|
4064
|
-
const { startItemsForFolder } = actions;
|
|
4065
|
-
const tasks = useProcessingTasks();
|
|
4066
|
-
const processingCount = useMemo(
|
|
4067
|
-
() => documents.filter(
|
|
4068
|
-
(doc) => isActiveDocumentStatus(resolveDocumentStatus(doc, tasks[doc.external_id]))
|
|
4069
|
-
).length,
|
|
4070
|
-
[documents, tasks]
|
|
4071
|
-
);
|
|
4072
|
-
const isEmpty = folder.count === 0;
|
|
4073
|
-
const iconSize = density === "list" ? 34 : 48;
|
|
4074
|
-
const menuItems = [
|
|
4075
|
-
...onStartRename ? [{ id: "rename", label: "Rename", icon: Pencil, onSelect: () => onStartRename(folder) }] : [],
|
|
4076
|
-
...!isEmpty ? startMenuItem(startItemsForFolder?.(folder.path.join("/")) ?? []) : [],
|
|
4077
|
-
...onDownload && !isEmpty ? [{ id: "download", label: "Download", icon: Download, onSelect: () => onDownload(folder) }] : [],
|
|
4078
|
-
...onMove && !isEmpty ? [{ id: "move", label: "Move to\u2026", icon: FolderInput, onSelect: () => onMove(folder) }] : [],
|
|
4079
|
-
...onDelete ? [
|
|
4080
|
-
{
|
|
4081
|
-
id: "delete",
|
|
4082
|
-
label: "Delete",
|
|
4083
|
-
icon: Trash2,
|
|
4084
|
-
onSelect: () => onDelete(folder),
|
|
4085
|
-
destructive: true,
|
|
4086
|
-
separatorBefore: true
|
|
4087
|
-
}
|
|
4088
|
-
] : []
|
|
4089
|
-
];
|
|
4090
|
-
const displayName = folder.path.length === 1 ? formatFolderSegment(folder.name) : folder.name;
|
|
4091
|
-
const providerIcon = folder.path.length === 1 && hasFolderProviderIcon(folder.name) ? /* @__PURE__ */ jsx(
|
|
4092
|
-
"span",
|
|
4093
|
-
{
|
|
4094
|
-
className: "flex items-center justify-center drop-shadow-sm",
|
|
4095
|
-
style: { width: iconSize, height: iconSize },
|
|
4096
|
-
children: /* @__PURE__ */ jsx(FolderProviderIcon, { folderPath: folder.name, className: "h-full w-full" })
|
|
4097
|
-
}
|
|
4098
|
-
) : void 0;
|
|
4099
|
-
return /* @__PURE__ */ jsx(
|
|
4100
|
-
ExplorerFolderTile,
|
|
4101
|
-
{
|
|
4102
|
-
name: folder.name,
|
|
4103
|
-
displayName: displayName === "" ? null : displayName,
|
|
4104
|
-
path: folder.path,
|
|
4105
|
-
count: folder.count,
|
|
4106
|
-
density,
|
|
4107
|
-
editing,
|
|
4108
|
-
selected,
|
|
4109
|
-
partiallySelected,
|
|
4110
|
-
processingCount,
|
|
4111
|
-
isOver,
|
|
4112
|
-
icon: providerIcon,
|
|
4113
|
-
menuItems,
|
|
4114
|
-
rootRef: setNodeRef,
|
|
4115
|
-
onOpen: () => onOpen(folder),
|
|
4116
|
-
onToggleSelect: onToggleSelect ? (e) => onToggleSelect(folder, e) : void 0,
|
|
4117
|
-
onCommitName: (name) => onCommitName?.(folder, name),
|
|
4118
|
-
onCancelName
|
|
4119
|
-
}
|
|
4120
|
-
);
|
|
4121
|
-
});
|
|
4122
|
-
var PROCESSING_LABELS = {
|
|
4123
|
-
parsing: "Parsing",
|
|
4124
|
-
encrypting: "Encrypting",
|
|
4125
|
-
indexing: "Indexing",
|
|
4126
|
-
analysing: "Analysing"
|
|
4127
|
-
};
|
|
4128
|
-
var QUOTA_PREFIX = "QUOTA_EXCEEDED:";
|
|
4129
|
-
function parseQuotaError(errorMessage2) {
|
|
4130
|
-
if (!errorMessage2 || !errorMessage2.startsWith(QUOTA_PREFIX)) return null;
|
|
4131
|
-
const body = errorMessage2.slice(QUOTA_PREFIX.length);
|
|
4132
|
-
const spend = body.match(/spend=([0-9.]+)/)?.[1];
|
|
4133
|
-
const budget = body.match(/budget=([0-9.]+)/)?.[1];
|
|
4134
|
-
const projectExtId = body.match(/project_ext_id=([^\s,]+)/)?.[1] ?? null;
|
|
4135
|
-
if (spend === void 0 || budget === void 0) return null;
|
|
4136
|
-
return { spend: Number(spend), budget: Number(budget), projectExtId };
|
|
4137
|
-
}
|
|
4138
|
-
function useResolvedDocStatus(doc) {
|
|
4139
|
-
const task = useProcessingTask(doc?.external_id ?? "");
|
|
4140
|
-
const isPendingSync = useDocumentPendingSync(doc?.external_id);
|
|
4141
|
-
if (!doc || !doc.status) return null;
|
|
4142
|
-
const status = resolveDocumentStatus(doc, doc.external_id ? task : void 0);
|
|
4143
|
-
return { status, isPendingSync, failedStage: task?.failed_stage ?? doc.failed_stage ?? null };
|
|
4144
|
-
}
|
|
4145
|
-
var GLYPH = "size-3.5 shrink-0";
|
|
4146
|
-
function describeGlyph(resolved, doc) {
|
|
4147
|
-
if (resolved.isPendingSync) {
|
|
4148
|
-
return {
|
|
4149
|
-
node: /* @__PURE__ */ jsx(RefreshCw, { className: `${GLYPH} text-yellow-text` }),
|
|
4150
|
-
title: "Changes saved on this device, waiting to sync"
|
|
4151
|
-
};
|
|
4152
|
-
}
|
|
4153
|
-
switch (resolved.status) {
|
|
4154
|
-
case "queued": {
|
|
4155
|
-
const isDocx = doc.file_name?.toLowerCase().endsWith(".docx");
|
|
4156
|
-
return {
|
|
4157
|
-
node: /* @__PURE__ */ jsx(Clock, { className: `${GLYPH} text-muted-foreground` }),
|
|
4158
|
-
title: isDocx ? "The document is available to edit. PDF and search indexing are processing." : "Queued, waiting to start"
|
|
4159
|
-
};
|
|
4160
|
-
}
|
|
4161
|
-
case "parsing":
|
|
4162
|
-
case "encrypting":
|
|
4163
|
-
case "indexing":
|
|
4164
|
-
case "analysing":
|
|
4165
|
-
return {
|
|
4166
|
-
node: /* @__PURE__ */ jsx(Loader2, { className: `${GLYPH} animate-spin text-ai-ink` }),
|
|
4167
|
-
title: PROCESSING_LABELS[resolved.status]
|
|
4168
|
-
};
|
|
4169
|
-
case "skipped":
|
|
4170
|
-
return {
|
|
4171
|
-
node: /* @__PURE__ */ jsx(SkipForward, { className: `${GLYPH} text-muted-foreground` }),
|
|
4172
|
-
title: "Skipped"
|
|
4173
|
-
};
|
|
4174
|
-
case "empty":
|
|
4175
|
-
return {
|
|
4176
|
-
node: /* @__PURE__ */ jsx(FileX, { className: `${GLYPH} text-yellow-text` }),
|
|
4177
|
-
title: "Empty, no extractable content"
|
|
4178
|
-
};
|
|
4179
|
-
case "low-content":
|
|
4180
|
-
return {
|
|
4181
|
-
node: /* @__PURE__ */ jsx(AlertTriangle, { className: `${GLYPH} text-yellow-text` }),
|
|
4182
|
-
title: "Low content, minimal extractable content"
|
|
4183
|
-
};
|
|
4184
|
-
case "failed":
|
|
4185
|
-
if (doc.error_message?.startsWith(QUOTA_PREFIX)) {
|
|
4186
|
-
return { node: /* @__PURE__ */ jsx(Zap, { className: `${GLYPH} text-yellow-text` }), title: "AI usage used up" };
|
|
4187
|
-
}
|
|
4188
|
-
return {
|
|
4189
|
-
node: /* @__PURE__ */ jsx(
|
|
4190
|
-
FailedStageIcon,
|
|
4191
|
-
{
|
|
4192
|
-
stage: resolved.failedStage,
|
|
4193
|
-
errorMessage: doc.error_message,
|
|
4194
|
-
className: `${GLYPH} text-red-text`
|
|
4195
|
-
}
|
|
4196
|
-
),
|
|
4197
|
-
title: "Failed"
|
|
4198
|
-
};
|
|
4199
|
-
default:
|
|
4200
|
-
return null;
|
|
4201
|
-
}
|
|
4202
|
-
}
|
|
4203
|
-
var DocumentStatusGlyph = memo(function DocumentStatusGlyph2({
|
|
4204
|
-
doc
|
|
4205
|
-
}) {
|
|
4206
|
-
const resolved = useResolvedDocStatus(doc);
|
|
4207
|
-
const shown = resolved ? describeGlyph(resolved, doc) : null;
|
|
4208
|
-
if (!resolved || !shown) return null;
|
|
4209
|
-
return /* @__PURE__ */ jsx(
|
|
4210
|
-
"span",
|
|
4211
|
-
{
|
|
4212
|
-
role: "img",
|
|
4213
|
-
"aria-label": shown.title,
|
|
4214
|
-
title: shown.title,
|
|
4215
|
-
"data-slot": "document-status-glyph",
|
|
4216
|
-
"data-status": resolved.status,
|
|
4217
|
-
className: "inline-flex items-center",
|
|
4218
|
-
children: shown.node
|
|
4219
|
-
}
|
|
4220
|
-
);
|
|
4221
|
-
});
|
|
4222
|
-
var StatusCell2 = memo(function StatusCell3({
|
|
4223
|
-
doc,
|
|
4224
|
-
onStatusClick,
|
|
4225
|
-
actions
|
|
4226
|
-
}) {
|
|
4227
|
-
const resolved = useResolvedDocStatus(doc);
|
|
4228
|
-
if (!doc || !resolved) return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "\u2014" });
|
|
4229
|
-
const { status, isPendingSync, failedStage } = resolved;
|
|
4230
|
-
const cell = (pill) => /* @__PURE__ */ jsx("div", { className: "flex h-full w-full items-center justify-center overflow-hidden", children: pill });
|
|
4231
|
-
const click = () => onStatusClick?.();
|
|
4232
|
-
if (isPendingSync) {
|
|
4233
|
-
return cell(
|
|
4234
|
-
/* @__PURE__ */ jsx(
|
|
4235
|
-
StatusPill,
|
|
4236
|
-
{
|
|
4237
|
-
tone: "warning",
|
|
4238
|
-
icon: /* @__PURE__ */ jsx(RefreshCw, { className: "size-3.5" }),
|
|
4239
|
-
label: "Pending",
|
|
4240
|
-
title: "Changes saved on this device \u2014 waiting to sync",
|
|
4241
|
-
onClick: openPendingSyncDialog
|
|
4242
|
-
}
|
|
4243
|
-
)
|
|
4244
|
-
);
|
|
4245
|
-
}
|
|
4246
|
-
switch (status) {
|
|
4247
|
-
case "completed":
|
|
4248
|
-
return cell(
|
|
4249
|
-
/* @__PURE__ */ jsx(
|
|
4250
|
-
StatusPill,
|
|
4251
|
-
{
|
|
4252
|
-
tone: "success",
|
|
4253
|
-
icon: /* @__PURE__ */ jsx(CheckCircle, { className: "size-3.5" }),
|
|
4254
|
-
label: "Ready",
|
|
4255
|
-
title: "Ready",
|
|
4256
|
-
onClick: click
|
|
4257
|
-
}
|
|
4258
|
-
)
|
|
4259
|
-
);
|
|
4260
|
-
case "skipped":
|
|
4261
|
-
return cell(
|
|
4262
|
-
/* @__PURE__ */ jsx(
|
|
4263
|
-
StatusPill,
|
|
4264
|
-
{
|
|
4265
|
-
tone: "neutral",
|
|
4266
|
-
icon: /* @__PURE__ */ jsx(SkipForward, { className: "size-3.5" }),
|
|
4267
|
-
label: "Skipped",
|
|
4268
|
-
title: "Skipped",
|
|
4269
|
-
onClick: click
|
|
4270
|
-
}
|
|
4271
|
-
)
|
|
4272
|
-
);
|
|
4273
|
-
case "empty":
|
|
4274
|
-
return cell(
|
|
4275
|
-
/* @__PURE__ */ jsx(
|
|
4276
|
-
StatusPill,
|
|
4277
|
-
{
|
|
4278
|
-
tone: "warning",
|
|
4279
|
-
icon: /* @__PURE__ */ jsx(FileX, { className: "size-3.5" }),
|
|
4280
|
-
label: "Empty",
|
|
4281
|
-
title: "Empty - no extractable content",
|
|
4282
|
-
onClick: click
|
|
4283
|
-
}
|
|
4284
|
-
)
|
|
4285
|
-
);
|
|
4286
|
-
case "low-content":
|
|
4287
|
-
return cell(
|
|
4288
|
-
/* @__PURE__ */ jsx(
|
|
4289
|
-
StatusPill,
|
|
4290
|
-
{
|
|
4291
|
-
tone: "warning",
|
|
4292
|
-
icon: /* @__PURE__ */ jsx(AlertTriangle, { className: "size-3.5" }),
|
|
4293
|
-
label: "Low content",
|
|
4294
|
-
title: "Low content - minimal extractable content",
|
|
4295
|
-
onClick: click
|
|
4296
|
-
}
|
|
4297
|
-
)
|
|
4298
|
-
);
|
|
4299
|
-
case "failed": {
|
|
4300
|
-
const quota = parseQuotaError(doc.error_message);
|
|
4301
|
-
if (quota) {
|
|
4302
|
-
return cell(
|
|
4303
|
-
/* @__PURE__ */ jsx(
|
|
4304
|
-
StatusPill,
|
|
4305
|
-
{
|
|
4306
|
-
tone: "warning",
|
|
4307
|
-
icon: /* @__PURE__ */ jsx(Zap, { className: "size-3.5" }),
|
|
4308
|
-
label: "Quota",
|
|
4309
|
-
title: "AI usage used up \u2014 click for options",
|
|
4310
|
-
onClick: () => actions?.openQuota?.(quota)
|
|
4311
|
-
}
|
|
4312
|
-
)
|
|
4313
|
-
);
|
|
4314
|
-
}
|
|
4315
|
-
return cell(
|
|
4316
|
-
/* @__PURE__ */ jsx(
|
|
4317
|
-
StatusPill,
|
|
4318
|
-
{
|
|
4319
|
-
tone: "danger",
|
|
4320
|
-
icon: /* @__PURE__ */ jsx(
|
|
4321
|
-
FailedStageIcon,
|
|
4322
|
-
{
|
|
4323
|
-
stage: failedStage,
|
|
4324
|
-
errorMessage: doc.error_message,
|
|
4325
|
-
className: "size-3.5"
|
|
4326
|
-
}
|
|
4327
|
-
),
|
|
4328
|
-
label: "Failed",
|
|
4329
|
-
onClick: click
|
|
4330
|
-
}
|
|
4331
|
-
)
|
|
4332
|
-
);
|
|
4333
|
-
}
|
|
4334
|
-
case "queued": {
|
|
4335
|
-
const isDocx = doc.file_name?.toLowerCase().endsWith(".docx");
|
|
4336
|
-
return cell(
|
|
4337
|
-
/* @__PURE__ */ jsx(
|
|
4338
|
-
StatusPill,
|
|
4339
|
-
{
|
|
4340
|
-
tone: "neutral",
|
|
4341
|
-
label: isDocx ? "Uploaded" : "Queued",
|
|
4342
|
-
progress: "queued",
|
|
4343
|
-
title: isDocx ? "The document is available to edit. PDF and search indexing are processing." : "Queued - waiting to start",
|
|
4344
|
-
onClick: click
|
|
4345
|
-
}
|
|
4346
|
-
)
|
|
4347
|
-
);
|
|
4348
|
-
}
|
|
4349
|
-
case "parsing":
|
|
4350
|
-
case "encrypting":
|
|
4351
|
-
case "indexing":
|
|
4352
|
-
case "analysing":
|
|
4353
|
-
return cell(
|
|
4354
|
-
/* @__PURE__ */ jsx(
|
|
4355
|
-
StatusPill,
|
|
4356
|
-
{
|
|
4357
|
-
tone: "info",
|
|
4358
|
-
label: PROCESSING_LABELS[status],
|
|
4359
|
-
progress: "processing",
|
|
4360
|
-
title: PROCESSING_LABELS[status],
|
|
4361
|
-
onClick: click
|
|
4362
|
-
}
|
|
4363
|
-
)
|
|
4364
|
-
);
|
|
4365
|
-
default:
|
|
4366
|
-
return cell(/* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: status }));
|
|
4367
|
-
}
|
|
4368
|
-
});
|
|
4369
|
-
var UserAvatar = memo(function UserAvatar2({
|
|
4370
|
-
user,
|
|
4371
|
-
isMe = false,
|
|
4372
|
-
onOpen
|
|
4373
|
-
}) {
|
|
4374
|
-
if (!user) return /* @__PURE__ */ jsx(UserEntity, { empty: true, size: "xs" });
|
|
4375
|
-
const colorClass = getUserAvatarColor(user.external_id);
|
|
4376
|
-
const agent = isAgent(user);
|
|
4377
|
-
return /* @__PURE__ */ jsx(
|
|
4378
|
-
UserEntity,
|
|
4379
|
-
{
|
|
4380
|
-
size: "xs",
|
|
4381
|
-
variant: "icon",
|
|
4382
|
-
showTooltip: false,
|
|
4383
|
-
interactive: !!onOpen,
|
|
4384
|
-
initials: getUserInitials(user),
|
|
4385
|
-
displayName: isMe ? "You" : getUserDisplayName(user),
|
|
4386
|
-
picture: user.picture,
|
|
4387
|
-
colorClass,
|
|
4388
|
-
isAgent: agent,
|
|
4389
|
-
isVerified: user.is_identity_verified === true,
|
|
4390
|
-
agentStyle: agent ? agentAvatarColors(colorClass) : void 0,
|
|
4391
|
-
isMe,
|
|
4392
|
-
onClick: onOpen ? (e) => {
|
|
4393
|
-
e.stopPropagation();
|
|
4394
|
-
onOpen(user.external_id);
|
|
4395
|
-
} : void 0
|
|
4396
|
-
}
|
|
4397
|
-
);
|
|
4398
|
-
});
|
|
4399
|
-
function DocumentSummaryTooltip({
|
|
4400
|
-
doc,
|
|
4401
|
-
users
|
|
4402
|
-
}) {
|
|
4403
|
-
const { data: tags } = useTags();
|
|
4404
|
-
const modifiedBy = users.find(
|
|
4405
|
-
(u) => u.external_id === (doc.updated_by_ext_id ?? doc.created_by_ext_id)
|
|
4406
|
-
);
|
|
4407
|
-
const tagNameById = /* @__PURE__ */ new Map();
|
|
4408
|
-
for (const tag of tags ?? []) tagNameById.set(tag.external_id, tag.name);
|
|
4409
|
-
return /* @__PURE__ */ jsx(FileTooltipContent, { doc, modifiedBy, tagNameById });
|
|
4410
|
-
}
|
|
4411
|
-
var OPEN_AFTER_DOUBLE_CLICK_WINDOW_MS = 300;
|
|
4412
|
-
var DocumentNameCell = memo(function DocumentNameCell2({
|
|
4413
|
-
doc,
|
|
4414
|
-
canEdit,
|
|
4415
|
-
users,
|
|
4416
|
-
onOpen,
|
|
4417
|
-
onReview,
|
|
4418
|
-
onDocumentChat,
|
|
4419
|
-
onRename,
|
|
4420
|
-
onDownload,
|
|
4421
|
-
onMove,
|
|
4422
|
-
onDelete
|
|
4423
|
-
}) {
|
|
4424
|
-
const arbi = useArbi();
|
|
4425
|
-
const { notify: notify18 } = useBlocksEnvironment();
|
|
4426
|
-
const isViewing = useOpenViewerDocumentId() === doc.external_id;
|
|
4427
|
-
const openTimerRef = useRef(void 0);
|
|
4428
|
-
useEffect(() => () => window.clearTimeout(openTimerRef.current), []);
|
|
4429
|
-
const downloadMarkup = async () => {
|
|
4430
|
-
try {
|
|
4431
|
-
const { blob, fileName } = await fetchMarkupPdf(arbi.getClient().fetch, doc.external_id);
|
|
4432
|
-
downloadBlob(blob, fileName);
|
|
4433
|
-
} catch (e) {
|
|
4434
|
-
notify18(e instanceof Error ? e.message : "The markup could not be downloaded", "error");
|
|
4435
|
-
}
|
|
4436
|
-
};
|
|
4437
|
-
return /* @__PURE__ */ jsx(
|
|
4438
|
-
DocumentNameCellFrame,
|
|
4439
|
-
{
|
|
4440
|
-
testId: `open-document-viewer-button-${doc.external_id}`,
|
|
4441
|
-
isViewing,
|
|
4442
|
-
subtitle: [doc.created_at?.slice(0, 10), doc.folder ? formatFolderLabel(doc.folder) : null].filter(Boolean).join(" \xB7 "),
|
|
4443
|
-
children: /* @__PURE__ */ jsx(
|
|
4444
|
-
DocumentEntity,
|
|
4445
|
-
{
|
|
4446
|
-
doc,
|
|
4447
|
-
size: "base",
|
|
4448
|
-
labelMaxWidth: "max-w-full",
|
|
4449
|
-
fullWidth: true,
|
|
4450
|
-
status: /* @__PURE__ */ jsx(DocumentStatusGlyph, { doc }),
|
|
4451
|
-
tooltipContent: /* @__PURE__ */ jsx(DocumentSummaryTooltip, { doc, users }),
|
|
4452
|
-
iconBadge: /* @__PURE__ */ jsx(
|
|
4453
|
-
DocumentSyncGlyph,
|
|
4454
|
-
{
|
|
4455
|
-
docExtId: doc.external_id,
|
|
4456
|
-
size: 10,
|
|
4457
|
-
className: "absolute -bottom-1 -right-1"
|
|
4458
|
-
}
|
|
4459
|
-
),
|
|
4460
|
-
onClick: (e) => {
|
|
4461
|
-
e.stopPropagation();
|
|
4462
|
-
window.clearTimeout(openTimerRef.current);
|
|
4463
|
-
if (e.detail > 1) return;
|
|
4464
|
-
openTimerRef.current = window.setTimeout(onOpen, OPEN_AFTER_DOUBLE_CLICK_WINDOW_MS);
|
|
4465
|
-
},
|
|
4466
|
-
actions: /* @__PURE__ */ jsx(
|
|
4467
|
-
DocumentRowMenu,
|
|
4468
|
-
{
|
|
4469
|
-
canEdit,
|
|
4470
|
-
onOpen,
|
|
4471
|
-
onReview,
|
|
4472
|
-
onDocumentChat,
|
|
4473
|
-
onRename,
|
|
4474
|
-
onDownload,
|
|
4475
|
-
onDownloadMarkup: currentHasMarkup(doc) ? () => void downloadMarkup() : void 0,
|
|
4476
|
-
downloadMarkupDisabledReason: isSignedVersion(doc) ? SIGNED_LOCKED_REASON : void 0,
|
|
4477
|
-
onMove,
|
|
4478
|
-
onDelete
|
|
4479
|
-
}
|
|
4480
|
-
),
|
|
4481
|
-
className: "min-w-0 max-w-full border-transparent bg-transparent hover:bg-foreground/5"
|
|
4482
|
-
}
|
|
4483
|
-
)
|
|
4484
|
-
}
|
|
4485
|
-
);
|
|
4486
|
-
});
|
|
4487
|
-
var DocumentSharedCell = memo(function DocumentSharedCell2({
|
|
4488
|
-
document: document2,
|
|
4489
|
-
disabled = false,
|
|
4490
|
-
disabledTooltip,
|
|
4491
|
-
onToggle
|
|
4492
|
-
}) {
|
|
4493
|
-
const handleToggle = useCallback(
|
|
4494
|
-
(shouldShare) => onToggle(document2.external_id, shouldShare),
|
|
4495
|
-
[document2.external_id, onToggle]
|
|
4496
|
-
);
|
|
4497
|
-
return /* @__PURE__ */ jsx(
|
|
4498
|
-
SharedCell,
|
|
4499
|
-
{
|
|
4500
|
-
item: document2,
|
|
4501
|
-
onToggle: handleToggle,
|
|
4502
|
-
disabled,
|
|
4503
|
-
disabledTooltip,
|
|
4504
|
-
tooltipActive: visibilityToggleTooltip(true),
|
|
4505
|
-
tooltipInactive: visibilityToggleTooltip(false),
|
|
4506
|
-
workspaceLabel: getEntityLabel("WORKSPACE")
|
|
4507
|
-
}
|
|
4508
|
-
);
|
|
4509
|
-
});
|
|
4510
|
-
function useDocumentFolders(documents, value) {
|
|
4511
|
-
return useMemo(() => {
|
|
4512
|
-
const paths = /* @__PURE__ */ new Set();
|
|
4513
|
-
for (const doc of documents) if (doc.folder) paths.add(doc.folder);
|
|
4514
|
-
if (value) paths.add(value);
|
|
4515
|
-
return [...paths].sort((a, b) => a.localeCompare(b));
|
|
4516
|
-
}, [documents, value]);
|
|
4517
|
-
}
|
|
4518
|
-
function folderSegments(folder) {
|
|
4519
|
-
return folder.split("/").map((part, i) => i === 0 ? formatFolderSegment(part) : part).filter((part, i) => i > 0 || part !== "");
|
|
4520
|
-
}
|
|
4521
|
-
var DocumentFolderCell = memo(
|
|
4522
|
-
function DocumentFolderCell2({
|
|
4523
|
-
document: document2,
|
|
4524
|
-
isEditable,
|
|
4525
|
-
allDocuments,
|
|
4526
|
-
onUpdateFolder
|
|
4527
|
-
}) {
|
|
4528
|
-
const folder = document2.folder;
|
|
4529
|
-
const folders = useDocumentFolders(allDocuments, folder);
|
|
4530
|
-
return /* @__PURE__ */ jsx(
|
|
4531
|
-
FolderCell,
|
|
4532
|
-
{
|
|
4533
|
-
folder,
|
|
4534
|
-
segments: folder ? folderSegments(folder) : [],
|
|
4535
|
-
icon: folder && hasFolderProviderIcon(folder) ? /* @__PURE__ */ jsx(FolderProviderIcon, { folderPath: folder, className: "h-3.5 w-3.5 flex-none shrink-0" }) : void 0,
|
|
4536
|
-
isEditable,
|
|
4537
|
-
picker: /* @__PURE__ */ jsx(
|
|
4538
|
-
FolderCommandList,
|
|
4539
|
-
{
|
|
4540
|
-
folders,
|
|
4541
|
-
value: folder,
|
|
4542
|
-
onSelect: (next) => onUpdateFolder(document2.external_id, next),
|
|
4543
|
-
showRemove: !!folder
|
|
4544
|
-
}
|
|
4545
|
-
)
|
|
4546
|
-
}
|
|
4547
|
-
);
|
|
4548
|
-
},
|
|
4549
|
-
(prev, next) => prev.document.external_id === next.document.external_id && prev.document.folder === next.document.folder && prev.isEditable === next.isEditable && prev.allDocuments === next.allDocuments && prev.onUpdateFolder === next.onUpdateFolder
|
|
4550
|
-
);
|
|
4551
|
-
var RELATION_LABELS = {
|
|
4552
|
-
redaction: "Redacted copy",
|
|
4553
|
-
annotated: "Annotated copy",
|
|
4554
|
-
production: "Production",
|
|
4555
|
-
crop: "Crop",
|
|
4556
|
-
redline_base: "Redline",
|
|
4557
|
-
redline_revised: "Redline",
|
|
4558
|
-
translation: "Translation"
|
|
4559
|
-
};
|
|
4560
|
-
var relationLabel = (role, version) => {
|
|
4561
|
-
const label = role ? RELATION_LABELS[role] : void 0;
|
|
4562
|
-
return version ? `${label ?? "Made"} from v${version}` : label;
|
|
4563
|
-
};
|
|
4564
|
-
var RelatedDocumentsCell = memo(function RelatedDocumentsCell2({
|
|
4565
|
-
currentDoc,
|
|
4566
|
-
related,
|
|
4567
|
-
viewingDocumentId,
|
|
4568
|
-
onDocumentClick,
|
|
4569
|
-
onDelete,
|
|
4570
|
-
onCompare
|
|
4571
|
-
}) {
|
|
4572
|
-
return /* @__PURE__ */ jsx(
|
|
4573
|
-
RelatedDocsCell,
|
|
4574
|
-
{
|
|
4575
|
-
parent: related.parent,
|
|
4576
|
-
attachments: related.children,
|
|
4577
|
-
madeFrom: related.madeFrom,
|
|
4578
|
-
copies: related.copies,
|
|
4579
|
-
getRelation: (doc) => relationLabel(related.roles[doc.external_id], related.versions?.[doc.external_id]),
|
|
4580
|
-
duplicates: related.duplicates,
|
|
4581
|
-
similar: related.similar.map(({ doc }) => doc),
|
|
4582
|
-
renderDoc: (doc) => /* @__PURE__ */ jsx(
|
|
4583
|
-
DocumentEntity,
|
|
4584
|
-
{
|
|
4585
|
-
doc,
|
|
4586
|
-
icon: viewingDocumentId === doc.external_id ? /* @__PURE__ */ jsx(Eye, { className: "h-3.5 w-3.5 flex-shrink-0 text-primary" }) : void 0,
|
|
4587
|
-
onClick: () => onDocumentClick(doc.external_id)
|
|
4588
|
-
}
|
|
4589
|
-
),
|
|
4590
|
-
getKey: (doc) => doc.external_id,
|
|
4591
|
-
onSwitchTo: (doc) => {
|
|
4592
|
-
const version = related.versions?.[doc.external_id];
|
|
4593
|
-
onDocumentClick(version ? `${doc.external_id}@v${version}` : doc.external_id);
|
|
4594
|
-
},
|
|
4595
|
-
onDelete,
|
|
4596
|
-
onCompare: onCompare ? (doc) => onCompare(currentDoc.external_id, doc.external_id) : void 0
|
|
4597
|
-
}
|
|
4598
|
-
);
|
|
4599
|
-
});
|
|
4600
|
-
var NOT_A_MEMBER_MESSAGE = "Join this workspace as a collaborator or owner to create or apply labels.";
|
|
4601
|
-
var DocumentLabelsCell = memo(function DocumentLabelsCell2({
|
|
4602
|
-
doc,
|
|
4603
|
-
labels,
|
|
4604
|
-
createDocTag,
|
|
4605
|
-
deleteDocTag,
|
|
4606
|
-
createTag,
|
|
4607
|
-
isMember,
|
|
4608
|
-
rowHeight,
|
|
4609
|
-
actions
|
|
4610
|
-
}) {
|
|
4611
|
-
const isCreatingTag = useIsCreatingTag();
|
|
4612
|
-
const { notify: notify18 } = useBlocksEnvironment();
|
|
4613
|
-
const options2 = useMemo(
|
|
4614
|
-
() => labels.map((t) => ({
|
|
4615
|
-
id: t.external_id,
|
|
4616
|
-
name: t.name,
|
|
4617
|
-
color: getEntityColor(t.external_id, "medium")
|
|
4618
|
-
})),
|
|
4619
|
-
[labels]
|
|
4620
|
-
);
|
|
4621
|
-
const appliedIds = useMemo(
|
|
4622
|
-
() => new Set(
|
|
4623
|
-
(doc.doctags || []).filter((dt) => labels.some((t) => t.external_id === dt.tag_ext_id)).map((dt) => dt.tag_ext_id)
|
|
4624
|
-
),
|
|
4625
|
-
[doc.doctags, labels]
|
|
4626
|
-
);
|
|
4627
|
-
const applyTag = useCallback(
|
|
4628
|
-
(tagId) => createDocTag.mutateAsync({ tagId, docIds: [doc.external_id] }),
|
|
4629
|
-
[createDocTag, doc.external_id]
|
|
4630
|
-
);
|
|
4631
|
-
const handleToggle = useCallback(
|
|
4632
|
-
async (tagId) => {
|
|
4633
|
-
if (!isMember) return notify18(NOT_A_MEMBER_MESSAGE, "info");
|
|
4634
|
-
if (appliedIds.has(tagId)) {
|
|
4635
|
-
await deleteDocTag.mutateAsync({ tagId, docIds: [doc.external_id] });
|
|
4636
|
-
} else {
|
|
4637
|
-
await applyTag(tagId);
|
|
4638
|
-
}
|
|
4639
|
-
},
|
|
4640
|
-
[isMember, appliedIds, deleteDocTag, applyTag, doc.external_id, notify18]
|
|
4641
|
-
);
|
|
4642
|
-
const handleCreate = useCallback(
|
|
4643
|
-
async (name) => {
|
|
4644
|
-
const trimmed = name.trim();
|
|
4645
|
-
if (!trimmed) return;
|
|
4646
|
-
if (!isMember) return notify18(NOT_A_MEMBER_MESSAGE, "info");
|
|
4647
|
-
const existing = labels.find((t) => t.name.toLowerCase() === trimmed.toLowerCase());
|
|
4648
|
-
if (existing) {
|
|
4649
|
-
if (!appliedIds.has(existing.external_id)) await applyTag(existing.external_id);
|
|
4650
|
-
return;
|
|
4651
|
-
}
|
|
4652
|
-
if (isCreatingTag(trimmed)) return;
|
|
4653
|
-
const created = await createTag.mutateAsync({
|
|
4654
|
-
name: trimmed,
|
|
4655
|
-
tagType: { type: "checkbox", options: [] },
|
|
4656
|
-
shared: false
|
|
4657
|
-
});
|
|
4658
|
-
if (created?.external_id) await applyTag(created.external_id);
|
|
4659
|
-
},
|
|
4660
|
-
[isMember, labels, appliedIds, createTag, applyTag, isCreatingTag, notify18]
|
|
4661
|
-
);
|
|
4662
|
-
const openFieldsManager = actions?.openFieldsManager;
|
|
4663
|
-
return /* @__PURE__ */ jsx(
|
|
4664
|
-
LabelMultiSelectView,
|
|
4665
|
-
{
|
|
4666
|
-
options: options2,
|
|
4667
|
-
appliedIds,
|
|
4668
|
-
onToggle: handleToggle,
|
|
4669
|
-
onCreate: handleCreate,
|
|
4670
|
-
onEditLabels: openFieldsManager ? () => openFieldsManager() : void 0,
|
|
4671
|
-
rowHeight
|
|
4672
|
-
}
|
|
4673
|
-
);
|
|
4674
|
-
});
|
|
4675
|
-
function DocumentUser({
|
|
4676
|
-
user,
|
|
4677
|
-
tooltip = true,
|
|
4678
|
-
variant = "icon"
|
|
4679
|
-
}) {
|
|
4680
|
-
const { renderUser: renderUser2 } = useDocumentsSupport();
|
|
4681
|
-
const { openUser } = useDocumentHostActions();
|
|
4682
|
-
if (user && renderUser2) return /* @__PURE__ */ jsx(Fragment, { children: renderUser2(user, { tooltip, variant }) });
|
|
4683
|
-
if (user && variant === "pill")
|
|
4684
|
-
return /* @__PURE__ */ jsx(
|
|
4685
|
-
UserEntity,
|
|
4686
|
-
{
|
|
4687
|
-
size: "sm",
|
|
4688
|
-
variant: "pill",
|
|
4689
|
-
displayName: getUserDisplayName(user),
|
|
4690
|
-
picture: user.picture,
|
|
4691
|
-
initials: `${user.given_name?.charAt(0) ?? ""}${user.family_name?.charAt(0) ?? ""}`
|
|
4692
|
-
}
|
|
4693
|
-
);
|
|
4694
|
-
return /* @__PURE__ */ jsx(UserAvatar, { user, onOpen: openUser });
|
|
4695
|
-
}
|
|
4696
|
-
function useMemberLookup() {
|
|
4697
|
-
const { data: members = [] } = useWorkspaceUsers();
|
|
4698
|
-
return useCallback(
|
|
4699
|
-
(userId) => userId ? members.find((m) => m.user.external_id === userId)?.user : void 0,
|
|
4700
|
-
[members]
|
|
4701
|
-
);
|
|
4702
|
-
}
|
|
4703
3634
|
var ANNOTATION_FORMATS = ["text", "select", "number", "date"];
|
|
4704
3635
|
var isAnnotationFormat = (type) => ANNOTATION_FORMATS.includes(type ?? "");
|
|
4705
3636
|
function kindOptions(group, tag) {
|
|
@@ -11974,8 +10905,8 @@ function WorkspaceCreateForm({
|
|
|
11974
10905
|
);
|
|
11975
10906
|
return;
|
|
11976
10907
|
}
|
|
11977
|
-
const
|
|
11978
|
-
const response = await
|
|
10908
|
+
const create2 = seed?.create ?? createWorkspaceMutation.mutateAsync;
|
|
10909
|
+
const response = await create2({
|
|
11979
10910
|
name: localWorkspaceName.trim(),
|
|
11980
10911
|
description: localWorkspaceDescription,
|
|
11981
10912
|
projectId: projectExtId
|
|
@@ -16010,113 +14941,6 @@ function ProjectDetailsForm({
|
|
|
16010
14941
|
] })
|
|
16011
14942
|
] });
|
|
16012
14943
|
}
|
|
16013
|
-
var useFilesStore = create()(
|
|
16014
|
-
persist(
|
|
16015
|
-
(set) => ({
|
|
16016
|
-
pendingFolders: {},
|
|
16017
|
-
addPendingFolder: (workspaceId, path) => set((state) => {
|
|
16018
|
-
const current = state.pendingFolders[workspaceId] ?? [];
|
|
16019
|
-
if (current.includes(path)) return state;
|
|
16020
|
-
return { pendingFolders: { ...state.pendingFolders, [workspaceId]: [...current, path] } };
|
|
16021
|
-
}),
|
|
16022
|
-
removePendingFolder: (workspaceId, path) => set((state) => {
|
|
16023
|
-
const current = state.pendingFolders[workspaceId] ?? [];
|
|
16024
|
-
if (!current.includes(path)) return state;
|
|
16025
|
-
return {
|
|
16026
|
-
pendingFolders: {
|
|
16027
|
-
...state.pendingFolders,
|
|
16028
|
-
[workspaceId]: current.filter((p) => p !== path)
|
|
16029
|
-
}
|
|
16030
|
-
};
|
|
16031
|
-
})
|
|
16032
|
-
}),
|
|
16033
|
-
{
|
|
16034
|
-
name: "arbi_explorer_pending_folders",
|
|
16035
|
-
storage: createJSONStorage(() => sessionStorage),
|
|
16036
|
-
partialize: (state) => ({ pendingFolders: state.pendingFolders })
|
|
16037
|
-
}
|
|
16038
|
-
)
|
|
16039
|
-
);
|
|
16040
|
-
var NONE = [];
|
|
16041
|
-
function usePendingFolders(workspaceId) {
|
|
16042
|
-
return useFilesStore(
|
|
16043
|
-
(state) => (workspaceId ? state.pendingFolders[workspaceId] : void 0) ?? NONE
|
|
16044
|
-
);
|
|
16045
|
-
}
|
|
16046
|
-
var FILES_PREFS_KEY = "files";
|
|
16047
|
-
var DEFAULT_VIEW_MODE = "explorer";
|
|
16048
|
-
var useFilesPrefs = create()(
|
|
16049
|
-
persist(
|
|
16050
|
-
(set) => ({
|
|
16051
|
-
documentFilters: {},
|
|
16052
|
-
setDocumentFilters: (documentFilters) => set({ documentFilters }),
|
|
16053
|
-
viewModes: {},
|
|
16054
|
-
setViewMode: (viewMode, prefsKey = FILES_PREFS_KEY) => set(
|
|
16055
|
-
(state) => state.viewModes[prefsKey] === viewMode ? state : { viewModes: { ...state.viewModes, [prefsKey]: viewMode } }
|
|
16056
|
-
),
|
|
16057
|
-
// New users start at the compact minimum (more rows at once).
|
|
16058
|
-
rowHeight: DOCUMENTS_ROW_HEIGHT_INITIAL,
|
|
16059
|
-
setRowHeight: (rowHeight) => set({ rowHeight })
|
|
16060
|
-
}),
|
|
16061
|
-
{
|
|
16062
|
-
name: "arbi_files_prefs",
|
|
16063
|
-
storage: createJSONStorage(() => localStorage),
|
|
16064
|
-
version: 1,
|
|
16065
|
-
// Version 0 kept one view for every files page: it becomes the files page's own.
|
|
16066
|
-
migrate: (persisted, version) => {
|
|
16067
|
-
const state = persisted ?? {};
|
|
16068
|
-
if (version >= 1) return state;
|
|
16069
|
-
const { viewMode, ...rest } = state;
|
|
16070
|
-
return {
|
|
16071
|
-
...rest,
|
|
16072
|
-
viewModes: viewMode ? { [FILES_PREFS_KEY]: viewMode } : {}
|
|
16073
|
-
};
|
|
16074
|
-
},
|
|
16075
|
-
partialize: (state) => ({
|
|
16076
|
-
documentFilters: state.documentFilters,
|
|
16077
|
-
viewModes: state.viewModes,
|
|
16078
|
-
rowHeight: state.rowHeight
|
|
16079
|
-
})
|
|
16080
|
-
}
|
|
16081
|
-
)
|
|
16082
|
-
);
|
|
16083
|
-
function filesViewMode(state, prefsKey = FILES_PREFS_KEY, defaultViewMode = DEFAULT_VIEW_MODE) {
|
|
16084
|
-
return state.viewModes[prefsKey] ?? defaultViewMode;
|
|
16085
|
-
}
|
|
16086
|
-
var useAiReviewStore = create()((set) => ({
|
|
16087
|
-
open: false,
|
|
16088
|
-
run: null,
|
|
16089
|
-
setOpen: (open) => set({ open }),
|
|
16090
|
-
setRun: (run) => set({ run }),
|
|
16091
|
-
markFinished: (docIds) => set((state) => {
|
|
16092
|
-
const run = state.run;
|
|
16093
|
-
if (!run) return state;
|
|
16094
|
-
const finished = new Set(run.finishedDocIds ?? []);
|
|
16095
|
-
const added = docIds.filter((id) => run.docIds.includes(id) && !finished.has(id));
|
|
16096
|
-
if (added.length === 0) return state;
|
|
16097
|
-
return { run: { ...run, finishedDocIds: [...finished, ...added] } };
|
|
16098
|
-
})
|
|
16099
|
-
}));
|
|
16100
|
-
var useFilesGridStates = create()(
|
|
16101
|
-
persist(
|
|
16102
|
-
(set) => ({
|
|
16103
|
-
gridStates: {},
|
|
16104
|
-
setGridState: (gridId, state) => set((current) => ({ gridStates: { ...current.gridStates, [gridId]: state } }))
|
|
16105
|
-
}),
|
|
16106
|
-
{ name: "arbi_files_grids", storage: createJSONStorage(() => localStorage) }
|
|
16107
|
-
)
|
|
16108
|
-
);
|
|
16109
|
-
var useFilesDialogs = create()((set) => ({
|
|
16110
|
-
move: null,
|
|
16111
|
-
openMove: (folder = null) => set({ move: { folder } }),
|
|
16112
|
-
closeMove: () => set({ move: null }),
|
|
16113
|
-
bulkTagsOpen: false,
|
|
16114
|
-
setBulkTagsOpen: (bulkTagsOpen) => set({ bulkTagsOpen }),
|
|
16115
|
-
deleteRequest: null,
|
|
16116
|
-
requestDelete: (deleteRequest) => set({ deleteRequest }),
|
|
16117
|
-
exportOpen: false,
|
|
16118
|
-
setExportOpen: (exportOpen) => set({ exportOpen })
|
|
16119
|
-
}));
|
|
16120
14944
|
var GRID_GAP = 12;
|
|
16121
14945
|
var SCROLL_PADDING_X = 32;
|
|
16122
14946
|
var PAGE_ASPECT = 1.3;
|
|
@@ -17337,10 +16161,10 @@ function ConnectedContactCardForm({
|
|
|
17337
16161
|
const [errors, setErrors] = useState({});
|
|
17338
16162
|
const [serverError, setServerError] = useState(null);
|
|
17339
16163
|
const [duplicateOf, setDuplicateOf] = useState(null);
|
|
17340
|
-
const
|
|
16164
|
+
const create2 = useCreateContact();
|
|
17341
16165
|
const update = useUpdateContact();
|
|
17342
16166
|
const link = useLinkContact();
|
|
17343
|
-
const saving =
|
|
16167
|
+
const saving = create2.isPending || update.isPending || link.isPending;
|
|
17344
16168
|
const linked = !!contact?.email;
|
|
17345
16169
|
const locked = !!contact && !contact.card;
|
|
17346
16170
|
const set = (key, value) => setForm((f) => ({ ...f, [key]: value }));
|
|
@@ -17368,7 +16192,7 @@ function ConnectedContactCardForm({
|
|
|
17368
16192
|
};
|
|
17369
16193
|
if (invite && email) {
|
|
17370
16194
|
if (contact) link.mutate({ contact, email, card }, { onSuccess: onInvited, onError });
|
|
17371
|
-
else
|
|
16195
|
+
else create2.mutate({ email, card, invite: true }, { onSuccess: onInvited, onError });
|
|
17372
16196
|
return;
|
|
17373
16197
|
}
|
|
17374
16198
|
const onSuccess = () => {
|
|
@@ -17377,7 +16201,7 @@ function ConnectedContactCardForm({
|
|
|
17377
16201
|
};
|
|
17378
16202
|
if (contact?.external_id)
|
|
17379
16203
|
update.mutate({ id: contact.external_id, card }, { onSuccess, onError });
|
|
17380
|
-
else
|
|
16204
|
+
else create2.mutate({ card, invite: false }, { onSuccess, onError });
|
|
17381
16205
|
};
|
|
17382
16206
|
if (locked)
|
|
17383
16207
|
return /* @__PURE__ */ jsxs("div", { className: "grid gap-3", "data-testid": "contact-card-locked", children: [
|
|
@@ -17898,7 +16722,7 @@ function ConnectedContactMenu({
|
|
|
17898
16722
|
const updateUserSettings = useUpdateUserSettings();
|
|
17899
16723
|
const deleteContact = useDeleteContact();
|
|
17900
16724
|
const name = getUserDisplayName(peer);
|
|
17901
|
-
const
|
|
16725
|
+
const isAgent8 = peer.external_id.startsWith("agt-");
|
|
17902
16726
|
const isMuted = useMemo(
|
|
17903
16727
|
() => (userSettings?.muted_users || []).includes(peer.external_id),
|
|
17904
16728
|
[userSettings, peer.external_id]
|
|
@@ -17973,7 +16797,7 @@ Your conversation is not deleted \u2014 you can add them again.`,
|
|
|
17973
16797
|
},
|
|
17974
16798
|
// An agent is not a contact you can remove — it belongs to your account, and is managed from
|
|
17975
16799
|
// the agents panel.
|
|
17976
|
-
...!
|
|
16800
|
+
...!isAgent8 && contactId ? [
|
|
17977
16801
|
{
|
|
17978
16802
|
id: "remove",
|
|
17979
16803
|
label: "Remove contact",
|
|
@@ -21244,7 +20068,7 @@ function BookingPagesPanel({ defaultTimeZone, className }) {
|
|
|
21244
20068
|
var selectClass4 = "h-9 w-full rounded-md border border-input bg-background px-2 text-sm text-foreground shadow-sm";
|
|
21245
20069
|
function CreateRoomForm({ zone, onDone }) {
|
|
21246
20070
|
const { notify: notify18 } = useBlocksEnvironment();
|
|
21247
|
-
const
|
|
20071
|
+
const create2 = useCreateRoom();
|
|
21248
20072
|
const [name, setName] = useState("");
|
|
21249
20073
|
const [type, setType] = useState("room");
|
|
21250
20074
|
const [capacity, setCapacity] = useState("");
|
|
@@ -21264,7 +20088,7 @@ function CreateRoomForm({ zone, onDone }) {
|
|
|
21264
20088
|
const cap = capacity.trim() ? Number(capacity) : null;
|
|
21265
20089
|
if (cap !== null && (!Number.isInteger(cap) || cap < 1))
|
|
21266
20090
|
return setError("Capacity must be a whole number");
|
|
21267
|
-
|
|
20091
|
+
create2.mutate(
|
|
21268
20092
|
{
|
|
21269
20093
|
name: name.trim(),
|
|
21270
20094
|
type,
|
|
@@ -21355,8 +20179,8 @@ function CreateRoomForm({ zone, onDone }) {
|
|
|
21355
20179
|
error && /* @__PURE__ */ jsx("p", { role: "alert", className: "text-sm text-destructive", children: error }),
|
|
21356
20180
|
/* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2", children: [
|
|
21357
20181
|
/* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", onClick: onDone, children: "Cancel" }),
|
|
21358
|
-
/* @__PURE__ */ jsxs(Button, { type: "submit", disabled:
|
|
21359
|
-
|
|
20182
|
+
/* @__PURE__ */ jsxs(Button, { type: "submit", disabled: create2.isPending, children: [
|
|
20183
|
+
create2.isPending && /* @__PURE__ */ jsx(Loader2, { className: "mr-1 size-4 animate-spin" }),
|
|
21360
20184
|
"Create"
|
|
21361
20185
|
] })
|
|
21362
20186
|
] })
|
|
@@ -24264,99 +23088,6 @@ function EmptyWorkspaceUpload({
|
|
|
24264
23088
|
}
|
|
24265
23089
|
);
|
|
24266
23090
|
}
|
|
24267
|
-
function ConnectedTagEntity({
|
|
24268
|
-
tag,
|
|
24269
|
-
size = "md",
|
|
24270
|
-
className = "",
|
|
24271
|
-
onClick,
|
|
24272
|
-
showTooltip = true,
|
|
24273
|
-
canEdit = false,
|
|
24274
|
-
onEditClick
|
|
24275
|
-
}) {
|
|
24276
|
-
const { data: workspaceTags } = useTags();
|
|
24277
|
-
const { data: members = [] } = useWorkspaceUsers();
|
|
24278
|
-
const byId = (id) => id ? members.find((m) => m.user.external_id === id)?.user : void 0;
|
|
24279
|
-
const freshTag = useMemo(() => {
|
|
24280
|
-
if (!workspaceTags) return tag;
|
|
24281
|
-
const found = workspaceTags.find((t) => t.external_id === tag.external_id);
|
|
24282
|
-
return found || tag;
|
|
24283
|
-
}, [workspaceTags, tag]);
|
|
24284
|
-
const creator = byId(tag.created_by_ext_id) ?? null;
|
|
24285
|
-
const updater = byId(tag.updated_by_ext_id) ?? null;
|
|
24286
|
-
const Icon = getTagTypeIcon(tag.tag_type.type);
|
|
24287
|
-
const tagColor = getEntityColor(tag.external_id, "medium");
|
|
24288
|
-
const handleVisibilityToggle = () => {
|
|
24289
|
-
if (canEdit && onEditClick) {
|
|
24290
|
-
onEditClick();
|
|
24291
|
-
}
|
|
24292
|
-
};
|
|
24293
|
-
const tooltipContent = showTooltip ? /* @__PURE__ */ jsxs(EntityTooltip, { children: [
|
|
24294
|
-
/* @__PURE__ */ jsx(
|
|
24295
|
-
EntityTooltipHeader,
|
|
24296
|
-
{
|
|
24297
|
-
lead: /* @__PURE__ */ jsx(
|
|
24298
|
-
"span",
|
|
24299
|
-
{
|
|
24300
|
-
className: "inline-flex items-center justify-center rounded-md text-white p-1",
|
|
24301
|
-
style: { backgroundColor: tagColor },
|
|
24302
|
-
children: /* @__PURE__ */ jsx(Icon, { size: 16 })
|
|
24303
|
-
}
|
|
24304
|
-
),
|
|
24305
|
-
title: tag.name
|
|
24306
|
-
}
|
|
24307
|
-
),
|
|
24308
|
-
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5 text-sm", children: [
|
|
24309
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
24310
|
-
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Type:" }),
|
|
24311
|
-
/* @__PURE__ */ jsx("span", { children: getTagTypeLabel(tag.tag_type.type) })
|
|
24312
|
-
] }),
|
|
24313
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
24314
|
-
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Documents:" }),
|
|
24315
|
-
/* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "h-5 min-w-[20px] justify-center", children: freshTag.doctag_count ?? 0 })
|
|
24316
|
-
] }),
|
|
24317
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
24318
|
-
/* @__PURE__ */ jsx(
|
|
24319
|
-
VisibilityToggle,
|
|
24320
|
-
{
|
|
24321
|
-
items: freshTag,
|
|
24322
|
-
onToggle: handleVisibilityToggle,
|
|
24323
|
-
disabled: !canEdit,
|
|
24324
|
-
showLabel: false,
|
|
24325
|
-
showTooltip: canEdit,
|
|
24326
|
-
tooltipActive: "Click to edit",
|
|
24327
|
-
tooltipInactive: "Click to edit"
|
|
24328
|
-
}
|
|
24329
|
-
),
|
|
24330
|
-
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: freshTag.shared ? "Shared" : "Private" })
|
|
24331
|
-
] }),
|
|
24332
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
24333
|
-
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Created:" }),
|
|
24334
|
-
/* @__PURE__ */ jsx("span", { children: formatFriendlyDate(tag.created_at) }),
|
|
24335
|
-
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "by" }),
|
|
24336
|
-
/* @__PURE__ */ jsx(UserAvatar, { user: creator ?? void 0 })
|
|
24337
|
-
] }),
|
|
24338
|
-
tag.updated_at && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
24339
|
-
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Updated:" }),
|
|
24340
|
-
/* @__PURE__ */ jsx("span", { children: formatFriendlyDate(tag.updated_at) }),
|
|
24341
|
-
updater && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
24342
|
-
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "by" }),
|
|
24343
|
-
/* @__PURE__ */ jsx(UserAvatar, { user: updater })
|
|
24344
|
-
] })
|
|
24345
|
-
] })
|
|
24346
|
-
] })
|
|
24347
|
-
] }) : void 0;
|
|
24348
|
-
return /* @__PURE__ */ jsx(
|
|
24349
|
-
TagEntity,
|
|
24350
|
-
{
|
|
24351
|
-
tag: { ...tag, color: tagColor },
|
|
24352
|
-
size,
|
|
24353
|
-
className,
|
|
24354
|
-
onClick,
|
|
24355
|
-
showTooltip,
|
|
24356
|
-
tooltipContent
|
|
24357
|
-
}
|
|
24358
|
-
);
|
|
24359
|
-
}
|
|
24360
23091
|
var CheckboxCellRenderer = memo(function CheckboxCellRenderer2({
|
|
24361
23092
|
params,
|
|
24362
23093
|
tagId,
|
|
@@ -24640,7 +23371,7 @@ function createDocumentColumns({
|
|
|
24640
23371
|
if (!params.data) return null;
|
|
24641
23372
|
const context = params.context;
|
|
24642
23373
|
return /* @__PURE__ */ jsx(
|
|
24643
|
-
|
|
23374
|
+
StatusCell,
|
|
24644
23375
|
{
|
|
24645
23376
|
doc: params.data,
|
|
24646
23377
|
onStatusClick,
|
|
@@ -27048,7 +25779,7 @@ function useFieldWrites({
|
|
|
27048
25779
|
const createTag = useCreateTag();
|
|
27049
25780
|
const updateTag = useUpdateTag();
|
|
27050
25781
|
const deleteTag = useDeleteTag();
|
|
27051
|
-
const
|
|
25782
|
+
const create2 = useCallback(
|
|
27052
25783
|
async (data) => {
|
|
27053
25784
|
let created;
|
|
27054
25785
|
try {
|
|
@@ -27154,7 +25885,7 @@ ${nested.length} nested ${nested.length === 1 ? "field moves" : "fields move"} t
|
|
|
27154
25885
|
},
|
|
27155
25886
|
[confirm, notify18, deleteTag, tags, workspaceTags, nouns]
|
|
27156
25887
|
);
|
|
27157
|
-
return { create:
|
|
25888
|
+
return { create: create2, update, rename, toggleShared, removeMany };
|
|
27158
25889
|
}
|
|
27159
25890
|
var ownFieldsExport = (props) => /* @__PURE__ */ jsx(ConnectedExportDialog, { ...props, entityType: "TAG", testId: "export-fields-modal" });
|
|
27160
25891
|
function ConnectedFieldsEditor({
|
|
@@ -27810,228 +26541,6 @@ function ConnectedBulkTagEditor({
|
|
|
27810
26541
|
)
|
|
27811
26542
|
] });
|
|
27812
26543
|
}
|
|
27813
|
-
function FolderPicker({
|
|
27814
|
-
documents,
|
|
27815
|
-
value,
|
|
27816
|
-
onSelect
|
|
27817
|
-
}) {
|
|
27818
|
-
const folders = useDocumentFolders(documents, value);
|
|
27819
|
-
return /* @__PURE__ */ jsx(FolderCommandList, { folders, value, onSelect, showRemove: !!value });
|
|
27820
|
-
}
|
|
27821
|
-
function RelatedDocuments({
|
|
27822
|
-
doc,
|
|
27823
|
-
related,
|
|
27824
|
-
onOpen,
|
|
27825
|
-
onDelete,
|
|
27826
|
-
onCompare
|
|
27827
|
-
}) {
|
|
27828
|
-
const viewingDocumentId = useOpenViewerDocumentId();
|
|
27829
|
-
return /* @__PURE__ */ jsx(
|
|
27830
|
-
RelatedDocumentsCell,
|
|
27831
|
-
{
|
|
27832
|
-
currentDoc: doc,
|
|
27833
|
-
related,
|
|
27834
|
-
viewingDocumentId,
|
|
27835
|
-
onDocumentClick: (id) => onOpen?.(id),
|
|
27836
|
-
onDelete: (other) => onDelete?.(other.external_id),
|
|
27837
|
-
onCompare
|
|
27838
|
-
}
|
|
27839
|
-
);
|
|
27840
|
-
}
|
|
27841
|
-
function DocTagAttribution({ doctag }) {
|
|
27842
|
-
const memberById = useMemberLookup();
|
|
27843
|
-
const creator = memberById(doctag.created_by_ext_id);
|
|
27844
|
-
const updater = doctag.updated_by_ext_id && doctag.updated_by_ext_id !== doctag.created_by_ext_id ? memberById(doctag.updated_by_ext_id) : void 0;
|
|
27845
|
-
const lastUser = updater || creator;
|
|
27846
|
-
if (!lastUser) return null;
|
|
27847
|
-
const lines = [
|
|
27848
|
-
creator && `Created ${formatFriendlyDate(doctag.created_at)} by ${creator.given_name || creator.email}`,
|
|
27849
|
-
updater && `Updated ${formatFriendlyDate(doctag.updated_at)} by ${updater.given_name || updater.email}`
|
|
27850
|
-
].filter((line) => !!line);
|
|
27851
|
-
return /* @__PURE__ */ jsx(
|
|
27852
|
-
FieldAttribution,
|
|
27853
|
-
{
|
|
27854
|
-
avatar: /* @__PURE__ */ jsx(DocumentUser, { user: lastUser, tooltip: false }),
|
|
27855
|
-
date: formatFriendlyDate(updater ? doctag.updated_at : doctag.created_at),
|
|
27856
|
-
lines
|
|
27857
|
-
}
|
|
27858
|
-
);
|
|
27859
|
-
}
|
|
27860
|
-
function LabelsCombobox({
|
|
27861
|
-
labelTags,
|
|
27862
|
-
appliedTagIds,
|
|
27863
|
-
onToggle,
|
|
27864
|
-
onCreateAndApply
|
|
27865
|
-
}) {
|
|
27866
|
-
const options2 = useMemo(
|
|
27867
|
-
() => labelTags.map((t) => ({
|
|
27868
|
-
id: t.external_id,
|
|
27869
|
-
name: t.name,
|
|
27870
|
-
color: getEntityColor(t.external_id, "medium")
|
|
27871
|
-
})),
|
|
27872
|
-
[labelTags]
|
|
27873
|
-
);
|
|
27874
|
-
const handleCreate = (name) => {
|
|
27875
|
-
const trimmed = name.trim();
|
|
27876
|
-
if (!trimmed) return;
|
|
27877
|
-
const existing = labelTags.find((t) => t.name.toLowerCase() === trimmed.toLowerCase());
|
|
27878
|
-
if (!existing) onCreateAndApply?.(trimmed);
|
|
27879
|
-
else if (!appliedTagIds.has(existing.external_id)) onToggle(existing);
|
|
27880
|
-
};
|
|
27881
|
-
return /* @__PURE__ */ jsx(
|
|
27882
|
-
FieldLabelsSelect,
|
|
27883
|
-
{
|
|
27884
|
-
options: options2,
|
|
27885
|
-
appliedIds: appliedTagIds,
|
|
27886
|
-
onToggle: (id) => {
|
|
27887
|
-
const tag = labelTags.find((t) => t.external_id === id);
|
|
27888
|
-
if (tag) onToggle(tag);
|
|
27889
|
-
},
|
|
27890
|
-
onCreate: onCreateAndApply ? handleCreate : void 0
|
|
27891
|
-
}
|
|
27892
|
-
);
|
|
27893
|
-
}
|
|
27894
|
-
var METADATA_FIELDS = {
|
|
27895
|
-
title: (doc) => getDocumentTitle(doc),
|
|
27896
|
-
doc_nature: (doc) => doc.doc_metadata?.doc_nature || "",
|
|
27897
|
-
doc_author: (doc) => doc.doc_metadata?.doc_author || "",
|
|
27898
|
-
doc_subject: (doc) => doc.doc_metadata?.doc_subject || "",
|
|
27899
|
-
// As the table shows it: with the time when the value has one (emails).
|
|
27900
|
-
doc_date: (doc) => formatDocDate(getDocumentDate(doc))
|
|
27901
|
-
};
|
|
27902
|
-
var INPUT_CLASS = "text-sm bg-muted/40 focus:bg-background transition-colors";
|
|
27903
|
-
var READ_ONLY_FIELDS = {
|
|
27904
|
-
file_name: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "strong", children: doc.file_name || "N/A" }),
|
|
27905
|
-
status: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", children: doc.status || "N/A" }),
|
|
27906
|
-
n_pages: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", children: doc.n_pages || "N/A" }),
|
|
27907
|
-
created_at: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", children: doc.created_at ? formatFriendlyDate(doc.created_at) : "N/A" }),
|
|
27908
|
-
updated_at: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", children: doc.updated_at ? formatFriendlyDate(doc.updated_at) : "N/A" }),
|
|
27909
|
-
file_type: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", children: friendlyFileType(doc.file_type, doc.file_name) }),
|
|
27910
|
-
file_size: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", children: doc.file_size ? `${Math.round(doc.file_size / 1024)} KB` : "N/A" }),
|
|
27911
|
-
doc_id: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", isMono: true, children: doc.external_id || "N/A" }),
|
|
27912
|
-
content_hash: (doc) => /* @__PURE__ */ jsx(FieldValue, { tone: "muted", isMono: true, isTruncated: true, children: doc.content_hash || "N/A" })
|
|
27913
|
-
};
|
|
27914
|
-
function documentFieldContent(options2) {
|
|
27915
|
-
const { columnId, doc, canEdit, workspaceTags, getColumnLabel, getColumnIcon } = options2;
|
|
27916
|
-
const Icon = getColumnIcon(columnId);
|
|
27917
|
-
const standard = (children) => ({
|
|
27918
|
-
label: getColumnLabel(columnId),
|
|
27919
|
-
icon: Icon ? /* @__PURE__ */ jsx(Icon, { size: 14 }) : void 0,
|
|
27920
|
-
children
|
|
27921
|
-
});
|
|
27922
|
-
const metadata = METADATA_FIELDS[columnId];
|
|
27923
|
-
if (metadata) {
|
|
27924
|
-
const editable = options2.isColumnEditable(columnId) && canEdit;
|
|
27925
|
-
return standard(
|
|
27926
|
-
editable ? /* @__PURE__ */ jsx(
|
|
27927
|
-
DebouncedInput,
|
|
27928
|
-
{
|
|
27929
|
-
value: metadata(doc),
|
|
27930
|
-
onChange: (value2) => options2.onUpdateDocumentField(columnId, value2),
|
|
27931
|
-
multiline: true,
|
|
27932
|
-
placeholder: `Add ${getColumnLabel(columnId).toLowerCase()}\u2026`,
|
|
27933
|
-
className: INPUT_CLASS
|
|
27934
|
-
}
|
|
27935
|
-
) : /* @__PURE__ */ jsx(FieldValue, { children: metadata(doc) || "N/A" })
|
|
27936
|
-
);
|
|
27937
|
-
}
|
|
27938
|
-
const readOnly = READ_ONLY_FIELDS[columnId];
|
|
27939
|
-
if (readOnly) return standard(readOnly(doc));
|
|
27940
|
-
if (columnId === "created_by") return standard(/* @__PURE__ */ jsx(DocumentUser, { user: options2.creator }));
|
|
27941
|
-
if (columnId === "folder") {
|
|
27942
|
-
return standard(
|
|
27943
|
-
canEdit ? /* @__PURE__ */ jsx(
|
|
27944
|
-
FieldFolderSelect,
|
|
27945
|
-
{
|
|
27946
|
-
folder: doc.folder,
|
|
27947
|
-
picker: /* @__PURE__ */ jsx(
|
|
27948
|
-
FolderPicker,
|
|
27949
|
-
{
|
|
27950
|
-
documents: options2.allDocuments ?? [],
|
|
27951
|
-
value: doc.folder,
|
|
27952
|
-
onSelect: (folder) => options2.onUpdateDocumentField("folder", folder)
|
|
27953
|
-
}
|
|
27954
|
-
)
|
|
27955
|
-
}
|
|
27956
|
-
) : /* @__PURE__ */ jsx(FieldFolderValue, { folder: doc.folder })
|
|
27957
|
-
);
|
|
27958
|
-
}
|
|
27959
|
-
if (columnId === "related") {
|
|
27960
|
-
const related = options2.relatedDocs;
|
|
27961
|
-
if (!related) return null;
|
|
27962
|
-
return standard(
|
|
27963
|
-
/* @__PURE__ */ jsx(
|
|
27964
|
-
RelatedDocuments,
|
|
27965
|
-
{
|
|
27966
|
-
doc,
|
|
27967
|
-
related,
|
|
27968
|
-
onOpen: options2.onOpenDocument,
|
|
27969
|
-
onDelete: options2.onDeleteDocument,
|
|
27970
|
-
onCompare: options2.onCompareDocuments
|
|
27971
|
-
}
|
|
27972
|
-
)
|
|
27973
|
-
);
|
|
27974
|
-
}
|
|
27975
|
-
if (columnId === "all_tags") {
|
|
27976
|
-
const labelTags = workspaceTags.filter(isLabelTag);
|
|
27977
|
-
const appliedIds = new Set(
|
|
27978
|
-
(doc.doctags ?? []).filter((dt) => labelTags.some((t) => t.external_id === dt.tag_ext_id)).map((dt) => dt.tag_ext_id)
|
|
27979
|
-
);
|
|
27980
|
-
return standard(
|
|
27981
|
-
/* @__PURE__ */ jsx(
|
|
27982
|
-
LabelsCombobox,
|
|
27983
|
-
{
|
|
27984
|
-
labelTags,
|
|
27985
|
-
appliedTagIds: appliedIds,
|
|
27986
|
-
onToggle: (tag2) => options2.onUpdateTagValue(tag2, !appliedIds.has(tag2.external_id)),
|
|
27987
|
-
onCreateAndApply: options2.onCreateAndApplyLabel
|
|
27988
|
-
}
|
|
27989
|
-
)
|
|
27990
|
-
);
|
|
27991
|
-
}
|
|
27992
|
-
const tag = workspaceTags.find((t) => t.external_id === columnId);
|
|
27993
|
-
if (!tag || !isAnnotationTag(tag)) return null;
|
|
27994
|
-
const doctag = doc.doctags?.find((dt) => dt.tag_ext_id === tag.external_id);
|
|
27995
|
-
let value;
|
|
27996
|
-
if (tag.tag_type.type === "select") {
|
|
27997
|
-
value = /* @__PURE__ */ jsx(
|
|
27998
|
-
FieldNativeSelect,
|
|
27999
|
-
{
|
|
28000
|
-
value: doctag?.note || "",
|
|
28001
|
-
options: tag.tag_type.options,
|
|
28002
|
-
onChange: (next) => options2.onUpdateTagValue(tag, next),
|
|
28003
|
-
ariaLabel: tag.name
|
|
28004
|
-
}
|
|
28005
|
-
);
|
|
28006
|
-
} else if (tag.tag_type.type === "number") {
|
|
28007
|
-
value = /* @__PURE__ */ jsx(
|
|
28008
|
-
DebouncedInput,
|
|
28009
|
-
{
|
|
28010
|
-
type: "number",
|
|
28011
|
-
value: doctag?.note || "",
|
|
28012
|
-
onChange: (next) => options2.onUpdateTagValue(tag, next),
|
|
28013
|
-
placeholder: `Add ${tag.name.toLowerCase()}\u2026`,
|
|
28014
|
-
className: INPUT_CLASS
|
|
28015
|
-
}
|
|
28016
|
-
);
|
|
28017
|
-
} else {
|
|
28018
|
-
value = /* @__PURE__ */ jsx(
|
|
28019
|
-
Textarea,
|
|
28020
|
-
{
|
|
28021
|
-
value: doctag?.note || "",
|
|
28022
|
-
onChange: (e) => options2.onUpdateTagWithCitations(tag, e.target.value, doctag?.citations ?? null),
|
|
28023
|
-
placeholder: "Add a note...",
|
|
28024
|
-
rows: 2,
|
|
28025
|
-
className: INPUT_CLASS
|
|
28026
|
-
}
|
|
28027
|
-
);
|
|
28028
|
-
}
|
|
28029
|
-
return {
|
|
28030
|
-
label: tag.name,
|
|
28031
|
-
tag,
|
|
28032
|
-
children: doctag ? /* @__PURE__ */ jsx(FieldWithAttribution, { attribution: /* @__PURE__ */ jsx(DocTagAttribution, { doctag }), children: value }) : value
|
|
28033
|
-
};
|
|
28034
|
-
}
|
|
28035
26544
|
|
|
28036
26545
|
// src/connection/files/views/tableViews.ts
|
|
28037
26546
|
var belongsTo = (view, workspaceId, table) => view.workspace === workspaceId && (view.table ?? null) === table;
|
|
@@ -28479,10 +26988,17 @@ var TABLET_VISIBLE_COLUMNS = ["title", "doc_subject"];
|
|
|
28479
26988
|
var TABLET_TABLE_BELOW = 860;
|
|
28480
26989
|
var TABLET_VIEWPORT_BELOW = 1100;
|
|
28481
26990
|
var NO_CONVERSATION_DOCUMENTS = [];
|
|
26991
|
+
var DocumentReviewCard = lazy(
|
|
26992
|
+
() => import('../DocumentReviewCard-Y67FFRPC.js').then((module) => ({ default: module.DocumentReviewCard }))
|
|
26993
|
+
);
|
|
26994
|
+
function defaultReviewCard(props) {
|
|
26995
|
+
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(LoadingIndicator, { message: "Loading document viewer..." }), children: /* @__PURE__ */ jsx(DocumentReviewCard, { ...props }, `navigator-${props.currentDocument.external_id}`) });
|
|
26996
|
+
}
|
|
28482
26997
|
function ConnectedFilesPage({
|
|
28483
26998
|
isModal = false,
|
|
28484
26999
|
onClose,
|
|
28485
27000
|
onToggleDocument,
|
|
27001
|
+
onCompareDocuments,
|
|
28486
27002
|
onUpload,
|
|
28487
27003
|
onStatusClick,
|
|
28488
27004
|
onOpenTags,
|
|
@@ -28495,7 +27011,7 @@ function ConnectedFilesPage({
|
|
|
28495
27011
|
workspaceIcon,
|
|
28496
27012
|
externalSearchQuery = "",
|
|
28497
27013
|
renderSearch,
|
|
28498
|
-
renderReviewCard,
|
|
27014
|
+
renderReviewCard = defaultReviewCard,
|
|
28499
27015
|
renderFieldsManager,
|
|
28500
27016
|
bulkTagBreadcrumb,
|
|
28501
27017
|
dialogs,
|
|
@@ -29048,6 +27564,7 @@ function ConnectedFilesPage({
|
|
|
29048
27564
|
gridApi: gridApiRef.current,
|
|
29049
27565
|
onNavigate: navigatorOnNavigate,
|
|
29050
27566
|
onOpenDocumentViewer: onToggleDocument,
|
|
27567
|
+
onCompareDocuments,
|
|
29051
27568
|
onDeleteDocument: requestDeleteDocument,
|
|
29052
27569
|
isDocumentViewerEnabled,
|
|
29053
27570
|
onReorderColumns: (ids) => handleReorderColumns(ids, gridApiRef.current ?? void 0),
|
|
@@ -31501,7 +30018,7 @@ function MeetingAvatar() {
|
|
|
31501
30018
|
);
|
|
31502
30019
|
}
|
|
31503
30020
|
var isGroupChat = (chat) => !!chat && chat.kind !== "direct";
|
|
31504
|
-
var
|
|
30021
|
+
var isAgent6 = (user) => chats.isAgentExtId(user.external_id);
|
|
31505
30022
|
function ConnectedMessenger({
|
|
31506
30023
|
activeId,
|
|
31507
30024
|
onOpen,
|
|
@@ -31538,7 +30055,7 @@ function ConnectedMessenger({
|
|
|
31538
30055
|
// Presence rides on the row's avatar.
|
|
31539
30056
|
avatar(c.peer)
|
|
31540
30057
|
),
|
|
31541
|
-
badge: !isGroupChat(c.chat) &&
|
|
30058
|
+
badge: !isGroupChat(c.chat) && isAgent6(c.peer) ? /* @__PURE__ */ jsx(AgentBadge, {}) : void 0
|
|
31542
30059
|
}));
|
|
31543
30060
|
const all = [...decorated, ...extraRows];
|
|
31544
30061
|
if (!filters?.size) return all;
|
|
@@ -31546,7 +30063,7 @@ function ConnectedMessenger({
|
|
|
31546
30063
|
unread: (row2) => row2.unreadCount > 0,
|
|
31547
30064
|
// A person is muted, not a group that happens to list them first.
|
|
31548
30065
|
muted: (row2) => !isGroupChat(row2.chat) && mutedUsers.has(row2.peer.external_id),
|
|
31549
|
-
agents: (row2) => !isGroupChat(row2.chat) &&
|
|
30066
|
+
agents: (row2) => !isGroupChat(row2.chat) && isAgent6(row2.peer),
|
|
31550
30067
|
meetings: (row2) => row2.chat?.kind === "meeting",
|
|
31551
30068
|
...rowFilters
|
|
31552
30069
|
};
|
|
@@ -31677,12 +30194,12 @@ function ConnectedMessenger({
|
|
|
31677
30194
|
{
|
|
31678
30195
|
avatar: activePeer ? avatar(activePeer) : void 0,
|
|
31679
30196
|
name: activePeer ? userDisplayName(activePeer) : "Conversation",
|
|
31680
|
-
badge: activePeer &&
|
|
30197
|
+
badge: activePeer && isAgent6(activePeer) ? /* @__PURE__ */ jsx(AgentBadge, {}) : void 0,
|
|
31681
30198
|
presence: presence ? /* @__PURE__ */ jsx(PresenceLabel, { status: presence }) : void 0,
|
|
31682
30199
|
email: activePeer?.email,
|
|
31683
30200
|
menu: activePeer ? directActions?.(activePeer, {
|
|
31684
30201
|
// A personal agent never carries over into a group, and a self-chat has no peer.
|
|
31685
|
-
addPeople:
|
|
30202
|
+
addPeople: isAgent6(activePeer) || activeIsSelf || !PeoplePicker ? void 0 : () => setPicker({ mode: "from-direct", fixed: [activePeer] })
|
|
31686
30203
|
}) : void 0
|
|
31687
30204
|
}
|
|
31688
30205
|
),
|
|
@@ -33981,7 +32498,7 @@ function useWorkflowTasks() {
|
|
|
33981
32498
|
() => Object.fromEntries(documents.map((d) => [d.external_id, getDocumentTitle(d, d.external_id)])),
|
|
33982
32499
|
[documents]
|
|
33983
32500
|
);
|
|
33984
|
-
const
|
|
32501
|
+
const create2 = useCallback(
|
|
33985
32502
|
async (ctx, forceWorkflow = false) => {
|
|
33986
32503
|
const request = taskComposerToCreateRequest(
|
|
33987
32504
|
{ ...ctx, documentTitles, plan: ctx.plan ?? null },
|
|
@@ -34048,7 +32565,7 @@ function useWorkflowTasks() {
|
|
|
34048
32565
|
[activeWorkspaceId, documentTitles, grantAgentAccess, updateWorkflowMutation]
|
|
34049
32566
|
);
|
|
34050
32567
|
return {
|
|
34051
|
-
create:
|
|
32568
|
+
create: create2,
|
|
34052
32569
|
update,
|
|
34053
32570
|
updateWorkflow,
|
|
34054
32571
|
isPending: createWork.isPending || startQuery.isPending || createWorkflow.isPending || updateConversation.isPending || updateWorkflowMutation.isPending
|
|
@@ -35217,7 +33734,7 @@ function useThreadLabels(canEditShared) {
|
|
|
35217
33734
|
if (failed)
|
|
35218
33735
|
notify18(`Could not update labels on ${failed} thread${failed === 1 ? "" : "s"}.`, "error");
|
|
35219
33736
|
};
|
|
35220
|
-
const
|
|
33737
|
+
const create2 = async (rows, name) => {
|
|
35221
33738
|
if (!canEdit(rows) || !name.trim()) return;
|
|
35222
33739
|
try {
|
|
35223
33740
|
const existing = labels.find((tag) => tag.name.toLowerCase() === name.trim().toLowerCase());
|
|
@@ -35239,7 +33756,7 @@ function useThreadLabels(canEditShared) {
|
|
|
35239
33756
|
options: options2,
|
|
35240
33757
|
appliedIds: new Set(row2.label_ext_ids ?? []),
|
|
35241
33758
|
onToggle: (id) => void apply([row2], id, Boolean(row2.label_ext_ids?.includes(id))),
|
|
35242
|
-
onCreate: (name) => void
|
|
33759
|
+
onCreate: (name) => void create2([row2], name),
|
|
35243
33760
|
rowHeight: 40
|
|
35244
33761
|
}
|
|
35245
33762
|
),
|
|
@@ -35261,7 +33778,7 @@ function useThreadLabels(canEditShared) {
|
|
|
35261
33778
|
disabled: !canEdit(rows) || update.isPending || createTag.isPending,
|
|
35262
33779
|
isCompact,
|
|
35263
33780
|
onToggle: (id) => void apply(rows, id, all.has(id)),
|
|
35264
|
-
onCreate: (name) => void
|
|
33781
|
+
onCreate: (name) => void create2(rows, name)
|
|
35265
33782
|
}
|
|
35266
33783
|
);
|
|
35267
33784
|
}
|
|
@@ -35749,7 +34266,7 @@ function ConnectedTaskComposer({
|
|
|
35749
34266
|
const planWork = usePlanWork();
|
|
35750
34267
|
const { tasks: allTasks } = useWorkItems();
|
|
35751
34268
|
const { data: documents = [] } = useDocuments();
|
|
35752
|
-
const { create:
|
|
34269
|
+
const { create: create2, update, updateWorkflow, isPending } = useWorkflowTasks();
|
|
35753
34270
|
const scopeSource = useConnectedWorkflowScopeSource();
|
|
35754
34271
|
const activeWorkspaceId = useArbiSessionState((s) => s.workspaceId);
|
|
35755
34272
|
const activeWorkspace = useMemo(
|
|
@@ -35879,7 +34396,7 @@ function ConnectedTaskComposer({
|
|
|
35879
34396
|
await update(task, ctx);
|
|
35880
34397
|
notify18(`Updated \u201C${task.title ?? "task"}\u201D`, "success");
|
|
35881
34398
|
} else {
|
|
35882
|
-
const created = await
|
|
34399
|
+
const created = await create2(ctx, saveOnly && !options2?.runOnce);
|
|
35883
34400
|
if (created.kind === "workflow") {
|
|
35884
34401
|
notify18(`Saved \u201C${created.workflow.name}\u201D.`, "success");
|
|
35885
34402
|
openWorkflow?.();
|
|
@@ -43766,6 +42283,6 @@ function useContextualHints() {
|
|
|
43766
42283
|
};
|
|
43767
42284
|
}
|
|
43768
42285
|
|
|
43769
|
-
export { AddAddonDialog, AddFromAccountsButton, AgentBarShell, AgentControlBar, AgentSteps, AnswerTable, AskAgainContext, BACKFILL_OPTIONS, BUILTIN_GLOBAL_DIALOGS, BULK_REPROCESS_LIMIT, BillingProjectEntity, CaptureBar, ChangePlanDialog, ChatAttachmentList, ConnectedAccountAccessBadge, ConnectedAccountCluster, ConnectedAccountSettings, ConnectedAccountsImport, ConnectedAddContacts, ConnectedAgentChat, ConnectedAgentChatPanel, ConnectedAgentConfigForm, ConnectedAgentCreator, ConnectedAiReview, ConnectedAppRuntime, ConnectedAppShell, ConnectedAppsSettings, ConnectedAuthorizeAgent, ConnectedBranchControls, ConnectedBulkTagEditor, ConnectedCalendar, ConnectedChatThread, ConnectedCitationRenderer, ConnectedCompactConversation, ConnectedConfigForm, ConnectedContactCardForm, ConnectedContactMenu, ConnectedContactToggle, ConnectedContactsDirectory, ConnectedConversation, ConnectedConversationDocumentPicker, ConnectedConversationEmpty, ConnectedConversationStart, ConnectedDangerZone, ConnectedDatabasesPage, ConnectedDeploymentStorage, ConnectedDeveloperConfig, ConnectedDocumentProcessingPanel, ConnectedDriveSyncDialog, ConnectedExportDialog, ConnectedExportPanel, ConnectedFactsPage, ConnectedFieldsEditor, ConnectedFieldsManager, ConnectedFilesBulkActions, ConnectedFilesExplorer, ConnectedFilesPage, ConnectedFilterDropdown, ConnectedForgotPassword, ConnectedGlobalDialogs, ConnectedGrantWorkspaceAccessDialog, ConnectedGridView, ConnectedGroupMembers, ConnectedIdentityVerification, ConnectedLoginPage, ConnectedLogoutDialog, ConnectedMailAccounts, ConnectedMailComposer, ConnectedMailInviteCard, ConnectedMailMessage, ConnectedMailSettings, ConnectedMailSetup, ConnectedMailbox, ConnectedMailboxSyncDialog, ConnectedMessage, ConnectedMessageArea, ConnectedMessageList, ConnectedMessenger, ConnectedModelSelector, ConnectedMoveToFolder, ConnectedNewThreadDialog, ConnectedNotificationCenter, ConnectedNotificationPreferences, ConnectedOAuthConsentPage, ConnectedPanelHost, ConnectedPasswordChangeDialog,
|
|
42286
|
+
export { AddAddonDialog, AddFromAccountsButton, AgentBarShell, AgentControlBar, AgentSteps, AnswerTable, AskAgainContext, BACKFILL_OPTIONS, BUILTIN_GLOBAL_DIALOGS, BULK_REPROCESS_LIMIT, BillingProjectEntity, CaptureBar, ChangePlanDialog, ChatAttachmentList, ConnectedAccountAccessBadge, ConnectedAccountCluster, ConnectedAccountSettings, ConnectedAccountsImport, ConnectedAddContacts, ConnectedAgentChat, ConnectedAgentChatPanel, ConnectedAgentConfigForm, ConnectedAgentCreator, ConnectedAiReview, ConnectedAppRuntime, ConnectedAppShell, ConnectedAppsSettings, ConnectedAuthorizeAgent, ConnectedBranchControls, ConnectedBulkTagEditor, ConnectedCalendar, ConnectedChatThread, ConnectedCitationRenderer, ConnectedCompactConversation, ConnectedConfigForm, ConnectedContactCardForm, ConnectedContactMenu, ConnectedContactToggle, ConnectedContactsDirectory, ConnectedConversation, ConnectedConversationDocumentPicker, ConnectedConversationEmpty, ConnectedConversationStart, ConnectedDangerZone, ConnectedDatabasesPage, ConnectedDeploymentStorage, ConnectedDeveloperConfig, ConnectedDocumentProcessingPanel, ConnectedDriveSyncDialog, ConnectedExportDialog, ConnectedExportPanel, ConnectedFactsPage, ConnectedFieldsEditor, ConnectedFieldsManager, ConnectedFilesBulkActions, ConnectedFilesExplorer, ConnectedFilesPage, ConnectedFilterDropdown, ConnectedForgotPassword, ConnectedGlobalDialogs, ConnectedGrantWorkspaceAccessDialog, ConnectedGridView, ConnectedGroupMembers, ConnectedIdentityVerification, ConnectedLoginPage, ConnectedLogoutDialog, ConnectedMailAccounts, ConnectedMailComposer, ConnectedMailInviteCard, ConnectedMailMessage, ConnectedMailSettings, ConnectedMailSetup, ConnectedMailbox, ConnectedMailboxSyncDialog, ConnectedMessage, ConnectedMessageArea, ConnectedMessageList, ConnectedMessenger, ConnectedModelSelector, ConnectedMoveToFolder, ConnectedNewThreadDialog, ConnectedNotificationCenter, ConnectedNotificationPreferences, ConnectedOAuthConsentPage, ConnectedPanelHost, ConnectedPasswordChangeDialog, ConnectedPeopleMultiSelect, ConnectedPremiumModels, ConnectedPrivacySettings, ConnectedProfileCard, ConnectedProjectEntity, ConnectedProjectPage, ConnectedProjectSelector, ConnectedProjectStorage, ConnectedProjectsPanel, ConnectedPublicBooking, ConnectedQuotaDialog, ConnectedRecentlyDeletedButton, ConnectedRecoveryKeyDialog, ConnectedReportProblem, ConnectedRequestWorkspaceAccess, ConnectedRequireVerified, ConnectedSearchPage, ConnectedSecuritySection, ConnectedSessionsRow, ConnectedSettingsPage, ConnectedShareDialog, ConnectedSharePointAdminConsentPage, ConnectedSharedFilesPage, ConnectedSignatureVerifyPage, ConnectedSkillUpload, ConnectedSkillsLibrary, ConnectedSsoCallback, ConnectedStorageProjectCard, ConnectedStorageSettings, ConnectedTagEditorDialog, ConnectedTagForm, ConnectedTagTable, ConnectedTagsPage, ConnectedTaskAccessRequest, ConnectedTaskActivityDialog, ConnectedTaskComposer, ConnectedTaskStartDialog, ConnectedThreadFollow, ConnectedThreadLauncher, ConnectedThreadTabs, ConnectedThreadTaskBar, ConnectedThreadsPage, ConnectedThreadsPreview, ConnectedTransferWatcher, ConnectedUpcomingEvents, ConnectedUpload, ConnectedUploadDropzone, ConnectedUserEntity, ConnectedWelcomeDialog, ConnectedWorkflowHistory, ConnectedWorkflowRunner, ConnectedWorkflowStart, ConnectedWorkspaceActivity, ConnectedWorkspaceDashboard, ConnectedWorkspaceEntity, ConnectedWorkspaceFormModal, ConnectedWorkspaceList, ConnectedWorkspaceMembers, ConnectedWorkspaceNotificationMenu, ConnectedWorkspaceSettings, ConnectedWorkspaceTrash, ConversationAlert, ConversationComposer2 as ConversationComposer, ConversationEntity, ConversationSendButton, ConversationStatusCell, DEFAULT_CONNECTED_SEARCH_PAGE_LABELS, DEFAULT_CONNECTED_SKILL_UPLOAD_LABELS, DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS, DEFAULT_OAUTH_PERMISSIONS, DEFAULT_PROJECTS_LIST_LABELS, DEFAULT_PROJECT_DETAILS_LABELS, DEFAULT_PROJECT_DETAIL_FIELDS, DEFAULT_PROJECT_LIST_COLUMNS, DEFAULT_PROJECT_PAGE_LABELS, DEFAULT_SEARCH_FIELDS, DEFAULT_SEARCH_ROW_LABELS, DEFAULT_SETTINGS_SECTIONS, DEFAULT_TIMELINE_LABEL_WIDTH, DEFAULT_WORKSPACE_LIST_LABELS, DeveloperFooter, DocumentsFilterBarActions, DocumentsUploadButton, EmptyWorkspaceUpload, FACTS_GRID_ID, ImportVcfButton, ImportVcfSummary, InvoicesModal, LOOK_AGAIN_LABEL, MessageDetailsModal, MessageLiveSeconds, MicButton, NewProjectFlow, NotificationCenter, NotificationEvent, PENDING_LOOKUP_MS, PENDING_RECOVERY_KEY, PENDING_TASK_MESSAGE, PREMIUM_TIER_TAG, PROJECTS_BASE_TAB_ID, PROMPT_BINDINGS, PersistedGridView, ProgressiveLoadingChip, ProjectDetail, ProjectUsageContent, ProjectsTable, REFERRAL_OFFER, RecoveryKeyDownload, ReportProblemDialog, RunStatsBadges, RunningSubagents, SEARCH_FIELD_OPTIONS, SETTINGS_SECTION_IDS, STANDARD_TIER_TAG, SessionStatusIcon, SharedProjects, SourceChips, SsoResendVerificationButton, StorageBreakdown, StorageItemsTable, StorageTiers, StreamedArtifact, TILE_DEFAULT, TILE_MAX, TILE_MIN, ThreadSwitcher, ViewSelector, WORKSPACES_TAB_ID, WorkflowLaunchHost, WorkflowRunStatusCell, WorkflowRunThread, WorkflowStepMessage, accountSettingsSection, appearanceSettingsSection, backUpOnSignup, bookingCancelLink, buildNotificationCenterItems, buildProjectSummaries, chatSettingsSection, closeAccessRequestReview, connectedAppsSettingsSection, connectionSettingsSection, countNotificationTypes, createDocumentColumns, createEventCall, createNotificationTargetOpener, createTagColumn, deduplicateByContentHash, defaultHost, describePlan, distinctPeers, documentFamilyMeta, filterNotificationCenterItems, formatStorageGb, groupFallbackName, identifyOAuthClient, joinEventMeeting, loadEventWebinar, mailSettingsSection, openMeetingLink, openSsoPopup, organisationSettingsSection, parseArbiCallUrl, parseOAuthConsentRequest, parseTypedSkill, primaryProjectWorkspace, privacySettingsSection, renderConnectedUser, renderSessionStatusIcon, requestProjectBillingFocus, resolveAttendeeUsers, resolveAttendeeUsersRemote, resolveCallPeers, resolveCallPeersRemote, resolveLaunchInputs, resolveMailbox, resolveSsoName, reviewAccessRequest, reviewProgress, shareEventCall, storageSettingsSection, suppliedKinds, threadStateOf, toWorkspaceSummary, transferOutcome, updateEventWebinarRoles, usageSettingsSection, useAccessRequestUnderReview, useAddFromUrls, useAiReviewLiveUpdates, useAppShell, useAuthPages, useAutoRefreshPendingProjects, useBatchCompleteToasts, useChatMessageToasts, useConnectedAgentManagement, useConnectedCalendarCalls, useConnectedNotificationBell, useConnectedShellWorkspaces, useConnectedThreadActivity, useConnectedWorkspaceList, useConnectedWorkspaceSettings, useContextualHints, useDocumentBulkActions, useDocumentFilters, useDocumentGridSync, useDocumentNavigation, useDocumentTable, useExportStore, useHasAccountsImport, useLaunchWorkflow, useMessengerRows, useModelPicker, useNotificationBellEntry, useNotificationToasts, useOpenBillingPortal, useOpenChunk, useOpenNotificationTarget, useOpenWorkspaceActivityTarget, useOpenWorkspaceIcon, usePendingTaskThread, useProjectBillingFocus, useProjectSummaries, useProjectSummary, useReferralReward, useRenderTaskPerson, useReportProblem, useSessionPanelMode, useSessionSidebar, useSkillsEnabled, useSlashItems, useSlashSkillWorkflows, useSsoSignIn, useStartRequestedDraft, useTableViews, useTaskPeople, useTaskStart, useThreadLabels, useThreadTabs, useWorkflowDefinitions, useWorkflowLaunch, useWorkflowTasks, useWorkflowsPageState, useWorkspaceDocTitles, viewsOfTable, webinarRolesByUser, windowLabel, withMissingTableViews, withTableView, withoutTableView, workflowRunView };
|
|
43770
42287
|
//# sourceMappingURL=index.js.map
|
|
43771
42288
|
//# sourceMappingURL=index.js.map
|