-
Notifications
You must be signed in to change notification settings - Fork 1
Description
ListView Spec Protocol — Complete Implementation Gap Analysis
A thorough comparison between @objectstack/spec View protocol (view.zod.ts) and the ObjectUI ListView implementation across packages/types, packages/plugin-list, packages/plugin-grid, and packages/react/src/spec-bridge.
Legend
| Status | Meaning |
|---|---|
| ✅ Implemented | Property is typed, bridged, AND rendered with real UI behavior |
| Property exists in types or bridge, but has NO real rendering logic (disabled button, passthrough, no UI) | |
| ❌ Not Implemented | Property is defined in spec but has no corresponding type, bridge, or rendering at all |
1. ListView Top-Level Properties (42 total)
| # | Spec Property | Type (Spec) | Status | Details |
|---|---|---|---|---|
| 1 | name |
string? |
✅ | Used as view identifier |
| 2 | label |
I18nLabel? |
✅ | Displayed in title; but i18n object form { en, zh } is NOT resolved — only plain string works |
| 3 | type |
enum |
✅ | Mapped to viewType |
| 4 | data |
ViewDataSchema? |
ListView.tsx ignores data entirely — always uses dataSource.find(objectName). provider: api/value modes not consumed |
|
| 5 | columns |
string[] | ListColumn[] |
✅ | Supports both simple strings and detailed column configs |
| 6 | filter |
any[]? |
✅ | Used as base filter in data fetching |
| 7 | sort |
string | SortConfig[]? |
✅ Partial | Only array form supported; legacy string format "field desc" NOT parsed |
| 8 | searchableFields |
string[]? |
Search UI exists but does NOT scope queries to these fields | |
| 9 | filterableFields |
string[]? |
FilterBuilder does NOT restrict fields to this whitelist | |
| 10 | quickFilters |
QuickFilter[]? |
Structure mismatch: spec uses { field, operator, value }, ObjectUI uses { id, label, filters[] } |
|
| 11 | resizable |
boolean? |
✅ | Passed to ObjectGrid |
| 12 | striped |
boolean? |
✅ | Forwarded to child views |
| 13 | bordered |
boolean? |
✅ | Forwarded to child views |
| 14 | selection |
SelectionConfig? |
✅ | Fully implemented |
| 15 | navigation |
NavigationConfig? |
✅ | drawer/modal/page/popover all supported |
| 16 | pagination |
PaginationConfig? |
pageSize works; pageSizeOptions has no UI selector for users to switch |
|
| 17 | kanban |
KanbanConfig? |
Uses legacy schema.options?.kanban?.groupField instead of spec kanban config |
|
| 18 | calendar |
CalendarConfig? |
Uses legacy schema.options?.calendar instead of spec structure |
|
| 19 | gantt |
GanttConfig? |
Uses legacy schema.options?.gantt instead of spec structure |
|
| 20 | gallery |
GalleryConfig? |
❌ Not Implemented | Spec GalleryConfigSchema (coverField, coverFit, cardSize, titleField, visibleFields) is NOT typed or consumed |
| 21 | timeline |
TimelineConfig? |
❌ Not Implemented | Spec TimelineConfigSchema (startDateField, endDateField, titleField, groupByField, colorField, scale) is NOT typed or consumed |
| 22 | description |
I18nLabel? |
Bridge passes through, no UI renders view description | |
| 23 | sharing |
ViewSharing? |
Spec: { type: personal/collaborative, lockedBy } vs ObjectUI: { visibility, enabled } — Share button renders but is non-functional |
|
| 24 | rowHeight |
RowHeight enum? |
Only compact/medium/tall mapped; spec short and extra_tall are NOT handled |
|
| 25 | grouping |
GroupingConfig? |
Group button renders but is disabled — zero grouping rendering logic |
|
| 26 | rowColor |
RowColorConfig? |
Color button renders but is disabled — zero row coloring logic |
|
| 27 | hiddenFields |
string[]? |
✅ | Implemented with hide/show popover UI |
| 28 | fieldOrder |
string[]? |
✅ | Sorts fields by order map |
| 29 | rowActions |
string[]? |
No row-level action menu UI rendered | |
| 30 | bulkActions |
string[]? |
No bulk action bar UI on multi-select | |
| 31 | virtualScroll |
boolean? |
VirtualGrid exists but ListView does NOT toggle it based on this flag | |
| 32 | conditionalFormatting |
Array<{condition, style}>? |
Spec uses expression-based { condition, style }, ObjectUI uses field/operator/value rules |
|
| 33 | inlineEdit |
boolean? |
✅ | Mapped to editable on ObjectGrid |
| 34 | exportOptions |
enum[]? |
Spec: simple string[], ObjectUI: { formats, maxRecords, includeHeaders, fileNamePrefix } object |
|
| 35 | userActions |
UserActionsConfig? |
userActions.sort/search/filter/rowHeight/addRecordForm/buttons do NOT control toolbar visibility |
|
| 36 | appearance |
AppearanceConfig? |
showDescription and allowedVisualizations have NO rendering |
|
| 37 | tabs |
ViewTab[]? |
NO tab bar UI rendered | |
| 38 | addRecord |
AddRecordConfig? |
NO "+ Add Record" button rendered | |
| 39 | showRecordCount |
boolean? |
Record count bar ALWAYS shows regardless of this flag | |
| 40 | allowPrinting |
boolean? |
NO print button or functionality | |
| 41 | emptyState |
{ title?, message?, icon? } |
✅ | Fully implemented with Lucide icon resolution |
| 42 | aria |
AriaProps? |
✅ | Applied to root container element |
2. ListColumn Properties (13 total)
| # | Spec Property | Status | Details |
|---|---|---|---|
| 1 | field |
✅ | Core column identifier |
| 2 | label |
✅ | Display label override |
| 3 | width |
✅ | Column width in pixels |
| 4 | align |
✅ | Text alignment |
| 5 | hidden |
✅ | Hide column by default |
| 6 | sortable |
✅ | Allow sorting |
| 7 | resizable |
✅ | Allow column resizing |
| 8 | wrap |
✅ | Text wrapping |
| 9 | type |
✅ | Renderer type override |
| 10 | pinned |
ObjectGrid does NOT implement frozen/pinned columns | |
| 11 | summary |
NO column footer aggregation UI (count, sum, avg) | |
| 12 | link |
No click-to-navigate rendering on link columns | |
| 13 | action |
No action dispatch on column click |
3. Sub-Config Schemas
| # | Spec Schema | Status | Key Gaps |
|---|---|---|---|
| 1 | GalleryConfigSchema |
❌ | coverField, coverFit, cardSize, titleField, visibleFields — all missing |
| 2 | TimelineConfigSchema |
❌ | startDateField, endDateField, titleField, groupByField, colorField, scale — all missing |
| 3 | GroupingConfigSchema |
fields[].field, fields[].order, fields[].collapsed — zero rendering |
|
| 4 | RowColorConfigSchema |
field, colors mapping — zero rendering |
|
| 5 | ViewSharingSchema |
Spec personal/collaborative vs ObjectUI visibility |
|
| 6 | UserActionsConfigSchema |
sort, search, filter, rowHeight, addRecordForm, buttons — none wired |
|
| 7 | AppearanceConfigSchema |
showDescription, allowedVisualizations — zero UI |
|
| 8 | ViewTabSchema |
name, label, icon, view, filter, order, pinned, isDefault, visible — zero UI |
|
| 9 | AddRecordConfigSchema |
enabled, position, mode, formView — zero UI |
|
| 10 | PaginationConfigSchema |
pageSize works, pageSizeOptions has no UI selector |
4. Summary Statistics
| Category | Count | Percentage |
|---|---|---|
| Spec ListView properties total | 42 | 100% |
| ✅ Fully implemented | 14 | 33% |
| 22 | 52% | |
| ❌ Not implemented at all | 6 | 15% |
5. Priority Ranking
| Priority | Property | Impact |
|---|---|---|
| P0 | data (ViewDataSchema) |
Core protocol — provider: api/value modes ignored |
| P0 | grouping |
Group button visible but disabled — top Airtable parity |
| P0 | rowColor |
Color button visible but disabled — top Airtable parity |
| P0 | gallery / timeline config |
Spec configs ignored, legacy options.* used |
| P1 | userActions → toolbar control |
Spec should drive showSearch/showSort/showFilters |
| P1 | tabs (ViewTab) |
Multi-tab interfaces — core Interface Builder feature |
| P1 | addRecord |
No "+ Add Record" button from spec config |
| P1 | quickFilters |
Structure mismatch — spec vs ObjectUI format |
| P1 | conditionalFormatting |
Expression-based (spec) vs field/operator (ObjectUI) mismatch |
| P1 | Column pinned |
Bridge passes but grid doesn't freeze columns |
| P1 | Column summary |
No footer aggregation UI |
| P2 | rowActions / bulkActions |
No row action menu or bulk action bar |
| P2 | allowPrinting |
No print functionality |
| P2 | showRecordCount flag |
Record count always shows, flag ignored |
| P2 | appearance.allowedVisualizations |
ViewSwitcher doesn't respect whitelist |
| P2 | sharing schema mismatch |
Spec personal/collaborative vs ObjectUI visibility |
| P3 | searchableFields |
Search exists but doesn't scope to fields |
| P3 | filterableFields |
FilterBuilder doesn't restrict to whitelist |
| P3 | rowHeight enum gaps |
short and extra_tall not mapped |
| P3 | sort legacy string format |
"field desc" format not parsed |
6. Source Code References
- Spec protocol:
objectstack-ai/spec→packages/spec/src/ui/view.zod.ts - ObjectUI types:
packages/types/src/list-view.ts - ListView component:
packages/plugin-list/src/ListView.tsx - Spec bridge:
packages/react/src/spec-bridge/bridges/list-view.ts - ObjectGrid:
packages/plugin-grid/src/ObjectGrid.tsx
This checklist focuses on protocol alignment analysis only. Interaction design details can be further discussed in sub-issues.
Reactions are currently unavailable