Skip to content

Commit d9bdd90

Browse files
authored
Merge pull request #791 from objectstack-ai/copilot/sync-navigation-tree-with-crud
2 parents b7e232e + 8bb6a03 commit d9bdd90

File tree

5 files changed

+1325
-1
lines changed

5 files changed

+1325
-1
lines changed

ROADMAP.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,9 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind
172172
- [x] Console integration: Drag reorder upgrade — replace HTML5 DnD with `@dnd-kit` via `NavigationRenderer`
173173
- [x] Console integration: Navigation pin — `useNavPins` hook + `NavigationRenderer` `enablePinning`/`onPinToggle`
174174
- [x] Console integration: `AppSchemaRenderer` slot system — `sidebarHeader`, `sidebarExtra`, `sidebarFooter` slots for Console customization
175+
- [x] Navigation Sync Service — `useNavigationSync` hook auto-syncs App navigation tree on Page/Dashboard CRUD (create, delete, rename) with toast + undo
176+
- [x] Navigation Sync auto-detection — `NavigationSyncEffect` component monitors metadata changes and auto-syncs navigation across ALL apps when pages/dashboards are added or removed
177+
- [x] Navigation Sync all-apps convenience API — `sync*AllApps` methods iterate all apps without requiring explicit `appName`
175178

176179
### P1.8 Console — View Config Panel (Phase 20)
177180

apps/console/src/App.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { ConditionalAuthWrapper } from './components/ConditionalAuthWrapper';
2121
import { KeyboardShortcutsDialog } from './components/KeyboardShortcutsDialog';
2222
import { OnboardingWalkthrough } from './components/OnboardingWalkthrough';
2323
import { useRecentItems } from './hooks/useRecentItems';
24+
import { NavigationSyncEffect } from './hooks/useNavigationSync';
2425

2526
// Route-based code splitting — lazy-load less-frequently-used routes
2627
const RecordDetailView = lazy(() => import('./components/RecordDetailView').then(m => ({ default: m.RecordDetailView })));
@@ -295,6 +296,7 @@ export function AppContent() {
295296

296297
return (
297298
<ExpressionProvider user={expressionUser} app={activeApp} data={{}}>
299+
<NavigationSyncEffect />
298300
<ConsoleLayout
299301
activeAppName={activeApp.name}
300302
activeApp={activeApp}

apps/console/src/__tests__/console-load-performance.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ describe('Entry-size budget constants', () => {
9898
beforeLazy.match(/^import\s+(?!type\b)/gm) || [];
9999

100100
// Eagerly loaded modules should stay small; flag if this grows too large
101-
expect(staticImports.length).toBeLessThanOrEqual(20);
101+
expect(staticImports.length).toBeLessThanOrEqual(21);
102102
});
103103
});
104104

0 commit comments

Comments
 (0)