cabloy 5.1.61 → 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 (201) 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 +42 -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 +19 -28
  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 +568 -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 +406 -680
  171. package/zova/src/suite/a-training/modules/training-student/cli/openapi.config.ts +9 -0
  172. package/zova/src/suite/a-training/modules/training-student/package.json +52 -0
  173. package/zova/src/suite/a-training/modules/training-student/src/.metadata/component/formFieldLevel.ts +31 -0
  174. package/zova/src/suite/a-training/modules/training-student/src/.metadata/index.ts +258 -0
  175. package/zova/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +7 -0
  176. package/zova/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
  177. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/baseURL.ts +5 -0
  178. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/index.ts +3 -0
  179. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +196 -0
  180. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +4146 -0
  181. package/zova/src/suite/a-training/modules/training-student/src/api/trainingStudent.ts +151 -0
  182. package/zova/src/suite/a-training/modules/training-student/src/apiSchema/trainingStudent.ts +43 -0
  183. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionDeleteForce.tsx +51 -0
  184. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionSummary.tsx +56 -0
  185. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.level.tsx +63 -0
  186. package/zova/src/suite/a-training/modules/training-student/src/component/formFieldLevel/controller.tsx +117 -0
  187. package/zova/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +9 -0
  188. package/zova/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +9 -0
  189. package/zova/src/suite/a-training/modules/training-student/src/index.ts +2 -0
  190. package/zova/src/suite/a-training/modules/training-student/src/model/student.ts +42 -0
  191. package/zova/src/suite/a-training/modules/training-student/tsconfig.build.json +13 -0
  192. package/zova/src/suite/a-training/modules/training-student/tsconfig.json +5 -0
  193. package/zova/src/suite/a-training/package.json +12 -0
  194. package/zova/src/suite/a-training/tsconfig.base.json +4 -0
  195. package/zova/src/suite/a-training/tsconfig.json +4 -0
  196. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +29 -7
  197. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/select/controller.tsx +34 -11
  198. package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
  199. package/zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx +3 -3
  200. package/zova/src/suite-vendor/a-zova/modules/a-table/src/lib/tableCell.ts +1 -1
  201. package/zova/src/suite-vendor/a-zova/package.json +2 -2
@@ -0,0 +1,532 @@
1
+ # Zova Table Under the Hood
2
+
3
+ This guide explains the source-level runtime path behind Zova Table.
4
+
5
+ Use this page together with:
6
+
7
+ - [Table Guide](/frontend/table-guide)
8
+ - [TableCell Authoring Cookbook](/frontend/table-cell-cookbook)
9
+ - [Table + Resource CRUD Cookbook](/frontend/table-resource-crud-cookbook)
10
+ - [Rest Resource Under the Hood](/frontend/rest-resource-under-the-hood)
11
+ - [Rest Resource Source Reading Map](/frontend/rest-resource-source-reading-map)
12
+ - [Zova Table Source Reading Map](/frontend/zova-table-source-reading-map)
13
+ - [Zova Source Reading Map](/frontend/zova-source-reading-map)
14
+ - [API Schema Guide](/frontend/api-schema-guide)
15
+ - [Bean Scene Authoring](/frontend/bean-scene-authoring)
16
+
17
+ Use this page after [Table Guide](/frontend/table-guide) when you want to move from the public authoring surface to the internal cooperation among table controllers, schema metadata, TanStack Table, `tableCell` beans, JSX/CEL scopes, and resource-page integration.
18
+
19
+ If your next question is not “how does this runtime work?” but “which files should I read next?”, continue with [Zova Table Source Reading Map](/frontend/zova-table-source-reading-map).
20
+
21
+ If your next question is specifically why row or bulk actions are visible or hidden in current list pages, continue with [Table Action Visibility and Permission Flow Guide](/frontend/table-action-visibility-permission-flow-guide).
22
+
23
+ If your next question is specifically about the controller/render micro-pipeline inside `ControllerTable`, continue with [Zova Table Controller Render Supplement](/frontend/zova-table-controller-render-supplement).
24
+
25
+ > [!TIP]
26
+ > **Zova Table docs path**
27
+ >
28
+ > 1. **[Table Guide](/frontend/table-guide)** — learn the public authoring surface
29
+ > 2. **[Zova Table Under the Hood](/frontend/zova-table-under-the-hood)** — learn how the runtime pieces cooperate
30
+ > 3. **[Zova Table Source Reading Map](/frontend/zova-table-source-reading-map)** — learn which files to read next
31
+ >
32
+ > **You are here:** step 2.
33
+ > **Previous page:** [Table Guide](/frontend/table-guide).
34
+ > **Next recommended page:** [Zova Table Source Reading Map](/frontend/zova-table-source-reading-map).
35
+
36
+ ## Why this page exists
37
+
38
+ The public table guide already explains the authoring surface:
39
+
40
+ - `ZTable`
41
+ - schema-driven columns
42
+ - `getColumns(...)`
43
+ - `tableCell` beans
44
+ - resource-page integration
45
+
46
+ What many contributors and AI workflows still want next is the implementation bridge:
47
+
48
+ - where the table controller is created
49
+ - where schema `table` metadata becomes visible columns
50
+ - where TanStack Table enters the runtime
51
+ - how a `tableCell` onion name becomes a bean instance
52
+ - how column and cell CEL/JSX scopes are prepared
53
+ - how resource page blocks feed data and permissions into the table runtime
54
+
55
+ This page is that bridge.
56
+
57
+ ## The shortest accurate runtime model
58
+
59
+ For a typical Zova table, the shortest accurate model is:
60
+
61
+ 1. the `ZTable` wrapper creates a table controller bean through the normal Zova controller path
62
+ 2. the table controller loads table-scene schema properties from the row schema
63
+ 3. the controller builds table metadata with visible properties and per-column render functions
64
+ 4. the controller creates TanStack table options through Zova’s `$useTable(...)` wrapper
65
+ 5. each cell render resolves either to text fallback, a general JSX render target, or a `tableCell` bean
66
+ 6. the cell runtime evaluates JSX/CEL props with table-aware column and cell scope
67
+ 7. resource pages feed schema, data, permissions, and page scope into the same table runtime through `basic-page:blockTable`
68
+
69
+ That is why Zova Table is not only a thin wrapper around TanStack Table. The business-facing runtime surface is still Zova-native.
70
+
71
+ ## A concrete source specimen
72
+
73
+ The smallest public wrapper entry is:
74
+
75
+ ```text
76
+ zova/src/suite-vendor/a-zova/modules/a-table/src/.metadata/component/table.ts
77
+ ```
78
+
79
+ A business-facing consumer specimen is:
80
+
81
+ ```text
82
+ zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockTable/controller.tsx
83
+ ```
84
+
85
+ A representative `tableCell` bean specimen is:
86
+
87
+ ```text
88
+ zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionOperationsRow.tsx
89
+ ```
90
+
91
+ These three files already show the core architecture:
92
+
93
+ - the wrapper is thin
94
+ - the controller owns the runtime
95
+ - cell rendering is scene-driven rather than hard-coded in the page
96
+
97
+ ## The core source-reading path
98
+
99
+ When you want to trace the full mechanism, read these files in order:
100
+
101
+ 1. `zova/src/suite-vendor/a-zova/modules/a-table/src/.metadata/component/table.ts`
102
+ 2. `zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx`
103
+ 3. `zova/src/suite-vendor/a-zova/modules/a-table/src/lib/beanControllerTableBase.ts`
104
+ 4. `zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/render.tsx`
105
+ 5. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/lib/schema.ts`
106
+ 6. `zova/src/suite-vendor/a-zova/modules/a-table/src/types/tableCell.ts`
107
+ 7. `zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockTable/controller.tsx`
108
+ 8. `zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockPage/controller.tsx`
109
+
110
+ A compact role map is:
111
+
112
+ - `table.ts` shows how the public wrapper enters `useController(...)`
113
+ - `component/table/controller.tsx` owns schema properties, metadata refresh, TanStack bridge, and cell rendering
114
+ - `beanControllerTableBase.ts` shows the Zova wrapper around `useVueTable(...)`
115
+ - `component/table/render.tsx` shows the default table DOM render path through `FlexRender`
116
+ - `schema.ts` shows how table-scene schema properties are loaded and ordered
117
+ - `types/tableCell.ts` shows the `tableCell` scene contract
118
+ - `blockTable/controller.tsx` shows how page blocks feed `data`, `schema`, and `tableScope` into `ZTable`
119
+ - `blockPage/controller.tsx` shows where resource data, permissions, and page scope come from
120
+
121
+ ## Step-by-step runtime path
122
+
123
+ ### 1. `ZTable` creates the table controller bean
124
+
125
+ The public wrapper enters the normal Zova controller path through:
126
+
127
+ ```text
128
+ zova/src/suite-vendor/a-zova/modules/a-table/src/.metadata/component/table.ts
129
+ ```
130
+
131
+ That wrapper calls `useController(ControllerTable, RenderTable, undefined)`.
132
+
133
+ A practical reading takeaway is:
134
+
135
+ - **the visible wrapper component is thin**
136
+ - **the controller bean is the real runtime owner**
137
+
138
+ That wrapper also exposes `controllerRef`, which means the public instance-reference pattern is still controller-oriented rather than DOM-ref-oriented.
139
+
140
+ ## 2. The table controller owns schema properties, metadata, and render context
141
+
142
+ The main runtime owner is:
143
+
144
+ ```text
145
+ zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx
146
+ ```
147
+
148
+ Inside `ControllerTable.__init__()` the controller:
149
+
150
+ - registers itself as `$$table`
151
+ - creates a column CEL environment
152
+ - creates a `ZovaJsx` instance bound to that CEL environment
153
+ - creates reactive `properties` from `this.$sdk.loadSchemaProperties(this.schema, 'table')`
154
+ - refreshes `tableMeta` and `columns`
155
+ - watches schema changes and refreshes metadata when needed
156
+ - creates the TanStack table instance
157
+
158
+ This is one of the most important source-level facts about Zova Table.
159
+
160
+ The table controller is not only coordinating rows. It is the central bridge among:
161
+
162
+ - table-scene schema metadata
163
+ - column and cell CEL/JSX scope
164
+ - TanStack table state
165
+ - `tableCell` bean-scene rendering
166
+
167
+ ## 3. Why `$useTable(...)` exists
168
+
169
+ The shared wrapper lives in:
170
+
171
+ ```text
172
+ zova/src/suite-vendor/a-zova/modules/a-table/src/lib/beanControllerTableBase.ts
173
+ ```
174
+
175
+ and the page-controller variant lives in:
176
+
177
+ ```text
178
+ zova/src/suite-vendor/a-zova/modules/a-table/src/lib/beanControllerPageTableBase.ts
179
+ ```
180
+
181
+ The important runtime detail is that `$useTable(...)` wraps TanStack `useVueTable(...)` like this:
182
+
183
+ - run it inside `ctx.util.instanceScope(...)`
184
+ - then `markRaw(...)` the returned TanStack object
185
+
186
+ That matters because:
187
+
188
+ - Zova wants the controller bean to stay the business-facing runtime host
189
+ - the underlying TanStack table object still needs to be created in the correct Zova instance scope
190
+ - the raw TanStack API should not become the main architecture surface
191
+
192
+ A practical reading takeaway is:
193
+
194
+ - **Zova does not replace TanStack Table**
195
+ - **Zova relocates the business-facing ownership into controller beans**
196
+
197
+ ## 4. How schema becomes visible columns
198
+
199
+ The default schema path starts in two places:
200
+
201
+ ```text
202
+ zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx
203
+ zova/src/suite-vendor/a-zova/modules/a-openapi/src/lib/schema.ts
204
+ ```
205
+
206
+ The important runtime path is:
207
+
208
+ 1. the table receives `schema`
209
+ 2. `_createProperties()` computes `this.$sdk.loadSchemaProperties(this.schema, 'table')`
210
+ 3. `loadSchemaProperties(...)` resolves `$ref`, applies `rest.table` overlays, and sorts by `rest.order`
211
+ 4. `_createTableMeta()` iterates those properties and decides visibility and render behavior
212
+ 5. `_createColumnsMiddle()` converts the surviving properties into TanStack column definitions
213
+
214
+ A practical reading takeaway is:
215
+
216
+ - **schema is not only validation truth**
217
+ - **schema also drives table order, visibility, and cell render metadata**
218
+
219
+ ## 5. How table metadata is built
220
+
221
+ The internal table metadata shape is:
222
+
223
+ - `properties`
224
+ - `renders`
225
+
226
+ For each property, `_createTableMeta()` does this work:
227
+
228
+ - create column scope with `getColumnScope(...)`
229
+ - create column render context with `getColumnJsxRenderContext(...)`
230
+ - compute top-level column options through `getColumnComponentPropsTop(...)`
231
+ - skip the column if `visible === false`
232
+ - create a render function through `_createColumnRender(...)`
233
+
234
+ That means a visible column is not only “one schema property plus one header”.
235
+
236
+ It is the result of a controller-owned pipeline that has already decided:
237
+
238
+ - whether the column exists
239
+ - which render provider it uses
240
+ - which column props belong to that provider
241
+
242
+ ## 6. The default TanStack table options are still controller-owned
243
+
244
+ The actual TanStack table is created in `_createTable()`.
245
+
246
+ Important defaults include:
247
+
248
+ - `getRowId: row => row.id`
249
+ - `getCoreRowModel: getCoreRowModel()`
250
+ - `renderFallbackValue: this.scope.config.renderFallbackValue`
251
+ - `manualPagination: true`
252
+ - reactive `data` getter returning `self.data || []`
253
+ - reactive `columns` getter returning `self.columns`
254
+
255
+ A practical reading takeaway is:
256
+
257
+ - **TanStack owns the row-model mechanics**
258
+ - **the controller still owns which data and columns TanStack sees**
259
+
260
+ ## 7. Column and cell render context are explicitly separated
261
+
262
+ The controller creates two related but distinct runtime contexts.
263
+
264
+ ### Column context
265
+
266
+ `getColumnJsxRenderContext(...)` exposes:
267
+
268
+ - `$scene: 'tableColumn'`
269
+ - `$host: this`
270
+ - `$celScope`
271
+ - `$jsx`
272
+ - `$$table`
273
+
274
+ ### Cell context
275
+
276
+ `getCellJsxRenderContext(...)` exposes:
277
+
278
+ - `$scene: 'tableCell'`
279
+ - `$host: this`
280
+ - `$celScope`
281
+ - `$jsx`
282
+ - `$$table`
283
+ - `cellContext`
284
+
285
+ This matters because column-level decisions and cell-level rendering do not have exactly the same information.
286
+
287
+ A practical reading takeaway is:
288
+
289
+ - **column configuration is prepared before one row value exists**
290
+ - **cell rendering gets the row-aware `CellContext` only when the cell is actually rendered**
291
+
292
+ ## 8. How a `tableCell` onion name becomes a bean instance
293
+
294
+ The central method is:
295
+
296
+ ```text
297
+ ControllerTable.getRenderProvider(...)
298
+ ```
299
+
300
+ Its important behavior is:
301
+
302
+ - no render -> use `'text'`
303
+ - onion-like render string with `:` -> convert it with `beanFullNameFromOnionName(render, 'tableCell')`
304
+ - otherwise keep the render target as-is
305
+
306
+ Then `_createColumnRender(...)` can resolve that provider.
307
+
308
+ If the provider belongs to the `tableCell` bean scene, the controller:
309
+
310
+ - loads the bean instance through `this.sys.bean._getBean(...)`
311
+ - reads decorator options through `appResource.getBean(...)`
312
+ - merges onion options with column props via `deepExtend(...)`
313
+ - optionally calls `beanInstance.checkVisible(...)`
314
+
315
+ That means a cell bean is not only a render callback. It is a first-class scene resource with:
316
+
317
+ - bean resolution
318
+ - decorator options
319
+ - optional async visibility logic
320
+ - render-time `next()` composition
321
+
322
+ ## 9. The cell render pipeline
323
+
324
+ The most useful durable mental model for one cell is:
325
+
326
+ ```text
327
+ column metadata -> render provider resolution -> bean/decorator option merge -> cell scope -> JSX/CEL evaluation -> bean render or direct render
328
+ ```
329
+
330
+ The core methods are:
331
+
332
+ - `cellRenderPrepare(...)`
333
+ - `cellRender(...)`
334
+ - `_cellRender(...)`
335
+ - `_cellRenderInner(...)`
336
+
337
+ Important behavior includes:
338
+
339
+ ### Text fallback
340
+
341
+ If the render provider is `'text'`, the cell returns:
342
+
343
+ - the current value
344
+ - or `renderFallbackValue` when the value is nil or empty string
345
+
346
+ ### Cell scope construction
347
+
348
+ If no explicit cell scope exists yet, the controller derives one from column scope plus:
349
+
350
+ - `value`
351
+ - `fallbackValue`
352
+
353
+ ### Transient helper injection
354
+
355
+ `_cellRender(...)` uses `zovaJsx.setTransientObject(...)` so CEL/JSX evaluation can call `getValue(name)` against the current row.
356
+
357
+ ### Bean-backed render path
358
+
359
+ When the render provider resolves to a `tableCell` bean:
360
+
361
+ - props are rendered through `zovaJsx.renderJsxProps(...)`
362
+ - `class` and `style` are normalized into controller-host CSS handling
363
+ - `beanInstance.render(...)` receives final options, render context, and `next()`
364
+
365
+ ### General render path
366
+
367
+ When there is no bean instance, the controller falls back to `zovaJsx.render(...)`.
368
+
369
+ A practical reading takeaway is:
370
+
371
+ - **`tableCell` resources are part of a controller-prepared render pipeline**
372
+ - **the page does not manually wire row value extraction, CEL scope, and option merge each time**
373
+
374
+ ## 10. What `tableCell` beans really are
375
+
376
+ The scene contract lives in:
377
+
378
+ ```text
379
+ zova/src/suite-vendor/a-zova/modules/a-table/src/types/tableCell.ts
380
+ zova/src/suite-vendor/a-zova/modules/a-table/src/lib/tableCell.ts
381
+ ```
382
+
383
+ That contract defines:
384
+
385
+ - `ITableCellRender`
386
+ - `IDecoratorTableCellOptions`
387
+ - `NextTableCellRender`
388
+ - `SysOnion.tableCell`
389
+ - `ConfigOnions.tableCell`
390
+ - `IBeanSceneRecord.tableCell`
391
+
392
+ The decorator itself is:
393
+
394
+ ```typescript
395
+ createBeanDecorator('tableCell', 'sys', true, options);
396
+ ```
397
+
398
+ That means `tableCell` is not only a naming convention. It is a frontend bean scene with:
399
+
400
+ - system-scoped resolution behavior
401
+ - scene-level typing
402
+ - CLI boilerplate support
403
+ - metadata-driven resource identity
404
+
405
+ ## 11. Representative `tableCell` patterns
406
+
407
+ Simple formatting cells such as:
408
+
409
+ - `basic-text:text`
410
+ - `basic-date:date`
411
+ - `basic-select:select`
412
+
413
+ usually implement a straightforward shape:
414
+
415
+ 1. call `next()` to get the base value
416
+ 2. format or map that value
417
+ 3. optionally wrap it with a class-aware container
418
+
419
+ Row-action cells such as:
420
+
421
+ - `basic-table:actionOperationsRow`
422
+
423
+ show the more advanced pattern:
424
+
425
+ - `checkVisible(...)` filters actions by permission and preloads nested renders
426
+ - `render(...)` reuses `$$table.cellRender(...)` for each visible action
427
+
428
+ That is an important source-level clue:
429
+
430
+ - **one `tableCell` bean can itself orchestrate more table-cell renders**
431
+
432
+ ## 12. The default DOM render still happens in a render bean
433
+
434
+ The default render bean lives in:
435
+
436
+ ```text
437
+ zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/render.tsx
438
+ ```
439
+
440
+ It does two important jobs:
441
+
442
+ - render the outer table markup with `<table class="table">`
443
+ - delegate header and cell vnode creation to TanStack `FlexRender`
444
+
445
+ If `slotDefault` is supplied, the render bean yields to that slot instead of the built-in table DOM.
446
+
447
+ That means automatic table rendering is not happening magically in the wrapper component. It is happening in the render bean.
448
+
449
+ A practical reading takeaway is:
450
+
451
+ - **the wrapper starts the controller path**
452
+ - **the render bean owns the default DOM shape**
453
+ - **the table controller still owns the cell render functions that `FlexRender` consumes**
454
+
455
+ ## 13. Resource-page integration path
456
+
457
+ Zova Table is frequently consumed through Cabloy Basic resource pages.
458
+
459
+ The strongest specimens are:
460
+
461
+ ```text
462
+ zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockPage/controller.tsx
463
+ zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockTable/controller.tsx
464
+ ```
465
+
466
+ ### Page block path
467
+
468
+ `blockPage`:
469
+
470
+ - loads `ModelResource`
471
+ - creates page-level JSX/CEL environment
472
+ - computes resource query state
473
+ - exposes `data`, `schemaRow`, and `permissions`
474
+ - refreshes table metadata when permissions change
475
+
476
+ ### Table block path
477
+
478
+ `blockTable`:
479
+
480
+ - renders `ZTable`
481
+ - passes `data={$$page.data}`
482
+ - passes `schema={$$page.schemaRow}`
483
+ - passes `tableScope={$$page.jsxCelScope}`
484
+ - captures `controllerRef` and stores `tableRef` back onto the page controller
485
+
486
+ This is one of the most important integration facts about the module.
487
+
488
+ The resource page does not manually rebuild the table runtime. It feeds page-owned resource state into the same reusable table controller.
489
+
490
+ ## 14. Compact call-flow sketch
491
+
492
+ When in doubt, use this short call flow:
493
+
494
+ 1. `ZTable` wrapper enters the normal Zova controller path
495
+ 2. `ControllerTable.__init__()` creates CEL/JSX support and schema-driven properties
496
+ 3. `refreshMeta()` computes visible table properties and per-column render functions
497
+ 4. `_createTable()` creates the TanStack bridge through `$useTable(...)`
498
+ 5. `RenderTable` renders headers and rows through `FlexRender`
499
+ 6. each cell render resolves to text fallback, a general render target, or a `tableCell` bean
500
+ 7. `tableCell` beans receive controller-prepared options, scope, and `next()`
501
+ 8. resource pages prepare `data`, `schemaRow`, `permissions`, and `tableScope` before entering the same runtime
502
+
503
+ That is the shortest end-to-end explanation of how the module cooperates.
504
+
505
+ ## Final takeaway
506
+
507
+ Zova Table is not just TanStack Table plus JSX wrappers.
508
+
509
+ It moves table ownership into:
510
+
511
+ - table controller beans
512
+ - schema metadata
513
+ - `tableCell` bean-scene resources
514
+ - controller-prepared CEL/JSX scope
515
+ - resource-page integration
516
+
517
+ TanStack Table is still the underlying row-model engine, but the business-facing runtime model is Zova-native.
518
+
519
+ ## Verification checklist
520
+
521
+ When documenting or changing this area, verify in this order:
522
+
523
+ 1. confirm the runtime claims against the current `a-table` source
524
+ 2. confirm `tableCell` scene metadata and boilerplates still match current `package.json` and `cli/` wiring
525
+ 3. confirm resource-page integration claims still match `blockPage` and `blockTable`
526
+ 4. build the docs site:
527
+
528
+ ```bash
529
+ npm run docs:build
530
+ ```
531
+
532
+ 5. verify the page is reachable from the frontend sidebar and related table docs