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