Skip to content

Active-org nav context, related-list action bridges, first-run wizard fixes (cloud ADR-0081) - #2356

Merged
os-zhuang merged 2 commits into
mainfrom
feat/team-org-context
Jul 9, 2026
Merged

Active-org nav context, related-list action bridges, first-run wizard fixes (cloud ADR-0081)#2356
os-zhuang merged 2 commits into
mainfrom
feat/team-org-context

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Mechanism wiring for cloud ADR-0081 (in-shell org/member management) — no business logic, all metadata plumbing + real bug fixes:

  • currentOrgId in nav template context (sidebars, command palette, search): {current_org_id} recordId tokens now resolve — the spec + NavigationRenderer already supported them; the shell never supplied the value.
  • AuthProvider: refreshOrganizations returns the fetched list (callers read a stale state closure); a session with no active org and exactly ONE membership auto-activates it (repairs pre-existing sessions without re-login).
  • Related-list row actions on record pages were broken end-to-end (pre-existing):
    • the bridge spread the ActionParam[] DEFINITION array into the params object ({0:{…}}) → sent to the data API as a fields map → INVALID_FIELD: Unknown field '0'; dispatch now mirrors ObjectGrid (actionParams + params:{_rowRecord});
    • param dialogs resolve field-backed params against the action's OWN (child) object + prefill defaultFromRow from the clicked row;
    • RecordDetailView.apiHandler gains the canonical absolute-HTTP branch — previously every type:'api' action mapped to dataSource.update: remove_member silently no-opped as fake success, update_member_role bypassed better-auth with a raw managed-table write.
  • NEW: related lists bridge child list_toolbar actions as header buttons (invite_user on an org's Invitations list) — same contract as row actions, no row context.
  • First-run wizard (SetupPage): fresh org list + short retry (stale closure always fell through to createOrganization, FORBIDden in single-org, error swallowed); keep the existing slug when the name slugifies to '' (CJK names); don't auto-redirect mid-submission (the navigation killed the in-flight rename).

Verification

react 5464 ✓ / app-shell 1135 ✓ / plugin-detail 170 ✓ / auth 130 ✓. Browser E2E against both a single-org framework stack and the full cloud stack (real signup → Team page → invite/accept/change-role/remove through better-auth).

Pairs with objectstack-ai/objectstack#2699 and objectstack-ai/cloud feat/console-team-page (cloud#738).

🤖 Generated with Claude Code

os-zhuang and others added 2 commits July 9, 2026 08:42
…ow-action correctness + first-run wizard fixes

Mechanism wiring for cloud ADR-0081 (in-shell org/member management):

- Nav template context now carries currentOrgId (sidebars, command palette,
  search results) so '{current_org_id}' recordId deep-links resolve — the
  spec + NavigationRenderer already supported the token; the shell just
  never supplied the value.
- AuthProvider: refreshOrganizations returns the fetched list (callers were
  reading a stale state closure), and a session with no active org but
  exactly one membership auto-activates it (repairs pre-existing sessions
  without a re-login).
- Related-list row actions (record pages) fixed end-to-end:
  - RelatedRecordActionsBridge spread the ActionParam[] DEFINITION array
    into the params object ({0:{...}}), which downstream sent to the data
    API as a fields map -> INVALID_FIELD: Unknown field '0'. Dispatch now
    mirrors ObjectGrid: defs as actionParams, params reserved for
    _rowRecord.
  - Param dialogs resolve field-backed params against the action's OWN
    (child) object and prefill defaultFromRow from the clicked row
    (RecordDetailView + useConsoleActionRuntime).
  - RecordDetailView.apiHandler gains the canonical absolute-HTTP branch
    (recordIdParam/bodyExtra/bodyShape + active-org injection). Previously
    every type:'api' action mapped to dataSource.update: remove_member
    silently no-opped as a fake success, and update_member_role bypassed
    better-auth with a raw write to a managed identity table.
- First-run wizard (SetupPage): use the returned org list with a short
  retry (stale closure made it always fall through to createOrganization,
  which single-org FORBIDs and the error was swallowed); keep the existing
  slug when the org name slugifies to '' (CJK names); don't auto-redirect
  mid-submission (the navigation killed the in-flight rename).

Live-verified against a single-org framework stack in the browser.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…s onto related lists

Related lists surfaced a child object's row actions (list_item) but not its
LIST actions — on an organization record page the Invitations tab had no way
to send an invitation (sys_invitation's invite_user is a list_toolbar
action). Extend the same host-bridge contract with toolbarActions /
onToolbarAction: the bridge derives the child's list_toolbar actions
(localized), RelatedList renders them as header buttons before Add/New, and
execution reuses the row-action dispatch without a row record.

Completes the in-shell Team surface (cloud ADR-0081 D3): invite / cancel /
resend now work from the org record page's Invitations list; live-verified
against the cloud control plane.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 9, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Jul 9, 2026 3:29am

Request Review

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 59.7 KB 350 KB
Entry file index-DIsL9im6.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 7.54KB 2.74KB
app-shell (runtime-config.js) 5.79KB 2.08KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 19.11KB 4.04KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 4.79KB 1.88KB
auth (LoginForm.js) 9.55KB 3.36KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.63KB 2.15KB
auth (SocialSignInButtons.js) 8.89KB 3.61KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 26.07KB 6.30KB
auth (createAuthenticatedFetch.js) 3.93KB 1.55KB
auth (index.js) 1.75KB 0.76KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 4.29KB 0.82KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 18.38KB 4.49KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 3.65KB 1.42KB
collaboration (PresenceProvider.js) 2.42KB 0.96KB
collaboration (index.js) 1.25KB 0.53KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 440.80KB 95.06KB
core (index.js) 1.65KB 0.59KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 110.51KB 27.26KB
fields (index.js) 186.64KB 45.58KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.46KB 0.96KB
i18n (pickLocalized.js) 1.31KB 0.67KB
i18n (provider.js) 5.37KB 1.72KB
i18n (useObjectLabel.js) 21.15KB 4.68KB
i18n (useSafeTranslation.js) 2.68KB 0.98KB
layout (index.js) 38.41KB 10.65KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.74KB
mobile (index.js) 1.50KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 4.42KB 1.27KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 1.77KB 0.77KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 5.09KB 1.84KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.46KB 1.03KB
permissions (evaluator.js) 4.00KB 1.23KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.50KB 0.70KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 45.12KB 12.34KB
plugin-charts (index.js) 46.31KB 13.06KB
plugin-chatbot (index.js) 173.85KB 41.46KB
plugin-dashboard (index.js) 108.35KB 26.87KB
plugin-designer (index.js) 213.95KB 43.04KB
plugin-detail (index.js) 204.81KB 49.36KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 104.12KB 25.19KB
plugin-gantt (index.js) 136.72KB 33.89KB
plugin-grid (index.js) 171.02KB 45.15KB
plugin-kanban (index.js) 48.16KB 12.94KB
plugin-list (index.js) 98.00KB 23.12KB
plugin-map (index.js) 16.80KB 5.24KB
plugin-markdown (index.js) 13.65KB 4.67KB
plugin-report (index.js) 37.83KB 9.97KB
plugin-timeline (index.js) 25.37KB 7.20KB
plugin-tree (index.js) 8.21KB 2.76KB
plugin-view (index.js) 85.47KB 20.80KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.55KB 0.67KB
providers (UploadProvider.js) 11.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 3.19KB 1.38KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 18.23KB 5.97KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 0.79KB 0.43KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 2.16KB 0.94KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
tenant (TenantContext.js) 0.31KB 0.25KB
tenant (TenantGuard.js) 1.04KB 0.43KB
tenant (TenantProvider.js) 2.76KB 0.98KB
tenant (TenantScopedQuery.js) 0.77KB 0.44KB
tenant (index.js) 0.75KB 0.38KB
tenant (resolver.js) 2.64KB 0.76KB
tenant (useTenant.js) 0.50KB 0.32KB
tenant (useTenantBranding.js) 0.62KB 0.39KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 0.77KB 0.41KB
types (disclosure.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (index.js) 1.54KB 0.68KB
types (layout.js) 0.20KB 0.18KB
types (mobile.js) 0.20KB 0.18KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.26KB 1.96KB
types (tenant.js) 0.20KB 0.18KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 0.75KB 0.46KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@os-zhuang
os-zhuang merged commit b0aa251 into main Jul 9, 2026
10 checks passed
@os-zhuang
os-zhuang deleted the feat/team-org-context branch July 9, 2026 05:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant