diff --git a/ROADMAP.md b/ROADMAP.md index cb273f3c54..b12c9c40eb 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -49,7 +49,7 @@ Everything below has been built, tested, and verified. These items are stable an - **Animation:** 7 presets, reduced-motion aware, page transitions (9 types with View Transitions API). - **Notifications:** Toast/banner/snackbar with full CRUD integration. - **View Enhancements:** Gallery, column summary, grouping, row color, density modes, view sharing, ViewTabBar (reorder, pin, context menu, type-switch, personal/shared grouping). -- **Inline View Config Panel:** Airtable-style right sidebar for view configuration (Page, Data, Appearance, User Filters, Actions, Advanced), breadcrumb header, record count footer, responsive mobile overlay, ARIA accessibility, auto-close on view switch — no page navigation required. +- **Inline View Config Panel:** Airtable-style right sidebar for view configuration (Page, Data, Appearance, User Filters, Actions, Advanced), breadcrumb header, record count footer, responsive mobile overlay, ARIA accessibility, auto-close on view switch — no page navigation required. Full interactive editing support: inline title editing, Switch toggles for all boolean settings, ViewType select, clickable rows to open sub-editors (columns/filters/sort), local draft state with Save/Discard workflow, i18n in all 10 locales. ### Enterprise Features ✅ diff --git a/ROADMAP_CONSOLE.md b/ROADMAP_CONSOLE.md index dfac2923b7..186bc5779a 100644 --- a/ROADMAP_CONSOLE.md +++ b/ROADMAP_CONSOLE.md @@ -1021,7 +1021,7 @@ These were the initial tasks to bring the console prototype to production-qualit | **Global Undo/Redo (Ctrl+Z)** | ✅ Done (global UndoManager + batch ops + persistent stack) | Post v1.0 | Phase 16 (L1+L2) | | Notification center | ✅ Partial (ActivityFeed with filter preferences) | Post v1.0 | Phase 17 (L2) | | Activity feed | ✅ Done | Post v1.0 | Phase 17 (L1) | -| **Inline View Config Panel** | ✅ Done (Airtable-style right sidebar, breadcrumb header, record count footer, responsive mobile overlay, ARIA accessibility, auto-close on view switch) | Post v1.0 | Phase 20 | +| **Inline View Config Panel** | ✅ Done (Airtable-style right sidebar, breadcrumb header, record count footer, responsive mobile overlay, ARIA accessibility, auto-close on view switch, full interactive editing: Switch toggles, inline title edit, ViewType select, clickable sub-editor rows, draft state with Save/Discard) | Post v1.0 | Phase 20 | ### 5.5 Kanban & Visual Views @@ -1103,7 +1103,7 @@ These were the initial tasks to bring the console prototype to production-qualit 2027 Q1+ — v2.1: INLINE VIEW DESIGNER (✅ Complete) ═══════════════════════════════════════════════════════════ - Phase 20: Inline ViewConfigPanel ██████████████ ✅ Complete: Airtable-style right sidebar, breadcrumb header, record count footer, responsive mobile overlay, ARIA accessibility, auto-close on view switch + Phase 20: Inline ViewConfigPanel ██████████████ ✅ Complete: Airtable-style right sidebar, full interactive editing (Switch toggles, inline title, ViewType select, sub-editor rows, draft Save/Discard), ARIA accessibility ``` ### Milestone Summary @@ -1118,7 +1118,7 @@ These were the initial tasks to bring the console prototype to production-qualit | **v1.1** | v1.1.0 | ✅ Complete | Kanban + Forms + Import/Export (Phases 13-15); all L1 ✅ | | **v1.2** | v1.2.0 | ✅ L1 Complete | Undo/Redo + Collaboration (Phases 16-17); L1 integrated into console | | **v2.0** | v2.0.0 | ✅ L2 Complete | All L2 features: batch undo, expression formatting, conditional triggers, multi-step actions, swimlane persistence, keyboard nav, file validation, thread resolution, notification prefs | -| **v2.1** | v2.1.0 | ✅ Complete | Inline ViewConfigPanel (Phase 20): Airtable-style right sidebar for view configuration | +| **v2.1** | v2.1.0 | ✅ Complete | Inline ViewConfigPanel (Phase 20): Airtable-style right sidebar with full interactive editing support | --- diff --git a/apps/console/src/__tests__/ViewConfigPanel.test.tsx b/apps/console/src/__tests__/ViewConfigPanel.test.tsx index 9bc031992f..c1fd75a928 100644 --- a/apps/console/src/__tests__/ViewConfigPanel.test.tsx +++ b/apps/console/src/__tests__/ViewConfigPanel.test.tsx @@ -2,6 +2,8 @@ * ViewConfigPanel Tests * * Tests for the Airtable-style inline view configuration panel. + * Covers: read-only display, interactive editing (Switch, Input, Select), + * draft state, save/discard, open editor callbacks, and ARIA accessibility. */ import { describe, it, expect, vi } from 'vitest'; @@ -24,6 +26,23 @@ vi.mock('@object-ui/components', () => ({ Button: ({ children, onClick, title, ...props }: any) => ( ), + Switch: ({ checked, onCheckedChange, ...props }: any) => ( + + + + )} ); } diff --git a/packages/i18n/src/locales/ar.ts b/packages/i18n/src/locales/ar.ts index a6f9b6d923..f4711b60e4 100644 --- a/packages/i18n/src/locales/ar.ts +++ b/packages/i18n/src/locales/ar.ts @@ -208,6 +208,8 @@ const ar = { noDescription: 'لا يوجد وصف', none: 'لا شيء', columnsConfigured: '{{count}} أعمدة', + save: 'حفظ', + discard: 'تجاهل', }, localeSwitcher: { label: 'اللغة', diff --git a/packages/i18n/src/locales/de.ts b/packages/i18n/src/locales/de.ts index 0e9d2ce7d4..9cd28e7104 100644 --- a/packages/i18n/src/locales/de.ts +++ b/packages/i18n/src/locales/de.ts @@ -212,6 +212,8 @@ const de = { noDescription: 'Keine Beschreibung', none: 'Keine', columnsConfigured: '{{count}} Spalten', + save: 'Speichern', + discard: 'Verwerfen', }, localeSwitcher: { label: 'Sprache', diff --git a/packages/i18n/src/locales/en.ts b/packages/i18n/src/locales/en.ts index 8b5d886e01..f6fde1052f 100644 --- a/packages/i18n/src/locales/en.ts +++ b/packages/i18n/src/locales/en.ts @@ -212,6 +212,8 @@ const en = { noDescription: 'No description', none: 'None', columnsConfigured: '{{count}} columns', + save: 'Save', + discard: 'Discard', }, localeSwitcher: { label: 'Language', diff --git a/packages/i18n/src/locales/es.ts b/packages/i18n/src/locales/es.ts index 4009d84651..9757d1ce58 100644 --- a/packages/i18n/src/locales/es.ts +++ b/packages/i18n/src/locales/es.ts @@ -207,6 +207,8 @@ const es = { noDescription: 'Sin descripción', none: 'Ninguno', columnsConfigured: '{{count}} columnas', + save: 'Guardar', + discard: 'Descartar', }, localeSwitcher: { label: 'Idioma', diff --git a/packages/i18n/src/locales/fr.ts b/packages/i18n/src/locales/fr.ts index 092b03adcf..30d20b6c02 100644 --- a/packages/i18n/src/locales/fr.ts +++ b/packages/i18n/src/locales/fr.ts @@ -212,6 +212,8 @@ const fr = { noDescription: 'Aucune description', none: 'Aucun', columnsConfigured: '{{count}} colonnes', + save: 'Enregistrer', + discard: 'Annuler', }, localeSwitcher: { label: 'Langue', diff --git a/packages/i18n/src/locales/ja.ts b/packages/i18n/src/locales/ja.ts index 0d445dd041..a3a6c563d3 100644 --- a/packages/i18n/src/locales/ja.ts +++ b/packages/i18n/src/locales/ja.ts @@ -207,6 +207,8 @@ const ja = { noDescription: '説明なし', none: 'なし', columnsConfigured: '{{count}} 列', + save: '保存', + discard: '破棄', }, localeSwitcher: { label: '言語', diff --git a/packages/i18n/src/locales/ko.ts b/packages/i18n/src/locales/ko.ts index bc478ca44e..4c70883d0f 100644 --- a/packages/i18n/src/locales/ko.ts +++ b/packages/i18n/src/locales/ko.ts @@ -207,6 +207,8 @@ const ko = { noDescription: '설명 없음', none: '없음', columnsConfigured: '{{count}}개 열', + save: '저장', + discard: '취소', }, localeSwitcher: { label: '언어', diff --git a/packages/i18n/src/locales/pt.ts b/packages/i18n/src/locales/pt.ts index 79c4bb657a..5183c758b3 100644 --- a/packages/i18n/src/locales/pt.ts +++ b/packages/i18n/src/locales/pt.ts @@ -207,6 +207,8 @@ const pt = { noDescription: 'Sem descrição', none: 'Nenhum', columnsConfigured: '{{count}} colunas', + save: 'Salvar', + discard: 'Descartar', }, localeSwitcher: { label: 'Idioma', diff --git a/packages/i18n/src/locales/ru.ts b/packages/i18n/src/locales/ru.ts index fa85f6f176..da7808da10 100644 --- a/packages/i18n/src/locales/ru.ts +++ b/packages/i18n/src/locales/ru.ts @@ -207,6 +207,8 @@ const ru = { noDescription: 'Нет описания', none: 'Нет', columnsConfigured: '{{count}} столбцов', + save: 'Сохранить', + discard: 'Отменить', }, localeSwitcher: { label: 'Язык', diff --git a/packages/i18n/src/locales/zh.ts b/packages/i18n/src/locales/zh.ts index 21af88de80..6db20be51f 100644 --- a/packages/i18n/src/locales/zh.ts +++ b/packages/i18n/src/locales/zh.ts @@ -212,6 +212,8 @@ const zh = { noDescription: '无描述', none: '无', columnsConfigured: '{{count}} 列', + save: '保存', + discard: '丢弃', }, localeSwitcher: { label: '语言',