Resource Entry Page Deep Dive
This guide explains the runtime path of a resource entry page in Zova through the current public Cabloy Basic source.
Use this page when you want to understand:
- how a
/rest/resource/...entry route becomes a working entry page - where the thin
rest-resourcepage shell stops - how
basic-pageentrytakes over the deeper entry runtime - where
blockFormandblockToolbarRowfit into that runtime - how submit flow and page-meta updates connect back to the routed shell
Why this page exists
Several existing docs already explain important parts of the story:
- Generated Contract Consumption: Entry Branch explains the consumer-side handoff before the deeper runtime begins
- Rest Resource Under the Hood explains the module-level runtime bridge
- Rest Resource Source Reading Map explains the shortest file path into the module
- Form Guide and Zova Form Under the Hood explain the form runtime
- Form Scene to Page Meta Guide explains the cross-layer
formScene -> formMeta -> pageMetachain
What those pages do not isolate directly is the one cohesive entry-page runtime path from route entry into the deeper Basic form/page runtime.
That is the gap this page fills.
The shortest accurate mental model
A practical mental model is:
rest-resourcedeclares generic resource entry routes- generated page wrappers bind those routes to
ControllerPageEntry ControllerPageEntryis a thin shell that resolvesresource,id, andformScene- that shell derives
formMeta, loadsformSchema, and rendersformSchema.rest.blocks - those blocks usually enter
basic-pageentry:blockPageEntry blockPageEntrybecomes the deeper runtime owner forModelResource,formData, submit flow, and page-meta updatesblockFormbridges intoZFormblockToolbarRowrenders the action row from the shared page-entry render context
That means the entry page is not “one big page controller that does everything.” It is a route-shell plus downstream reusable block runtime.
This page focuses only on the entry-page branch. For the broader module-level shell-to-runtime map shared by both list and entry pages, keep Rest Resource Source Reading Map as the general reference.
Source-confirmed reading path
When reading this topic, use this order:
zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/routes.tszova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/page/entry.tszova/src/suite-vendor/a-cabloy/modules/rest-resource/src/page/entry/controller.tsxzova/src/suite/cabloy-basic/modules/basic-pageentry/src/.metadata/index.tszova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockPageEntry/controller.tsxzova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockForm/controller.tsxzova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx
That order moves from public route surface, to route wrapper, to resource entry shell, to Basic block registry, to the real entry-page runtime owner, then to the form bridge and action row.
Runtime path by layer
1. Route entry
The public route surface lives in:
zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/routes.tsThe entry routes are:
:resource/create:resource/:id/:formScene?
This already shows the public entry-page contract:
- resource identity comes from the route
- row identity comes from
id - scene can come explicitly from
formScene, or later fall back by runtime rule
The shared tabKey(route) also shows that entry pages stay grouped under one resource-oriented workspace rather than creating a brand-new workspace per row.
2. Generated page wrapper
The route component wrapper lives in:
zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/page/entry.tsThis file is thin but important.
It shows that the page does not enter runtime through ad hoc local setup code. Instead, it enters the standard Zova page-controller path through:
createZovaComponentPage(ControllerPageEntry, ...)
That means the route entry is still controller-oriented from the beginning.
3. Thin rest-resource entry shell
The actual entry shell lives in:
zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/page/entry/controller.tsxIts main jobs are:
- resolve
resource - resolve
entryId - resolve
formScene - derive
formMeta - resolve
formProvider - resolve
formSchema - autoload form API schemas
- render
formSchema?.rest?.blocks
This is the first key architectural boundary:
ControllerPageEntryis a thin shell- it does not own the whole entry runtime by itself
Its role is to interpret route context, resolve resource/form schema state, and let schema-defined blocks take over the deeper behavior.
4. basic-pageentry block registry
The Basic block registry lives in:
zova/src/suite/cabloy-basic/modules/basic-pageentry/src/.metadata/index.tsThis file shows the reusable entry-page runtime surface exported by the module:
basic-pageentry:blockPageEntrybasic-pageentry:blockFormbasic-pageentry:blockToolbarRow
That matters because the deeper entry-page behavior is not hidden inside one giant page file.
It is split into reusable controller-backed blocks.
5. blockPageEntry becomes the deeper runtime owner
The most important current Basic file is:
zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockPageEntry/controller.tsxThis is the deeper entry runtime owner.
Its main jobs are:
- resolve selector-backed
ModelResource - derive
formMetaandschemaScene - derive
formProvider,formSchema, andformData - prepare the shared JSX render context
- autoload view/query data
- own submit flow through
submitData(...) - update page meta through
setPageMeta(...) - expose
$$pageEntryinto the render context for downstream blocks
This is the second key architectural boundary:
- the route shell chooses the resource/scene context
blockPageEntryowns the deeper entry-page runtime once blocks are rendered
6. blockForm bridges into ZForm
The form bridge lives in:
zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockForm/controller.tsxThis controller does not re-derive entry-page state.
Instead, it consumes $$pageEntry from the host render context and passes the canonical page-entry-owned values into ZForm, including:
dataschemaschemaSceneformMetaformProviderformScope- submit callback
- change callback
This is the clearest source-confirmed proof that blockForm is a bridge, not the main owner of entry-page orchestration.
7. blockToolbarRow renders the action row
The action row lives in:
zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsxIts role is to consume the same $$pageEntry render context and render action buttons based on:
- current permissions
- current
formScene - action render definitions
This is important because it shows that action visibility and entry-page state stay attached to the same host context, instead of being recomputed independently by unrelated components.
The shared handoff model
A useful rule is:
- the route shell resolves context
- schema blocks choose which entry-page runtime pieces should appear
blockPageEntrybecomes the shared host runtime ownerblockFormandblockToolbarRoware specialized consumers of that host-owned context
That means the shared handoff is through $$pageEntry, not through scattered local state.
Submit flow and page-meta flow
The entry runtime also connects cleanly to the wider shell/task model.
Inside blockPageEntry:
- data loading initializes page state
- submit flow delegates to
ModelResourcemutation logic setPageMeta(...)updates the routed shell title / dirty / form-scene state
This is why the entry-page runtime should be read together with Form Scene to Page Meta Guide and Page Meta Guide.
What this guide does not re-explain
This page does not fully re-explain:
- the internals of
ZFormitself -> see Zova Form Under the Hood - the full
formScene -> formMeta -> pageMetabridge -> see Form Scene to Page Meta Guide - the routed-shell host mechanics -> see Router Tabs Mechanism
Its job is only to explain how the entry page runtime is assembled across route shell, Basic blocks, and shared host context.
Debugging checklist
If a resource entry page behaves unexpectedly, ask:
- is the route resolving the expected
resource,id, andformScene? - is
ControllerPageEntryloading the expectedformSchema.rest.blocks? - is the expected
basic-pageentry:*block actually present in the schema? - is
blockPageEntryresolving the expectedModelResourceselector state? - is
blockFormreceiving the correctschemaScene,formMeta, andformData? - is
blockToolbarRowconsuming the expected$$pageEntrycontext? - is submit/page-meta flow failing in
blockPageEntry, rather than in the outer route shell?
Where to read next
Use these next steps depending on your question:
- if you want the resource module bridge: Rest Resource Under the Hood
- if you want the shortest source map: Rest Resource Source Reading Map
- if you want the form runtime branch: Zova Form Under the Hood
- if you want the
formScene -> formMeta -> pageMetachain: Form Scene to Page Meta Guide - if you want action visibility rules: Permission, formScene, and Action Visibility Guide
Final takeaway
The most accurate way to read a resource entry page in the current Basic frontend is:
rest-resourceentry page is the thin route shell- schema-defined blocks choose the deeper runtime pieces
basic-pageentry:blockPageEntryowns the real entry runtimeblockFormandblockToolbarRowconsume the same shared host context- submit flow and page-meta flow live in that deeper runtime layer
That is the source-confirmed entry-page runtime path in the current Cabloy Basic frontend architecture.