diff --git a/internal/cloudcp/portal/dist/build_manifest.json b/internal/cloudcp/portal/dist/build_manifest.json index 99c8a03fed..83a3ebbc4e 100644 --- a/internal/cloudcp/portal/dist/build_manifest.json +++ b/internal/cloudcp/portal/dist/build_manifest.json @@ -1,5 +1,5 @@ { - "source_hash": "ddd93142cd52f630277d943b39580c9f06d810ca3dffe1b96ab87ab9705ee6ed", + "source_hash": "8b0b284da60918f341d35eb2e51aed2893c7af4b399d949fd6dc0cef3e166408", "build_inputs": [ "package.json", "tsconfig.json", diff --git a/internal/cloudcp/portal/dist/portal_app.css b/internal/cloudcp/portal/dist/portal_app.css index 4ac072b81c..0e2445474b 100644 --- a/internal/cloudcp/portal/dist/portal_app.css +++ b/internal/cloudcp/portal/dist/portal_app.css @@ -541,13 +541,14 @@ header .logout-btn:hover, .account-content-panel { display: block; } +.account-content-panel-overview, .account-content-panel-workspaces, .account-content-panel-team { - padding: 16px; + padding: 18px; border: 1px solid var(--line); - border-radius: var(--radius-md); - background: var(--panel); - box-shadow: var(--shadow-sm); + border-radius: var(--radius-lg); + background: #eef3f7; + box-shadow: 0 12px 28px rgba(10, 25, 41, 0.045); } .account-command-deck, .account-overview-card, @@ -604,6 +605,10 @@ header .logout-btn:hover, grid-template-columns: 1fr; gap: 14px; align-items: stretch; + padding: 16px; + border: 1px solid var(--line); + border-radius: 14px; + background: rgba(255, 255, 255, 0.6); } .account-overview-card { display: grid; @@ -660,7 +665,6 @@ header .logout-btn:hover, gap: 18px; grid-column: 1 / -1; padding: 16px; - border-top: 1px solid var(--line); background: var(--panel); border-radius: var(--radius-md); } @@ -814,7 +818,7 @@ header .logout-btn:hover, color: var(--ink-soft); } .account-stage-header { - padding: 0 0 12px; + padding: 0 0 14px; border-bottom: 1px solid var(--line); margin-bottom: 14px; } @@ -822,6 +826,10 @@ header .logout-btn:hover, display: flex; flex-direction: column; gap: 10px; + padding: 14px; + border: 1px solid var(--line); + border-radius: 14px; + background: #fff; } .workspace-list-toolbar { display: flex; @@ -957,6 +965,10 @@ header .logout-btn:hover, grid-template-columns: minmax(0, 1.5fr) minmax(320px, 0.9fr); gap: 14px; align-items: start; + padding: 16px; + border: 1px solid var(--line); + border-radius: 14px; + background: rgba(255, 255, 255, 0.56); } .workspace-operations-main, .workspace-operations-detail { @@ -988,11 +1000,29 @@ header .logout-btn:hover, } .workspace-management-empty { margin-top: 16px; + display: flex; + flex-direction: column; + gap: 12px; padding: 16px; border-radius: var(--radius-sm); background: var(--panel-muted); color: var(--ink-soft); } +.workspace-management-empty-copy { + font-size: 14px; + line-height: 1.5; + color: var(--ink); +} +.workspace-management-empty-actions { + display: flex; + gap: 10px; + flex-wrap: wrap; +} +.workspace-management-empty-note { + font-size: 12px; + line-height: 1.5; + color: var(--ink-soft); +} .workspace-management-content { margin-top: 16px; } @@ -1073,8 +1103,8 @@ header .logout-btn:hover, } .team-roster, .team-invite-panel { - background: var(--panel-muted); - border-color: var(--line-strong); + background: #fff; + border-color: var(--line); } .team-panel-heading { margin-bottom: 12px; @@ -1241,6 +1271,10 @@ header .logout-btn:hover, grid-template-columns: minmax(280px, 0.82fr) minmax(0, 1.18fr); gap: 16px; align-items: start; + padding: 16px; + border: 1px solid var(--line); + border-radius: var(--radius-lg); + background: #eef3f7; } .service-shell-main, .service-shell-sidebar { diff --git a/internal/cloudcp/portal/dist/portal_app.js b/internal/cloudcp/portal/dist/portal_app.js index a1b74b09b0..bf2fbf5574 100644 --- a/internal/cloudcp/portal/dist/portal_app.js +++ b/internal/cloudcp/portal/dist/portal_app.js @@ -1797,7 +1797,15 @@ var unhealthyCount = countWorkspacesByHealth(workspaces, "unhealthy"); var workspaceManagement = ""; if (account.can_manage) { - workspaceManagement = '

Review one workspace at a time

Select a workspace from the fleet to review its lifecycle state and run explicit management actions.

Choose a workspace to manage from the fleet above.
'; + var workspaceDeskActions = ""; + if (account.kind === "msp") { + workspaceDeskActions += ''; + } + if (account.has_billing) { + workspaceDeskActions += ''; + } + workspaceDeskActions += ''; + workspaceManagement = '

Review one workspace at a time

Select a workspace from the fleet to review its lifecycle state and run explicit management actions.

Choose a workspace to manage from the fleet above.
' + workspaceDeskActions + '
Use the fleet table for workspace-level work, or run account-wide billing and team actions from here.
'; } var workspaceHTML = workspaces.length ? '
Review the hosted fleet, open a workspace, and keep lifecycle actions explicit.
' + String(workspaces.length) + ' total' + String(healthyCount) + ' healthy' + String(checkingCount) + ' checking' + String(unhealthyCount) + ' needs attention
WorkspaceHealthLifecycleActions
' + workspaces.map(function(workspace) { return renderWorkspaceCard(account, workspace, accountAPIBasePath); diff --git a/internal/cloudcp/portal/frontend/src/shell_view.ts b/internal/cloudcp/portal/frontend/src/shell_view.ts index 35b0a30dfb..9c451ece25 100644 --- a/internal/cloudcp/portal/frontend/src/shell_view.ts +++ b/internal/cloudcp/portal/frontend/src/shell_view.ts @@ -469,6 +469,24 @@ function renderAccountWorkspaceSection(account: PortalAccountSummary, accountAPI var unhealthyCount = countWorkspacesByHealth(workspaces, 'unhealthy'); var workspaceManagement = ''; if (account.can_manage) { + var workspaceDeskActions = ''; + if (account.kind === 'msp') { + workspaceDeskActions += + ''; + } + if (account.has_billing) { + workspaceDeskActions += + ''; + } + workspaceDeskActions += + ''; + workspaceManagement = '
Choose a workspace to manage from the fleet above.
' + + '">' + + '
Choose a workspace to manage from the fleet above.
' + + '
' + workspaceDeskActions + '
' + + '
Use the fleet table for workspace-level work, or run account-wide billing and team actions from here.
' + + '
' + '