diff --git a/apps/sim/app/workspace/[workspaceId]/components/resource/resource.tsx b/apps/sim/app/workspace/[workspaceId]/components/resource/resource.tsx index d2490ec46f6..93512d9467f 100644 --- a/apps/sim/app/workspace/[workspaceId]/components/resource/resource.tsx +++ b/apps/sim/app/workspace/[workspaceId]/components/resource/resource.tsx @@ -219,6 +219,36 @@ export const ResourceTable = memo(function ResourceTable({ direction: 'desc', }) + const [contextMenuRowId, setContextMenuRowId] = useState(null) + + const wrappedOnRowContextMenu = useCallback( + (e: React.MouseEvent, rowId: string) => { + setContextMenuRowId(rowId) + onRowContextMenu?.(e, rowId) + }, + [onRowContextMenu] + ) + + useEffect(() => { + if (!contextMenuRowId) return + const clear = () => setContextMenuRowId(null) + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Escape') { + document.removeEventListener('keydown', handleKeyDown) + clear() + } + } + const timeoutId = setTimeout(() => { + document.addEventListener('pointerdown', clear, { once: true }) + document.addEventListener('keydown', handleKeyDown) + }, 0) + return () => { + clearTimeout(timeoutId) + document.removeEventListener('pointerdown', clear) + document.removeEventListener('keydown', handleKeyDown) + } + }, [contextMenuRowId]) + const handleSort = useCallback((column: string, direction: 'asc' | 'desc') => { setInternalSort({ column, direction }) }, []) @@ -343,7 +373,8 @@ export const ResourceTable = memo(function ResourceTable({ rowDragDrop={rowDragDrop} onRowClick={onRowClick} onRowHover={onRowHover} - onRowContextMenu={onRowContextMenu} + onRowContextMenu={onRowContextMenu ? wrappedOnRowContextMenu : undefined} + isContextMenuTarget={contextMenuRowId === row.id} hasCheckbox={hasCheckbox} /> ))} @@ -403,17 +434,18 @@ const Pagination = memo(function Pagination({ } if (page < 1 || page > totalPages) return null return ( - + ) })} @@ -460,6 +492,7 @@ interface DataRowProps { onRowClick?: (rowId: string) => void onRowHover?: (rowId: string) => void onRowContextMenu?: (e: React.MouseEvent, rowId: string) => void + isContextMenuTarget?: boolean hasCheckbox: boolean } @@ -472,6 +505,7 @@ const DataRow = memo(function DataRow({ onRowClick, onRowHover, onRowContextMenu, + isContextMenuTarget, hasCheckbox, }: DataRowProps) { const isSelected = selectable?.selectedIds.has(row.id) ?? false @@ -554,7 +588,7 @@ const DataRow = memo(function DataRow({ onRowClick && 'cursor-pointer', isDraggable && 'cursor-grab active:cursor-grabbing', isDropTarget && 'data-[drop-target=true]:outline-offset-[-1px]', - (selectedRowId === row.id || isSelected) && 'bg-[var(--surface-3)]', + (selectedRowId === row.id || isSelected || isContextMenuTarget) && 'bg-[var(--surface-3)]', isActiveDropTarget && 'bg-[var(--surface-4)] outline outline-1 outline-[var(--accent)]', (isDragging || (isAnyDragActive && isSelected && !isActiveDropTarget)) && 'opacity-50' )} diff --git a/apps/sim/app/workspace/[workspaceId]/files/files.tsx b/apps/sim/app/workspace/[workspaceId]/files/files.tsx index 1e715a8a373..6aa7d5a40b1 100644 --- a/apps/sim/app/workspace/[workspaceId]/files/files.tsx +++ b/apps/sim/app/workspace/[workspaceId]/files/files.tsx @@ -1585,10 +1585,11 @@ export function Files() { } : undefined, dropdownItems: - isCurrentFolder && canEdit + isCurrentFolder && (canEdit || userPermissions.isLoading) ? [ { label: 'Rename', + disabled: !canEdit, onClick: () => breadcrumbRenameRef.current.startRename(folder.id, folder.name), }, ] @@ -1605,6 +1606,7 @@ export function Files() { router, workspaceId, canEdit, + userPermissions.isLoading, breadcrumbRename.editingId, breadcrumbRename.editValue, ]) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx index 301cdd26be0..43071af70a7 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx @@ -814,15 +814,26 @@ export function KnowledgeBase({ } : undefined, dropdownItems: [ - ...(userPermissions.canEdit + ...(userPermissions.canEdit || userPermissions.isLoading ? [ { label: 'Rename', icon: Pencil, + disabled: !userPermissions.canEdit, onClick: () => kbRename.startRename(id, knowledgeBaseName), }, - { label: 'Tags', icon: Tag, onClick: () => setShowTagsModal(true) }, - { label: 'Delete', icon: Trash, onClick: () => setShowDeleteDialog(true) }, + { + label: 'Tags', + icon: Tag, + disabled: !userPermissions.canEdit, + onClick: () => setShowTagsModal(true), + }, + { + label: 'Delete', + icon: Trash, + disabled: !userPermissions.canEdit, + onClick: () => setShowDeleteDialog(true), + }, ] : []), ], @@ -830,8 +841,15 @@ export function KnowledgeBase({ ] const headerActions: HeaderAction[] = [ - ...(userPermissions.canEdit - ? [{ label: 'New connector', icon: Plus, onClick: () => setShowAddConnectorModal(true) }] + ...(userPermissions.canEdit || userPermissions.isLoading + ? [ + { + label: 'New connector', + icon: Plus, + disabled: !userPermissions.canEdit, + onClick: () => setShowAddConnectorModal(true), + }, + ] : []), ] @@ -886,18 +904,18 @@ export function KnowledgeBase({ /> {enabledFilter.length > 0 && ( - + )} - + Connected Sources Manage connected data sources for this knowledge base @@ -1535,13 +1553,13 @@ function TagFilterSection({ tagDefinitions, entries, onChange }: TagFilterSectio >
- +
{step === 'select-type' ? (
-
+
- +
{config.name} diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.tsx index ea39d97cfac..4106c94d286 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connector-selector-field/connector-selector-field.tsx @@ -72,7 +72,7 @@ export function ConnectorSelectorField({ if (isLoading && isEnabled) { return ( -
+
Loading…
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.tsx index b388ff2b246..a70738c7cd4 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/connectors-section/connectors-section.tsx @@ -372,7 +372,7 @@ function ConnectorCard({
- {Icon && } + {Icon && } {connector.status === 'disabled' && ( )} @@ -532,7 +532,7 @@ function ConnectorCard({

{canEdit && serviceId && providerId && (
{canEdit && (