cabloy 5.1.61 → 5.1.63

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 (230) hide show
  1. package/.claude/skills/cabloy-backend-scaffold/SKILL.md +2 -0
  2. package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -1
  3. package/.claude/skills/cabloy-domain-planning/SKILL.md +212 -0
  4. package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +2 -0
  5. package/CHANGELOG.md +55 -0
  6. package/CLAUDE.md +1 -0
  7. package/cabloy-docs/.vitepress/config.mjs +158 -12
  8. package/cabloy-docs/ai/docs-skills-rules-mapping.md +8 -0
  9. package/cabloy-docs/ai/future-skill-roadmap.md +2 -0
  10. package/cabloy-docs/ai/skills.md +1 -0
  11. package/cabloy-docs/backend/backend-contract-emission-output-inspection.md +189 -0
  12. package/cabloy-docs/backend/backend-contract-emission-source-reading-map.md +160 -0
  13. package/cabloy-docs/backend/backend-contract-emission-specimen.md +170 -0
  14. package/cabloy-docs/backend/backend-resource-module-contract-chain.md +323 -0
  15. package/cabloy-docs/backend/backend-source-reading-debug-checklist.md +173 -0
  16. package/cabloy-docs/backend/backend-source-reading-roadmap.md +129 -0
  17. package/cabloy-docs/backend/backend-source-reading-verify-playbook.md +166 -0
  18. package/cabloy-docs/backend/bean-scene-authoring.md +4 -4
  19. package/cabloy-docs/backend/broadcast-guide.md +3 -3
  20. package/cabloy-docs/backend/cli.md +20 -11
  21. package/cabloy-docs/backend/config-guide.md +4 -4
  22. package/cabloy-docs/backend/controller-aop-guide.md +10 -10
  23. package/cabloy-docs/backend/controller-guide.md +12 -2
  24. package/cabloy-docs/backend/crud-workflow.md +7 -3
  25. package/cabloy-docs/backend/dto-guide.md +12 -2
  26. package/cabloy-docs/backend/dto-infer-generation.md +201 -25
  27. package/cabloy-docs/backend/election-guide.md +2 -2
  28. package/cabloy-docs/backend/entity-guide.md +12 -3
  29. package/cabloy-docs/backend/error-guide.md +3 -3
  30. package/cabloy-docs/backend/event-guide.md +4 -4
  31. package/cabloy-docs/backend/external-aop-guide.md +2 -2
  32. package/cabloy-docs/backend/field-indexes.md +9 -3
  33. package/cabloy-docs/backend/foundation.md +8 -8
  34. package/cabloy-docs/backend/i18n-guide.md +6 -6
  35. package/cabloy-docs/backend/internal-aop-guide.md +2 -2
  36. package/cabloy-docs/backend/introduction.md +13 -0
  37. package/cabloy-docs/backend/migration-and-changes.md +3 -3
  38. package/cabloy-docs/backend/model-guide.md +16 -6
  39. package/cabloy-docs/backend/openapi-guide.md +3 -0
  40. package/cabloy-docs/backend/queue-guide.md +3 -3
  41. package/cabloy-docs/backend/redlock-guide.md +2 -2
  42. package/cabloy-docs/backend/schedule-guide.md +2 -2
  43. package/cabloy-docs/backend/scripts.md +8 -0
  44. package/cabloy-docs/backend/serialization-guide.md +2 -2
  45. package/cabloy-docs/backend/service-guide.md +18 -9
  46. package/cabloy-docs/backend/startup-guide.md +5 -5
  47. package/cabloy-docs/backend/status-guide.md +7 -7
  48. package/cabloy-docs/backend/unit-testing.md +3 -3
  49. package/cabloy-docs/backend/vona-source-reading-map.md +157 -0
  50. package/cabloy-docs/backend/websocket-protocol-guide.md +5 -5
  51. package/cabloy-docs/backend/websocket-usage-guide.md +15 -8
  52. package/cabloy-docs/frontend/a-model-under-the-hood.md +281 -0
  53. package/cabloy-docs/frontend/a-openapi-under-the-hood.md +248 -0
  54. package/cabloy-docs/frontend/a-router-guide.md +307 -0
  55. package/cabloy-docs/frontend/api-guide.md +4 -4
  56. package/cabloy-docs/frontend/api-schema-guide.md +1 -0
  57. package/cabloy-docs/frontend/app-startup-guide.md +7 -4
  58. package/cabloy-docs/frontend/bean-scene-authoring.md +1 -1
  59. package/cabloy-docs/frontend/behavior-guide.md +16 -16
  60. package/cabloy-docs/frontend/cli.md +5 -5
  61. package/cabloy-docs/frontend/command-scene-authoring.md +17 -8
  62. package/cabloy-docs/frontend/component-guide.md +5 -5
  63. package/cabloy-docs/frontend/component-props-guide.md +1 -1
  64. package/cabloy-docs/frontend/component-v-model-guide.md +2 -2
  65. package/cabloy-docs/frontend/filter-query-select-data-flow-guide.md +260 -0
  66. package/cabloy-docs/frontend/form-guide.md +27 -30
  67. package/cabloy-docs/frontend/form-scene-to-page-meta-guide.md +303 -0
  68. package/cabloy-docs/frontend/foundation.md +10 -6
  69. package/cabloy-docs/frontend/frontend-source-reading-roadmap.md +249 -0
  70. package/cabloy-docs/frontend/generated-contract-consumption-debug-checklist.md +190 -0
  71. package/cabloy-docs/frontend/generated-contract-consumption-entry-branch.md +205 -0
  72. package/cabloy-docs/frontend/generated-contract-consumption-list-branch.md +157 -0
  73. package/cabloy-docs/frontend/generated-contract-consumption-specimen.md +203 -0
  74. package/cabloy-docs/frontend/generated-contract-consumption-verify-playbook.md +189 -0
  75. package/cabloy-docs/frontend/generic-component-guide.md +1 -1
  76. package/cabloy-docs/frontend/introduction.md +29 -7
  77. package/cabloy-docs/frontend/model-architecture.md +38 -2
  78. package/cabloy-docs/frontend/model-resource-cookbook.md +11 -8
  79. package/cabloy-docs/frontend/model-resource-internals-deep-dive.md +238 -0
  80. package/cabloy-docs/frontend/model-resource-owner-pattern.md +22 -2
  81. package/cabloy-docs/frontend/model-resource-usage-guide.md +22 -6
  82. package/cabloy-docs/frontend/model-state-guide.md +12 -9
  83. package/cabloy-docs/frontend/module-scope.md +8 -8
  84. package/cabloy-docs/frontend/modules-and-suites.md +2 -1
  85. package/cabloy-docs/frontend/navigation-guards-guide.md +7 -0
  86. package/cabloy-docs/frontend/openapi-sdk-guide.md +12 -4
  87. package/cabloy-docs/frontend/page-guide.md +9 -9
  88. package/cabloy-docs/frontend/page-meta-guide.md +466 -0
  89. package/cabloy-docs/frontend/page-params-guide.md +3 -3
  90. package/cabloy-docs/frontend/page-query-guide.md +2 -2
  91. package/cabloy-docs/frontend/page-route-guide.md +6 -0
  92. package/cabloy-docs/frontend/permission-formscene-action-visibility-guide.md +263 -0
  93. package/cabloy-docs/frontend/quickstart.md +14 -2
  94. package/cabloy-docs/frontend/resource-entry-page-deep-dive.md +271 -0
  95. package/cabloy-docs/frontend/resource-list-page-deep-dive.md +279 -0
  96. package/cabloy-docs/frontend/rest-resource-source-reading-map.md +522 -0
  97. package/cabloy-docs/frontend/rest-resource-under-the-hood.md +622 -0
  98. package/cabloy-docs/frontend/root-behaviors-guide.md +282 -0
  99. package/cabloy-docs/frontend/route-alias-guide.md +6 -0
  100. package/cabloy-docs/frontend/router-stack-guide.md +229 -0
  101. package/cabloy-docs/frontend/router-tabs-introduction.md +26 -3
  102. package/cabloy-docs/frontend/router-tabs-layout-integration.md +367 -0
  103. package/cabloy-docs/frontend/router-tabs-mechanism.md +6 -0
  104. package/cabloy-docs/frontend/router-tabs-route-meta-cookbook.md +7 -0
  105. package/cabloy-docs/frontend/router-tabs-vs-stack.md +167 -0
  106. package/cabloy-docs/frontend/router-view-hosts-guide.md +450 -0
  107. package/cabloy-docs/frontend/server-data.md +2 -1
  108. package/cabloy-docs/frontend/system-startup-guide.md +2 -2
  109. package/cabloy-docs/frontend/table-action-visibility-permission-flow-guide.md +263 -0
  110. package/cabloy-docs/frontend/table-cell-cookbook.md +571 -0
  111. package/cabloy-docs/frontend/table-guide.md +373 -0
  112. package/cabloy-docs/frontend/table-resource-crud-cookbook.md +496 -0
  113. package/cabloy-docs/frontend/zova-app-guide.md +251 -0
  114. package/cabloy-docs/frontend/zova-form-source-reading-map.md +7 -9
  115. package/cabloy-docs/frontend/zova-form-under-the-hood.md +5 -0
  116. package/cabloy-docs/frontend/zova-router-under-the-hood.md +561 -0
  117. package/cabloy-docs/frontend/zova-source-reading-map.md +101 -7
  118. package/cabloy-docs/frontend/zova-table-controller-render-supplement.md +225 -0
  119. package/cabloy-docs/frontend/zova-table-source-reading-map.md +317 -0
  120. package/cabloy-docs/frontend/zova-table-under-the-hood.md +532 -0
  121. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-debug-checklist.md +245 -0
  122. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-source-reading-map.md +139 -0
  123. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-verify-playbook.md +248 -0
  124. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions.md +511 -0
  125. package/cabloy-docs/fullstack/contract-loop-playbook.md +8 -2
  126. package/cabloy-docs/fullstack/edition-collaboration-differences.md +6 -0
  127. package/cabloy-docs/fullstack/frontend-metadata-to-backend.md +181 -48
  128. package/cabloy-docs/fullstack/introduction.md +3 -0
  129. package/cabloy-docs/fullstack/openapi-to-sdk.md +116 -2
  130. package/cabloy-docs/fullstack/suites-and-modules.md +333 -0
  131. package/cabloy-docs/fullstack/tutorial-1-first-module.md +3 -0
  132. package/cabloy-docs/fullstack/tutorial-2-first-crud.md +4 -0
  133. package/cabloy-docs/fullstack/tutorial-3-frontend-metadata-sharing.md +4 -0
  134. package/cabloy-docs/fullstack/tutorial-4-custom-level-renderers.md +31 -19
  135. package/cabloy-docs/fullstack/tutorial-5-backend-contract-sharing.md +5 -0
  136. package/cabloy-docs/fullstack/tutorial-6-one-contract-four-uses.md +4 -0
  137. package/cabloy-docs/fullstack/tutorials-overview.md +1 -1
  138. package/cabloy-docs/reference/bean-scene-boilerplates.md +13 -13
  139. package/cabloy-docs/reference/package-map.md +4 -3
  140. package/package.json +1 -1
  141. package/vona/pnpm-lock.yaml +22 -258
  142. package/vona/src/suite/a-training/modules/training-student/package.json +53 -0
  143. package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +400 -0
  144. package/vona/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +18 -0
  145. package/vona/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
  146. package/vona/src/suite/a-training/modules/training-student/src/bean/meta.index.ts +12 -0
  147. package/vona/src/suite/a-training/modules/training-student/src/bean/meta.version.ts +21 -0
  148. package/vona/src/suite/a-training/modules/training-student/src/bean/ssrMenu.student.ts +29 -0
  149. package/vona/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +15 -0
  150. package/vona/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +15 -0
  151. package/vona/src/suite/a-training/modules/training-student/src/controller/student.ts +74 -0
  152. package/vona/src/suite/a-training/modules/training-student/src/dto/studentCreate.tsx +28 -0
  153. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectReq.tsx +44 -0
  154. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectRes.tsx +11 -0
  155. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectResItem.tsx +45 -0
  156. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSummary.tsx +42 -0
  157. package/vona/src/suite/a-training/modules/training-student/src/dto/studentUpdate.tsx +28 -0
  158. package/vona/src/suite/a-training/modules/training-student/src/dto/studentView.tsx +25 -0
  159. package/vona/src/suite/a-training/modules/training-student/src/entity/student.tsx +84 -0
  160. package/vona/src/suite/a-training/modules/training-student/src/index.ts +2 -0
  161. package/vona/src/suite/a-training/modules/training-student/src/model/student.ts +10 -0
  162. package/vona/src/suite/a-training/modules/training-student/src/service/student.ts +57 -0
  163. package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +173 -0
  164. package/vona/src/suite/a-training/modules/training-student/tsconfig.build.json +11 -0
  165. package/vona/src/suite/a-training/modules/training-student/tsconfig.json +7 -0
  166. package/vona/src/suite/a-training/package.json +12 -0
  167. package/vona/src/suite/a-training/tsconfig.base.json +4 -0
  168. package/vona/src/suite/a-training/tsconfig.json +10 -0
  169. package/zova/packages-zova/zova/package.json +2 -2
  170. package/zova/pnpm-lock.yaml +423 -682
  171. package/zova/src/suite/a-demo/modules/demo-basic/src/page/toolOne/render.tsx +5 -3
  172. package/zova/src/suite/a-home/modules/home-login/src/page/login/render.tsx +5 -3
  173. package/zova/src/suite/a-training/modules/training-student/cli/openapi.config.ts +9 -0
  174. package/zova/src/suite/a-training/modules/training-student/package.json +57 -0
  175. package/zova/src/suite/a-training/modules/training-student/src/.metadata/component/formFieldLevel.ts +31 -0
  176. package/zova/src/suite/a-training/modules/training-student/src/.metadata/index.ts +258 -0
  177. package/zova/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +7 -0
  178. package/zova/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
  179. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/baseURL.ts +5 -0
  180. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/index.ts +3 -0
  181. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +196 -0
  182. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +4146 -0
  183. package/zova/src/suite/a-training/modules/training-student/src/api/trainingStudent.ts +151 -0
  184. package/zova/src/suite/a-training/modules/training-student/src/apiSchema/trainingStudent.ts +43 -0
  185. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionDeleteForce.tsx +53 -0
  186. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionSummary.tsx +56 -0
  187. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.level.tsx +63 -0
  188. package/zova/src/suite/a-training/modules/training-student/src/component/formFieldLevel/controller.tsx +117 -0
  189. package/zova/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +9 -0
  190. package/zova/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +9 -0
  191. package/zova/src/suite/a-training/modules/training-student/src/index.ts +2 -0
  192. package/zova/src/suite/a-training/modules/training-student/src/model/student.ts +42 -0
  193. package/zova/src/suite/a-training/modules/training-student/tsconfig.build.json +13 -0
  194. package/zova/src/suite/a-training/modules/training-student/tsconfig.json +5 -0
  195. package/zova/src/suite/a-training/package.json +12 -0
  196. package/zova/src/suite/a-training/tsconfig.base.json +4 -0
  197. package/zova/src/suite/a-training/tsconfig.json +4 -0
  198. package/zova/src/suite/cabloy-basic/modules/basic-app/package.json +60 -0
  199. package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/index.ts +137 -0
  200. package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/locales.ts +7 -0
  201. package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/this.ts +2 -0
  202. package/zova/src/suite/cabloy-basic/modules/basic-app/src/bean/behavior.appModal.tsx +260 -0
  203. package/zova/src/suite/cabloy-basic/modules/basic-app/src/config/config.ts +39 -0
  204. package/zova/src/suite/cabloy-basic/modules/basic-app/src/config/locale/en-us.ts +7 -0
  205. package/zova/src/suite/cabloy-basic/modules/basic-app/src/config/locale/zh-cn.ts +7 -0
  206. package/zova/src/suite/cabloy-basic/modules/basic-app/src/index.ts +4 -0
  207. package/zova/src/suite/cabloy-basic/modules/basic-app/src/lib/appModalItem.ts +16 -0
  208. package/zova/src/suite/cabloy-basic/modules/basic-app/src/lib/index.ts +1 -0
  209. package/zova/src/suite/cabloy-basic/modules/basic-app/src/monkey.ts +38 -0
  210. package/zova/src/suite/cabloy-basic/modules/basic-app/src/monkeySys.ts +14 -0
  211. package/zova/src/suite/cabloy-basic/modules/basic-app/src/service/appModal.ts +89 -0
  212. package/zova/src/suite/cabloy-basic/modules/basic-app/src/types/appModal.ts +52 -0
  213. package/zova/src/suite/cabloy-basic/modules/basic-app/src/types/index.ts +1 -0
  214. package/zova/src/suite/cabloy-basic/modules/basic-app/tsconfig.build.json +13 -0
  215. package/zova/src/suite/cabloy-basic/modules/basic-app/tsconfig.json +5 -0
  216. package/zova/src/suite/cabloy-basic/modules/basic-commands/package.json +6 -1
  217. package/zova/src/suite/cabloy-basic/modules/basic-commands/src/.metadata/index.ts +16 -0
  218. package/zova/src/suite/cabloy-basic/modules/basic-commands/src/bean/command.alert.tsx +8 -14
  219. package/zova/src/suite/cabloy-basic/modules/basic-commands/src/bean/command.confirm.tsx +10 -7
  220. package/zova/src/suite/cabloy-basic/modules/basic-commands/src/bean/command.prompt.tsx +30 -0
  221. package/zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockForm/controller.tsx +5 -3
  222. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +29 -7
  223. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/select/controller.tsx +34 -11
  224. package/zova/src/suite/cabloy-basic/modules/basic-table/package.json +6 -1
  225. package/zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionDelete.tsx +4 -2
  226. package/zova/src/suite/cabloy-basic/package.json +1 -0
  227. package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
  228. package/zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx +3 -3
  229. package/zova/src/suite-vendor/a-zova/modules/a-table/src/lib/tableCell.ts +1 -1
  230. package/zova/src/suite-vendor/a-zova/package.json +2 -2
@@ -0,0 +1,263 @@
1
+ # Permission, formScene, and Action Visibility Guide
2
+
3
+ This guide explains how action visibility works in current Cabloy Basic entry pages when `formScene` participates in the decision.
4
+
5
+ Use this page when you want to understand:
6
+
7
+ - how `permissionHint.formScene` works
8
+ - how it interacts with `$$pageEntry.formMeta.formScene`
9
+ - how that differs from `$passport.checkPermission(...)`
10
+ - why some actions can be scene-gated while others cannot
11
+ - why bulk actions do not currently support `formScene`
12
+
13
+ ## Why this page exists
14
+
15
+ Several existing docs already explain nearby pieces:
16
+
17
+ - [Form Scene to Page Meta Guide](/frontend/form-scene-to-page-meta-guide) explains how `formScene` becomes `formMeta`, then `pageMeta`
18
+ - [Page Meta Guide](/frontend/page-meta-guide) explains shell/task presentation
19
+ - [Model Resource Owner Pattern](/frontend/model-resource-owner-pattern) and related resource-model docs explain permissions as part of resource ownership
20
+
21
+ What those pages do not isolate directly is the specific runtime rule for entry-page action visibility.
22
+
23
+ That is the gap this page fills.
24
+
25
+ In the current Basic source, `formScene` participates in action visibility as a **UI visibility filter** layered in front of the normal permission authorization check.
26
+
27
+ ## The shortest accurate mental model
28
+
29
+ A practical mental model is:
30
+
31
+ 1. page-entry runtime decides the current `formScene`
32
+ 2. `formMetaFromFormScene(...)` derives `formMeta`
33
+ 3. `$$pageEntry.formMeta.formScene` becomes the current scene surface for entry-page blocks
34
+ 4. `blockToolbarRow` reads `permissionHint.formScene`
35
+ 5. if the current scene does not match, the action is hidden immediately
36
+ 6. if the scene matches, `$passport.checkPermission(...)` still decides whether the action is allowed by permission rules
37
+ 7. the action renders only if both checks pass
38
+
39
+ That means `formScene` is not itself a permission engine. It is a scene-aware visibility prefilter.
40
+
41
+ ## What this guide is not
42
+
43
+ This page is not a general permission guide for every frontend action surface.
44
+
45
+ It is specifically about the current **entry-page** action visibility flow.
46
+
47
+ It is also not a guide to page-meta propagation. `pageMeta.formMeta` is part of the surrounding story, but the actual visibility authority for entry-page actions is the local page-entry runtime context.
48
+
49
+ ## Source-confirmed reading path
50
+
51
+ When reading this topic, use this order:
52
+
53
+ 1. `zova/src/suite-vendor/a-zova/modules/a-form/src/lib/utils.ts`
54
+ 2. `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockPageEntry/controller.tsx`
55
+ 3. `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx`
56
+ 4. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/permissions.ts`
57
+ 5. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/formActionRow.ts`
58
+ 6. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/tableActionRow.ts`
59
+ 7. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/tableActionBulk.ts`
60
+ 8. optional comparison: `zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionOperationsRow.tsx`
61
+
62
+ That order moves from scene/meta translation, to page-entry runtime ownership, to action-row filtering, to permission-hint typing, and finally to the bulk-action limitation and row-action comparison.
63
+
64
+ ## Visibility flow step by step
65
+
66
+ ### 1. `formScene` becomes canonical runtime metadata
67
+
68
+ The canonical helper lives in:
69
+
70
+ ```text
71
+ zova/src/suite-vendor/a-zova/modules/a-form/src/lib/utils.ts
72
+ ```
73
+
74
+ The current source confirms:
75
+
76
+ - `view` -> `formMode: 'view'`
77
+ - `create` -> `formMode: 'edit', editMode: 'create'`
78
+ - `edit` -> `formMode: 'edit', editMode: 'update'`
79
+
80
+ This matters because action visibility does not read an arbitrary raw string from anywhere in the app. It reads the current page-entry scene after that scene has already become part of the page-entry runtime metadata.
81
+
82
+ ### 2. `blockPageEntry` exposes the current scene through `$$pageEntry`
83
+
84
+ The key entry-page runtime file is:
85
+
86
+ ```text
87
+ zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockPageEntry/controller.tsx
88
+ ```
89
+
90
+ This controller:
91
+
92
+ - resolves `formScene`
93
+ - computes `formMeta`
94
+ - builds the shared JSX render context
95
+ - exposes `$$pageEntry` into that context
96
+
97
+ That is the key boundary for action visibility:
98
+
99
+ - entry-page actions do not need to rediscover the current scene
100
+ - they can read it from `$$pageEntry.formMeta.formScene`
101
+
102
+ ## 3. `blockToolbarRow` checks scene first, then permission
103
+
104
+ The most important source file for this guide is:
105
+
106
+ ```text
107
+ zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx
108
+ ```
109
+
110
+ Its action loop does two different checks:
111
+
112
+ 1. `_checkFormScene(permissionHint)`
113
+ 2. `$passport.checkPermission(...)`
114
+
115
+ The order matters.
116
+
117
+ ### Scene prefilter
118
+
119
+ `_checkFormScene(...)`:
120
+
121
+ - reads `$$pageEntry.formMeta.formScene`
122
+ - reads `permissionHint?.formScene`
123
+ - accepts a single scene or an array of scenes
124
+ - treats no `formScene` hint as “all scenes”
125
+
126
+ If the scene does not match, the action does not continue into the permission check.
127
+
128
+ ### Authorization check
129
+
130
+ Only after the scene passes does the controller call:
131
+
132
+ - `$passport.checkPermission(this.permissions, actionName, permissionHint)`
133
+
134
+ This is the critical source-confirmed distinction:
135
+
136
+ - **scene filtering** decides whether this action should even be considered in the current page-entry scene
137
+ - **permission checking** decides whether the user is allowed to perform it
138
+
139
+ ## 4. What `permissionHint.formScene` really means
140
+
141
+ `permissionHint.formScene` should be read as:
142
+
143
+ - a UI visibility filter tied to the current page-entry scene
144
+
145
+ It should **not** be read as:
146
+
147
+ - a replacement for permission authorization
148
+ - a generic global permission-engine rule
149
+ - a page-meta-driven shell rule
150
+
151
+ A practical reading rule is:
152
+
153
+ - if the scene is wrong, hide the action
154
+ - if the scene is right, still run the real permission check
155
+
156
+ ## 5. What the permission types confirm
157
+
158
+ The permission hint types live in:
159
+
160
+ ```text
161
+ zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/permissions.ts
162
+ ```
163
+
164
+ The important source-confirmed detail is:
165
+
166
+ - `IPermissionHintGeneral` can carry `formScene`
167
+ - `IPermissionHintTableActionRow` can carry `formScene`
168
+ - `IPermissionHintTableActionBulk` does **not** carry `formScene`
169
+
170
+ This matches the current runtime split:
171
+
172
+ - entry-page row/form action visibility can be scene-aware
173
+ - bulk-action visibility is not scene-aware in the same way today
174
+
175
+ ## 6. Row/form action types vs bulk action types
176
+
177
+ The row/form action option types live in:
178
+
179
+ - `a-openapi/src/types/resource/formActionRow.ts`
180
+ - `a-openapi/src/types/resource/tableActionRow.ts`
181
+
182
+ They both use `permission?: IPermissionHintTableActionRow`.
183
+
184
+ That means row-style action definitions can express `formScene` in their permission hints.
185
+
186
+ By contrast, bulk action options live in:
187
+
188
+ - `a-openapi/src/types/resource/tableActionBulk.ts`
189
+
190
+ That type uses:
191
+
192
+ - `permission?: IPermissionHintTableActionBulk`
193
+
194
+ And that bulk hint type does not have `formScene`.
195
+
196
+ This is the clearest public type-level explanation for the current limitation.
197
+
198
+ ## 7. Why bulk actions are different today
199
+
200
+ Bulk actions are typed around bulk permission hints, not row/form-scene hints.
201
+
202
+ So in current Basic source, you should not claim that bulk actions support scene-based filtering the same way entry-page toolbar actions do.
203
+
204
+ This is not only a docs distinction. It is a source-confirmed contract distinction.
205
+
206
+ ## 8. Comparison with table row actions
207
+
208
+ A useful comparison file is:
209
+
210
+ ```text
211
+ zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionOperationsRow.tsx
212
+ ```
213
+
214
+ This table-row action surface uses permission checks, but it does not add the same local page-entry `formScene` prefilter path as `blockToolbarRow`.
215
+
216
+ That makes the current entry-page toolbar flow more specific:
217
+
218
+ - it is tied to entry-page runtime context
219
+ - it is not the universal rule for every action surface in the frontend
220
+
221
+ ## 9. Boundary with page meta
222
+
223
+ A common confusion is to think that because `formMeta` also becomes part of page meta, page meta is the authority for action visibility.
224
+
225
+ That is not the current source-confirmed rule.
226
+
227
+ The better boundary is:
228
+
229
+ - `pageMeta.formMeta` is shell/task presentation state
230
+ - `$$pageEntry.formMeta.formScene` is the local page-entry runtime surface that `blockToolbarRow` reads for scene filtering
231
+
232
+ So for action visibility, the local page-entry context is the authority.
233
+
234
+ ## 10. Bulk-action limitation
235
+
236
+ The current public Basic source supports this rule clearly:
237
+
238
+ - row/form action hints can be scene-aware
239
+ - bulk action hints are not scene-aware today
240
+
241
+ If a contributor needs scene-aware bulk visibility, they should first verify whether the type and runtime contracts are being extended, rather than assuming the row-action rule applies automatically.
242
+
243
+ ## Where to read next
244
+
245
+ Use these next steps depending on your question:
246
+
247
+ - if you want the full `formScene -> formMeta -> pageMeta -> shell/tab` bridge, read [Form Scene to Page Meta Guide](/frontend/form-scene-to-page-meta-guide)
248
+ - if you want the broader entry-page runtime path, read [Resource Entry Page Deep Dive](/frontend/resource-entry-page-deep-dive)
249
+ - if you want the list-page row/bulk contrast, read [Table Action Visibility and Permission Flow Guide](/frontend/table-action-visibility-permission-flow-guide)
250
+ - if you want shell/task presentation semantics, read [Page Meta Guide](/frontend/page-meta-guide)
251
+ - if you want the underlying resource permission/model context, read [Model Resource Owner Pattern](/frontend/model-resource-owner-pattern)
252
+
253
+ ## Final takeaway
254
+
255
+ The most accurate rule for current Cabloy Basic entry-page action visibility is:
256
+
257
+ - `permissionHint.formScene` is a scene-aware visibility prefilter
258
+ - `$$pageEntry.formMeta.formScene` is the current scene source
259
+ - `$passport.checkPermission(...)` is still the actual authorization check
260
+ - the action renders only if both layers pass
261
+ - bulk actions do not currently carry `formScene` in their permission hints
262
+
263
+ That is the source-confirmed `permission / formScene / action visibility` path in the current Basic frontend architecture.
@@ -127,8 +127,10 @@ This is why route metadata, guards, aliases, and theme/header/menu behavior shou
127
127
  Read together with:
128
128
 
129
129
  - [Page Route Guide](/frontend/page-route-guide)
130
- - [Navigation Guards Guide](/frontend/navigation-guards-guide)
131
130
  - [Route Alias Guide](/frontend/route-alias-guide)
131
+ - [Navigation Guards Guide](/frontend/navigation-guards-guide)
132
+ - [Zova Router Under the Hood](/frontend/zova-router-under-the-hood)
133
+ - [Router View Hosts Guide](/frontend/router-view-hosts-guide)
132
134
  - [Theme Guide](/frontend/theme-guide)
133
135
 
134
136
  ## Step 6: reach the first routed page
@@ -150,6 +152,8 @@ Read next:
150
152
  - [Frontend CLI](/frontend/cli)
151
153
  - [Page Guide](/frontend/page-guide)
152
154
  - [Page Route Guide](/frontend/page-route-guide)
155
+ - [Zova Router Under the Hood](/frontend/zova-router-under-the-hood)
156
+ - [Router View Hosts Guide](/frontend/router-view-hosts-guide)
153
157
 
154
158
  ## Step 7: understand menu and CLI ergonomics
155
159
 
@@ -173,6 +177,8 @@ Read next:
173
177
  - [Frontend Scripts](/frontend/scripts)
174
178
  - [Environment and Config Guide](/frontend/environment-config-guide)
175
179
  - [Page Route Guide](/frontend/page-route-guide)
180
+ - [Zova Router Under the Hood](/frontend/zova-router-under-the-hood)
181
+ - [Router View Hosts Guide](/frontend/router-view-hosts-guide)
176
182
  - [Theme Guide](/frontend/theme-guide)
177
183
 
178
184
  ### I want to understand startup and routing
@@ -180,14 +186,20 @@ Read next:
180
186
  - [System Startup Guide](/frontend/system-startup-guide)
181
187
  - [App Startup Guide](/frontend/app-startup-guide)
182
188
  - [Page Route Guide](/frontend/page-route-guide)
183
- - [Navigation Guards Guide](/frontend/navigation-guards-guide)
184
189
  - [Route Alias Guide](/frontend/route-alias-guide)
190
+ - [Navigation Guards Guide](/frontend/navigation-guards-guide)
191
+ - [Zova Router Under the Hood](/frontend/zova-router-under-the-hood)
192
+ - [Router View Hosts Guide](/frontend/router-view-hosts-guide)
193
+ - [Router Tabs Introduction](/frontend/router-tabs-introduction)
194
+ - [Router Tabs Layout Integration](/frontend/router-tabs-layout-integration)
185
195
 
186
196
  ### I want to create my first page
187
197
 
188
198
  - [Frontend CLI](/frontend/cli)
189
199
  - [Page Guide](/frontend/page-guide)
190
200
  - [Page Route Guide](/frontend/page-route-guide)
201
+ - [Zova Router Under the Hood](/frontend/zova-router-under-the-hood)
202
+ - [Router View Hosts Guide](/frontend/router-view-hosts-guide)
191
203
 
192
204
  ### I need edition-sensitive guidance
193
205
 
@@ -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.