cabloy 5.1.60 → 5.1.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/.claude/hooks/contract-loop-gate.ts +296 -0
  2. package/.claude/settings.json +16 -0
  3. package/.claude/skills/cabloy-backend-scaffold/SKILL.md +2 -0
  4. package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -0
  5. package/.claude/skills/cabloy-contract-loop/SKILL.md +89 -16
  6. package/.claude/skills/cabloy-contract-loop/references/contract-loop-map.md +102 -14
  7. package/.claude/skills/cabloy-contract-loop/references/resource-custom-state-pattern.md +4 -0
  8. package/.claude/skills/cabloy-contract-loop/references/verification-checklist.md +32 -14
  9. package/.claude/skills/cabloy-domain-planning/SKILL.md +212 -0
  10. package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +13 -0
  11. package/.claude/skills/cabloy-frontend-scaffold/references/follow-up-checklist.md +2 -0
  12. package/.claude/skills/cabloy-module-removal/SKILL.md +144 -0
  13. package/.claude/skills/cabloy-resource-field-update/SKILL.md +7 -0
  14. package/.claude/skills/cabloy-zova-source-reading/SKILL.md +221 -0
  15. package/.claude/skills/cabloy-zova-source-reading/references/analysis-modes.md +91 -0
  16. package/.claude/skills/cabloy-zova-source-reading/references/core-reading-paths.md +117 -0
  17. package/CHANGELOG.md +64 -0
  18. package/CLAUDE.md +11 -0
  19. package/cabloy-docs/.vitepress/config.mjs +197 -5
  20. package/cabloy-docs/ai/cli-to-skill-map.md +7 -0
  21. package/cabloy-docs/ai/docs-skills-rules-mapping.md +22 -0
  22. package/cabloy-docs/ai/future-skill-roadmap.md +12 -7
  23. package/cabloy-docs/ai/introduction.md +1 -0
  24. package/cabloy-docs/ai/playbook-backend-module.md +6 -0
  25. package/cabloy-docs/ai/playbook-module-removal.md +164 -0
  26. package/cabloy-docs/ai/skills.md +12 -0
  27. package/cabloy-docs/backend/backend-contract-emission-output-inspection.md +189 -0
  28. package/cabloy-docs/backend/backend-contract-emission-source-reading-map.md +160 -0
  29. package/cabloy-docs/backend/backend-contract-emission-specimen.md +170 -0
  30. package/cabloy-docs/backend/backend-resource-module-contract-chain.md +323 -0
  31. package/cabloy-docs/backend/backend-source-reading-debug-checklist.md +173 -0
  32. package/cabloy-docs/backend/backend-source-reading-roadmap.md +129 -0
  33. package/cabloy-docs/backend/backend-source-reading-verify-playbook.md +166 -0
  34. package/cabloy-docs/backend/bean-scene-authoring.md +4 -4
  35. package/cabloy-docs/backend/broadcast-guide.md +3 -3
  36. package/cabloy-docs/backend/cli.md +20 -11
  37. package/cabloy-docs/backend/config-guide.md +4 -4
  38. package/cabloy-docs/backend/controller-aop-guide.md +10 -10
  39. package/cabloy-docs/backend/controller-guide.md +12 -2
  40. package/cabloy-docs/backend/crud-workflow.md +7 -3
  41. package/cabloy-docs/backend/dto-guide.md +18 -2
  42. package/cabloy-docs/backend/dto-infer-generation.md +201 -25
  43. package/cabloy-docs/backend/election-guide.md +2 -2
  44. package/cabloy-docs/backend/entity-guide.md +30 -3
  45. package/cabloy-docs/backend/error-guide.md +3 -3
  46. package/cabloy-docs/backend/event-guide.md +4 -4
  47. package/cabloy-docs/backend/external-aop-guide.md +2 -2
  48. package/cabloy-docs/backend/field-indexes.md +9 -3
  49. package/cabloy-docs/backend/foundation.md +8 -8
  50. package/cabloy-docs/backend/i18n-guide.md +6 -6
  51. package/cabloy-docs/backend/internal-aop-guide.md +2 -2
  52. package/cabloy-docs/backend/introduction.md +15 -0
  53. package/cabloy-docs/backend/migration-and-changes.md +3 -3
  54. package/cabloy-docs/backend/model-guide.md +16 -6
  55. package/cabloy-docs/backend/openapi-guide.md +3 -0
  56. package/cabloy-docs/backend/queue-guide.md +3 -3
  57. package/cabloy-docs/backend/redlock-guide.md +2 -2
  58. package/cabloy-docs/backend/schedule-guide.md +2 -2
  59. package/cabloy-docs/backend/scripts.md +8 -0
  60. package/cabloy-docs/backend/serialization-guide.md +12 -2
  61. package/cabloy-docs/backend/service-guide.md +18 -9
  62. package/cabloy-docs/backend/startup-guide.md +5 -5
  63. package/cabloy-docs/backend/status-guide.md +271 -0
  64. package/cabloy-docs/backend/unit-testing.md +3 -3
  65. package/cabloy-docs/backend/vona-source-reading-map.md +157 -0
  66. package/cabloy-docs/backend/websocket-protocol-guide.md +5 -5
  67. package/cabloy-docs/backend/websocket-usage-guide.md +15 -8
  68. package/cabloy-docs/frontend/a-model-under-the-hood.md +281 -0
  69. package/cabloy-docs/frontend/a-openapi-under-the-hood.md +248 -0
  70. package/cabloy-docs/frontend/a-router-guide.md +307 -0
  71. package/cabloy-docs/frontend/api-guide.md +6 -4
  72. package/cabloy-docs/frontend/api-schema-guide.md +1 -0
  73. package/cabloy-docs/frontend/app-startup-guide.md +7 -4
  74. package/cabloy-docs/frontend/bean-scene-authoring.md +3 -1
  75. package/cabloy-docs/frontend/behavior-guide.md +16 -16
  76. package/cabloy-docs/frontend/cli.md +14 -2
  77. package/cabloy-docs/frontend/command-scene-authoring.md +504 -0
  78. package/cabloy-docs/frontend/component-guide.md +5 -5
  79. package/cabloy-docs/frontend/component-props-guide.md +1 -1
  80. package/cabloy-docs/frontend/component-v-model-guide.md +2 -2
  81. package/cabloy-docs/frontend/design-principles.md +6 -0
  82. package/cabloy-docs/frontend/fetch-interceptor-guide.md +440 -0
  83. package/cabloy-docs/frontend/filter-query-select-data-flow-guide.md +260 -0
  84. package/cabloy-docs/frontend/form-guide.md +786 -0
  85. package/cabloy-docs/frontend/form-scene-to-page-meta-guide.md +303 -0
  86. package/cabloy-docs/frontend/foundation.md +33 -0
  87. package/cabloy-docs/frontend/frontend-source-reading-roadmap.md +249 -0
  88. package/cabloy-docs/frontend/generated-contract-consumption-debug-checklist.md +190 -0
  89. package/cabloy-docs/frontend/generated-contract-consumption-entry-branch.md +205 -0
  90. package/cabloy-docs/frontend/generated-contract-consumption-list-branch.md +157 -0
  91. package/cabloy-docs/frontend/generated-contract-consumption-specimen.md +203 -0
  92. package/cabloy-docs/frontend/generated-contract-consumption-verify-playbook.md +189 -0
  93. package/cabloy-docs/frontend/generic-component-guide.md +1 -1
  94. package/cabloy-docs/frontend/introduction.md +38 -5
  95. package/cabloy-docs/frontend/ioc-and-beans.md +6 -0
  96. package/cabloy-docs/frontend/mock-guide.md +1 -0
  97. package/cabloy-docs/frontend/model-architecture.md +288 -39
  98. package/cabloy-docs/frontend/model-resource-best-practices.md +379 -0
  99. package/cabloy-docs/frontend/model-resource-cookbook.md +508 -0
  100. package/cabloy-docs/frontend/model-resource-internals-deep-dive.md +238 -0
  101. package/cabloy-docs/frontend/model-resource-owner-pattern.md +402 -0
  102. package/cabloy-docs/frontend/model-resource-usage-guide.md +334 -0
  103. package/cabloy-docs/frontend/model-state-guide.md +371 -15
  104. package/cabloy-docs/frontend/module-scope.md +8 -8
  105. package/cabloy-docs/frontend/modules-and-suites.md +2 -1
  106. package/cabloy-docs/frontend/navigation-guards-guide.md +7 -0
  107. package/cabloy-docs/frontend/openapi-sdk-guide.md +17 -6
  108. package/cabloy-docs/frontend/page-guide.md +15 -9
  109. package/cabloy-docs/frontend/page-meta-guide.md +466 -0
  110. package/cabloy-docs/frontend/page-params-guide.md +3 -3
  111. package/cabloy-docs/frontend/page-query-guide.md +2 -2
  112. package/cabloy-docs/frontend/page-route-guide.md +6 -0
  113. package/cabloy-docs/frontend/permission-formscene-action-visibility-guide.md +263 -0
  114. package/cabloy-docs/frontend/quickstart.md +18 -2
  115. package/cabloy-docs/frontend/reading-zova-for-vue-developers.md +266 -0
  116. package/cabloy-docs/frontend/resource-entry-page-deep-dive.md +271 -0
  117. package/cabloy-docs/frontend/resource-list-page-deep-dive.md +279 -0
  118. package/cabloy-docs/frontend/rest-resource-source-reading-map.md +522 -0
  119. package/cabloy-docs/frontend/rest-resource-under-the-hood.md +622 -0
  120. package/cabloy-docs/frontend/root-behaviors-guide.md +282 -0
  121. package/cabloy-docs/frontend/route-alias-guide.md +6 -0
  122. package/cabloy-docs/frontend/router-stack-guide.md +229 -0
  123. package/cabloy-docs/frontend/router-tabs-introduction.md +26 -3
  124. package/cabloy-docs/frontend/router-tabs-layout-integration.md +367 -0
  125. package/cabloy-docs/frontend/router-tabs-mechanism.md +6 -0
  126. package/cabloy-docs/frontend/router-tabs-route-meta-cookbook.md +7 -0
  127. package/cabloy-docs/frontend/router-tabs-vs-stack.md +167 -0
  128. package/cabloy-docs/frontend/router-view-hosts-guide.md +450 -0
  129. package/cabloy-docs/frontend/server-data.md +4 -1
  130. package/cabloy-docs/frontend/system-startup-guide.md +2 -2
  131. package/cabloy-docs/frontend/table-action-visibility-permission-flow-guide.md +263 -0
  132. package/cabloy-docs/frontend/table-cell-cookbook.md +568 -0
  133. package/cabloy-docs/frontend/table-guide.md +373 -0
  134. package/cabloy-docs/frontend/table-resource-crud-cookbook.md +496 -0
  135. package/cabloy-docs/frontend/zova-app-guide.md +251 -0
  136. package/cabloy-docs/frontend/zova-form-source-reading-map.md +293 -0
  137. package/cabloy-docs/frontend/zova-form-under-the-hood.md +561 -0
  138. package/cabloy-docs/frontend/zova-reactivity-under-the-hood.md +320 -0
  139. package/cabloy-docs/frontend/zova-router-under-the-hood.md +561 -0
  140. package/cabloy-docs/frontend/zova-source-reading-map.md +421 -0
  141. package/cabloy-docs/frontend/zova-table-controller-render-supplement.md +225 -0
  142. package/cabloy-docs/frontend/zova-table-source-reading-map.md +317 -0
  143. package/cabloy-docs/frontend/zova-table-under-the-hood.md +532 -0
  144. package/cabloy-docs/frontend/zova-vs-vue3-comparison.md +308 -0
  145. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-debug-checklist.md +245 -0
  146. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-source-reading-map.md +139 -0
  147. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-verify-playbook.md +248 -0
  148. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions.md +511 -0
  149. package/cabloy-docs/fullstack/contract-loop-playbook.md +356 -0
  150. package/cabloy-docs/fullstack/edition-collaboration-differences.md +6 -0
  151. package/cabloy-docs/fullstack/frontend-metadata-to-backend.md +199 -23
  152. package/cabloy-docs/fullstack/introduction.md +15 -1
  153. package/cabloy-docs/fullstack/openapi-to-sdk.md +135 -11
  154. package/cabloy-docs/fullstack/suites-and-modules.md +333 -0
  155. package/cabloy-docs/fullstack/tutorial-1-first-module.md +3 -0
  156. package/cabloy-docs/fullstack/tutorial-2-first-crud.md +4 -0
  157. package/cabloy-docs/fullstack/tutorial-3-frontend-metadata-sharing.md +6 -2
  158. package/cabloy-docs/fullstack/tutorial-4-custom-level-renderers.md +60 -23
  159. package/cabloy-docs/fullstack/tutorial-5-backend-contract-sharing.md +14 -7
  160. package/cabloy-docs/fullstack/tutorial-6-one-contract-four-uses.md +6 -0
  161. package/cabloy-docs/fullstack/tutorials-overview.md +17 -4
  162. package/cabloy-docs/reference/bean-scene-boilerplates.md +15 -13
  163. package/cabloy-docs/reference/package-map.md +4 -3
  164. package/package.json +2 -1
  165. package/scripts/init.ts +2 -18
  166. package/scripts/initTestData.ts +25 -0
  167. package/scripts/upgrade.ts +17 -2
  168. package/vona/pnpm-lock.yaml +48 -194
  169. package/vona/src/suite/a-training/modules/training-student/package.json +53 -0
  170. package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +400 -0
  171. package/vona/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +18 -0
  172. package/vona/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
  173. package/vona/src/suite/a-training/modules/training-student/src/bean/meta.index.ts +12 -0
  174. package/vona/src/suite/a-training/modules/training-student/src/bean/meta.version.ts +21 -0
  175. package/vona/src/suite/a-training/modules/training-student/src/bean/ssrMenu.student.ts +29 -0
  176. package/vona/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +15 -0
  177. package/vona/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +15 -0
  178. package/vona/src/suite/a-training/modules/training-student/src/controller/student.ts +74 -0
  179. package/vona/src/suite/a-training/modules/training-student/src/dto/studentCreate.tsx +28 -0
  180. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectReq.tsx +44 -0
  181. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectRes.tsx +11 -0
  182. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectResItem.tsx +45 -0
  183. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSummary.tsx +42 -0
  184. package/vona/src/suite/a-training/modules/training-student/src/dto/studentUpdate.tsx +28 -0
  185. package/vona/src/suite/a-training/modules/training-student/src/dto/studentView.tsx +25 -0
  186. package/vona/src/suite/a-training/modules/training-student/src/entity/student.tsx +84 -0
  187. package/vona/src/suite/a-training/modules/training-student/src/index.ts +2 -0
  188. package/vona/src/suite/a-training/modules/training-student/src/model/student.ts +10 -0
  189. package/vona/src/suite/a-training/modules/training-student/src/service/student.ts +57 -0
  190. package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +173 -0
  191. package/vona/src/suite/a-training/modules/training-student/tsconfig.build.json +11 -0
  192. package/vona/src/suite/a-training/modules/training-student/tsconfig.json +7 -0
  193. package/vona/src/suite/a-training/package.json +12 -0
  194. package/vona/src/suite/a-training/tsconfig.base.json +4 -0
  195. package/vona/src/suite/a-training/tsconfig.json +10 -0
  196. package/zova/packages-cli/cli/package.json +2 -2
  197. package/zova/packages-cli/cli-set-front/cli/templates/openapi/config/boilerplate/module/openapi.config.ts +6 -1
  198. package/zova/packages-cli/cli-set-front/package.json +1 -1
  199. package/zova/packages-cli/cli-set-front/src/lib/bean/cli.openapi.generate.ts +34 -4
  200. package/zova/packages-zova/zova/package.json +2 -2
  201. package/zova/pnpm-lock.yaml +416 -690
  202. package/zova/src/suite/a-training/modules/training-student/cli/openapi.config.ts +9 -0
  203. package/zova/src/suite/a-training/modules/training-student/package.json +52 -0
  204. package/zova/src/suite/a-training/modules/training-student/src/.metadata/component/formFieldLevel.ts +31 -0
  205. package/zova/src/suite/a-training/modules/training-student/src/.metadata/index.ts +258 -0
  206. package/zova/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +7 -0
  207. package/zova/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
  208. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/baseURL.ts +5 -0
  209. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/index.ts +3 -0
  210. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +196 -0
  211. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +4146 -0
  212. package/zova/src/suite/a-training/modules/training-student/src/api/trainingStudent.ts +151 -0
  213. package/zova/src/suite/a-training/modules/training-student/src/apiSchema/trainingStudent.ts +43 -0
  214. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionDeleteForce.tsx +51 -0
  215. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionSummary.tsx +56 -0
  216. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.level.tsx +63 -0
  217. package/zova/src/suite/a-training/modules/training-student/src/component/formFieldLevel/controller.tsx +117 -0
  218. package/zova/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +9 -0
  219. package/zova/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +9 -0
  220. package/zova/src/suite/a-training/modules/training-student/src/index.ts +2 -0
  221. package/zova/src/suite/a-training/modules/training-student/src/model/student.ts +42 -0
  222. package/zova/src/suite/a-training/modules/training-student/tsconfig.build.json +13 -0
  223. package/zova/src/suite/a-training/modules/training-student/tsconfig.json +5 -0
  224. package/zova/src/suite/a-training/package.json +12 -0
  225. package/zova/src/suite/a-training/tsconfig.base.json +4 -0
  226. package/zova/src/suite/a-training/tsconfig.json +4 -0
  227. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +29 -7
  228. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/select/controller.tsx +34 -11
  229. package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
  230. package/zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx +3 -3
  231. package/zova/src/suite-vendor/a-zova/modules/a-table/src/lib/tableCell.ts +1 -1
  232. package/zova/src/suite-vendor/a-zova/package.json +2 -2
@@ -0,0 +1,271 @@
1
+ # Resource Entry Page Deep Dive
2
+
3
+ This guide explains the runtime path of a resource entry page in Zova through the current public Cabloy Basic source.
4
+
5
+ Use this page when you want to understand:
6
+
7
+ - how a `/rest/resource/...` entry route becomes a working entry page
8
+ - where the thin `rest-resource` page shell stops
9
+ - how `basic-pageentry` takes over the deeper entry runtime
10
+ - where `blockForm` and `blockToolbarRow` fit into that runtime
11
+ - how submit flow and page-meta updates connect back to the routed shell
12
+
13
+ ## Why this page exists
14
+
15
+ Several existing docs already explain important parts of the story:
16
+
17
+ - [Generated Contract Consumption: Entry Branch](/frontend/generated-contract-consumption-entry-branch) explains the consumer-side handoff before the deeper runtime begins
18
+ - [Rest Resource Under the Hood](/frontend/rest-resource-under-the-hood) explains the module-level runtime bridge
19
+ - [Rest Resource Source Reading Map](/frontend/rest-resource-source-reading-map) explains the shortest file path into the module
20
+ - [Form Guide](/frontend/form-guide) and [Zova Form Under the Hood](/frontend/zova-form-under-the-hood) explain the form runtime
21
+ - [Form Scene to Page Meta Guide](/frontend/form-scene-to-page-meta-guide) explains the cross-layer `formScene -> formMeta -> pageMeta` chain
22
+
23
+ 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.
24
+
25
+ That is the gap this page fills.
26
+
27
+ ## The shortest accurate mental model
28
+
29
+ A practical mental model is:
30
+
31
+ 1. `rest-resource` declares generic resource entry routes
32
+ 2. generated page wrappers bind those routes to `ControllerPageEntry`
33
+ 3. `ControllerPageEntry` is a thin shell that resolves `resource`, `id`, and `formScene`
34
+ 4. that shell derives `formMeta`, loads `formSchema`, and renders `formSchema.rest.blocks`
35
+ 5. those blocks usually enter `basic-pageentry:blockPageEntry`
36
+ 6. `blockPageEntry` becomes the deeper runtime owner for `ModelResource`, `formData`, submit flow, and page-meta updates
37
+ 7. `blockForm` bridges into `ZForm`
38
+ 8. `blockToolbarRow` renders the action row from the shared page-entry render context
39
+
40
+ That means the entry page is not “one big page controller that does everything.” It is a route-shell plus downstream reusable block runtime.
41
+
42
+ 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](/frontend/rest-resource-source-reading-map) as the general reference.
43
+
44
+ ## Source-confirmed reading path
45
+
46
+ When reading this topic, use this order:
47
+
48
+ 1. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/routes.ts`
49
+ 2. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/page/entry.ts`
50
+ 3. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/page/entry/controller.tsx`
51
+ 4. `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/.metadata/index.ts`
52
+ 5. `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockPageEntry/controller.tsx`
53
+ 6. `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockForm/controller.tsx`
54
+ 7. `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx`
55
+
56
+ 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.
57
+
58
+ ## Runtime path by layer
59
+
60
+ ### 1. Route entry
61
+
62
+ The public route surface lives in:
63
+
64
+ ```text
65
+ zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/routes.ts
66
+ ```
67
+
68
+ The entry routes are:
69
+
70
+ - `:resource/create`
71
+ - `:resource/:id/:formScene?`
72
+
73
+ This already shows the public entry-page contract:
74
+
75
+ - resource identity comes from the route
76
+ - row identity comes from `id`
77
+ - scene can come explicitly from `formScene`, or later fall back by runtime rule
78
+
79
+ 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.
80
+
81
+ ### 2. Generated page wrapper
82
+
83
+ The route component wrapper lives in:
84
+
85
+ ```text
86
+ zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/page/entry.ts
87
+ ```
88
+
89
+ This file is thin but important.
90
+
91
+ 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:
92
+
93
+ - `createZovaComponentPage(ControllerPageEntry, ...)`
94
+
95
+ That means the route entry is still controller-oriented from the beginning.
96
+
97
+ ### 3. Thin `rest-resource` entry shell
98
+
99
+ The actual entry shell lives in:
100
+
101
+ ```text
102
+ zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/page/entry/controller.tsx
103
+ ```
104
+
105
+ Its main jobs are:
106
+
107
+ - resolve `resource`
108
+ - resolve `entryId`
109
+ - resolve `formScene`
110
+ - derive `formMeta`
111
+ - resolve `formProvider`
112
+ - resolve `formSchema`
113
+ - autoload form API schemas
114
+ - render `formSchema?.rest?.blocks`
115
+
116
+ This is the first key architectural boundary:
117
+
118
+ - `ControllerPageEntry` is a **thin shell**
119
+ - it does not own the whole entry runtime by itself
120
+
121
+ Its role is to interpret route context, resolve resource/form schema state, and let schema-defined blocks take over the deeper behavior.
122
+
123
+ ### 4. `basic-pageentry` block registry
124
+
125
+ The Basic block registry lives in:
126
+
127
+ ```text
128
+ zova/src/suite/cabloy-basic/modules/basic-pageentry/src/.metadata/index.ts
129
+ ```
130
+
131
+ This file shows the reusable entry-page runtime surface exported by the module:
132
+
133
+ - `basic-pageentry:blockPageEntry`
134
+ - `basic-pageentry:blockForm`
135
+ - `basic-pageentry:blockToolbarRow`
136
+
137
+ That matters because the deeper entry-page behavior is not hidden inside one giant page file.
138
+
139
+ It is split into reusable controller-backed blocks.
140
+
141
+ ### 5. `blockPageEntry` becomes the deeper runtime owner
142
+
143
+ The most important current Basic file is:
144
+
145
+ ```text
146
+ zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockPageEntry/controller.tsx
147
+ ```
148
+
149
+ This is the deeper entry runtime owner.
150
+
151
+ Its main jobs are:
152
+
153
+ - resolve selector-backed `ModelResource`
154
+ - derive `formMeta` and `schemaScene`
155
+ - derive `formProvider`, `formSchema`, and `formData`
156
+ - prepare the shared JSX render context
157
+ - autoload view/query data
158
+ - own submit flow through `submitData(...)`
159
+ - update page meta through `setPageMeta(...)`
160
+ - expose `$$pageEntry` into the render context for downstream blocks
161
+
162
+ This is the second key architectural boundary:
163
+
164
+ - the route shell chooses the resource/scene context
165
+ - `blockPageEntry` owns the deeper entry-page runtime once blocks are rendered
166
+
167
+ ### 6. `blockForm` bridges into `ZForm`
168
+
169
+ The form bridge lives in:
170
+
171
+ ```text
172
+ zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockForm/controller.tsx
173
+ ```
174
+
175
+ This controller does not re-derive entry-page state.
176
+
177
+ Instead, it consumes `$$pageEntry` from the host render context and passes the canonical page-entry-owned values into `ZForm`, including:
178
+
179
+ - `data`
180
+ - `schema`
181
+ - `schemaScene`
182
+ - `formMeta`
183
+ - `formProvider`
184
+ - `formScope`
185
+ - submit callback
186
+ - change callback
187
+
188
+ This is the clearest source-confirmed proof that `blockForm` is a bridge, not the main owner of entry-page orchestration.
189
+
190
+ ### 7. `blockToolbarRow` renders the action row
191
+
192
+ The action row lives in:
193
+
194
+ ```text
195
+ zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx
196
+ ```
197
+
198
+ Its role is to consume the same `$$pageEntry` render context and render action buttons based on:
199
+
200
+ - current permissions
201
+ - current `formScene`
202
+ - action render definitions
203
+
204
+ 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.
205
+
206
+ ## The shared handoff model
207
+
208
+ A useful rule is:
209
+
210
+ - the route shell resolves context
211
+ - schema blocks choose which entry-page runtime pieces should appear
212
+ - `blockPageEntry` becomes the shared host runtime owner
213
+ - `blockForm` and `blockToolbarRow` are specialized consumers of that host-owned context
214
+
215
+ That means the shared handoff is through `$$pageEntry`, not through scattered local state.
216
+
217
+ ## Submit flow and page-meta flow
218
+
219
+ The entry runtime also connects cleanly to the wider shell/task model.
220
+
221
+ Inside `blockPageEntry`:
222
+
223
+ - data loading initializes page state
224
+ - submit flow delegates to `ModelResource` mutation logic
225
+ - `setPageMeta(...)` updates the routed shell title / dirty / form-scene state
226
+
227
+ This is why the entry-page runtime should be read together with [Form Scene to Page Meta Guide](/frontend/form-scene-to-page-meta-guide) and [Page Meta Guide](/frontend/page-meta-guide).
228
+
229
+ ## What this guide does not re-explain
230
+
231
+ This page does **not** fully re-explain:
232
+
233
+ - the internals of `ZForm` itself -> see [Zova Form Under the Hood](/frontend/zova-form-under-the-hood)
234
+ - the full `formScene -> formMeta -> pageMeta` bridge -> see [Form Scene to Page Meta Guide](/frontend/form-scene-to-page-meta-guide)
235
+ - the routed-shell host mechanics -> see [Router Tabs Mechanism](/frontend/router-tabs-mechanism)
236
+
237
+ Its job is only to explain how the entry page runtime is assembled across route shell, Basic blocks, and shared host context.
238
+
239
+ ## Debugging checklist
240
+
241
+ If a resource entry page behaves unexpectedly, ask:
242
+
243
+ 1. is the route resolving the expected `resource`, `id`, and `formScene`?
244
+ 2. is `ControllerPageEntry` loading the expected `formSchema.rest.blocks`?
245
+ 3. is the expected `basic-pageentry:*` block actually present in the schema?
246
+ 4. is `blockPageEntry` resolving the expected `ModelResource` selector state?
247
+ 5. is `blockForm` receiving the correct `schemaScene`, `formMeta`, and `formData`?
248
+ 6. is `blockToolbarRow` consuming the expected `$$pageEntry` context?
249
+ 7. is submit/page-meta flow failing in `blockPageEntry`, rather than in the outer route shell?
250
+
251
+ ## Where to read next
252
+
253
+ Use these next steps depending on your question:
254
+
255
+ - if you want the resource module bridge: [Rest Resource Under the Hood](/frontend/rest-resource-under-the-hood)
256
+ - if you want the shortest source map: [Rest Resource Source Reading Map](/frontend/rest-resource-source-reading-map)
257
+ - if you want the form runtime branch: [Zova Form Under the Hood](/frontend/zova-form-under-the-hood)
258
+ - if you want the `formScene -> formMeta -> pageMeta` chain: [Form Scene to Page Meta Guide](/frontend/form-scene-to-page-meta-guide)
259
+ - if you want action visibility rules: [Permission, formScene, and Action Visibility Guide](/frontend/permission-formscene-action-visibility-guide)
260
+
261
+ ## Final takeaway
262
+
263
+ The most accurate way to read a resource entry page in the current Basic frontend is:
264
+
265
+ - `rest-resource` entry page is the thin route shell
266
+ - schema-defined blocks choose the deeper runtime pieces
267
+ - `basic-pageentry:blockPageEntry` owns the real entry runtime
268
+ - `blockForm` and `blockToolbarRow` consume the same shared host context
269
+ - submit flow and page-meta flow live in that deeper runtime layer
270
+
271
+ That is the source-confirmed entry-page runtime path in the current Cabloy Basic frontend architecture.
@@ -0,0 +1,279 @@
1
+ # Resource List Page Deep Dive
2
+
3
+ This guide explains the runtime path of a resource list page in Zova through the current public Cabloy Basic source.
4
+
5
+ Use this page when you want to understand:
6
+
7
+ - how a `/rest/resource/:resource` route becomes a working list page
8
+ - where the thin `rest-resource` list shell stops
9
+ - how `basic-page:blockPage` takes over the deeper list runtime
10
+ - where `blockFilter`, `blockTable`, and `blockPager` fit into that runtime
11
+ - how `ZTable` and `ModelResource` cooperate under the list-page shell
12
+
13
+ ## Why this page exists
14
+
15
+ Several existing docs already explain important parts of the story:
16
+
17
+ - [Generated Contract Consumption: List Branch](/frontend/generated-contract-consumption-list-branch) explains the consumer-side handoff before the deeper runtime begins
18
+ - [Rest Resource Under the Hood](/frontend/rest-resource-under-the-hood) explains the module-level runtime bridge
19
+ - [Rest Resource Source Reading Map](/frontend/rest-resource-source-reading-map) explains the shortest file path into the module
20
+ - [Table Guide](/frontend/table-guide) and [Zova Table Under the Hood](/frontend/zova-table-under-the-hood) explain the table runtime
21
+ - [Table + Resource CRUD Cookbook](/frontend/table-resource-crud-cookbook) explains authoring-oriented CRUD assembly
22
+
23
+ What those pages do not isolate directly is the one cohesive list-page runtime path from route entry into the deeper Basic page and table runtime.
24
+
25
+ That is the gap this page fills.
26
+
27
+ ## The shortest accurate mental model
28
+
29
+ A practical mental model is:
30
+
31
+ 1. `rest-resource` declares the generic resource list route
32
+ 2. a generated page wrapper binds that route to `ControllerPageResource`
33
+ 3. `ControllerPageResource` is a thin shell that resolves the current `resource`, loads top-level schema state, and renders `schemaRow.rest.blocks`
34
+ 4. those blocks usually enter `basic-page:blockPage`
35
+ 5. `blockPage` becomes the deeper list runtime owner for filter state, paging state, query state, and resource-backed list data
36
+ 6. `blockFilter`, `blockTable`, and `blockPager` are specialized consumers of that shared page runtime/context
37
+ 7. `ZTable` is the final schema-driven table runtime endpoint under that list-page runtime
38
+
39
+ That means the resource list page is not one controller doing everything. It is a route shell plus downstream reusable list/runtime blocks.
40
+
41
+ This page focuses only on the list-page branch. For the broader module-level shell-to-runtime map shared by both list and entry pages, keep [Rest Resource Source Reading Map](/frontend/rest-resource-source-reading-map) as the general reference.
42
+
43
+ ## Source-confirmed reading path
44
+
45
+ When reading this topic, use this order:
46
+
47
+ 1. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/routes.ts`
48
+ 2. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/page/resource.ts`
49
+ 3. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/page/resource/controller.tsx`
50
+ 4. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts`
51
+ 5. `zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockPage/controller.tsx`
52
+ 6. `zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockFilter/controller.tsx`
53
+ 7. `zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockTable/controller.tsx`
54
+ 8. `zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockPager/controller.tsx`
55
+ 9. `zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx`
56
+ 10. `zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/render.tsx`
57
+
58
+ That order moves from public route surface, to route wrapper, to list shell, to resource owner, to deeper list runtime, and finally to the schema-driven table runtime endpoint.
59
+
60
+ ## Runtime path by layer
61
+
62
+ ### 1. Route list entry
63
+
64
+ The public route surface lives in:
65
+
66
+ ```text
67
+ zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/routes.ts
68
+ ```
69
+
70
+ The list route is:
71
+
72
+ - `:resource`
73
+
74
+ That already shows the public list-page contract:
75
+
76
+ - the route is generic
77
+ - runtime identity comes from `route.params.resource`
78
+ - the shared `tabKey(route)` keeps list and entry pages grouped under one resource-oriented workspace
79
+
80
+ ### 2. Generated page wrapper
81
+
82
+ The list-page wrapper lives in:
83
+
84
+ ```text
85
+ zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/page/resource.ts
86
+ ```
87
+
88
+ This file shows that the route enters runtime through the standard Zova page-controller path:
89
+
90
+ - `createZovaComponentPage(ControllerPageResource, ...)`
91
+
92
+ That means the list page still begins as a controller-oriented page surface, not as ad hoc local route code.
93
+
94
+ ### 3. Thin `rest-resource` list shell
95
+
96
+ The list shell lives in:
97
+
98
+ ```text
99
+ zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/page/resource/controller.tsx
100
+ ```
101
+
102
+ Its main jobs are:
103
+
104
+ - resolve the current selector-backed `ModelResource`
105
+ - autoload select API schemas
106
+ - read `schemaRow?.rest?.blocks`
107
+ - render those blocks through `ZovaJsx`
108
+
109
+ This is the first key architectural boundary:
110
+
111
+ - `ControllerPageResource` is a **thin list shell**
112
+ - it does not own the whole list runtime by itself
113
+
114
+ Its role is to interpret resource context, load top-level schema state, and let schema-defined blocks take over the deeper behavior.
115
+
116
+ ### 4. `ModelResource` as the stable owner boundary
117
+
118
+ The owner model lives in:
119
+
120
+ ```text
121
+ zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts
122
+ ```
123
+
124
+ Its main jobs are:
125
+
126
+ - bootstrap the resource API path
127
+ - expose `permissions`
128
+ - expose schema surfaces such as `schemaFilter` and `schemaRow`
129
+ - expose `select(query)` for list data
130
+ - expose item/view/create/update/delete mutation/query helpers
131
+
132
+ This is the core owner boundary for the list page.
133
+
134
+ It is the stable resource-level runtime, even though the deeper list behavior is later assembled through Basic blocks.
135
+
136
+ ### 5. `basic-page:blockPage` becomes the deeper list runtime owner
137
+
138
+ The most important current Basic list-runtime file is:
139
+
140
+ ```text
141
+ zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockPage/controller.tsx
142
+ ```
143
+
144
+ This controller becomes the deeper owner for:
145
+
146
+ - selector-backed `ModelResource`
147
+ - `queryFilterData`
148
+ - `queryPaged`
149
+ - computed `query`
150
+ - `select(this.query)` list data
151
+ - `schemaFilter`, `schemaRow`, and `permissions`
152
+ - the shared page JSX/render context (`$$page`)
153
+ - permission-driven table-meta refresh through `tableRef.refreshMeta()`
154
+
155
+ This is the second key architectural boundary:
156
+
157
+ - the route shell chooses the resource context
158
+ - `blockPage` owns the real list/runtime state after blocks are rendered
159
+
160
+ ### 6. `blockFilter` consumes the shared list-page context
161
+
162
+ The filter block lives in:
163
+
164
+ ```text
165
+ zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockFilter/controller.tsx
166
+ ```
167
+
168
+ This block is a specialized consumer of the shared `$$page` runtime context.
169
+
170
+ Its role is to turn schema-driven filter UI into filter-state updates that flow back into the list-page query path.
171
+
172
+ That means filter state is not a separate unrelated subsystem. It is part of the shared list-page runtime owned by `blockPage`.
173
+
174
+ ### 7. `blockTable` bridges the page runtime into `ZTable`
175
+
176
+ The table bridge lives in:
177
+
178
+ ```text
179
+ zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockTable/controller.tsx
180
+ ```
181
+
182
+ This controller consumes `$$page` and passes the canonical page-owned values into `ZTable`, including:
183
+
184
+ - `data`
185
+ - `schemaRow`
186
+ - `tableScope`
187
+
188
+ It also captures the table controller ref back onto `$$page.tableRef`.
189
+
190
+ This is the clearest proof that `blockTable` is a bridge into table runtime, not the main owner of list state.
191
+
192
+ ### 8. `blockPager` consumes paged state
193
+
194
+ The pager block lives in:
195
+
196
+ ```text
197
+ zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockPager/controller.tsx
198
+ ```
199
+
200
+ Its role is to read paged state and delegate page changes back into the shared list-page runtime.
201
+
202
+ Like the filter and table blocks, it is another specialized consumer of the page runtime owned by `blockPage`.
203
+
204
+ ### 9. `ZTable` is the schema-driven runtime endpoint
205
+
206
+ The deeper table endpoint lives in:
207
+
208
+ ```text
209
+ zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx
210
+ zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/render.tsx
211
+ ```
212
+
213
+ This table runtime:
214
+
215
+ - loads schema properties for table rendering
216
+ - computes table metadata and columns
217
+ - creates column renderers
218
+ - turns schema-driven row metadata into visible table output
219
+
220
+ This is the final endpoint under the list-page runtime chain.
221
+
222
+ ## The shared handoff model
223
+
224
+ A useful rule is:
225
+
226
+ - the route shell resolves resource context
227
+ - schema-defined blocks choose which deeper list runtime pieces should appear
228
+ - `blockPage` becomes the shared host runtime owner
229
+ - `blockFilter`, `blockTable`, and `blockPager` are specialized consumers of that host-owned context
230
+ - `ZTable` is the final schema-driven render endpoint for rows and cells
231
+
232
+ That means the shared handoff is through `$$page`, not through scattered local page state.
233
+
234
+ ## What this guide does not re-explain
235
+
236
+ This page does **not** fully re-explain:
237
+
238
+ - the internals of `ModelResource` ownership -> see [Model Resource Owner Pattern](/frontend/model-resource-owner-pattern)
239
+ - the internals of `ZTable` itself -> see [Zova Table Under the Hood](/frontend/zova-table-under-the-hood)
240
+ - table authoring recipes -> see [Table + Resource CRUD Cookbook](/frontend/table-resource-crud-cookbook)
241
+
242
+ Its job is only to explain how the list-page runtime is assembled across route shell, resource owner, Basic blocks, and table runtime.
243
+
244
+ ## Debugging checklist
245
+
246
+ If a resource list page behaves unexpectedly, ask:
247
+
248
+ 1. is the route resolving the expected `resource`?
249
+ 2. is `ControllerPageResource` loading the expected `schemaRow.rest.blocks`?
250
+ 3. is the expected `basic-page:*` block actually present in the schema?
251
+ 4. is `blockPage` resolving the expected `ModelResource` selector state?
252
+ 5. is filter state flowing into `queryFilterData` as expected?
253
+ 6. is pager state flowing into `queryPaged` as expected?
254
+ 7. is `blockTable` receiving the expected `schemaRow`, `data`, and `permissions` scope?
255
+ 8. is table meta stale because the permission-driven refresh path is not firing where expected?
256
+
257
+ ## Where to read next
258
+
259
+ Use these next steps depending on your question:
260
+
261
+ - if you want the resource module bridge: [Rest Resource Under the Hood](/frontend/rest-resource-under-the-hood)
262
+ - if you want the shortest source map: [Rest Resource Source Reading Map](/frontend/rest-resource-source-reading-map)
263
+ - if you want the owner internals behind this runtime: [ModelResource Internals Deep Dive](/frontend/model-resource-internals-deep-dive)
264
+ - if you want the narrower filter/query/select data path: [Filter to Query to Select Data Flow Guide](/frontend/filter-query-select-data-flow-guide)
265
+ - if you want the table runtime branch: [Zova Table Under the Hood](/frontend/zova-table-under-the-hood)
266
+ - if you want row/bulk action visibility and permission gating: [Table Action Visibility and Permission Flow Guide](/frontend/table-action-visibility-permission-flow-guide)
267
+ - if you want the entry-page counterpart: [Resource Entry Page Deep Dive](/frontend/resource-entry-page-deep-dive)
268
+
269
+ ## Final takeaway
270
+
271
+ The most accurate way to read a resource list page in the current Basic frontend is:
272
+
273
+ - `rest-resource` list page is the thin route shell
274
+ - `ModelResource` is the stable owner boundary
275
+ - `basic-page:blockPage` owns the real list runtime
276
+ - `blockFilter`, `blockTable`, and `blockPager` consume the same shared page runtime context
277
+ - `ZTable` is the schema-driven runtime endpoint under that list-page chain
278
+
279
+ That is the source-confirmed list-page runtime path in the current Cabloy Basic frontend architecture.