All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
-
CI Build Fix: Unused Parameters in Test Mocks (
apps/console): Fixed TypeScriptnoUnusedParameterserrors (TS6133) inListToolbarActions.test.tsxwhere mock componentpropsparameters were declared but never used in@object-ui/plugin-kanbanand@object-ui/plugin-calendarmocks, causing the consoletscbuild step to fail in CI. -
i18n loadLanguage Not Compatible with Spec REST API Response Format (
apps/console): FixedloadLanguageinapps/console/src/main.tsxto correctly unwrap the@objectstack/specREST API envelope{ data: { locale, translations } }. Previously, the function returned the raw JSON response, which meantuseObjectLabelanduseObjectTranslationhooks received a wrapped object instead of the flat translation map, causing business object and field labels (e.g., CRM contact/account) to fall back to English. The fix extractsdata.translationswhen the spec envelope is detected, while preserving backward compatibility with mock/dev environments that return flat translation objects. Includes 6 unit tests covering spec envelope unwrapping, flat fallback, HTTP errors, network failures, and edge cases. -
List Toolbar Action Buttons Not Responding (
apps/console): Fixed a bug where schema-driven action buttons in the upper-right corner of the list view (rendered viaaction:barwithlocations: ['list_toolbar']) did not respond to clicks. The root cause: the consoleObjectViewcomponent rendered these action buttons viaSchemaRendererwithout wrapping them in anActionProvider. This causeduseAction()to fall back to a localActionRunnerwith no handlers, toast, confirmation, or navigation capabilities — so clicks executed silently with no visible effect. AddedActionProviderwith proper handlers (toast via Sonner, confirmation dialog, navigation via React Router, param collection dialog, and a generic API handler) to the consoleObjectView, following the same pattern already used inRecordDetailView. Includes 4 new integration tests validating the full action chain (render, confirm, execute, cancel). -
CRM Seed Data Lookup References (
examples/crm): Fixed all CRM seed data files to use natural key (name) references for lookup fields instead of rawidvalues. TheSeedLoaderServiceresolves foreign key references by the target object'snamefield (the defaultexternalId), so seed data values likeorder: "o1"oraccount: "2"could not be resolved and were set tonull. Updated all 8 affected data files (account,contact,opportunity,order,order_item,opportunity_contact,project_task,event) to use human-readable name references (e.g.,order: "ORD-2024-001",product: "Workstation Pro Laptop",account: "Salesforce Tower"). This fixes the issue where Order and Product columns displayed as empty in the Order Item grid view.
-
Lookup Field Selection Display Fix (
@object-ui/fields): Fixed a bug where selecting a record from the RecordPickerDialog (Level 2 popup) produced no visible feedback in the LookupField. The root cause:findOptiononly searched static and popover-fetched options, which did not include records loaded by the dialog. AddedonSelectRecordscallback toRecordPickerDialogPropsthat returns full record objects alongside IDs. LookupField now caches selected records from the dialog and displays their labels/badges correctly. Both single-select and multi-select modes are supported. Includes aselectedRecordsMapref in RecordPickerDialog that persists selected record data across page navigation for multi-select scenarios. -
RecordPickerDialog UI/UX Overhaul (
@object-ui/fields): Major enterprise-grade improvements referencing mainstream low-code platforms:- Skeleton Loading Screen: Replaced simple spinner with a table-shaped skeleton screen during initial data load, matching the column layout for a polished loading experience.
- Sticky Table Header: Table header now sticks to the top during vertical scroll, keeping column labels visible at all times.
- Loading Overlay: Subsequent data fetches (page navigation, sorting, filtering) show a semi-transparent overlay with spinner over the existing data, preventing layout jank.
- Page Jump Input: New input field in pagination bar allows users to type a page number and press Enter to jump directly to any page.
- Enhanced Search Bar: Redesigned with a subtle background container and borderless input for a cleaner, more modern appearance.
- Improved Table Styling: Even/odd row striping (
bg-muted/20), refined selected-row highlighting (bg-primary/5), uppercase column headers with tighter tracking, rounded table border, and improved cell padding. - Responsive Dialog: Responsive dialog sizing from
sm:max-w-3xltolg:max-w-5xlfor optimal data density across screen sizes; filter panel supports 3-column layout on wide viewports (lg:grid-cols-3). - Fixed Close-Reset Cycle: Separated dialog close-reset logic into its own
useEffect(depends only onopen) to prevent cascading state updates that could trigger React Error #185 (Maximum update depth exceeded) when selecting a record. - 8 New Unit Tests: Comprehensive test coverage for skeleton loading (column count validation), sticky header classes, page jump navigation (valid/invalid/single-page), and loading overlay behavior.
-
"Browse All" Button for Lookup Fields (
@object-ui/fields): Added an always-visible "Browse All" (table icon) button next to the Lookup quick-select trigger. Opens the full RecordPickerDialog directly, regardless of record count — making enterprise features (multi-column table, sort/filter bar, cell renderers) discoverable at all times. Previously, the dialog was only accessible via the "Show All Results" in-popover button, which only appeared when total records exceeded the page size. The button uses accessiblearia-label,title, and LucideTablePropertiesicon. Keyboard and screen reader accessible. -
CRM Enterprise Lookup Metadata (
examples/crm): All 14 lookup fields across 8 CRM objects now have enterprise-grade RecordPicker configuration —lookup_columns(with type hints for cell rendering: select, currency, boolean, date, number, percent),lookup_filters(base business filters using eq/ne/in/notIn operators), anddescription_field. Uses post-createObject.assigninjection pattern to bypassObjectSchema.create()Zod stripping (analogous to the listViews passthrough approach). -
Enterprise Lookup Tests (
examples/crm): 12 new test cases validating lookup_columns presence & type diversity, lookup_filters operator validity, description_field coverage, and specific business logic (e.g., active-only users, non-cancelled orders, open opportunities). -
RecordPickerDialog Component (
@object-ui/fields): New enterprise-grade record selection dialog with multi-column table display, pagination, search, column sorting with$orderby, keyboard navigation (Arrow keys + Enter), loading/error/empty states, and single/multi-select support. Responsive layout with mobile-friendly width. Provides the foundation for Salesforce-style Lookup experience. -
LookupField Popover Typeahead (
@object-ui/fields): Level 1 quick-select upgraded from Dialog to Popover for inline typeahead experience (anchored dropdown, not modal). Includes "Show All Results" footer button that opens the full RecordPickerDialog (Level 2). -
LookupFieldMetadata Schema Enhancement (
@object-ui/types): Addedlookup_columns,description_field,lookup_page_size,lookup_filterstoLookupFieldMetadata. NewLookupColumnDefinterface withtypehint for cell formatting. NewLookupFilterDefinterface for base filter configuration.
- @objectstack v3.2.6 Upgrade: Upgraded all
@objectstack/*packages from^3.2.5to^3.2.6across 13 package.json files (43 references) - @objectstack v3.0.4 Upgrade: Upgraded all
@objectstack/*packages from^3.0.2to^3.0.4across 42 references - @objectstack v3.0.0 Upgrade: Upgraded all
@objectstack/*packages from^2.0.7to^3.0.0across 13 package.json files - Breaking change migrations:
Hubnamespace →Cloudin @object-ui/types re-exportsdefinePluginremoved (onlydefineStackremains)PaginatedResult.value→.recordsacross all data plugins and adaptersPaginatedResult.count→.totalin data-objectstack adapterclient.meta.getObject()→client.meta.getItem('object', name)in data adapter
- Updated spec version references across ROADMAP.md, SPEC_COMPLIANCE_EVALUATION.md, OBJECTSTACK_CLIENT_EVALUATION.md, and console docs
- Updated ROADMAP with v3.0.0 migration table and next phase roadmap (N.1-N.5)
- Updated namespace-exports tests to reflect v3.0.0 exports
- Preview Mode (
@object-ui/auth): NewpreviewModeprop onAuthProviderfor auto-login with simulated identity — skip login/registration for marketplace demos and app showcases. IncludesPreviewBannercomponent,isPreviewMode/previewModeonuseAuth(), andPreviewModeOptionstype. Aligns with@objectstack/speckernelPreviewModeConfig. - Discovery Preview Detection (
@object-ui/react): ExtendedDiscoveryInfowithmodeandpreviewModefields for server-driven preview mode detection. - Console Preview Support:
ConditionalAuthWrapperauto-detectsmode === 'preview'from server discovery and configures auth accordingly. - Console Bundle Optimization: Split monolithic 3.7 MB main chunk into 17 granular cacheable chunks via
manualChunks— main entry reduced from 1,008 KB gzip to 48.5 KB gzip (95% reduction) - Gzip + Brotli Compression: Pre-compressed assets via
vite-plugin-compression2— Brotli main entry at 40 KB - Bundle Analysis: Added
rollup-plugin-visualizergenerating interactive treemap atdist/stats.html; newbuild:analyzescript - Lazy MSW Loading: MSW mock server now loaded via dynamic
import()— fully excluded frombuild:serveroutput (~150 KB gzip saved) - ROADMAP Console v1.0 Section: Added production release optimization roadmap with detailed before/after metrics
- Maintenance release - Documentation and build improvements
- Updated internal dependencies across all packages
0.3.0 - 2026-01-17
- New Plugin:
@object-ui/plugin-object- ObjectQL plugin for automatic table and form generationObjectTable: Auto-generates tables from ObjectQL object schemasObjectForm: Auto-generates forms from ObjectQL object schemas with create/edit/view modes- Full TypeScript support with comprehensive type definitions
- Type Definitions: Added
ObjectTableSchemaandObjectFormSchemato@object-ui/types - ObjectQL Integration: Enhanced
ObjectQLDataSourcewithgetObjectSchema()method using MetadataApiClient
- Updated
@objectql/sdkfrom ^1.8.3 to ^1.9.1 - Updated
@objectql/typesfrom ^1.8.3 to ^1.9.1
0.2.1 - 2026-01-15
- Fixed changeset configuration to remove non-existent @apps/* pattern
- Added automated changeset-based version management and release workflow
- Enhanced CI/CD workflows with GitHub Actions
- Improved documentation for contributing and releasing
0.2.0 - 2026-01-15
- Comprehensive test suite using Vitest and React Testing Library
- Test coverage for @object-ui/core, @object-ui/react, @object-ui/components, and @object-ui/designer packages
- GitHub Actions CI/CD workflows:
- CI workflow for automated testing, linting, and building
- Release workflow for publishing new versions
- Test coverage reporting with @vitest/coverage-v8
- Contributing guidelines (CONTRIBUTING.md)
- Documentation for testing and development workflow in README
- README files for all core packages
- Updated package.json scripts to use Vitest instead of placeholder test commands
- Enhanced README with testing instructions and CI status badges
0.1.0 - Initial Release
- Core packages:
- @object-ui/core - Core logic, types, and validation (Zero React dependencies)
- @object-ui/react - React bindings and SchemaRenderer component
- @object-ui/components - Standard UI components built with Tailwind CSS & Shadcn
- @object-ui/designer - Drag-and-drop visual editor
- Monorepo structure using pnpm workspaces
- Basic TypeScript configuration
- Example applications in the examples directory
- Complete documentation site with VitePress