| 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? | ⚠️ Typed-only | 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[]? | ⚠️ Typed-only | Search UI exists but does NOT scope queries to these fields |
| 9 | filterableFields | string[]? | ⚠️ Typed-only | FilterBuilder does NOT restrict fields to this whitelist |
| 10 | quickFilters | QuickFilter[]? | ⚠️ Incompatible | 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? | ⚠️ Partial | pageSize works; pageSizeOptions has no UI selector for users to switch |
| 17 | kanban | KanbanConfig? | ⚠️ Partial | Uses legacy schema.options?.kanban?.groupField instead of spec kanban config |
| 18 | calendar | CalendarConfig? | ⚠️ Partial | Uses legacy schema.options?.calendar instead of spec structure |
| 19 | gantt | GanttConfig? | ⚠️ Partial | 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? | ⚠️ Typed-only | Bridge passes through, no UI renders view description |
| 23 | sharing | ViewSharing? | ⚠️ Schema Mismatch | Spec: { type: personal/collaborative, lockedBy } vs ObjectUI: { visibility, enabled } — Share button renders but is non-functional |
| 24 | rowHeight | RowHeight enum? | ⚠️ Partial | Only compact/medium/tall mapped; spec short and extra_tall are NOT handled |
| 25 | grouping | GroupingConfig? | ⚠️ Stub | Group button renders but is disabled — zero grouping rendering logic |
| 26 | rowColor | RowColorConfig? | ⚠️ Stub | 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[]? | ⚠️ Typed-only | No row-level action menu UI rendered |
| 30 | bulkActions | string[]? | ⚠️ Typed-only | No bulk action bar UI on multi-select |
| 31 | virtualScroll | boolean? | ⚠️ Typed-only | VirtualGrid exists but ListView does NOT toggle it based on this flag |
| 32 | conditionalFormatting | Array<{condition, style}>? | ⚠️ Schema Mismatch | Spec uses expression-based { condition, style }, ObjectUI uses field/operator/value rules |
| 33 | inlineEdit | boolean? | ✅ | Mapped to editable on ObjectGrid |
| 34 | exportOptions | enum[]? | ⚠️ Schema Mismatch | Spec: simple string[], ObjectUI: { formats, maxRecords, includeHeaders, fileNamePrefix } object |
| 35 | userActions | UserActionsConfig? | ⚠️ Typed-only | userActions.sort/search/filter/rowHeight/addRecordForm/buttons do NOT control toolbar visibility |
| 36 | appearance | AppearanceConfig? | ⚠️ Typed-only | showDescription and allowedVisualizations have NO rendering |
| 37 | tabs | ViewTab[]? | ⚠️ Typed-only | NO tab bar UI rendered |
| 38 | addRecord | AddRecordConfig? | ⚠️ Typed-only | NO "+ Add Record" button rendered |
| 39 | showRecordCount | boolean? | ⚠️ Ignored | Record count bar ALWAYS shows regardless of this flag |
| 40 | allowPrinting | boolean? | ⚠️ Typed-only | NO print button or functionality |
| 41 | emptyState | { title?, message?, icon? } | ✅ | Fully implemented with Lucide icon resolution |
| 42 | aria | AriaProps? | ✅ | Applied to root container element |
ListView Spec Protocol — Complete Implementation Gap Analysis
A thorough comparison between
@objectstack/specView protocol (view.zod.ts) and the ObjectUI ListView implementation acrosspackages/types,packages/plugin-list,packages/plugin-grid, andpackages/react/src/spec-bridge.Legend
1. ListView Top-Level Properties (42 total)
namestring?labelI18nLabel?{ en, zh }is NOT resolved — only plainstringworkstypeenumviewTypedataViewDataSchema?ListView.tsxignoresdataentirely — always usesdataSource.find(objectName).provider: api/valuemodes not consumedcolumnsstring[] | ListColumn[]filterany[]?sortstring | SortConfig[]?"field desc"NOT parsedsearchableFieldsstring[]?filterableFieldsstring[]?quickFiltersQuickFilter[]?{ field, operator, value }, ObjectUI uses{ id, label, filters[] }resizableboolean?stripedboolean?borderedboolean?selectionSelectionConfig?navigationNavigationConfig?paginationPaginationConfig?pageSizeworks;pageSizeOptionshas no UI selector for users to switchkanbanKanbanConfig?schema.options?.kanban?.groupFieldinstead of speckanbanconfigcalendarCalendarConfig?schema.options?.calendarinstead of spec structureganttGanttConfig?schema.options?.ganttinstead of spec structuregalleryGalleryConfig?GalleryConfigSchema(coverField,coverFit,cardSize,titleField,visibleFields) is NOT typed or consumedtimelineTimelineConfig?TimelineConfigSchema(startDateField,endDateField,titleField,groupByField,colorField,scale) is NOT typed or consumeddescriptionI18nLabel?sharingViewSharing?{ type: personal/collaborative, lockedBy }vs ObjectUI:{ visibility, enabled }— Share button renders but is non-functionalrowHeightRowHeight enum?compact/medium/tallmapped; specshortandextra_tallare NOT handledgroupingGroupingConfig?disabled— zero grouping rendering logicrowColorRowColorConfig?disabled— zero row coloring logichiddenFieldsstring[]?fieldOrderstring[]?rowActionsstring[]?bulkActionsstring[]?virtualScrollboolean?conditionalFormattingArray<{condition, style}>?{ condition, style }, ObjectUI uses field/operator/value rulesinlineEditboolean?editableon ObjectGridexportOptionsenum[]?string[], ObjectUI:{ formats, maxRecords, includeHeaders, fileNamePrefix }objectuserActionsUserActionsConfig?userActions.sort/search/filter/rowHeight/addRecordForm/buttonsdo NOT control toolbar visibilityappearanceAppearanceConfig?showDescriptionandallowedVisualizationshave NO renderingtabsViewTab[]?addRecordAddRecordConfig?showRecordCountboolean?allowPrintingboolean?emptyState{ title?, message?, icon? }ariaAriaProps?2. ListColumn Properties (13 total)
fieldlabelwidthalignhiddensortableresizablewraptypepinnedsummarylinkaction3. Sub-Config Schemas
GalleryConfigSchemacoverField,coverFit,cardSize,titleField,visibleFields— all missingTimelineConfigSchemastartDateField,endDateField,titleField,groupByField,colorField,scale— all missingGroupingConfigSchemafields[].field,fields[].order,fields[].collapsed— zero renderingRowColorConfigSchemafield,colorsmapping — zero renderingViewSharingSchemapersonal/collaborativevs ObjectUIvisibilityUserActionsConfigSchemasort,search,filter,rowHeight,addRecordForm,buttons— none wiredAppearanceConfigSchemashowDescription,allowedVisualizations— zero UIViewTabSchemaname,label,icon,view,filter,order,pinned,isDefault,visible— zero UIAddRecordConfigSchemaenabled,position,mode,formView— zero UIPaginationConfigSchemapageSizeworks,pageSizeOptionshas no UI selector4. Summary Statistics
5. Priority Ranking
data(ViewDataSchema)provider: api/valuemodes ignoredgroupingrowColorgallery/timelineconfigoptions.*useduserActions→ toolbar controlshowSearch/showSort/showFilterstabs(ViewTab)addRecordquickFiltersconditionalFormattingpinnedsummaryrowActions/bulkActionsallowPrintingshowRecordCountflagappearance.allowedVisualizationssharingschema mismatchpersonal/collaborativevs ObjectUIvisibilitysearchableFieldsfilterableFieldsrowHeightenum gapsshortandextra_tallnot mappedsortlegacy string format"field desc"format not parsed6. Source Code References
objectstack-ai/spec→packages/spec/src/ui/view.zod.tspackages/types/src/list-view.tspackages/plugin-list/src/ListView.tsxpackages/react/src/spec-bridge/bridges/list-view.tspackages/plugin-grid/src/ObjectGrid.tsx