From 12865194980bfd011aae980137d69f8ae933fb3e Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 23 May 2026 12:40:37 -0700 Subject: [PATCH 1/3] fix(resource): prevent permission-gated breadcrumb items from flashing on load (#4732) * improvement(kb-connectors): align connector UI surfaces and strip redundant description suffix - Fix icon colors to use --text-icon token across connector cards and modal - Switch Reconnect/Update access buttons from active to primary variant - Lift search box surface from --surface-2 to --surface-3 so it's visible against modal bg - Replace raw + ) })} @@ -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 && (