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.
- package/.claude/skills/cabloy-backend-scaffold/SKILL.md +2 -0
- package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -1
- package/.claude/skills/cabloy-domain-planning/SKILL.md +212 -0
- package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +2 -0
- package/CHANGELOG.md +55 -0
- package/CLAUDE.md +1 -0
- package/cabloy-docs/.vitepress/config.mjs +158 -12
- package/cabloy-docs/ai/docs-skills-rules-mapping.md +8 -0
- package/cabloy-docs/ai/future-skill-roadmap.md +2 -0
- package/cabloy-docs/ai/skills.md +1 -0
- package/cabloy-docs/backend/backend-contract-emission-output-inspection.md +189 -0
- package/cabloy-docs/backend/backend-contract-emission-source-reading-map.md +160 -0
- package/cabloy-docs/backend/backend-contract-emission-specimen.md +170 -0
- package/cabloy-docs/backend/backend-resource-module-contract-chain.md +323 -0
- package/cabloy-docs/backend/backend-source-reading-debug-checklist.md +173 -0
- package/cabloy-docs/backend/backend-source-reading-roadmap.md +129 -0
- package/cabloy-docs/backend/backend-source-reading-verify-playbook.md +166 -0
- package/cabloy-docs/backend/bean-scene-authoring.md +4 -4
- package/cabloy-docs/backend/broadcast-guide.md +3 -3
- package/cabloy-docs/backend/cli.md +20 -11
- package/cabloy-docs/backend/config-guide.md +4 -4
- package/cabloy-docs/backend/controller-aop-guide.md +10 -10
- package/cabloy-docs/backend/controller-guide.md +12 -2
- package/cabloy-docs/backend/crud-workflow.md +7 -3
- package/cabloy-docs/backend/dto-guide.md +12 -2
- package/cabloy-docs/backend/dto-infer-generation.md +201 -25
- package/cabloy-docs/backend/election-guide.md +2 -2
- package/cabloy-docs/backend/entity-guide.md +12 -3
- package/cabloy-docs/backend/error-guide.md +3 -3
- package/cabloy-docs/backend/event-guide.md +4 -4
- package/cabloy-docs/backend/external-aop-guide.md +2 -2
- package/cabloy-docs/backend/field-indexes.md +9 -3
- package/cabloy-docs/backend/foundation.md +8 -8
- package/cabloy-docs/backend/i18n-guide.md +6 -6
- package/cabloy-docs/backend/internal-aop-guide.md +2 -2
- package/cabloy-docs/backend/introduction.md +13 -0
- package/cabloy-docs/backend/migration-and-changes.md +3 -3
- package/cabloy-docs/backend/model-guide.md +16 -6
- package/cabloy-docs/backend/openapi-guide.md +3 -0
- package/cabloy-docs/backend/queue-guide.md +3 -3
- package/cabloy-docs/backend/redlock-guide.md +2 -2
- package/cabloy-docs/backend/schedule-guide.md +2 -2
- package/cabloy-docs/backend/scripts.md +8 -0
- package/cabloy-docs/backend/serialization-guide.md +2 -2
- package/cabloy-docs/backend/service-guide.md +18 -9
- package/cabloy-docs/backend/startup-guide.md +5 -5
- package/cabloy-docs/backend/status-guide.md +7 -7
- package/cabloy-docs/backend/unit-testing.md +3 -3
- package/cabloy-docs/backend/vona-source-reading-map.md +157 -0
- package/cabloy-docs/backend/websocket-protocol-guide.md +5 -5
- package/cabloy-docs/backend/websocket-usage-guide.md +15 -8
- package/cabloy-docs/frontend/a-model-under-the-hood.md +281 -0
- package/cabloy-docs/frontend/a-openapi-under-the-hood.md +248 -0
- package/cabloy-docs/frontend/a-router-guide.md +307 -0
- package/cabloy-docs/frontend/api-guide.md +4 -4
- package/cabloy-docs/frontend/api-schema-guide.md +1 -0
- package/cabloy-docs/frontend/app-startup-guide.md +7 -4
- package/cabloy-docs/frontend/bean-scene-authoring.md +1 -1
- package/cabloy-docs/frontend/behavior-guide.md +16 -16
- package/cabloy-docs/frontend/cli.md +5 -5
- package/cabloy-docs/frontend/command-scene-authoring.md +17 -8
- package/cabloy-docs/frontend/component-guide.md +5 -5
- package/cabloy-docs/frontend/component-props-guide.md +1 -1
- package/cabloy-docs/frontend/component-v-model-guide.md +2 -2
- package/cabloy-docs/frontend/filter-query-select-data-flow-guide.md +260 -0
- package/cabloy-docs/frontend/form-guide.md +27 -30
- package/cabloy-docs/frontend/form-scene-to-page-meta-guide.md +303 -0
- package/cabloy-docs/frontend/foundation.md +10 -6
- package/cabloy-docs/frontend/frontend-source-reading-roadmap.md +249 -0
- package/cabloy-docs/frontend/generated-contract-consumption-debug-checklist.md +190 -0
- package/cabloy-docs/frontend/generated-contract-consumption-entry-branch.md +205 -0
- package/cabloy-docs/frontend/generated-contract-consumption-list-branch.md +157 -0
- package/cabloy-docs/frontend/generated-contract-consumption-specimen.md +203 -0
- package/cabloy-docs/frontend/generated-contract-consumption-verify-playbook.md +189 -0
- package/cabloy-docs/frontend/generic-component-guide.md +1 -1
- package/cabloy-docs/frontend/introduction.md +29 -7
- package/cabloy-docs/frontend/model-architecture.md +38 -2
- package/cabloy-docs/frontend/model-resource-cookbook.md +11 -8
- package/cabloy-docs/frontend/model-resource-internals-deep-dive.md +238 -0
- package/cabloy-docs/frontend/model-resource-owner-pattern.md +22 -2
- package/cabloy-docs/frontend/model-resource-usage-guide.md +22 -6
- package/cabloy-docs/frontend/model-state-guide.md +12 -9
- package/cabloy-docs/frontend/module-scope.md +8 -8
- package/cabloy-docs/frontend/modules-and-suites.md +2 -1
- package/cabloy-docs/frontend/navigation-guards-guide.md +7 -0
- package/cabloy-docs/frontend/openapi-sdk-guide.md +12 -4
- package/cabloy-docs/frontend/page-guide.md +9 -9
- package/cabloy-docs/frontend/page-meta-guide.md +466 -0
- package/cabloy-docs/frontend/page-params-guide.md +3 -3
- package/cabloy-docs/frontend/page-query-guide.md +2 -2
- package/cabloy-docs/frontend/page-route-guide.md +6 -0
- package/cabloy-docs/frontend/permission-formscene-action-visibility-guide.md +263 -0
- package/cabloy-docs/frontend/quickstart.md +14 -2
- package/cabloy-docs/frontend/resource-entry-page-deep-dive.md +271 -0
- package/cabloy-docs/frontend/resource-list-page-deep-dive.md +279 -0
- package/cabloy-docs/frontend/rest-resource-source-reading-map.md +522 -0
- package/cabloy-docs/frontend/rest-resource-under-the-hood.md +622 -0
- package/cabloy-docs/frontend/root-behaviors-guide.md +282 -0
- package/cabloy-docs/frontend/route-alias-guide.md +6 -0
- package/cabloy-docs/frontend/router-stack-guide.md +229 -0
- package/cabloy-docs/frontend/router-tabs-introduction.md +26 -3
- package/cabloy-docs/frontend/router-tabs-layout-integration.md +367 -0
- package/cabloy-docs/frontend/router-tabs-mechanism.md +6 -0
- package/cabloy-docs/frontend/router-tabs-route-meta-cookbook.md +7 -0
- package/cabloy-docs/frontend/router-tabs-vs-stack.md +167 -0
- package/cabloy-docs/frontend/router-view-hosts-guide.md +450 -0
- package/cabloy-docs/frontend/server-data.md +2 -1
- package/cabloy-docs/frontend/system-startup-guide.md +2 -2
- package/cabloy-docs/frontend/table-action-visibility-permission-flow-guide.md +263 -0
- package/cabloy-docs/frontend/table-cell-cookbook.md +571 -0
- package/cabloy-docs/frontend/table-guide.md +373 -0
- package/cabloy-docs/frontend/table-resource-crud-cookbook.md +496 -0
- package/cabloy-docs/frontend/zova-app-guide.md +251 -0
- package/cabloy-docs/frontend/zova-form-source-reading-map.md +7 -9
- package/cabloy-docs/frontend/zova-form-under-the-hood.md +5 -0
- package/cabloy-docs/frontend/zova-router-under-the-hood.md +561 -0
- package/cabloy-docs/frontend/zova-source-reading-map.md +101 -7
- package/cabloy-docs/frontend/zova-table-controller-render-supplement.md +225 -0
- package/cabloy-docs/frontend/zova-table-source-reading-map.md +317 -0
- package/cabloy-docs/frontend/zova-table-under-the-hood.md +532 -0
- package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-debug-checklist.md +245 -0
- package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-source-reading-map.md +139 -0
- package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-verify-playbook.md +248 -0
- package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions.md +511 -0
- package/cabloy-docs/fullstack/contract-loop-playbook.md +8 -2
- package/cabloy-docs/fullstack/edition-collaboration-differences.md +6 -0
- package/cabloy-docs/fullstack/frontend-metadata-to-backend.md +181 -48
- package/cabloy-docs/fullstack/introduction.md +3 -0
- package/cabloy-docs/fullstack/openapi-to-sdk.md +116 -2
- package/cabloy-docs/fullstack/suites-and-modules.md +333 -0
- package/cabloy-docs/fullstack/tutorial-1-first-module.md +3 -0
- package/cabloy-docs/fullstack/tutorial-2-first-crud.md +4 -0
- package/cabloy-docs/fullstack/tutorial-3-frontend-metadata-sharing.md +4 -0
- package/cabloy-docs/fullstack/tutorial-4-custom-level-renderers.md +31 -19
- package/cabloy-docs/fullstack/tutorial-5-backend-contract-sharing.md +5 -0
- package/cabloy-docs/fullstack/tutorial-6-one-contract-four-uses.md +4 -0
- package/cabloy-docs/fullstack/tutorials-overview.md +1 -1
- package/cabloy-docs/reference/bean-scene-boilerplates.md +13 -13
- package/cabloy-docs/reference/package-map.md +4 -3
- package/package.json +1 -1
- package/vona/pnpm-lock.yaml +22 -258
- package/vona/src/suite/a-training/modules/training-student/package.json +53 -0
- package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +400 -0
- package/vona/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +18 -0
- package/vona/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
- package/vona/src/suite/a-training/modules/training-student/src/bean/meta.index.ts +12 -0
- package/vona/src/suite/a-training/modules/training-student/src/bean/meta.version.ts +21 -0
- package/vona/src/suite/a-training/modules/training-student/src/bean/ssrMenu.student.ts +29 -0
- package/vona/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +15 -0
- package/vona/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +15 -0
- package/vona/src/suite/a-training/modules/training-student/src/controller/student.ts +74 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentCreate.tsx +28 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectReq.tsx +44 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectRes.tsx +11 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectResItem.tsx +45 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentSummary.tsx +42 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentUpdate.tsx +28 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentView.tsx +25 -0
- package/vona/src/suite/a-training/modules/training-student/src/entity/student.tsx +84 -0
- package/vona/src/suite/a-training/modules/training-student/src/index.ts +2 -0
- package/vona/src/suite/a-training/modules/training-student/src/model/student.ts +10 -0
- package/vona/src/suite/a-training/modules/training-student/src/service/student.ts +57 -0
- package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +173 -0
- package/vona/src/suite/a-training/modules/training-student/tsconfig.build.json +11 -0
- package/vona/src/suite/a-training/modules/training-student/tsconfig.json +7 -0
- package/vona/src/suite/a-training/package.json +12 -0
- package/vona/src/suite/a-training/tsconfig.base.json +4 -0
- package/vona/src/suite/a-training/tsconfig.json +10 -0
- package/zova/packages-zova/zova/package.json +2 -2
- package/zova/pnpm-lock.yaml +423 -682
- package/zova/src/suite/a-demo/modules/demo-basic/src/page/toolOne/render.tsx +5 -3
- package/zova/src/suite/a-home/modules/home-login/src/page/login/render.tsx +5 -3
- package/zova/src/suite/a-training/modules/training-student/cli/openapi.config.ts +9 -0
- package/zova/src/suite/a-training/modules/training-student/package.json +57 -0
- package/zova/src/suite/a-training/modules/training-student/src/.metadata/component/formFieldLevel.ts +31 -0
- package/zova/src/suite/a-training/modules/training-student/src/.metadata/index.ts +258 -0
- package/zova/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +7 -0
- package/zova/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/baseURL.ts +5 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/index.ts +3 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +196 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +4146 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/trainingStudent.ts +151 -0
- package/zova/src/suite/a-training/modules/training-student/src/apiSchema/trainingStudent.ts +43 -0
- package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionDeleteForce.tsx +53 -0
- package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionSummary.tsx +56 -0
- package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.level.tsx +63 -0
- package/zova/src/suite/a-training/modules/training-student/src/component/formFieldLevel/controller.tsx +117 -0
- package/zova/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +9 -0
- package/zova/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +9 -0
- package/zova/src/suite/a-training/modules/training-student/src/index.ts +2 -0
- package/zova/src/suite/a-training/modules/training-student/src/model/student.ts +42 -0
- package/zova/src/suite/a-training/modules/training-student/tsconfig.build.json +13 -0
- package/zova/src/suite/a-training/modules/training-student/tsconfig.json +5 -0
- package/zova/src/suite/a-training/package.json +12 -0
- package/zova/src/suite/a-training/tsconfig.base.json +4 -0
- package/zova/src/suite/a-training/tsconfig.json +4 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/package.json +60 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/index.ts +137 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/locales.ts +7 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/this.ts +2 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/bean/behavior.appModal.tsx +260 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/config/config.ts +39 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/config/locale/en-us.ts +7 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/config/locale/zh-cn.ts +7 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/index.ts +4 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/lib/appModalItem.ts +16 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/lib/index.ts +1 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/monkey.ts +38 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/monkeySys.ts +14 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/service/appModal.ts +89 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/types/appModal.ts +52 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/src/types/index.ts +1 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/tsconfig.build.json +13 -0
- package/zova/src/suite/cabloy-basic/modules/basic-app/tsconfig.json +5 -0
- package/zova/src/suite/cabloy-basic/modules/basic-commands/package.json +6 -1
- package/zova/src/suite/cabloy-basic/modules/basic-commands/src/.metadata/index.ts +16 -0
- package/zova/src/suite/cabloy-basic/modules/basic-commands/src/bean/command.alert.tsx +8 -14
- package/zova/src/suite/cabloy-basic/modules/basic-commands/src/bean/command.confirm.tsx +10 -7
- package/zova/src/suite/cabloy-basic/modules/basic-commands/src/bean/command.prompt.tsx +30 -0
- package/zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockForm/controller.tsx +5 -3
- package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +29 -7
- package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/select/controller.tsx +34 -11
- package/zova/src/suite/cabloy-basic/modules/basic-table/package.json +6 -1
- package/zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionDelete.tsx +4 -2
- package/zova/src/suite/cabloy-basic/package.json +1 -0
- package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx +3 -3
- package/zova/src/suite-vendor/a-zova/modules/a-table/src/lib/tableCell.ts +1 -1
- 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
|