# OFBiz Modern UI Migration Status Last refreshed: 2026-06-09 ## Current Gate The modern frontend has structural route/page/action/form/table coverage for the scanned legacy OFBiz view surface. The business parity gate is still pending. Do not claim full parity. ```text coverageStatus=structural-passed-business-incomplete frontendRewriteGate=passed businessParityGate=pending missingRoutes=0 missingActions=0 missingPageDefinitions=0 legacyViewRoutes=1772 routeManifest=1772 uniquePageDefinitions=1767 splitPageDefinitionFiles=1767 duplicateLegacyRouteAliases=5 requestActions=4099 actionDefinitions=7934 serviceDefinitions=3848 renderablePages=1767 structuredPages=1250 adapterCoveredPages=465 customParityPages=465 customVuePages=0 verifiedBusinessParityPages=46 pendingBusinessE2ePages=1721 highRiskPendingPages=876 runtimeSmokePagesInCurrentParityArtifact=4 runtimeSmokePassed=4 runtimeSmokeDomains=1 runtimeSmokeFlows=1 verificationScreenshotsPresent=112 unsupportedBlockTypeCount=0 browserRuntimeFallback=Chrome/CDP browserRuntimeStatus=passed browserRuntimeScreenshot=plugins/modern-ui/verification/browser-runtime-admin.png browserPluginIabStatus=unavailable ``` ## What Is Implemented Every generated page can enter this structural path: ```text legacy controller/widget/template metadata -> PageDefinition JSON -> /api/v1/pages/:pageId -> BusinessPageView -> ErpPageRenderer / ErpAdapterBlock -> Element Plus ERP wrappers/adapters ``` Implemented evidence from the current artifacts: - 1772 legacy view routes map to 1767 unique PageDefinitions. - 1767 split PageDefinition JSON files exist under `webapp/modern/app/generated/pages`. - The lightweight inventory index exposes counts, coverage, parity manifest, route manifest, and `pageDefinitionUrl`; full page payloads are fetched per page. - 7934 action definitions exist for 4099 scanned legacy request actions. - 1409 form blocks have explicit contracts. - 553 table blocks have data-source contracts: 505 entity-backed and 48 derived/report/history. - 1870 select/radio/drop-down fields have option contracts. - The renderer has no unsupported block type in the current parity artifact. ## What Is Structurally Covered By Metadata Renderer The generated renderer covers these block families by metadata and wrappers/adapters: ```text section: 2630 legacy-screen: 1767 actions: 1704 form: 1409 client-behavior: 1034 commerce-surface: 749 table: 553 permission: 234 links: 218 catalog-workspace: 191 finance-workspace: 173 menu: 163 communication-workspace: 115 report: 107 marketing-workspace: 84 manufacturing-workspace: 66 pos-workspace: 53 route-workspace: 51 search-workspace: 49 order-workspace: 34 profile-workspace: 32 entity-editor: 26 shipment-workspace: 26 tree-workspace: 25 order-entry-workspace: 20 entity-admin-workspace: 19 inventory-workspace: 18 cart-workspace: 17 calendar: 15 media-workspace: 14 lookup-workspace: 13 product-workspace: 10 chart-workspace: 9 survey-workspace: 8 quote-workspace: 8 request-workspace: 7 ``` This is structural coverage. It means pages can be represented and rendered with a modern UI contract. It does not prove that every legacy side effect, report output, permission branch, or JavaScript behavior is business-equivalent. ## What Is Custom Rebuilt The production SPA includes custom Vue admin/workspace surfaces for the main administrator experience and high-use domains, including dashboard, login, module workspaces, domain admin pages, order, party, product/catalog, accounting, inventory/facility, manufacturing, human resources, sales, procurement, scrum, operations, content, marketing, commerce, POS, marketplace, analytics, system security/operations, and extensions. These custom surfaces are developer-maintained Vue components under `plugins/modern-ui/app/src/views` and `plugins/modern-ui/app/src/components/erp`. They complement the generated PageDefinition renderer. The generated inventory still reports `customVuePages=0` because generated PageDefinitions themselves do not point at per-page custom Vue components; `adapterCoveredPages/customParityPages=465` marks generated pages whose old template/workspace behavior needs parity attention. ## Current Runtime And Screenshot Evidence Current visible evidence in this repo: - `coverage-verification.json`: generated 2026-06-09T06:25:25.455Z. - `parity-verification.json`: generated 2026-06-08T01:55:10.521Z. - Runtime smoke in the current parity artifact covers 4 Accounting pages and passes all 4. - Screenshot directory currently contains 112 PNG files. This is useful visual evidence, but not all 1767 generated pages. - Browser runtime verification currently passes through local Google Chrome + CDP against `http://127.0.0.1:8080/modern/app/`; report path is `plugins/modern-ui/verification/browser-runtime-report.json` and screenshot path is `plugins/modern-ui/verification/browser-runtime-admin.png`. - The Codex in-app browser path is currently unavailable: `agent.browsers.get('iab') -> Browser is not available: iab`. Treat that as a tooling limitation, not as evidence that Modern UI failed. Use Chrome/CDP and fail fast on concrete Chrome/base URL errors instead of retrying `iab`. The earlier claim of a 64-page runtime smoke sample is not supported by the current `parity-verification.json` artifact in this checkout. Treat the 4-page smoke numbers above as the current reproducible artifact state until `npm run verify:parity` is rerun and the JSON is updated. ## Remaining Work Before Functional Equivalence `pendingBusinessE2ePages=1721` is the completion blocker. The remaining pages need old-vs-new business E2E, especially the `876` high-risk pages involving payment, POS/cart, upload/import/export/PDF/print, finance state, shipment, return, report output, permission/session handling, or legacy JavaScript behavior. Largest pending domains by page count: ```text Product / Catalog: 346 Accounting: 257 Order: 197 Party: 145 Content: 137 Ecommerce: 96 Human Resources: 87 WebTools: 79 Marketing: 74 Work Effort: 68 Scrum: 56 Project: 38 ``` ## Verification Source Of Truth Use these files for current claims: ```text plugins/modern-ui/verification/coverage-verification.json plugins/modern-ui/verification/coverage-verification.md plugins/modern-ui/verification/parity-verification.json plugins/modern-ui/verification/parity-verification.md plugins/modern-ui/webapp/modern/app/generated/ui-inventory.json plugins/modern-ui/webapp/modern/app/generated/pages/*.json ``` Useful commands from `plugins/modern-ui/app` when code or generated assets change: ```bash npm run build npm run verify:coverage npm run verify:preview npm run verify:parity npm run verify:browser-runtime ``` Do not rewrite these commands' meaning in delivery notes: coverage proves structural coverage, preview/browser checks prove representative runtime health, and parity remains pending until page-level business E2E is complete. Acceptance gate to move `businessParityGate` from pending to passed: ```text pendingBusinessE2ePages=0 highRiskPendingPages=0 verifiedBusinessParityPages=1767 runtime smoke expanded beyond the current 4 Accounting pages across domains and scenario flows old-vs-new authenticated E2E covers mutation, report/export/PDF/print, upload/import, POS/cart/payment, permission/session, validation, and state-transition behavior Chrome/CDP browser-runtime report passes with screenshot evidence ```