Skip to content

Commit b7c62d8

Browse files
authored
Merge pull request #759 from objectstack-ai/copilot/add-navigation-tree-designer
2 parents c980b3e + 9de9b46 commit b7c62d8

File tree

14 files changed

+447
-10
lines changed

14 files changed

+447
-10
lines changed

ROADMAP.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,10 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind
426426
- [x] Deep tree operations (remove/reorder works at any depth)
427427
- [x] Live preview sidebar showing navigation as rendered
428428
- [x] Type badges with color coding
429+
- [x] Icon editing (inline icon name input with pencil button, Enter/Escape commit/discard)
430+
- [x] Visibility toggle (eye/eye-off icon per node, hidden badge display)
431+
- [x] Export/Import navigation JSON Schema (toolbar buttons with file I/O, custom callbacks)
432+
- [x] Mobile responsive layout (flex-col on mobile, sm:flex-row on desktop)
429433

430434
**Page Canvas Editor:**
431435
- [x] Component palette (Grid, Kanban, Calendar, Gallery, Dashboard, Form, Layout Grid)
@@ -455,10 +459,10 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind
455459
- [x] Disabled state support
456460

457461
**i18n:**
458-
- [x] `appDesigner` section with 94 keys added to all 10 locales (en, zh, ja, de, fr, es, ar, ru, pt, ko)
462+
- [x] `appDesigner` section with 103 keys added to all 10 locales (en, zh, ja, de, fr, es, ar, ru, pt, ko)
459463
- [x] `useDesignerTranslation` safe wrapper hook with English fallback (no I18nProvider required)
460464
- [x] AppCreationWizard fully i18n-integrated (all labels, buttons, step names, validation messages)
461-
- [x] NavigationDesigner fully i18n-integrated (type badges, quick-add labels, aria-labels, preview)
465+
- [x] NavigationDesigner fully i18n-integrated (type badges, quick-add labels, aria-labels, preview, icon editing, visibility, export/import)
462466

463467
**UX Enhancements:**
464468
- [x] Cancel confirmation dialog with unsaved-changes detection
@@ -468,12 +472,12 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind
468472
**Testing:**
469473
- [x] 9 type tests (isValidAppName, wizardDraftToAppSchema, type shapes)
470474
- [x] 41 AppCreationWizard tests (rendering, steps 1-4, navigation, callbacks, cancel confirm, save draft, i18n, read-only)
471-
- [x] 18 NavigationDesigner tests (rendering, add, remove, groups, badges, i18n, read-only)
475+
- [x] 33 NavigationDesigner tests (rendering, add, remove, groups, badges, i18n, read-only, icon editing, visibility toggle, export/import, responsive)
472476
- [x] 7 EditorModeToggle tests (render, active mode, onChange, accessibility, disabled)
473477
- [x] 10 DashboardEditor tests (rendering, add/remove widgets, property panel, read-only)
474478
- [x] 9 PageCanvasEditor tests (rendering, add/remove components, property panel, read-only)
475479
- [x] 12 ObjectViewConfigurator tests (rendering, view type switch, column visibility, toggles, read-only)
476-
- [x] **Total: 165 tests across 9 files, all passing**
480+
- [x] **Total: 180 tests across 9 files, all passing**
477481

478482
**ComponentRegistry:**
479483
- [x] Registered: `app-creation-wizard`, `navigation-designer`, `dashboard-editor`, `page-canvas-editor`, `object-view-configurator`

packages/i18n/src/locales/ar.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,15 @@ const ar = {
230230
navTypeGroup: 'مجموعة',
231231
navTypeSeparator: 'فاصل',
232232
navTypeAction: 'إجراء',
233+
navEditIcon: 'تعديل الأيقونة',
234+
navToggleVisible: 'تبديل الظهور',
235+
navHidden: 'مخفي',
236+
navExportSchema: 'تصدير JSON',
237+
navImportSchema: 'استيراد JSON',
238+
navExportSuccess: 'تم تصدير هيكل التنقل',
239+
navImportSuccess: 'تم استيراد هيكل التنقل',
240+
navImportError: 'ملف JSON تنقل غير صالح',
241+
navIconPlaceholder: 'اسم الأيقونة (مثل Users)',
233242
},
234243
console: {
235244
title: 'وحدة تحكم ObjectStack',

packages/i18n/src/locales/de.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,15 @@ const de = {
229229
navTypeGroup: 'Gruppe',
230230
navTypeSeparator: 'Trennlinie',
231231
navTypeAction: 'Aktion',
232+
navEditIcon: 'Symbol bearbeiten',
233+
navToggleVisible: 'Sichtbarkeit umschalten',
234+
navHidden: 'Ausgeblendet',
235+
navExportSchema: 'JSON exportieren',
236+
navImportSchema: 'JSON importieren',
237+
navExportSuccess: 'Navigationsstruktur exportiert',
238+
navImportSuccess: 'Navigationsstruktur importiert',
239+
navImportError: 'Ungültiges Navigations-JSON',
240+
navIconPlaceholder: 'Symbolname (z.B. Users)',
232241
},
233242
console: {
234243
title: 'ObjectStack Konsole',

packages/i18n/src/locales/en.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,15 @@ const en = {
229229
navTypeGroup: 'Group',
230230
navTypeSeparator: 'Separator',
231231
navTypeAction: 'Action',
232+
navEditIcon: 'Edit icon',
233+
navToggleVisible: 'Toggle visibility',
234+
navHidden: 'Hidden',
235+
navExportSchema: 'Export JSON',
236+
navImportSchema: 'Import JSON',
237+
navExportSuccess: 'Navigation schema exported',
238+
navImportSuccess: 'Navigation schema imported',
239+
navImportError: 'Invalid navigation JSON',
240+
navIconPlaceholder: 'Icon name (e.g. Users)',
232241
},
233242
console: {
234243
title: 'ObjectStack Console',

packages/i18n/src/locales/es.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,15 @@ const es = {
229229
navTypeGroup: 'Grupo',
230230
navTypeSeparator: 'Separador',
231231
navTypeAction: 'Acción',
232+
navEditIcon: 'Editar icono',
233+
navToggleVisible: 'Alternar visibilidad',
234+
navHidden: 'Oculto',
235+
navExportSchema: 'Exportar JSON',
236+
navImportSchema: 'Importar JSON',
237+
navExportSuccess: 'Estructura de navegación exportada',
238+
navImportSuccess: 'Estructura de navegación importada',
239+
navImportError: 'JSON de navegación inválido',
240+
navIconPlaceholder: 'Nombre del icono (ej: Users)',
232241
},
233242
console: {
234243
title: 'Consola ObjectStack',

packages/i18n/src/locales/fr.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,15 @@ const fr = {
229229
navTypeGroup: 'Groupe',
230230
navTypeSeparator: 'Séparateur',
231231
navTypeAction: 'Action',
232+
navEditIcon: 'Modifier l\'icône',
233+
navToggleVisible: 'Basculer la visibilité',
234+
navHidden: 'Masqué',
235+
navExportSchema: 'Exporter JSON',
236+
navImportSchema: 'Importer JSON',
237+
navExportSuccess: 'Structure de navigation exportée',
238+
navImportSuccess: 'Structure de navigation importée',
239+
navImportError: 'JSON de navigation invalide',
240+
navIconPlaceholder: 'Nom d\'icône (ex: Users)',
232241
},
233242
console: {
234243
title: 'Console ObjectStack',

packages/i18n/src/locales/ja.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,15 @@ const ja = {
229229
navTypeGroup: 'グループ',
230230
navTypeSeparator: 'セパレーター',
231231
navTypeAction: 'アクション',
232+
navEditIcon: 'アイコン編集',
233+
navToggleVisible: '表示切替',
234+
navHidden: '非表示',
235+
navExportSchema: 'JSON エクスポート',
236+
navImportSchema: 'JSON インポート',
237+
navExportSuccess: 'ナビゲーション構造をエクスポートしました',
238+
navImportSuccess: 'ナビゲーション構造をインポートしました',
239+
navImportError: '無効なナビゲーション JSON',
240+
navIconPlaceholder: 'アイコン名(例: Users)',
232241
},
233242
console: {
234243
title: 'ObjectStack コンソール',

packages/i18n/src/locales/ko.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,15 @@ const ko = {
229229
navTypeGroup: '그룹',
230230
navTypeSeparator: '구분선',
231231
navTypeAction: '액션',
232+
navEditIcon: '아이콘 편집',
233+
navToggleVisible: '표시 전환',
234+
navHidden: '숨김',
235+
navExportSchema: 'JSON 내보내기',
236+
navImportSchema: 'JSON 가져오기',
237+
navExportSuccess: '내비게이션 구조를 내보냈습니다',
238+
navImportSuccess: '내비게이션 구조를 가져왔습니다',
239+
navImportError: '잘못된 내비게이션 JSON',
240+
navIconPlaceholder: '아이콘 이름 (예: Users)',
232241
},
233242
console: {
234243
title: 'ObjectStack 콘솔',

packages/i18n/src/locales/pt.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,15 @@ const pt = {
229229
navTypeGroup: 'Grupo',
230230
navTypeSeparator: 'Separador',
231231
navTypeAction: 'Ação',
232+
navEditIcon: 'Editar ícone',
233+
navToggleVisible: 'Alternar visibilidade',
234+
navHidden: 'Oculto',
235+
navExportSchema: 'Exportar JSON',
236+
navImportSchema: 'Importar JSON',
237+
navExportSuccess: 'Estrutura de navegação exportada',
238+
navImportSuccess: 'Estrutura de navegação importada',
239+
navImportError: 'JSON de navegação inválido',
240+
navIconPlaceholder: 'Nome do ícone (ex: Users)',
232241
},
233242
console: {
234243
title: 'Console ObjectStack',

packages/i18n/src/locales/ru.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,15 @@ const ru = {
229229
navTypeGroup: 'Группа',
230230
navTypeSeparator: 'Разделитель',
231231
navTypeAction: 'Действие',
232+
navEditIcon: 'Изменить иконку',
233+
navToggleVisible: 'Переключить видимость',
234+
navHidden: 'Скрыто',
235+
navExportSchema: 'Экспорт JSON',
236+
navImportSchema: 'Импорт JSON',
237+
navExportSuccess: 'Структура навигации экспортирована',
238+
navImportSuccess: 'Структура навигации импортирована',
239+
navImportError: 'Недопустимый JSON навигации',
240+
navIconPlaceholder: 'Имя иконки (напр. Users)',
232241
},
233242
console: {
234243
title: 'Консоль ObjectStack',

0 commit comments

Comments
 (0)