Skip to content

Commit 105491f

Browse files
authored
Merge pull request #745 from objectstack-ai/copilot/add-app-creation-wizard
2 parents 6627be8 + 6ed99fa commit 105491f

File tree

19 files changed

+836
-95
lines changed

19 files changed

+836
-95
lines changed

ROADMAP.md

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -446,17 +446,25 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind
446446
- [x] Disabled state support
447447

448448
**i18n:**
449-
- [x] `appDesigner` section with 54 keys added to all 10 locales (en, zh, ja, de, fr, es, ar, ru, pt, ko)
449+
- [x] `appDesigner` section with 94 keys added to all 10 locales (en, zh, ja, de, fr, es, ar, ru, pt, ko)
450+
- [x] `useDesignerTranslation` safe wrapper hook with English fallback (no I18nProvider required)
451+
- [x] AppCreationWizard fully i18n-integrated (all labels, buttons, step names, validation messages)
452+
- [x] NavigationDesigner fully i18n-integrated (type badges, quick-add labels, aria-labels, preview)
453+
454+
**UX Enhancements:**
455+
- [x] Cancel confirmation dialog with unsaved-changes detection
456+
- [x] `onSaveDraft` callback for partial progress save
457+
- [x] `useConfirmDialog` hook integration for cancel workflow
450458

451459
**Testing:**
452460
- [x] 9 type tests (isValidAppName, wizardDraftToAppSchema, type shapes)
453-
- [x] 31 AppCreationWizard tests (rendering, steps 1-4, navigation, callbacks, read-only)
454-
- [x] 18 NavigationDesigner tests (rendering, add, remove, groups, badges, read-only)
461+
- [x] 41 AppCreationWizard tests (rendering, steps 1-4, navigation, callbacks, cancel confirm, save draft, i18n, read-only)
462+
- [x] 18 NavigationDesigner tests (rendering, add, remove, groups, badges, i18n, read-only)
455463
- [x] 7 EditorModeToggle tests (render, active mode, onChange, accessibility, disabled)
456-
- [x] 14 DashboardEditor tests (rendering, add/remove widgets, property panel, read-only)
457-
- [x] 10 PageCanvasEditor tests (rendering, add/remove components, property panel, read-only)
458-
- [x] 14 ObjectViewConfigurator tests (rendering, view type switch, column visibility, toggles, read-only)
459-
- [x] **Total: 103 new tests, all passing**
464+
- [x] 10 DashboardEditor tests (rendering, add/remove widgets, property panel, read-only)
465+
- [x] 9 PageCanvasEditor tests (rendering, add/remove components, property panel, read-only)
466+
- [x] 12 ObjectViewConfigurator tests (rendering, view type switch, column visibility, toggles, read-only)
467+
- [x] **Total: 165 tests across 9 files, all passing**
460468

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

packages/i18n/src/locales/ar.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,45 @@ const ar = {
191191
stripedRows: 'Striped Rows',
192192
bordered: 'Bordered',
193193
livePreview: 'Live Preview',
194+
stepBasicDesc: 'الاسم والعنوان والتخطيط',
195+
stepObjectsDesc: 'اختيار كائنات الأعمال',
196+
stepNavigationDesc: 'بناء شجرة التنقل',
197+
stepBrandingDesc: 'الشعار والألوان والأيقونة',
198+
noObjectsFound: 'لم يتم العثور على كائنات.',
199+
noNavItemsHint: 'لا توجد عناصر تنقل بعد. حدد كائنات في الخطوة السابقة أو أضف عناصر يدويًا.',
200+
separator: 'فاصل',
201+
separatorLabel: '— فاصل —',
202+
newGroup: 'مجموعة جديدة',
203+
newLink: 'رابط جديد',
204+
saveDraft: 'حفظ المسودة',
205+
cancelConfirmTitle: 'تجاهل التغييرات؟',
206+
cancelConfirmMessage: 'لديك تغييرات غير محفوظة. هل أنت متأكد من الإلغاء؟',
207+
confirmDiscard: 'تجاهل',
208+
keepEditing: 'متابعة التحرير',
209+
navNoItems: 'لا توجد عناصر تنقل. انقر على الأزرار أعلاه لإضافة عناصر.',
210+
navNoPreviewItems: 'لا توجد عناصر',
211+
navLivePreview: 'معاينة مباشرة',
212+
navCollapseGroup: 'طي المجموعة',
213+
navExpandGroup: 'توسيع المجموعة',
214+
navAddChild: 'إضافة عنصر فرعي',
215+
navMoveUp: 'نقل لأعلى',
216+
navMoveDown: 'نقل لأسفل',
217+
navRemove: 'إزالة',
218+
navObjectPage: 'صفحة الكائن',
219+
navDashboard: 'لوحة القيادة',
220+
navPage: 'صفحة',
221+
navReport: 'تقرير',
222+
navGroup: 'مجموعة',
223+
navUrl: 'رابط',
224+
navSeparator: 'فاصل',
225+
navTypeObject: 'كائن',
226+
navTypeDashboard: 'لوحة القيادة',
227+
navTypePage: 'صفحة',
228+
navTypeReport: 'تقرير',
229+
navTypeUrl: 'رابط',
230+
navTypeGroup: 'مجموعة',
231+
navTypeSeparator: 'فاصل',
232+
navTypeAction: 'إجراء',
194233
},
195234
console: {
196235
title: 'وحدة تحكم ObjectStack',

packages/i18n/src/locales/de.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,45 @@ const de = {
190190
stripedRows: 'Gestreifte Zeilen',
191191
bordered: 'Umrandet',
192192
livePreview: 'Live-Vorschau',
193+
stepBasicDesc: 'Name, Titel und Layout',
194+
stepObjectsDesc: 'Geschäftsobjekte auswählen',
195+
stepNavigationDesc: 'Navigationsbaum erstellen',
196+
stepBrandingDesc: 'Logo, Farben und Favicon',
197+
noObjectsFound: 'Keine Objekte gefunden.',
198+
noNavItemsHint: 'Noch keine Navigationselemente. Wählen Sie Objekte im vorherigen Schritt aus oder fügen Sie manuell hinzu.',
199+
separator: 'Trennlinie',
200+
separatorLabel: '— Trennlinie —',
201+
newGroup: 'Neue Gruppe',
202+
newLink: 'Neuer Link',
203+
saveDraft: 'Entwurf speichern',
204+
cancelConfirmTitle: 'Änderungen verwerfen?',
205+
cancelConfirmMessage: 'Sie haben ungespeicherte Änderungen. Möchten Sie wirklich abbrechen?',
206+
confirmDiscard: 'Verwerfen',
207+
keepEditing: 'Weiter bearbeiten',
208+
navNoItems: 'Keine Navigationselemente. Klicken Sie auf die Schaltflächen oben, um Elemente hinzuzufügen.',
209+
navNoPreviewItems: 'Keine Elemente',
210+
navLivePreview: 'Live-Vorschau',
211+
navCollapseGroup: 'Gruppe einklappen',
212+
navExpandGroup: 'Gruppe ausklappen',
213+
navAddChild: 'Unterelement hinzufügen',
214+
navMoveUp: 'Nach oben',
215+
navMoveDown: 'Nach unten',
216+
navRemove: 'Entfernen',
217+
navObjectPage: 'Objektseite',
218+
navDashboard: 'Dashboard',
219+
navPage: 'Seite',
220+
navReport: 'Bericht',
221+
navGroup: 'Gruppe',
222+
navUrl: 'URL',
223+
navSeparator: 'Trennlinie',
224+
navTypeObject: 'Objekt',
225+
navTypeDashboard: 'Dashboard',
226+
navTypePage: 'Seite',
227+
navTypeReport: 'Bericht',
228+
navTypeUrl: 'URL',
229+
navTypeGroup: 'Gruppe',
230+
navTypeSeparator: 'Trennlinie',
231+
navTypeAction: 'Aktion',
193232
},
194233
console: {
195234
title: 'ObjectStack Konsole',

packages/i18n/src/locales/en.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,45 @@ const en = {
190190
stripedRows: 'Striped Rows',
191191
bordered: 'Bordered',
192192
livePreview: 'Live Preview',
193+
stepBasicDesc: 'Name, title, and layout',
194+
stepObjectsDesc: 'Select business objects',
195+
stepNavigationDesc: 'Build navigation tree',
196+
stepBrandingDesc: 'Logo, colors, and favicon',
197+
noObjectsFound: 'No objects found.',
198+
noNavItemsHint: 'No navigation items yet. Select objects in the previous step or add items manually.',
199+
separator: 'Separator',
200+
separatorLabel: '— Separator —',
201+
newGroup: 'New Group',
202+
newLink: 'New Link',
203+
saveDraft: 'Save Draft',
204+
cancelConfirmTitle: 'Discard changes?',
205+
cancelConfirmMessage: 'You have unsaved changes. Are you sure you want to cancel?',
206+
confirmDiscard: 'Discard',
207+
keepEditing: 'Keep Editing',
208+
navNoItems: 'No navigation items. Click buttons above to add items.',
209+
navNoPreviewItems: 'No items',
210+
navLivePreview: 'Live Preview',
211+
navCollapseGroup: 'Collapse group',
212+
navExpandGroup: 'Expand group',
213+
navAddChild: 'Add child',
214+
navMoveUp: 'Move up',
215+
navMoveDown: 'Move down',
216+
navRemove: 'Remove',
217+
navObjectPage: 'Object Page',
218+
navDashboard: 'Dashboard',
219+
navPage: 'Page',
220+
navReport: 'Report',
221+
navGroup: 'Group',
222+
navUrl: 'URL',
223+
navSeparator: 'Separator',
224+
navTypeObject: 'Object',
225+
navTypeDashboard: 'Dashboard',
226+
navTypePage: 'Page',
227+
navTypeReport: 'Report',
228+
navTypeUrl: 'URL',
229+
navTypeGroup: 'Group',
230+
navTypeSeparator: 'Separator',
231+
navTypeAction: 'Action',
193232
},
194233
console: {
195234
title: 'ObjectStack Console',

packages/i18n/src/locales/es.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,45 @@ const es = {
190190
stripedRows: 'Filas rayadas',
191191
bordered: 'Con borde',
192192
livePreview: 'Vista previa en vivo',
193+
stepBasicDesc: 'Nombre, título y diseño',
194+
stepObjectsDesc: 'Seleccionar objetos de negocio',
195+
stepNavigationDesc: 'Construir árbol de navegación',
196+
stepBrandingDesc: 'Logo, colores y favicon',
197+
noObjectsFound: 'No se encontraron objetos.',
198+
noNavItemsHint: 'Aún no hay elementos de navegación. Seleccione objetos en el paso anterior o agregue elementos manualmente.',
199+
separator: 'Separador',
200+
separatorLabel: '— Separador —',
201+
newGroup: 'Nuevo grupo',
202+
newLink: 'Nuevo enlace',
203+
saveDraft: 'Guardar borrador',
204+
cancelConfirmTitle: '¿Descartar cambios?',
205+
cancelConfirmMessage: 'Tiene cambios sin guardar. ¿Está seguro de que desea cancelar?',
206+
confirmDiscard: 'Descartar',
207+
keepEditing: 'Seguir editando',
208+
navNoItems: 'Sin elementos de navegación. Haga clic en los botones de arriba para agregar elementos.',
209+
navNoPreviewItems: 'Sin elementos',
210+
navLivePreview: 'Vista previa en vivo',
211+
navCollapseGroup: 'Contraer grupo',
212+
navExpandGroup: 'Expandir grupo',
213+
navAddChild: 'Agregar hijo',
214+
navMoveUp: 'Mover arriba',
215+
navMoveDown: 'Mover abajo',
216+
navRemove: 'Eliminar',
217+
navObjectPage: 'Página de objeto',
218+
navDashboard: 'Panel de control',
219+
navPage: 'Página',
220+
navReport: 'Informe',
221+
navGroup: 'Grupo',
222+
navUrl: 'URL',
223+
navSeparator: 'Separador',
224+
navTypeObject: 'Objeto',
225+
navTypeDashboard: 'Panel de control',
226+
navTypePage: 'Página',
227+
navTypeReport: 'Informe',
228+
navTypeUrl: 'URL',
229+
navTypeGroup: 'Grupo',
230+
navTypeSeparator: 'Separador',
231+
navTypeAction: 'Acción',
193232
},
194233
console: {
195234
title: 'Consola ObjectStack',

packages/i18n/src/locales/fr.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,45 @@ const fr = {
190190
stripedRows: 'Lignes rayées',
191191
bordered: 'Bordé',
192192
livePreview: 'Aperçu en direct',
193+
stepBasicDesc: 'Nom, titre et mise en page',
194+
stepObjectsDesc: 'Sélectionner les objets métier',
195+
stepNavigationDesc: "Construire l'arbre de navigation",
196+
stepBrandingDesc: 'Logo, couleurs et favicon',
197+
noObjectsFound: 'Aucun objet trouvé.',
198+
noNavItemsHint: "Pas encore d'éléments de navigation. Sélectionnez des objets à l'étape précédente ou ajoutez-en manuellement.",
199+
separator: 'Séparateur',
200+
separatorLabel: '— Séparateur —',
201+
newGroup: 'Nouveau groupe',
202+
newLink: 'Nouveau lien',
203+
saveDraft: 'Enregistrer le brouillon',
204+
cancelConfirmTitle: 'Abandonner les modifications ?',
205+
cancelConfirmMessage: 'Vous avez des modifications non enregistrées. Êtes-vous sûr de vouloir annuler ?',
206+
confirmDiscard: 'Abandonner',
207+
keepEditing: 'Continuer à éditer',
208+
navNoItems: 'Aucun élément de navigation. Cliquez sur les boutons ci-dessus pour ajouter des éléments.',
209+
navNoPreviewItems: 'Aucun élément',
210+
navLivePreview: 'Aperçu en direct',
211+
navCollapseGroup: 'Réduire le groupe',
212+
navExpandGroup: 'Développer le groupe',
213+
navAddChild: 'Ajouter un enfant',
214+
navMoveUp: 'Monter',
215+
navMoveDown: 'Descendre',
216+
navRemove: 'Supprimer',
217+
navObjectPage: "Page d'objet",
218+
navDashboard: 'Tableau de bord',
219+
navPage: 'Page',
220+
navReport: 'Rapport',
221+
navGroup: 'Groupe',
222+
navUrl: 'URL',
223+
navSeparator: 'Séparateur',
224+
navTypeObject: 'Objet',
225+
navTypeDashboard: 'Tableau de bord',
226+
navTypePage: 'Page',
227+
navTypeReport: 'Rapport',
228+
navTypeUrl: 'URL',
229+
navTypeGroup: 'Groupe',
230+
navTypeSeparator: 'Séparateur',
231+
navTypeAction: 'Action',
193232
},
194233
console: {
195234
title: 'Console ObjectStack',

packages/i18n/src/locales/ja.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,45 @@ const ja = {
190190
stripedRows: 'ストライプ',
191191
bordered: 'ボーダー',
192192
livePreview: 'ライブプレビュー',
193+
stepBasicDesc: '名前、タイトル、レイアウト',
194+
stepObjectsDesc: 'ビジネスオブジェクトを選択',
195+
stepNavigationDesc: 'ナビゲーションツリーを構築',
196+
stepBrandingDesc: 'ロゴ、色、ファビコン',
197+
noObjectsFound: 'オブジェクトが見つかりません。',
198+
noNavItemsHint: 'ナビゲーション項目がありません。前のステップでオブジェクトを選択するか、手動で追加してください。',
199+
separator: 'セパレーター',
200+
separatorLabel: '— セパレーター —',
201+
newGroup: '新しいグループ',
202+
newLink: '新しいリンク',
203+
saveDraft: '下書き保存',
204+
cancelConfirmTitle: '変更を破棄しますか?',
205+
cancelConfirmMessage: '保存されていない変更があります。キャンセルしてもよろしいですか?',
206+
confirmDiscard: '破棄',
207+
keepEditing: '編集を続ける',
208+
navNoItems: 'ナビゲーション項目がありません。上のボタンをクリックして追加してください。',
209+
navNoPreviewItems: '項目なし',
210+
navLivePreview: 'ライブプレビュー',
211+
navCollapseGroup: 'グループを折りたたむ',
212+
navExpandGroup: 'グループを展開',
213+
navAddChild: '子項目を追加',
214+
navMoveUp: '上に移動',
215+
navMoveDown: '下に移動',
216+
navRemove: '削除',
217+
navObjectPage: 'オブジェクトページ',
218+
navDashboard: 'ダッシュボード',
219+
navPage: 'ページ',
220+
navReport: 'レポート',
221+
navGroup: 'グループ',
222+
navUrl: 'URL',
223+
navSeparator: 'セパレーター',
224+
navTypeObject: 'オブジェクト',
225+
navTypeDashboard: 'ダッシュボード',
226+
navTypePage: 'ページ',
227+
navTypeReport: 'レポート',
228+
navTypeUrl: 'URL',
229+
navTypeGroup: 'グループ',
230+
navTypeSeparator: 'セパレーター',
231+
navTypeAction: 'アクション',
193232
},
194233
console: {
195234
title: 'ObjectStack コンソール',

packages/i18n/src/locales/ko.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,45 @@ const ko = {
190190
stripedRows: 'Striped Rows',
191191
bordered: 'Bordered',
192192
livePreview: 'Live Preview',
193+
stepBasicDesc: '이름, 제목 및 레이아웃',
194+
stepObjectsDesc: '비즈니스 객체 선택',
195+
stepNavigationDesc: '네비게이션 트리 구성',
196+
stepBrandingDesc: '로고, 색상 및 파비콘',
197+
noObjectsFound: '객체를 찾을 수 없습니다.',
198+
noNavItemsHint: '네비게이션 항목이 없습니다. 이전 단계에서 객체를 선택하거나 수동으로 추가하세요.',
199+
separator: '구분선',
200+
separatorLabel: '— 구분선 —',
201+
newGroup: '새 그룹',
202+
newLink: '새 링크',
203+
saveDraft: '임시 저장',
204+
cancelConfirmTitle: '변경 사항을 폐기하시겠습니까?',
205+
cancelConfirmMessage: '저장되지 않은 변경 사항이 있습니다. 취소하시겠습니까?',
206+
confirmDiscard: '폐기',
207+
keepEditing: '편집 계속',
208+
navNoItems: '네비게이션 항목이 없습니다. 위 버튼을 클릭하여 항목을 추가하세요.',
209+
navNoPreviewItems: '항목 없음',
210+
navLivePreview: '실시간 미리보기',
211+
navCollapseGroup: '그룹 접기',
212+
navExpandGroup: '그룹 펼치기',
213+
navAddChild: '하위 항목 추가',
214+
navMoveUp: '위로 이동',
215+
navMoveDown: '아래로 이동',
216+
navRemove: '제거',
217+
navObjectPage: '객체 페이지',
218+
navDashboard: '대시보드',
219+
navPage: '페이지',
220+
navReport: '리포트',
221+
navGroup: '그룹',
222+
navUrl: 'URL',
223+
navSeparator: '구분선',
224+
navTypeObject: '객체',
225+
navTypeDashboard: '대시보드',
226+
navTypePage: '페이지',
227+
navTypeReport: '리포트',
228+
navTypeUrl: 'URL',
229+
navTypeGroup: '그룹',
230+
navTypeSeparator: '구분선',
231+
navTypeAction: '액션',
193232
},
194233
console: {
195234
title: 'ObjectStack 콘솔',

0 commit comments

Comments
 (0)