diff --git a/frontend/src/DesktopWorkspace.jsx b/frontend/src/DesktopWorkspace.jsx index c445c37..da8775c 100644 --- a/frontend/src/DesktopWorkspace.jsx +++ b/frontend/src/DesktopWorkspace.jsx @@ -2768,6 +2768,8 @@ export const createDesktopSurface = ({ onBulkCorrespondentAdd, onBulkCorrespondentRemove, onBulkReanalyze, + folderOptions, + onMoveDocumentsToFolder, } = workspaceProps; const title = Array.isArray(searchResults) ? 'Search results' : currentFolderName; @@ -2803,6 +2805,8 @@ export const createDesktopSurface = ({ onBulkReanalyze={onBulkReanalyze} onDeleteSelection={onDeleteSelection} onClearSelection={onClearSelection} + folderOptions={folderOptions} + onMoveDocumentsToFolder={onMoveDocumentsToFolder} /> ) : null; diff --git a/frontend/src/app/AppLayout.jsx b/frontend/src/app/AppLayout.jsx index b7407f5..43b3556 100644 --- a/frontend/src/app/AppLayout.jsx +++ b/frontend/src/app/AppLayout.jsx @@ -4575,6 +4575,8 @@ const AppLayout = () => { onBulkCorrespondentAdd: handleBulkCorrespondentAdd, onBulkCorrespondentRemove: handleBulkCorrespondentRemove, onBulkReanalyze: handleBulkSelectionReanalyze, + folderOptions, + onMoveDocumentsToFolder: moveDocumentsToFolder, }), [ activeCorrespondentFilters, @@ -4623,6 +4625,8 @@ const AppLayout = () => { handleBulkCorrespondentAdd, handleBulkCorrespondentRemove, handleBulkSelectionReanalyze, + folderOptions, + moveDocumentsToFolder, ], ); @@ -4882,6 +4886,8 @@ const AppLayout = () => { onBulkCorrespondentAdd: handleBulkCorrespondentAdd, onBulkCorrespondentRemove: handleBulkCorrespondentRemove, onBulkReanalyze: handleBulkSelectionReanalyze, + folderOptions, + onMoveDocumentsToFolder: moveDocumentsToFolder, }), [ documents, @@ -4922,6 +4928,8 @@ const AppLayout = () => { handleBulkCorrespondentAdd, handleBulkCorrespondentRemove, handleBulkSelectionReanalyze, + folderOptions, + moveDocumentsToFolder, ], ); diff --git a/frontend/src/app/SettingsRoute.jsx b/frontend/src/app/SettingsRoute.jsx index c6f6665..165bfa0 100644 --- a/frontend/src/app/SettingsRoute.jsx +++ b/frontend/src/app/SettingsRoute.jsx @@ -3,6 +3,8 @@ import { useNavigate } from 'react-router-dom'; import SettingsModal from '../settings/SettingsModal'; import { useAppShell } from '../appShellContext'; import useApiTokens from '../settings/useApiTokens'; +import useCapabilitySets from '../settings/useCapabilitySets'; +import useCapabilities from '../settings/useCapabilities'; import { api } from './appState'; const SettingsRoute = () => { @@ -23,31 +25,49 @@ const SettingsRoute = () => { const { tokens, - loading, - creating, + loading: tokensLoading, + creating: creatingToken, deletingId, regeneratingId, createdSecret, - refresh, - refreshCapabilitySets, - create, - revoke, - regenerate, + refresh: refreshTokens, + create: createToken, + revoke: revokeToken, + regenerate: regenerateToken, dismissSecret, - capabilitySets, - capabilitySetsLoading, } = useApiTokens({ api, token, notifyApiError, setStatusMessage }); + const { + capabilitySets, + capabilitySetsLoading, + creatingCapabilitySet, + savingCapabilitySetId, + deletingCapabilitySetId, + supportsCapabilitySetLabels, + refreshCapabilitySets, + createCapabilitySet, + updateCapabilitySet, + deleteCapabilitySet, + } = useCapabilitySets({ api, token, notifyApiError, setStatusMessage }); + + const { + capabilities, + capabilitiesLoading, + refreshCapabilities, + } = useCapabilities({ api, notifyApiError, token }); + useEffect(() => { - refresh(); + refreshTokens(); refreshCapabilitySets(); + refreshCapabilities(); refreshPasskeys(); - }, [refresh, refreshCapabilitySets, refreshPasskeys]); + }, [refreshTokens, refreshCapabilitySets, refreshCapabilities, refreshPasskeys]); const handleRefresh = useCallback(() => { - refresh(); + refreshTokens(); refreshCapabilitySets(); - }, [refresh, refreshCapabilitySets]); + refreshCapabilities(); + }, [refreshTokens, refreshCapabilitySets, refreshCapabilities]); const handleClose = useCallback(() => { dismissSecret(); @@ -74,18 +94,29 @@ const SettingsRoute = () => { open onClose={handleClose} tokens={tokens} - loading={loading} - creating={creating} + loading={tokensLoading} + creating={creatingToken} deletingId={deletingId} regeneratingId={regeneratingId} onRefresh={handleRefresh} - onCreate={create} - onDelete={revoke} - onRegenerate={regenerate} + onCreate={createToken} + onDelete={revokeToken} + onRegenerate={regenerateToken} createdToken={createdSecret} onDismissCreatedToken={dismissSecret} capabilitySets={capabilitySets} capabilitySetsLoading={capabilitySetsLoading} + creatingCapabilitySet={creatingCapabilitySet} + savingCapabilitySetId={savingCapabilitySetId} + deletingCapabilitySetId={deletingCapabilitySetId} + supportsCapabilitySetLabels={supportsCapabilitySetLabels} + onRefreshCapabilitySets={refreshCapabilitySets} + capabilities={capabilities} + capabilitiesLoading={capabilitiesLoading} + onRefreshCapabilities={refreshCapabilities} + onCreateCapabilitySet={createCapabilitySet} + onUpdateCapabilitySet={updateCapabilitySet} + onDeleteCapabilitySet={deleteCapabilitySet} passkeys={passkeys} passkeysSupported={passkeysSupported} passkeysLoading={passkeysLoading} diff --git a/frontend/src/documents/DocumentsPanel.jsx b/frontend/src/documents/DocumentsPanel.jsx index deec470..dc3965c 100644 --- a/frontend/src/documents/DocumentsPanel.jsx +++ b/frontend/src/documents/DocumentsPanel.jsx @@ -844,6 +844,8 @@ export const createDocumentsSurface = ({ onBulkCorrespondentAdd, onBulkCorrespondentRemove, onBulkReanalyze, + folderOptions, + onMoveDocumentsToFolder, } = tableProps; const title = Array.isArray(searchResults) ? 'Search results' : currentFolderName; @@ -879,6 +881,8 @@ export const createDocumentsSurface = ({ onBulkReanalyze={onBulkReanalyze} onDeleteSelection={onDeleteSelection} onClearSelection={onClearSelection} + folderOptions={folderOptions} + onMoveDocumentsToFolder={onMoveDocumentsToFolder} /> ) : null; diff --git a/frontend/src/documents/SelectionAssignmentMenu.jsx b/frontend/src/documents/SelectionAssignmentMenu.jsx index 8a77e24..7f2742e 100644 --- a/frontend/src/documents/SelectionAssignmentMenu.jsx +++ b/frontend/src/documents/SelectionAssignmentMenu.jsx @@ -34,6 +34,11 @@ const SelectionAssignmentMenu = ({ onCreate, disabled = false, className, + triggerContent = null, + showStateIndicators = true, + showCounts = true, + onOpenMenu = null, + renderItemLabel = null, }) => { const anchorRef = useRef(null); const inputRef = useRef(null); @@ -143,20 +148,32 @@ const SelectionAssignmentMenu = ({ && query.trim().length > 0 && !existingLabels.has(query.trim().toLowerCase()); + const handleTriggerClick = useCallback(() => { + if (disabled) { + return; + } + if (!isOpen) { + onOpenMenu?.(); + } + toggle(); + }, [disabled, isOpen, onOpenMenu, toggle]); + return (
+ Capability sets bundle permissions that you can assign to API tokens and user memberships. +
{capabilitySetFormError}
Loading capability sets…
No capability sets yet.
{capabilitySetEditError}
Select a settings section.