From f5cd0afe090a22b5958483ae027ce546f466083e Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Sat, 4 Apr 2026 18:55:32 -0700 Subject: [PATCH 1/3] fix(settings): align skeleton loading states with actual page layouts --- .../settings/[section]/settings.tsx | 6 +- .../components/admin/admin-skeleton.tsx | 61 ++++++++++++++- .../components/api-keys/api-key-skeleton.tsx | 34 ++++++-- .../settings/components/api-keys/api-keys.tsx | 19 +++-- .../components/byok/byok-skeleton.tsx | 9 ++- .../credentials/credential-skeleton.tsx | 65 +++++++++++----- .../custom-tools/custom-tool-skeleton.tsx | 6 +- .../components/general/general-skeleton.tsx | 4 +- .../components/inbox/inbox-skeleton.tsx | 77 ++++++++++++++----- .../integrations/integrations-skeleton.tsx | 43 +++++++++++ .../mcp-server-skeleton.tsx | 6 +- .../deleted-item-skeleton.tsx | 2 +- .../recently-deleted-skeleton.tsx | 36 +++++++++ 13 files changed, 303 insertions(+), 65 deletions(-) create mode 100644 apps/sim/app/workspace/[workspaceId]/settings/components/integrations/integrations-skeleton.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx diff --git a/apps/sim/app/workspace/[workspaceId]/settings/[section]/settings.tsx b/apps/sim/app/workspace/[workspaceId]/settings/[section]/settings.tsx index 352a0cfd334..339655b467e 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/[section]/settings.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/[section]/settings.tsx @@ -16,8 +16,10 @@ import { CredentialsSkeleton } from '@/app/workspace/[workspaceId]/settings/comp import { CustomToolsSkeleton } from '@/app/workspace/[workspaceId]/settings/components/custom-tools/custom-tool-skeleton' import { GeneralSkeleton } from '@/app/workspace/[workspaceId]/settings/components/general/general-skeleton' import { InboxSkeleton } from '@/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton' +import { IntegrationsSkeleton } from '@/app/workspace/[workspaceId]/settings/components/integrations/integrations-skeleton' import { McpSkeleton } from '@/app/workspace/[workspaceId]/settings/components/mcp/mcp-skeleton' import { SkillsSkeleton } from '@/app/workspace/[workspaceId]/settings/components/skills/skill-skeleton' +import { RecentlyDeletedSkeleton } from '@/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton' import { WorkflowMcpServersSkeleton } from '@/app/workspace/[workspaceId]/settings/components/workflow-mcp-servers/workflow-mcp-servers-skeleton' import type { SettingsSection } from '@/app/workspace/[workspaceId]/settings/navigation' import { @@ -52,7 +54,7 @@ const Integrations = dynamic( import('@/app/workspace/[workspaceId]/settings/components/integrations/integrations').then( (m) => m.Integrations ), - { loading: () => } + { loading: () => } ) const Credentials = dynamic( () => @@ -145,7 +147,7 @@ const RecentlyDeleted = dynamic( import( '@/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted' ).then((m) => m.RecentlyDeleted), - { loading: () => } + { loading: () => } ) const AccessControl = dynamic( () => import('@/ee/access-control/components/access-control').then((m) => m.AccessControl), diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/admin/admin-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/admin/admin-skeleton.tsx index 5fc7bfcf968..7d59942f89e 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/admin/admin-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/admin/admin-skeleton.tsx @@ -1,12 +1,21 @@ import { Skeleton } from '@/components/emcn' +/** + * Skeleton component for admin settings loading state. + * Matches the exact layout structure of the Admin component. + */ export function AdminSkeleton() { return (
+ {/* Super admin mode toggle */}
+ +
+ + {/* Workflow import section */}
@@ -14,9 +23,57 @@ export function AdminSkeleton() {
-
+ +
+ + {/* User management section */} +
- + + {/* Search input + button */} +
+ + +
+ + {/* Table */} +
+ {/* Column headers */} +
+ + + + + +
+ + {/* Table rows */} + {Array.from({ length: 5 }).map((_, i) => ( +
+ + + + +
+ + + +
+
+ ))} +
+ + {/* Pagination */} +
+ +
+ + +
+
) diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-key-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-key-skeleton.tsx index 2840852df87..905be870655 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-key-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-key-skeleton.tsx @@ -24,13 +24,37 @@ export function ApiKeySkeleton() { export function ApiKeysSkeleton() { return (
+ {/* Search bar and Create button */}
- - + +
-
- - + + {/* Scrollable content area */} +
+
+ {/* Workspace section */} +
+ + +
+ + {/* Personal section */} +
+ + + +
+
+
+ + {/* Bottom toggle section */} +
+
+ + +
+
) diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-keys.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-keys.tsx index d60b76eeffd..5db8c7d592f 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-keys.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-keys.tsx @@ -158,14 +158,14 @@ export function ApiKeys() {
{isLoading ? (
+ {/* Workspace section header */}
- -
- -
+ +
+ {/* Personal section header + keys */}
- +
@@ -310,6 +310,15 @@ export function ApiKeys() {
{/* Allow Personal API Keys Toggle - Fixed at bottom */} + {isLoading && canManageWorkspaceKeys && ( +
+
+ + +
+ +
+ )} {!isLoading && canManageWorkspaceKeys && (
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok-skeleton.tsx index de080c3c23b..ead1b66fbc9 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/byok/byok-skeleton.tsx @@ -9,11 +9,14 @@ export function BYOKKeySkeleton() {
- - + +
- +
+ + +
) } diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/credentials/credential-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/credentials/credential-skeleton.tsx index 32823978561..3897943e03b 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/credentials/credential-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/credentials/credential-skeleton.tsx @@ -1,46 +1,75 @@ import { Skeleton } from '@/components/emcn' -const GRID_COLS = 'grid grid-cols-[minmax(0,1fr)_8px_minmax(0,1fr)_auto] items-center' +const GRID_COLS = 'grid grid-cols-[minmax(0,1fr)_8px_minmax(0,1fr)_auto_auto] items-center' +const COL_SPAN_ALL = 'col-span-5' /** - * Skeleton component for a single secret row in the grid layout. + * Skeleton for a single integration credential row. */ export function CredentialSkeleton() { return ( -
+
+
+ +
+ + +
+
+
+ + +
+
+ ) +} + +/** + * Skeleton for a single secret row matching the credentials grid layout. + */ +function CredentialRowSkeleton() { + return ( +
-
- - -
+ +
) } /** - * Skeleton for the Secrets section shown during dynamic import loading. + * Skeleton for the Credentials (Secrets) page shown during dynamic import loading. */ export function CredentialsSkeleton() { return (
+ {/* Search bar + Save button */}
-
-
- -
- + + {/* Scrollable content area */} +
+
+
+ {/* Workspace section header */} + + + + + {/* Spacer matching the real component */} +
+ + {/* Personal section header */} + + + +
-
- - - -
) } diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/custom-tools/custom-tool-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/custom-tools/custom-tool-skeleton.tsx index 93f2895d768..6fe69f3630c 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/custom-tools/custom-tool-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/custom-tools/custom-tool-skeleton.tsx @@ -7,11 +7,11 @@ export function CustomToolSkeleton() { return (
- - + +
- +
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/general/general-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/general/general-skeleton.tsx index e58ef57af15..dae014f0bf4 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/general/general-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/general/general-skeleton.tsx @@ -11,10 +11,10 @@ export function GeneralSkeleton() {
- +
- +
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton.tsx index 70768951c2d..fc98f433d38 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton.tsx @@ -8,7 +8,7 @@ export function InboxTaskSkeleton() {
- +
@@ -20,36 +20,71 @@ export function InboxTaskSkeleton() { } /** - * Skeleton for the full Inbox section shown during dynamic import loading. + * Skeleton for the full Inbox section shown while data is loading. */ export function InboxSkeleton() { return (
- - - -
- - - + {/* InboxEnableToggle: label + description on left, switch on right */} +
+
+ + +
+
-
- - - + + {/* Border separator */} +
+ + {/* InboxSettingsTab: two sections with gap-6 */} +
+ {/* Sim's email section */} +
+ +
+ +
+ + +
+
+ +
+ + {/* Allowed senders section */} +
+ + +
+
+ +
+
+ +
+
+ +
+ + {/* Border separator with Inbox heading */}
-
- - -
-
- - - + + {/* InboxTaskList: search bar + status filter */} +
+
+ + +
+
+ + + +
) diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/integrations/integrations-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/integrations/integrations-skeleton.tsx new file mode 100644 index 00000000000..6fdbfbb9db7 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/integrations/integrations-skeleton.tsx @@ -0,0 +1,43 @@ +import { Skeleton } from '@/components/emcn' + +/** + * Skeleton for a single integration row matching the flex card layout. + */ +function IntegrationItemSkeleton() { + return ( +
+
+ +
+ + +
+
+
+ + +
+
+ ) +} + +/** + * Skeleton for the Integrations section shown during dynamic import loading. + */ +export function IntegrationsSkeleton() { + return ( +
+
+ + +
+
+
+ + + +
+
+
+ ) +} diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/components/mcp-server-skeleton/mcp-server-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/components/mcp-server-skeleton/mcp-server-skeleton.tsx index 87b6f0ce01a..f32b4591c3e 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/components/mcp-server-skeleton/mcp-server-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/mcp/components/mcp-server-skeleton/mcp-server-skeleton.tsx @@ -9,10 +9,10 @@ export function McpServerSkeleton() {
- - + +
- +
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/deleted-item-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/deleted-item-skeleton.tsx index 58a62e1f52a..e6cf2de3306 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/deleted-item-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/deleted-item-skeleton.tsx @@ -5,7 +5,7 @@ import { Skeleton } from '@/components/emcn' */ export function DeletedItemSkeleton() { return ( -
+
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx new file mode 100644 index 00000000000..1a8fab6a272 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx @@ -0,0 +1,36 @@ +import { Skeleton } from '@/components/emcn' +import { DeletedItemSkeleton } from '@/app/workspace/[workspaceId]/settings/components/recently-deleted/deleted-item-skeleton' + +/** + * Skeleton component for the entire Recently Deleted settings section. + * Renders placeholder UI for the search bar, sort dropdown, tabs, and item list. + */ +export function RecentlyDeletedSkeleton() { + return ( +
+ {/* Search bar + sort dropdown row */} +
+ + +
+ + {/* Tabs bar */} +
+ + + + + +
+ + {/* Item list */} +
+
+ + + +
+
+
+ ) +} From 65f512b17e65a8e2986283ddc7ce26f9220cb509 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Sat, 4 Apr 2026 19:05:35 -0700 Subject: [PATCH 2/3] lint --- .../app/workspace/[workspaceId]/settings/[section]/settings.tsx | 2 +- .../components/recently-deleted/recently-deleted-skeleton.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/settings/[section]/settings.tsx b/apps/sim/app/workspace/[workspaceId]/settings/[section]/settings.tsx index 339655b467e..ddda31f2a41 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/[section]/settings.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/[section]/settings.tsx @@ -18,8 +18,8 @@ import { GeneralSkeleton } from '@/app/workspace/[workspaceId]/settings/componen import { InboxSkeleton } from '@/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton' import { IntegrationsSkeleton } from '@/app/workspace/[workspaceId]/settings/components/integrations/integrations-skeleton' import { McpSkeleton } from '@/app/workspace/[workspaceId]/settings/components/mcp/mcp-skeleton' -import { SkillsSkeleton } from '@/app/workspace/[workspaceId]/settings/components/skills/skill-skeleton' import { RecentlyDeletedSkeleton } from '@/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton' +import { SkillsSkeleton } from '@/app/workspace/[workspaceId]/settings/components/skills/skill-skeleton' import { WorkflowMcpServersSkeleton } from '@/app/workspace/[workspaceId]/settings/components/workflow-mcp-servers/workflow-mcp-servers-skeleton' import type { SettingsSection } from '@/app/workspace/[workspaceId]/settings/navigation' import { diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx index 1a8fab6a272..37004b5e7f4 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx @@ -15,7 +15,7 @@ export function RecentlyDeletedSkeleton() {
{/* Tabs bar */} -
+
From b60987d20f4b2e677d87e493e1cd91ffa8d0e6d3 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Sat, 4 Apr 2026 19:11:50 -0700 Subject: [PATCH 3/3] =?UTF-8?q?fix(settings):=20address=20PR=20feedback=20?= =?UTF-8?q?=E2=80=94=20deduplicate=20skeleton,=20fix=20import=20order,=20r?= =?UTF-8?q?emove=20inline=20comments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/admin/admin-skeleton.tsx | 8 ------ .../components/api-keys/api-key-skeleton.tsx | 5 ---- .../credentials/credential-skeleton.tsx | 5 ---- .../components/inbox/inbox-skeleton.tsx | 7 ----- .../integrations/integrations-skeleton.tsx | 28 +++---------------- .../recently-deleted-skeleton.tsx | 3 -- 6 files changed, 4 insertions(+), 52 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/admin/admin-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/admin/admin-skeleton.tsx index 7d59942f89e..5115edac650 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/admin/admin-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/admin/admin-skeleton.tsx @@ -7,7 +7,6 @@ import { Skeleton } from '@/components/emcn' export function AdminSkeleton() { return (
- {/* Super admin mode toggle */}
@@ -15,7 +14,6 @@ export function AdminSkeleton() {
- {/* Workflow import section */}
@@ -26,19 +24,15 @@ export function AdminSkeleton() {
- {/* User management section */}
- {/* Search input + button */}
- {/* Table */}
- {/* Column headers */}
@@ -47,7 +41,6 @@ export function AdminSkeleton() {
- {/* Table rows */} {Array.from({ length: 5 }).map((_, i) => (
- {/* Pagination */}
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-key-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-key-skeleton.tsx index 905be870655..a4131c5cb77 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-key-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-key-skeleton.tsx @@ -24,22 +24,18 @@ export function ApiKeySkeleton() { export function ApiKeysSkeleton() { return (
- {/* Search bar and Create button */}
- {/* Scrollable content area */}
- {/* Workspace section */}
- {/* Personal section */}
@@ -48,7 +44,6 @@ export function ApiKeysSkeleton() {
- {/* Bottom toggle section */}
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/credentials/credential-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/credentials/credential-skeleton.tsx index 3897943e03b..c6812a3d2de 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/credentials/credential-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/credentials/credential-skeleton.tsx @@ -45,25 +45,20 @@ function CredentialRowSkeleton() { export function CredentialsSkeleton() { return (
- {/* Search bar + Save button */}
- {/* Scrollable content area */}
- {/* Workspace section header */} - {/* Spacer matching the real component */}
- {/* Personal section header */} diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton.tsx index fc98f433d38..1948ccb1146 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton.tsx @@ -25,7 +25,6 @@ export function InboxTaskSkeleton() { export function InboxSkeleton() { return (
- {/* InboxEnableToggle: label + description on left, switch on right */}
@@ -34,12 +33,9 @@ export function InboxSkeleton() {
- {/* Border separator */}
- {/* InboxSettingsTab: two sections with gap-6 */}
- {/* Sim's email section */}
@@ -52,7 +48,6 @@ export function InboxSkeleton() {
- {/* Allowed senders section */}
@@ -68,13 +63,11 @@ export function InboxSkeleton() {
- {/* Border separator with Inbox heading */}
- {/* InboxTaskList: search bar + status filter */}
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/integrations/integrations-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/integrations/integrations-skeleton.tsx index 6fdbfbb9db7..223c274568d 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/integrations/integrations-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/integrations/integrations-skeleton.tsx @@ -1,25 +1,5 @@ import { Skeleton } from '@/components/emcn' - -/** - * Skeleton for a single integration row matching the flex card layout. - */ -function IntegrationItemSkeleton() { - return ( -
-
- -
- - -
-
-
- - -
-
- ) -} +import { CredentialSkeleton } from '@/app/workspace/[workspaceId]/settings/components/credentials/credential-skeleton' /** * Skeleton for the Integrations section shown during dynamic import loading. @@ -33,9 +13,9 @@ export function IntegrationsSkeleton() {
- - - + + +
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx index 37004b5e7f4..59846faac9a 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted-skeleton.tsx @@ -8,13 +8,11 @@ import { DeletedItemSkeleton } from '@/app/workspace/[workspaceId]/settings/comp export function RecentlyDeletedSkeleton() { return (
- {/* Search bar + sort dropdown row */}
- {/* Tabs bar */}
@@ -23,7 +21,6 @@ export function RecentlyDeletedSkeleton() {
- {/* Item list */}