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,263 @@
|
|
|
1
|
+
# Permission, formScene, and Action Visibility Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how action visibility works in current Cabloy Basic entry pages when `formScene` participates in the decision.
|
|
4
|
+
|
|
5
|
+
Use this page when you want to understand:
|
|
6
|
+
|
|
7
|
+
- how `permissionHint.formScene` works
|
|
8
|
+
- how it interacts with `$$pageEntry.formMeta.formScene`
|
|
9
|
+
- how that differs from `$passport.checkPermission(...)`
|
|
10
|
+
- why some actions can be scene-gated while others cannot
|
|
11
|
+
- why bulk actions do not currently support `formScene`
|
|
12
|
+
|
|
13
|
+
## Why this page exists
|
|
14
|
+
|
|
15
|
+
Several existing docs already explain nearby pieces:
|
|
16
|
+
|
|
17
|
+
- [Form Scene to Page Meta Guide](/frontend/form-scene-to-page-meta-guide) explains how `formScene` becomes `formMeta`, then `pageMeta`
|
|
18
|
+
- [Page Meta Guide](/frontend/page-meta-guide) explains shell/task presentation
|
|
19
|
+
- [Model Resource Owner Pattern](/frontend/model-resource-owner-pattern) and related resource-model docs explain permissions as part of resource ownership
|
|
20
|
+
|
|
21
|
+
What those pages do not isolate directly is the specific runtime rule for entry-page action visibility.
|
|
22
|
+
|
|
23
|
+
That is the gap this page fills.
|
|
24
|
+
|
|
25
|
+
In the current Basic source, `formScene` participates in action visibility as a **UI visibility filter** layered in front of the normal permission authorization check.
|
|
26
|
+
|
|
27
|
+
## The shortest accurate mental model
|
|
28
|
+
|
|
29
|
+
A practical mental model is:
|
|
30
|
+
|
|
31
|
+
1. page-entry runtime decides the current `formScene`
|
|
32
|
+
2. `formMetaFromFormScene(...)` derives `formMeta`
|
|
33
|
+
3. `$$pageEntry.formMeta.formScene` becomes the current scene surface for entry-page blocks
|
|
34
|
+
4. `blockToolbarRow` reads `permissionHint.formScene`
|
|
35
|
+
5. if the current scene does not match, the action is hidden immediately
|
|
36
|
+
6. if the scene matches, `$passport.checkPermission(...)` still decides whether the action is allowed by permission rules
|
|
37
|
+
7. the action renders only if both checks pass
|
|
38
|
+
|
|
39
|
+
That means `formScene` is not itself a permission engine. It is a scene-aware visibility prefilter.
|
|
40
|
+
|
|
41
|
+
## What this guide is not
|
|
42
|
+
|
|
43
|
+
This page is not a general permission guide for every frontend action surface.
|
|
44
|
+
|
|
45
|
+
It is specifically about the current **entry-page** action visibility flow.
|
|
46
|
+
|
|
47
|
+
It is also not a guide to page-meta propagation. `pageMeta.formMeta` is part of the surrounding story, but the actual visibility authority for entry-page actions is the local page-entry runtime context.
|
|
48
|
+
|
|
49
|
+
## Source-confirmed reading path
|
|
50
|
+
|
|
51
|
+
When reading this topic, use this order:
|
|
52
|
+
|
|
53
|
+
1. `zova/src/suite-vendor/a-zova/modules/a-form/src/lib/utils.ts`
|
|
54
|
+
2. `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockPageEntry/controller.tsx`
|
|
55
|
+
3. `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx`
|
|
56
|
+
4. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/permissions.ts`
|
|
57
|
+
5. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/formActionRow.ts`
|
|
58
|
+
6. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/tableActionRow.ts`
|
|
59
|
+
7. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/tableActionBulk.ts`
|
|
60
|
+
8. optional comparison: `zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionOperationsRow.tsx`
|
|
61
|
+
|
|
62
|
+
That order moves from scene/meta translation, to page-entry runtime ownership, to action-row filtering, to permission-hint typing, and finally to the bulk-action limitation and row-action comparison.
|
|
63
|
+
|
|
64
|
+
## Visibility flow step by step
|
|
65
|
+
|
|
66
|
+
### 1. `formScene` becomes canonical runtime metadata
|
|
67
|
+
|
|
68
|
+
The canonical helper lives in:
|
|
69
|
+
|
|
70
|
+
```text
|
|
71
|
+
zova/src/suite-vendor/a-zova/modules/a-form/src/lib/utils.ts
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The current source confirms:
|
|
75
|
+
|
|
76
|
+
- `view` -> `formMode: 'view'`
|
|
77
|
+
- `create` -> `formMode: 'edit', editMode: 'create'`
|
|
78
|
+
- `edit` -> `formMode: 'edit', editMode: 'update'`
|
|
79
|
+
|
|
80
|
+
This matters because action visibility does not read an arbitrary raw string from anywhere in the app. It reads the current page-entry scene after that scene has already become part of the page-entry runtime metadata.
|
|
81
|
+
|
|
82
|
+
### 2. `blockPageEntry` exposes the current scene through `$$pageEntry`
|
|
83
|
+
|
|
84
|
+
The key entry-page runtime file is:
|
|
85
|
+
|
|
86
|
+
```text
|
|
87
|
+
zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockPageEntry/controller.tsx
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
This controller:
|
|
91
|
+
|
|
92
|
+
- resolves `formScene`
|
|
93
|
+
- computes `formMeta`
|
|
94
|
+
- builds the shared JSX render context
|
|
95
|
+
- exposes `$$pageEntry` into that context
|
|
96
|
+
|
|
97
|
+
That is the key boundary for action visibility:
|
|
98
|
+
|
|
99
|
+
- entry-page actions do not need to rediscover the current scene
|
|
100
|
+
- they can read it from `$$pageEntry.formMeta.formScene`
|
|
101
|
+
|
|
102
|
+
## 3. `blockToolbarRow` checks scene first, then permission
|
|
103
|
+
|
|
104
|
+
The most important source file for this guide is:
|
|
105
|
+
|
|
106
|
+
```text
|
|
107
|
+
zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Its action loop does two different checks:
|
|
111
|
+
|
|
112
|
+
1. `_checkFormScene(permissionHint)`
|
|
113
|
+
2. `$passport.checkPermission(...)`
|
|
114
|
+
|
|
115
|
+
The order matters.
|
|
116
|
+
|
|
117
|
+
### Scene prefilter
|
|
118
|
+
|
|
119
|
+
`_checkFormScene(...)`:
|
|
120
|
+
|
|
121
|
+
- reads `$$pageEntry.formMeta.formScene`
|
|
122
|
+
- reads `permissionHint?.formScene`
|
|
123
|
+
- accepts a single scene or an array of scenes
|
|
124
|
+
- treats no `formScene` hint as “all scenes”
|
|
125
|
+
|
|
126
|
+
If the scene does not match, the action does not continue into the permission check.
|
|
127
|
+
|
|
128
|
+
### Authorization check
|
|
129
|
+
|
|
130
|
+
Only after the scene passes does the controller call:
|
|
131
|
+
|
|
132
|
+
- `$passport.checkPermission(this.permissions, actionName, permissionHint)`
|
|
133
|
+
|
|
134
|
+
This is the critical source-confirmed distinction:
|
|
135
|
+
|
|
136
|
+
- **scene filtering** decides whether this action should even be considered in the current page-entry scene
|
|
137
|
+
- **permission checking** decides whether the user is allowed to perform it
|
|
138
|
+
|
|
139
|
+
## 4. What `permissionHint.formScene` really means
|
|
140
|
+
|
|
141
|
+
`permissionHint.formScene` should be read as:
|
|
142
|
+
|
|
143
|
+
- a UI visibility filter tied to the current page-entry scene
|
|
144
|
+
|
|
145
|
+
It should **not** be read as:
|
|
146
|
+
|
|
147
|
+
- a replacement for permission authorization
|
|
148
|
+
- a generic global permission-engine rule
|
|
149
|
+
- a page-meta-driven shell rule
|
|
150
|
+
|
|
151
|
+
A practical reading rule is:
|
|
152
|
+
|
|
153
|
+
- if the scene is wrong, hide the action
|
|
154
|
+
- if the scene is right, still run the real permission check
|
|
155
|
+
|
|
156
|
+
## 5. What the permission types confirm
|
|
157
|
+
|
|
158
|
+
The permission hint types live in:
|
|
159
|
+
|
|
160
|
+
```text
|
|
161
|
+
zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/permissions.ts
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
The important source-confirmed detail is:
|
|
165
|
+
|
|
166
|
+
- `IPermissionHintGeneral` can carry `formScene`
|
|
167
|
+
- `IPermissionHintTableActionRow` can carry `formScene`
|
|
168
|
+
- `IPermissionHintTableActionBulk` does **not** carry `formScene`
|
|
169
|
+
|
|
170
|
+
This matches the current runtime split:
|
|
171
|
+
|
|
172
|
+
- entry-page row/form action visibility can be scene-aware
|
|
173
|
+
- bulk-action visibility is not scene-aware in the same way today
|
|
174
|
+
|
|
175
|
+
## 6. Row/form action types vs bulk action types
|
|
176
|
+
|
|
177
|
+
The row/form action option types live in:
|
|
178
|
+
|
|
179
|
+
- `a-openapi/src/types/resource/formActionRow.ts`
|
|
180
|
+
- `a-openapi/src/types/resource/tableActionRow.ts`
|
|
181
|
+
|
|
182
|
+
They both use `permission?: IPermissionHintTableActionRow`.
|
|
183
|
+
|
|
184
|
+
That means row-style action definitions can express `formScene` in their permission hints.
|
|
185
|
+
|
|
186
|
+
By contrast, bulk action options live in:
|
|
187
|
+
|
|
188
|
+
- `a-openapi/src/types/resource/tableActionBulk.ts`
|
|
189
|
+
|
|
190
|
+
That type uses:
|
|
191
|
+
|
|
192
|
+
- `permission?: IPermissionHintTableActionBulk`
|
|
193
|
+
|
|
194
|
+
And that bulk hint type does not have `formScene`.
|
|
195
|
+
|
|
196
|
+
This is the clearest public type-level explanation for the current limitation.
|
|
197
|
+
|
|
198
|
+
## 7. Why bulk actions are different today
|
|
199
|
+
|
|
200
|
+
Bulk actions are typed around bulk permission hints, not row/form-scene hints.
|
|
201
|
+
|
|
202
|
+
So in current Basic source, you should not claim that bulk actions support scene-based filtering the same way entry-page toolbar actions do.
|
|
203
|
+
|
|
204
|
+
This is not only a docs distinction. It is a source-confirmed contract distinction.
|
|
205
|
+
|
|
206
|
+
## 8. Comparison with table row actions
|
|
207
|
+
|
|
208
|
+
A useful comparison file is:
|
|
209
|
+
|
|
210
|
+
```text
|
|
211
|
+
zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionOperationsRow.tsx
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
This table-row action surface uses permission checks, but it does not add the same local page-entry `formScene` prefilter path as `blockToolbarRow`.
|
|
215
|
+
|
|
216
|
+
That makes the current entry-page toolbar flow more specific:
|
|
217
|
+
|
|
218
|
+
- it is tied to entry-page runtime context
|
|
219
|
+
- it is not the universal rule for every action surface in the frontend
|
|
220
|
+
|
|
221
|
+
## 9. Boundary with page meta
|
|
222
|
+
|
|
223
|
+
A common confusion is to think that because `formMeta` also becomes part of page meta, page meta is the authority for action visibility.
|
|
224
|
+
|
|
225
|
+
That is not the current source-confirmed rule.
|
|
226
|
+
|
|
227
|
+
The better boundary is:
|
|
228
|
+
|
|
229
|
+
- `pageMeta.formMeta` is shell/task presentation state
|
|
230
|
+
- `$$pageEntry.formMeta.formScene` is the local page-entry runtime surface that `blockToolbarRow` reads for scene filtering
|
|
231
|
+
|
|
232
|
+
So for action visibility, the local page-entry context is the authority.
|
|
233
|
+
|
|
234
|
+
## 10. Bulk-action limitation
|
|
235
|
+
|
|
236
|
+
The current public Basic source supports this rule clearly:
|
|
237
|
+
|
|
238
|
+
- row/form action hints can be scene-aware
|
|
239
|
+
- bulk action hints are not scene-aware today
|
|
240
|
+
|
|
241
|
+
If a contributor needs scene-aware bulk visibility, they should first verify whether the type and runtime contracts are being extended, rather than assuming the row-action rule applies automatically.
|
|
242
|
+
|
|
243
|
+
## Where to read next
|
|
244
|
+
|
|
245
|
+
Use these next steps depending on your question:
|
|
246
|
+
|
|
247
|
+
- if you want the full `formScene -> formMeta -> pageMeta -> shell/tab` bridge, read [Form Scene to Page Meta Guide](/frontend/form-scene-to-page-meta-guide)
|
|
248
|
+
- if you want the broader entry-page runtime path, read [Resource Entry Page Deep Dive](/frontend/resource-entry-page-deep-dive)
|
|
249
|
+
- if you want the list-page row/bulk contrast, read [Table Action Visibility and Permission Flow Guide](/frontend/table-action-visibility-permission-flow-guide)
|
|
250
|
+
- if you want shell/task presentation semantics, read [Page Meta Guide](/frontend/page-meta-guide)
|
|
251
|
+
- if you want the underlying resource permission/model context, read [Model Resource Owner Pattern](/frontend/model-resource-owner-pattern)
|
|
252
|
+
|
|
253
|
+
## Final takeaway
|
|
254
|
+
|
|
255
|
+
The most accurate rule for current Cabloy Basic entry-page action visibility is:
|
|
256
|
+
|
|
257
|
+
- `permissionHint.formScene` is a scene-aware visibility prefilter
|
|
258
|
+
- `$$pageEntry.formMeta.formScene` is the current scene source
|
|
259
|
+
- `$passport.checkPermission(...)` is still the actual authorization check
|
|
260
|
+
- the action renders only if both layers pass
|
|
261
|
+
- bulk actions do not currently carry `formScene` in their permission hints
|
|
262
|
+
|
|
263
|
+
That is the source-confirmed `permission / formScene / action visibility` path in the current Basic frontend architecture.
|
|
@@ -127,8 +127,10 @@ This is why route metadata, guards, aliases, and theme/header/menu behavior shou
|
|
|
127
127
|
Read together with:
|
|
128
128
|
|
|
129
129
|
- [Page Route Guide](/frontend/page-route-guide)
|
|
130
|
-
- [Navigation Guards Guide](/frontend/navigation-guards-guide)
|
|
131
130
|
- [Route Alias Guide](/frontend/route-alias-guide)
|
|
131
|
+
- [Navigation Guards Guide](/frontend/navigation-guards-guide)
|
|
132
|
+
- [Zova Router Under the Hood](/frontend/zova-router-under-the-hood)
|
|
133
|
+
- [Router View Hosts Guide](/frontend/router-view-hosts-guide)
|
|
132
134
|
- [Theme Guide](/frontend/theme-guide)
|
|
133
135
|
|
|
134
136
|
## Step 6: reach the first routed page
|
|
@@ -150,6 +152,8 @@ Read next:
|
|
|
150
152
|
- [Frontend CLI](/frontend/cli)
|
|
151
153
|
- [Page Guide](/frontend/page-guide)
|
|
152
154
|
- [Page Route Guide](/frontend/page-route-guide)
|
|
155
|
+
- [Zova Router Under the Hood](/frontend/zova-router-under-the-hood)
|
|
156
|
+
- [Router View Hosts Guide](/frontend/router-view-hosts-guide)
|
|
153
157
|
|
|
154
158
|
## Step 7: understand menu and CLI ergonomics
|
|
155
159
|
|
|
@@ -173,6 +177,8 @@ Read next:
|
|
|
173
177
|
- [Frontend Scripts](/frontend/scripts)
|
|
174
178
|
- [Environment and Config Guide](/frontend/environment-config-guide)
|
|
175
179
|
- [Page Route Guide](/frontend/page-route-guide)
|
|
180
|
+
- [Zova Router Under the Hood](/frontend/zova-router-under-the-hood)
|
|
181
|
+
- [Router View Hosts Guide](/frontend/router-view-hosts-guide)
|
|
176
182
|
- [Theme Guide](/frontend/theme-guide)
|
|
177
183
|
|
|
178
184
|
### I want to understand startup and routing
|
|
@@ -180,14 +186,20 @@ Read next:
|
|
|
180
186
|
- [System Startup Guide](/frontend/system-startup-guide)
|
|
181
187
|
- [App Startup Guide](/frontend/app-startup-guide)
|
|
182
188
|
- [Page Route Guide](/frontend/page-route-guide)
|
|
183
|
-
- [Navigation Guards Guide](/frontend/navigation-guards-guide)
|
|
184
189
|
- [Route Alias Guide](/frontend/route-alias-guide)
|
|
190
|
+
- [Navigation Guards Guide](/frontend/navigation-guards-guide)
|
|
191
|
+
- [Zova Router Under the Hood](/frontend/zova-router-under-the-hood)
|
|
192
|
+
- [Router View Hosts Guide](/frontend/router-view-hosts-guide)
|
|
193
|
+
- [Router Tabs Introduction](/frontend/router-tabs-introduction)
|
|
194
|
+
- [Router Tabs Layout Integration](/frontend/router-tabs-layout-integration)
|
|
185
195
|
|
|
186
196
|
### I want to create my first page
|
|
187
197
|
|
|
188
198
|
- [Frontend CLI](/frontend/cli)
|
|
189
199
|
- [Page Guide](/frontend/page-guide)
|
|
190
200
|
- [Page Route Guide](/frontend/page-route-guide)
|
|
201
|
+
- [Zova Router Under the Hood](/frontend/zova-router-under-the-hood)
|
|
202
|
+
- [Router View Hosts Guide](/frontend/router-view-hosts-guide)
|
|
191
203
|
|
|
192
204
|
### I need edition-sensitive guidance
|
|
193
205
|
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# Resource Entry Page Deep Dive
|
|
2
|
+
|
|
3
|
+
This guide explains the runtime path of a resource entry page in Zova through the current public Cabloy Basic source.
|
|
4
|
+
|
|
5
|
+
Use this page when you want to understand:
|
|
6
|
+
|
|
7
|
+
- how a `/rest/resource/...` entry route becomes a working entry page
|
|
8
|
+
- where the thin `rest-resource` page shell stops
|
|
9
|
+
- how `basic-pageentry` takes over the deeper entry runtime
|
|
10
|
+
- where `blockForm` and `blockToolbarRow` fit into that runtime
|
|
11
|
+
- how submit flow and page-meta updates connect back to the routed shell
|
|
12
|
+
|
|
13
|
+
## Why this page exists
|
|
14
|
+
|
|
15
|
+
Several existing docs already explain important parts of the story:
|
|
16
|
+
|
|
17
|
+
- [Generated Contract Consumption: Entry Branch](/frontend/generated-contract-consumption-entry-branch) explains the consumer-side handoff before the deeper runtime begins
|
|
18
|
+
- [Rest Resource Under the Hood](/frontend/rest-resource-under-the-hood) explains the module-level runtime bridge
|
|
19
|
+
- [Rest Resource Source Reading Map](/frontend/rest-resource-source-reading-map) explains the shortest file path into the module
|
|
20
|
+
- [Form Guide](/frontend/form-guide) and [Zova Form Under the Hood](/frontend/zova-form-under-the-hood) explain the form runtime
|
|
21
|
+
- [Form Scene to Page Meta Guide](/frontend/form-scene-to-page-meta-guide) explains the cross-layer `formScene -> formMeta -> pageMeta` chain
|
|
22
|
+
|
|
23
|
+
What those pages do not isolate directly is the one cohesive entry-page runtime path from route entry into the deeper Basic form/page runtime.
|
|
24
|
+
|
|
25
|
+
That is the gap this page fills.
|
|
26
|
+
|
|
27
|
+
## The shortest accurate mental model
|
|
28
|
+
|
|
29
|
+
A practical mental model is:
|
|
30
|
+
|
|
31
|
+
1. `rest-resource` declares generic resource entry routes
|
|
32
|
+
2. generated page wrappers bind those routes to `ControllerPageEntry`
|
|
33
|
+
3. `ControllerPageEntry` is a thin shell that resolves `resource`, `id`, and `formScene`
|
|
34
|
+
4. that shell derives `formMeta`, loads `formSchema`, and renders `formSchema.rest.blocks`
|
|
35
|
+
5. those blocks usually enter `basic-pageentry:blockPageEntry`
|
|
36
|
+
6. `blockPageEntry` becomes the deeper runtime owner for `ModelResource`, `formData`, submit flow, and page-meta updates
|
|
37
|
+
7. `blockForm` bridges into `ZForm`
|
|
38
|
+
8. `blockToolbarRow` renders the action row from the shared page-entry render context
|
|
39
|
+
|
|
40
|
+
That means the entry page is not “one big page controller that does everything.” It is a route-shell plus downstream reusable block runtime.
|
|
41
|
+
|
|
42
|
+
This page focuses only on the entry-page branch. For the broader module-level shell-to-runtime map shared by both list and entry pages, keep [Rest Resource Source Reading Map](/frontend/rest-resource-source-reading-map) as the general reference.
|
|
43
|
+
|
|
44
|
+
## Source-confirmed reading path
|
|
45
|
+
|
|
46
|
+
When reading this topic, use this order:
|
|
47
|
+
|
|
48
|
+
1. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/routes.ts`
|
|
49
|
+
2. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/page/entry.ts`
|
|
50
|
+
3. `zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/page/entry/controller.tsx`
|
|
51
|
+
4. `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/.metadata/index.ts`
|
|
52
|
+
5. `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockPageEntry/controller.tsx`
|
|
53
|
+
6. `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockForm/controller.tsx`
|
|
54
|
+
7. `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx`
|
|
55
|
+
|
|
56
|
+
That order moves from public route surface, to route wrapper, to resource entry shell, to Basic block registry, to the real entry-page runtime owner, then to the form bridge and action row.
|
|
57
|
+
|
|
58
|
+
## Runtime path by layer
|
|
59
|
+
|
|
60
|
+
### 1. Route entry
|
|
61
|
+
|
|
62
|
+
The public route surface lives in:
|
|
63
|
+
|
|
64
|
+
```text
|
|
65
|
+
zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/routes.ts
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The entry routes are:
|
|
69
|
+
|
|
70
|
+
- `:resource/create`
|
|
71
|
+
- `:resource/:id/:formScene?`
|
|
72
|
+
|
|
73
|
+
This already shows the public entry-page contract:
|
|
74
|
+
|
|
75
|
+
- resource identity comes from the route
|
|
76
|
+
- row identity comes from `id`
|
|
77
|
+
- scene can come explicitly from `formScene`, or later fall back by runtime rule
|
|
78
|
+
|
|
79
|
+
The shared `tabKey(route)` also shows that entry pages stay grouped under one resource-oriented workspace rather than creating a brand-new workspace per row.
|
|
80
|
+
|
|
81
|
+
### 2. Generated page wrapper
|
|
82
|
+
|
|
83
|
+
The route component wrapper lives in:
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/page/entry.ts
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
This file is thin but important.
|
|
90
|
+
|
|
91
|
+
It shows that the page does not enter runtime through ad hoc local setup code. Instead, it enters the standard Zova page-controller path through:
|
|
92
|
+
|
|
93
|
+
- `createZovaComponentPage(ControllerPageEntry, ...)`
|
|
94
|
+
|
|
95
|
+
That means the route entry is still controller-oriented from the beginning.
|
|
96
|
+
|
|
97
|
+
### 3. Thin `rest-resource` entry shell
|
|
98
|
+
|
|
99
|
+
The actual entry shell lives in:
|
|
100
|
+
|
|
101
|
+
```text
|
|
102
|
+
zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/page/entry/controller.tsx
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Its main jobs are:
|
|
106
|
+
|
|
107
|
+
- resolve `resource`
|
|
108
|
+
- resolve `entryId`
|
|
109
|
+
- resolve `formScene`
|
|
110
|
+
- derive `formMeta`
|
|
111
|
+
- resolve `formProvider`
|
|
112
|
+
- resolve `formSchema`
|
|
113
|
+
- autoload form API schemas
|
|
114
|
+
- render `formSchema?.rest?.blocks`
|
|
115
|
+
|
|
116
|
+
This is the first key architectural boundary:
|
|
117
|
+
|
|
118
|
+
- `ControllerPageEntry` is a **thin shell**
|
|
119
|
+
- it does not own the whole entry runtime by itself
|
|
120
|
+
|
|
121
|
+
Its role is to interpret route context, resolve resource/form schema state, and let schema-defined blocks take over the deeper behavior.
|
|
122
|
+
|
|
123
|
+
### 4. `basic-pageentry` block registry
|
|
124
|
+
|
|
125
|
+
The Basic block registry lives in:
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
zova/src/suite/cabloy-basic/modules/basic-pageentry/src/.metadata/index.ts
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
This file shows the reusable entry-page runtime surface exported by the module:
|
|
132
|
+
|
|
133
|
+
- `basic-pageentry:blockPageEntry`
|
|
134
|
+
- `basic-pageentry:blockForm`
|
|
135
|
+
- `basic-pageentry:blockToolbarRow`
|
|
136
|
+
|
|
137
|
+
That matters because the deeper entry-page behavior is not hidden inside one giant page file.
|
|
138
|
+
|
|
139
|
+
It is split into reusable controller-backed blocks.
|
|
140
|
+
|
|
141
|
+
### 5. `blockPageEntry` becomes the deeper runtime owner
|
|
142
|
+
|
|
143
|
+
The most important current Basic file is:
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockPageEntry/controller.tsx
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
This is the deeper entry runtime owner.
|
|
150
|
+
|
|
151
|
+
Its main jobs are:
|
|
152
|
+
|
|
153
|
+
- resolve selector-backed `ModelResource`
|
|
154
|
+
- derive `formMeta` and `schemaScene`
|
|
155
|
+
- derive `formProvider`, `formSchema`, and `formData`
|
|
156
|
+
- prepare the shared JSX render context
|
|
157
|
+
- autoload view/query data
|
|
158
|
+
- own submit flow through `submitData(...)`
|
|
159
|
+
- update page meta through `setPageMeta(...)`
|
|
160
|
+
- expose `$$pageEntry` into the render context for downstream blocks
|
|
161
|
+
|
|
162
|
+
This is the second key architectural boundary:
|
|
163
|
+
|
|
164
|
+
- the route shell chooses the resource/scene context
|
|
165
|
+
- `blockPageEntry` owns the deeper entry-page runtime once blocks are rendered
|
|
166
|
+
|
|
167
|
+
### 6. `blockForm` bridges into `ZForm`
|
|
168
|
+
|
|
169
|
+
The form bridge lives in:
|
|
170
|
+
|
|
171
|
+
```text
|
|
172
|
+
zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockForm/controller.tsx
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
This controller does not re-derive entry-page state.
|
|
176
|
+
|
|
177
|
+
Instead, it consumes `$$pageEntry` from the host render context and passes the canonical page-entry-owned values into `ZForm`, including:
|
|
178
|
+
|
|
179
|
+
- `data`
|
|
180
|
+
- `schema`
|
|
181
|
+
- `schemaScene`
|
|
182
|
+
- `formMeta`
|
|
183
|
+
- `formProvider`
|
|
184
|
+
- `formScope`
|
|
185
|
+
- submit callback
|
|
186
|
+
- change callback
|
|
187
|
+
|
|
188
|
+
This is the clearest source-confirmed proof that `blockForm` is a bridge, not the main owner of entry-page orchestration.
|
|
189
|
+
|
|
190
|
+
### 7. `blockToolbarRow` renders the action row
|
|
191
|
+
|
|
192
|
+
The action row lives in:
|
|
193
|
+
|
|
194
|
+
```text
|
|
195
|
+
zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Its role is to consume the same `$$pageEntry` render context and render action buttons based on:
|
|
199
|
+
|
|
200
|
+
- current permissions
|
|
201
|
+
- current `formScene`
|
|
202
|
+
- action render definitions
|
|
203
|
+
|
|
204
|
+
This is important because it shows that action visibility and entry-page state stay attached to the same host context, instead of being recomputed independently by unrelated components.
|
|
205
|
+
|
|
206
|
+
## The shared handoff model
|
|
207
|
+
|
|
208
|
+
A useful rule is:
|
|
209
|
+
|
|
210
|
+
- the route shell resolves context
|
|
211
|
+
- schema blocks choose which entry-page runtime pieces should appear
|
|
212
|
+
- `blockPageEntry` becomes the shared host runtime owner
|
|
213
|
+
- `blockForm` and `blockToolbarRow` are specialized consumers of that host-owned context
|
|
214
|
+
|
|
215
|
+
That means the shared handoff is through `$$pageEntry`, not through scattered local state.
|
|
216
|
+
|
|
217
|
+
## Submit flow and page-meta flow
|
|
218
|
+
|
|
219
|
+
The entry runtime also connects cleanly to the wider shell/task model.
|
|
220
|
+
|
|
221
|
+
Inside `blockPageEntry`:
|
|
222
|
+
|
|
223
|
+
- data loading initializes page state
|
|
224
|
+
- submit flow delegates to `ModelResource` mutation logic
|
|
225
|
+
- `setPageMeta(...)` updates the routed shell title / dirty / form-scene state
|
|
226
|
+
|
|
227
|
+
This is why the entry-page runtime should be read together with [Form Scene to Page Meta Guide](/frontend/form-scene-to-page-meta-guide) and [Page Meta Guide](/frontend/page-meta-guide).
|
|
228
|
+
|
|
229
|
+
## What this guide does not re-explain
|
|
230
|
+
|
|
231
|
+
This page does **not** fully re-explain:
|
|
232
|
+
|
|
233
|
+
- the internals of `ZForm` itself -> see [Zova Form Under the Hood](/frontend/zova-form-under-the-hood)
|
|
234
|
+
- the full `formScene -> formMeta -> pageMeta` bridge -> see [Form Scene to Page Meta Guide](/frontend/form-scene-to-page-meta-guide)
|
|
235
|
+
- the routed-shell host mechanics -> see [Router Tabs Mechanism](/frontend/router-tabs-mechanism)
|
|
236
|
+
|
|
237
|
+
Its job is only to explain how the entry page runtime is assembled across route shell, Basic blocks, and shared host context.
|
|
238
|
+
|
|
239
|
+
## Debugging checklist
|
|
240
|
+
|
|
241
|
+
If a resource entry page behaves unexpectedly, ask:
|
|
242
|
+
|
|
243
|
+
1. is the route resolving the expected `resource`, `id`, and `formScene`?
|
|
244
|
+
2. is `ControllerPageEntry` loading the expected `formSchema.rest.blocks`?
|
|
245
|
+
3. is the expected `basic-pageentry:*` block actually present in the schema?
|
|
246
|
+
4. is `blockPageEntry` resolving the expected `ModelResource` selector state?
|
|
247
|
+
5. is `blockForm` receiving the correct `schemaScene`, `formMeta`, and `formData`?
|
|
248
|
+
6. is `blockToolbarRow` consuming the expected `$$pageEntry` context?
|
|
249
|
+
7. is submit/page-meta flow failing in `blockPageEntry`, rather than in the outer route shell?
|
|
250
|
+
|
|
251
|
+
## Where to read next
|
|
252
|
+
|
|
253
|
+
Use these next steps depending on your question:
|
|
254
|
+
|
|
255
|
+
- if you want the resource module bridge: [Rest Resource Under the Hood](/frontend/rest-resource-under-the-hood)
|
|
256
|
+
- if you want the shortest source map: [Rest Resource Source Reading Map](/frontend/rest-resource-source-reading-map)
|
|
257
|
+
- if you want the form runtime branch: [Zova Form Under the Hood](/frontend/zova-form-under-the-hood)
|
|
258
|
+
- if you want the `formScene -> formMeta -> pageMeta` chain: [Form Scene to Page Meta Guide](/frontend/form-scene-to-page-meta-guide)
|
|
259
|
+
- if you want action visibility rules: [Permission, formScene, and Action Visibility Guide](/frontend/permission-formscene-action-visibility-guide)
|
|
260
|
+
|
|
261
|
+
## Final takeaway
|
|
262
|
+
|
|
263
|
+
The most accurate way to read a resource entry page in the current Basic frontend is:
|
|
264
|
+
|
|
265
|
+
- `rest-resource` entry page is the thin route shell
|
|
266
|
+
- schema-defined blocks choose the deeper runtime pieces
|
|
267
|
+
- `basic-pageentry:blockPageEntry` owns the real entry runtime
|
|
268
|
+
- `blockForm` and `blockToolbarRow` consume the same shared host context
|
|
269
|
+
- submit flow and page-meta flow live in that deeper runtime layer
|
|
270
|
+
|
|
271
|
+
That is the source-confirmed entry-page runtime path in the current Cabloy Basic frontend architecture.
|