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,450 @@
|
|
|
1
|
+
# Router View Hosts Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how router-view hosts work in Zova within the Cabloy monorepo.
|
|
4
|
+
|
|
5
|
+
Use this page after [Page Route Guide](/frontend/page-route-guide), [A-Router Guide](/frontend/a-router-guide), and [Zova Router Under the Hood](/frontend/zova-router-under-the-hood) when your next question is no longer “how is the route registered?” but “which routed host actually owns the page instance, keep-alive behavior, and workspace model?”.
|
|
6
|
+
|
|
7
|
+
Read this page together with:
|
|
8
|
+
|
|
9
|
+
- [Page Route Guide](/frontend/page-route-guide)
|
|
10
|
+
- [Zova Router Under the Hood](/frontend/zova-router-under-the-hood)
|
|
11
|
+
- [Router Tabs Introduction](/frontend/router-tabs-introduction)
|
|
12
|
+
- [Router Tabs vs Stack](/frontend/router-tabs-vs-stack)
|
|
13
|
+
- [Router Stack Guide](/frontend/router-stack-guide)
|
|
14
|
+
- [Router Tabs Mechanism](/frontend/router-tabs-mechanism)
|
|
15
|
+
- [Page Meta Guide](/frontend/page-meta-guide)
|
|
16
|
+
- [Router Tabs Layout Integration](/frontend/router-tabs-layout-integration)
|
|
17
|
+
- [Zova Source Reading Map](/frontend/zova-source-reading-map)
|
|
18
|
+
|
|
19
|
+
If you reached this page from the routing branch of [Zova Source Reading Map](/frontend/zova-source-reading-map), this is the next step after route registration and controller route-state injection.
|
|
20
|
+
|
|
21
|
+
> [!TIP]
|
|
22
|
+
> **Router ecosystem docs path**
|
|
23
|
+
>
|
|
24
|
+
> 1. **[Page Route Guide](/frontend/page-route-guide)** — learn the public route-record and layout surface
|
|
25
|
+
> 2. **[A-Router Guide](/frontend/a-router-guide)** — learn what the `a-router` package owns in the runtime
|
|
26
|
+
> 3. **[Zova Router Under the Hood](/frontend/zova-router-under-the-hood)** — learn how the core router runtime cooperates
|
|
27
|
+
> 4. **[Router View Hosts Guide](/frontend/router-view-hosts-guide)** — learn how routed pages are actually hosted
|
|
28
|
+
> 5. **[Router Tabs Overview](/frontend/router-tabs-overview)** — learn the business/workbench meaning of router tabs
|
|
29
|
+
> 6. **[Router Tabs Mechanism](/frontend/router-tabs-mechanism)** — learn the shared tabs model in code
|
|
30
|
+
> 7. **[Router Tabs Layout Integration](/frontend/router-tabs-layout-integration)** — learn how the current Basic layouts turn the shared model into a visible shell
|
|
31
|
+
> 8. **[Zova Source Reading Map](/frontend/zova-source-reading-map)** — learn which files to read next
|
|
32
|
+
>
|
|
33
|
+
> **You are here:** step 4.
|
|
34
|
+
> **Previous pages:** [Page Route Guide](/frontend/page-route-guide), [A-Router Guide](/frontend/a-router-guide), and [Zova Router Under the Hood](/frontend/zova-router-under-the-hood).
|
|
35
|
+
> **Next recommended pages:** [Router Tabs Overview](/frontend/router-tabs-overview), [Router Tabs Mechanism](/frontend/router-tabs-mechanism), [Page Meta Guide](/frontend/page-meta-guide), and [Router Tabs Layout Integration](/frontend/router-tabs-layout-integration).
|
|
36
|
+
|
|
37
|
+
## Why this page exists
|
|
38
|
+
|
|
39
|
+
After contributors understand route records, guards, aliases, and typed params/query, the next practical question is usually about the routed host itself.
|
|
40
|
+
|
|
41
|
+
Typical follow-up questions are:
|
|
42
|
+
|
|
43
|
+
- why does one routed page behave like a plain shell page while another behaves like a workbench tab?
|
|
44
|
+
- where does keep-alive inclusion come from?
|
|
45
|
+
- where do `tabKey`, `componentKey`, and page-level task state actually attach?
|
|
46
|
+
- what is the difference among `routerViewEmpty`, `routerViewTabs`, and `routerViewStack`?
|
|
47
|
+
|
|
48
|
+
This page answers those questions.
|
|
49
|
+
|
|
50
|
+
## The shortest accurate mental model
|
|
51
|
+
|
|
52
|
+
The shortest accurate model is:
|
|
53
|
+
|
|
54
|
+
1. `a-router` resolves the target route
|
|
55
|
+
2. the routed page enters a router-view host, not only a bare Vue Router outlet
|
|
56
|
+
3. the host decides whether the route is treated as plain output, a workbench tab, or a stack item
|
|
57
|
+
4. the host computes routed identity such as `tabKey`, `componentKey`, and keep-alive participation
|
|
58
|
+
5. the shared router bean calls host callbacks on forward/back navigation and page-meta updates
|
|
59
|
+
6. the active layout chooses which host component to render
|
|
60
|
+
|
|
61
|
+
That is why routed-page behavior in Zova is not only a route-record concern. It is also a host-selection concern.
|
|
62
|
+
|
|
63
|
+
## The public host entrypoints
|
|
64
|
+
|
|
65
|
+
The public wrapper components are:
|
|
66
|
+
|
|
67
|
+
- `ZRouterViewEmpty`
|
|
68
|
+
- `ZRouterViewTabs`
|
|
69
|
+
- `ZRouterViewStack`
|
|
70
|
+
|
|
71
|
+
Representative wrapper sources:
|
|
72
|
+
|
|
73
|
+
- `zova/src/suite-vendor/a-zova/modules/a-router/src/.metadata/component/routerViewEmpty.ts`
|
|
74
|
+
- `zova/src/suite-vendor/a-zova/modules/a-routertabs/src/.metadata/component/routerViewTabs.ts`
|
|
75
|
+
- `zova/src/suite-vendor/a-zova/modules/a-routerstack/src/.metadata/component/routerViewStack.ts`
|
|
76
|
+
|
|
77
|
+
These wrapper files matter for two reasons:
|
|
78
|
+
|
|
79
|
+
- they show that router-view hosts still enter the runtime through the normal `useController(...)` wrapper path
|
|
80
|
+
- they confirm that `controllerRef` exposes the controller instance of the host, not a generic DOM ref
|
|
81
|
+
|
|
82
|
+
So even at the routed-host level, Zova keeps the same controller-oriented component model.
|
|
83
|
+
|
|
84
|
+
## The shared contract: `BeanRouterViewBase`
|
|
85
|
+
|
|
86
|
+
The shared base host lives in:
|
|
87
|
+
|
|
88
|
+
```text
|
|
89
|
+
zova/src/suite-vendor/a-zova/modules/a-router/src/lib/routerViewBase.tsx
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
This is the core host contract for richer routed shells.
|
|
93
|
+
|
|
94
|
+
Its main responsibilities are:
|
|
95
|
+
|
|
96
|
+
- register itself on the bean host as `$$routerView`
|
|
97
|
+
- register and deregister itself with `$router`
|
|
98
|
+
- expose host callbacks for forward-route and back-route handling
|
|
99
|
+
- expose `setPageMeta(...)` for task-level page metadata updates
|
|
100
|
+
- wrap routed pages in `RouterView`
|
|
101
|
+
- wrap routed pages in `KeepAlive`
|
|
102
|
+
- set vnode `key` from the host-computed route meta
|
|
103
|
+
- inject the current page route into the routed vnode through host providers
|
|
104
|
+
|
|
105
|
+
A practical reading takeaway is:
|
|
106
|
+
|
|
107
|
+
- **a routed page enters a host controller first, then the host decides how the page instance participates in the shell**
|
|
108
|
+
|
|
109
|
+
## The route-meta contract for hosts
|
|
110
|
+
|
|
111
|
+
The shared host-level route-meta types live in:
|
|
112
|
+
|
|
113
|
+
```text
|
|
114
|
+
zova/src/suite-vendor/a-zova/modules/a-router/src/types/routerView.ts
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
The important records are:
|
|
118
|
+
|
|
119
|
+
- `IRouteViewRouteItem`
|
|
120
|
+
- `IRouteViewRouteMeta`
|
|
121
|
+
|
|
122
|
+
A compact interpretation is:
|
|
123
|
+
|
|
124
|
+
- `tabKey` = the host-level grouping identity
|
|
125
|
+
- `componentKey` = the page-instance identity
|
|
126
|
+
- `fullPath` = the concrete route visit
|
|
127
|
+
- `keepAlive` = whether that routed instance should participate in host keep-alive inclusion
|
|
128
|
+
|
|
129
|
+
This is the point where route state becomes host state.
|
|
130
|
+
|
|
131
|
+
## Host 1: `routerViewEmpty`
|
|
132
|
+
|
|
133
|
+
The minimal host controller lives in:
|
|
134
|
+
|
|
135
|
+
```text
|
|
136
|
+
zova/src/suite-vendor/a-zova/modules/a-router/src/component/routerViewEmpty/controller.tsx
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Zova-native role
|
|
140
|
+
|
|
141
|
+
`routerViewEmpty` is the minimal routed host.
|
|
142
|
+
|
|
143
|
+
It is for cases where the page should render directly without the richer tab/workspace model.
|
|
144
|
+
|
|
145
|
+
### Source-confirmed runtime behavior
|
|
146
|
+
|
|
147
|
+
This host overrides `render()` instead of using the base `BeanRouterViewBase.render()` pipeline.
|
|
148
|
+
|
|
149
|
+
That means it:
|
|
150
|
+
|
|
151
|
+
- renders a plain `RouterView`
|
|
152
|
+
- creates the routed vnode directly from `component.Component`
|
|
153
|
+
- injects the current page route provider
|
|
154
|
+
- does **not** use the base keep-alive inclusion flow
|
|
155
|
+
- does **not** ask a host model to compute `tabKey` or `componentKey`
|
|
156
|
+
|
|
157
|
+
A practical reading takeaway is:
|
|
158
|
+
|
|
159
|
+
- **`routerViewEmpty` is the lowest-friction routed host and the closest thing to a shell-minimal route outlet in Zova**
|
|
160
|
+
|
|
161
|
+
## Host 2: `routerViewTabs`
|
|
162
|
+
|
|
163
|
+
The tabs host controller lives in:
|
|
164
|
+
|
|
165
|
+
```text
|
|
166
|
+
zova/src/suite-vendor/a-zova/modules/a-routertabs/src/component/routerViewTabs/controller.tsx
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Its shared model lives in:
|
|
170
|
+
|
|
171
|
+
```text
|
|
172
|
+
zova/src/suite-vendor/a-zova/modules/a-routertabs/src/model/tabs.ts
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Zova-native role
|
|
176
|
+
|
|
177
|
+
`routerViewTabs` is the routed host for the workbench-style tabs model.
|
|
178
|
+
|
|
179
|
+
It does not invent a second routing system.
|
|
180
|
+
|
|
181
|
+
Instead it reinterprets normal route visits as:
|
|
182
|
+
|
|
183
|
+
- stable level-1 workspaces through `tabKey`
|
|
184
|
+
- level-2 routed page instances through `componentKey`
|
|
185
|
+
- task-level page presentation through `pageMeta`
|
|
186
|
+
- keep-alive participation through the tabs model
|
|
187
|
+
|
|
188
|
+
### Source-confirmed runtime behavior
|
|
189
|
+
|
|
190
|
+
The controller itself is intentionally thin.
|
|
191
|
+
|
|
192
|
+
It delegates these responsibilities to `ModelTabs`:
|
|
193
|
+
|
|
194
|
+
- `backRoute(...)`
|
|
195
|
+
- `forwardRoute(...)`
|
|
196
|
+
- `setPageMeta(...)`
|
|
197
|
+
- `prepareRouteMeta(...)`
|
|
198
|
+
- `keepAliveInclude`
|
|
199
|
+
|
|
200
|
+
That means the tabs host is really the shell-facing controller surface for the model, while `ModelTabs` is the real state owner.
|
|
201
|
+
|
|
202
|
+
### What `ModelTabs` actually owns
|
|
203
|
+
|
|
204
|
+
Inside `ModelTabs`, the main responsibilities are:
|
|
205
|
+
|
|
206
|
+
- keep the `tabs` array as the workbench-state owner
|
|
207
|
+
- track `tabKeyCurrent` and `componentKeyCurrent`
|
|
208
|
+
- compute `tabCurrent` and `tabCurrentIndex`
|
|
209
|
+
- compute `keepAliveInclude`
|
|
210
|
+
- load cached tab state when enabled
|
|
211
|
+
- add, update, activate, prune, and delete tabs and tab items
|
|
212
|
+
- update task-level `pageMeta`
|
|
213
|
+
- derive route-level host metadata from route meta and route identity
|
|
214
|
+
|
|
215
|
+
This is the main source-level fact about `a-routertabs`:
|
|
216
|
+
|
|
217
|
+
- **the workbench model is implemented as a model bean, not as ad hoc layout-local state**
|
|
218
|
+
|
|
219
|
+
### How route identity becomes workbench identity
|
|
220
|
+
|
|
221
|
+
`ModelTabs.prepareRouteMeta(route)` does four important things:
|
|
222
|
+
|
|
223
|
+
1. keeps `fullPath`
|
|
224
|
+
2. computes `componentKey`
|
|
225
|
+
3. computes `tabKey`
|
|
226
|
+
4. computes `keepAlive`
|
|
227
|
+
|
|
228
|
+
The key rules are:
|
|
229
|
+
|
|
230
|
+
- explicit `meta.componentKey` has highest priority
|
|
231
|
+
- otherwise a named route with `componentKeyMode: 'nameOnly'` reuses the route name
|
|
232
|
+
- otherwise the route path becomes the effective page-instance identity
|
|
233
|
+
- explicit `meta.tabKey` groups several route visits into one workspace
|
|
234
|
+
- if `meta.tabKey` is absent, the model falls back to `componentKey`
|
|
235
|
+
|
|
236
|
+
That is why [Router Tabs Route Meta Cookbook](/frontend/router-tabs-route-meta-cookbook) is really a host-behavior document as much as a route-meta document.
|
|
237
|
+
|
|
238
|
+
### Why page metadata matters here
|
|
239
|
+
|
|
240
|
+
`ModelTabs.updateTabItemPageMeta(...)` stores page-level task state such as:
|
|
241
|
+
|
|
242
|
+
- `pageTitle`
|
|
243
|
+
- `pageDirty`
|
|
244
|
+
- `formMeta`
|
|
245
|
+
|
|
246
|
+
This is how task-level routed state becomes visible in workbench UI.
|
|
247
|
+
|
|
248
|
+
In the current Basic source, the Admin layout uses this for task-row icon and title behavior such as dirty state and create/edit indicators.
|
|
249
|
+
|
|
250
|
+
### Current Cabloy Basic consumers
|
|
251
|
+
|
|
252
|
+
In the current public Cabloy Basic source, `routerViewTabs` is the actively used richer routed host.
|
|
253
|
+
|
|
254
|
+
Representative consumers:
|
|
255
|
+
|
|
256
|
+
- `zova/src/suite/a-home/modules/home-layoutadmin/src/component/layoutAdmin/controller.tsx`
|
|
257
|
+
- `zova/src/suite/a-home/modules/home-layoutadmin/src/component/layoutAdmin/render.tabs.tsx`
|
|
258
|
+
- `zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/controller.tsx`
|
|
259
|
+
- `zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.tabs.tsx`
|
|
260
|
+
|
|
261
|
+
The source-confirmed split is:
|
|
262
|
+
|
|
263
|
+
- Admin renders the two-level workbench meaning directly
|
|
264
|
+
- Web reuses the same `ModelTabs` state but presents the top level as a menu-like workspace surface
|
|
265
|
+
|
|
266
|
+
### Config-sensitive differences in current Basic source
|
|
267
|
+
|
|
268
|
+
Representative config sources:
|
|
269
|
+
|
|
270
|
+
- `zova/src/suite/a-home/modules/home-layoutadmin/src/config/config.ts`
|
|
271
|
+
- `zova/src/suite/a-home/modules/home-layoutweb/src/config/config.ts`
|
|
272
|
+
|
|
273
|
+
In the current Basic source:
|
|
274
|
+
|
|
275
|
+
- Admin uses `scene: ''`, `max: 6`, `maxItems: 3`, `cache: true`
|
|
276
|
+
- Web uses `scene: 'web'`, `max: 6`, `maxItems: 6`, `cache: false`
|
|
277
|
+
|
|
278
|
+
That means the shared tabs model is stable, but the layout can still choose different cache and density behavior.
|
|
279
|
+
|
|
280
|
+
## Host 3: `routerViewStack`
|
|
281
|
+
|
|
282
|
+
The stack host controller lives in:
|
|
283
|
+
|
|
284
|
+
```text
|
|
285
|
+
zova/src/suite-vendor/a-zova/modules/a-routerstack/src/component/routerViewStack/controller.tsx
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
Its shared model lives in:
|
|
289
|
+
|
|
290
|
+
```text
|
|
291
|
+
zova/src/suite-vendor/a-zova/modules/a-routerstack/src/model/stack.ts
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### Zova-native role
|
|
295
|
+
|
|
296
|
+
`routerViewStack` is the minimal richer host for stack-style routed caching.
|
|
297
|
+
|
|
298
|
+
Unlike `routerViewTabs`, it does not model a stable business workspace plus nested work items.
|
|
299
|
+
|
|
300
|
+
Instead it treats routed visits as a linear stack of page instances.
|
|
301
|
+
|
|
302
|
+
### Source-confirmed runtime behavior
|
|
303
|
+
|
|
304
|
+
The controller mirrors the tabs host shape, but with a smaller contract:
|
|
305
|
+
|
|
306
|
+
- `backRoute(...)` delegates to `ModelStack.backRoute(...)`
|
|
307
|
+
- `forwardRoute(...)` delegates to `ModelStack.forwardRoute(...)`
|
|
308
|
+
- `prepareRouteMeta(...)` delegates to `ModelStack.prepareRouteMeta(...)`
|
|
309
|
+
- `getKeepAliveInclude()` delegates to `ModelStack.keepAliveInclude`
|
|
310
|
+
|
|
311
|
+
There is no `setPageMeta(...)` override here.
|
|
312
|
+
|
|
313
|
+
That is an important difference from `routerViewTabs`.
|
|
314
|
+
|
|
315
|
+
### What `ModelStack` actually owns
|
|
316
|
+
|
|
317
|
+
Inside `ModelStack`, the main responsibilities are:
|
|
318
|
+
|
|
319
|
+
- keep the `tabs` array as a linear stack of routed instances
|
|
320
|
+
- compute `keepAliveInclude`
|
|
321
|
+
- add, update, delete, and prune stack items by recency
|
|
322
|
+
- map both `tabKey` and `componentKey` to `route.fullPath`
|
|
323
|
+
|
|
324
|
+
The crucial identity rule is:
|
|
325
|
+
|
|
326
|
+
```typescript
|
|
327
|
+
return { tabKey: fullPath, componentKey: fullPath, fullPath };
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
That means:
|
|
331
|
+
|
|
332
|
+
- each concrete route visit is its own stack item
|
|
333
|
+
- there is no level-1 workspace grouping
|
|
334
|
+
- there is no separate task-level page-meta model
|
|
335
|
+
- the host behaves more like a bounded stack of routed instances than a business workbench
|
|
336
|
+
|
|
337
|
+
### Practical interpretation
|
|
338
|
+
|
|
339
|
+
`routerViewStack` is useful when you want:
|
|
340
|
+
|
|
341
|
+
- routed keep-alive behavior
|
|
342
|
+
- per-visit identity
|
|
343
|
+
- simple pruning by recency
|
|
344
|
+
- no extra workbench grouping semantics
|
|
345
|
+
|
|
346
|
+
A practical reading takeaway is:
|
|
347
|
+
|
|
348
|
+
- **`a-routerstack` is a host-level cache/stack primitive, not a tabs/workspace mechanism**
|
|
349
|
+
|
|
350
|
+
If your next question is specifically about how a page author should update task-level title, dirty state, or form scene through `$router.setPageMeta(...)`, continue with [Page Meta Guide](/frontend/page-meta-guide).
|
|
351
|
+
|
|
352
|
+
### Current usage boundary in Cabloy Basic
|
|
353
|
+
|
|
354
|
+
In the current public Cabloy Basic source, there is no app-level layout consumer of `ZRouterViewStack` outside the vendor module itself.
|
|
355
|
+
|
|
356
|
+
That means the stack host is present as a reusable framework primitive, but the current public Basic layouts visibly consume `routerViewTabs` rather than `routerViewStack`.
|
|
357
|
+
|
|
358
|
+
This is a source-confirmed statement based on the current repo search surface, not a guarantee about all future editions or downstream apps.
|
|
359
|
+
|
|
360
|
+
## Empty vs tabs vs stack
|
|
361
|
+
|
|
362
|
+
A useful routing-host comparison is:
|
|
363
|
+
|
|
364
|
+
| Host | Main role | Identity model | Page-meta support | Current Basic consumer shape |
|
|
365
|
+
| ----------------- | ----------------------------- | ------------------------- | ---------------------------- | ------------------------------------------------------------ |
|
|
366
|
+
| `routerViewEmpty` | minimal routed host | no richer host model | no host-level page-meta flow | empty/minimal shell routing |
|
|
367
|
+
| `routerViewTabs` | workbench host | `tabKey` + `componentKey` | yes | Admin and Web layouts |
|
|
368
|
+
| `routerViewStack` | stack-style routed cache host | `fullPath` only | no | framework primitive, no current public Basic layout consumer |
|
|
369
|
+
|
|
370
|
+
## How to choose the right mental model while reading source
|
|
371
|
+
|
|
372
|
+
Use these questions first:
|
|
373
|
+
|
|
374
|
+
### When the page feels shell-minimal
|
|
375
|
+
|
|
376
|
+
Start with `routerViewEmpty`.
|
|
377
|
+
|
|
378
|
+
Ask:
|
|
379
|
+
|
|
380
|
+
- does this route only need plain routed output?
|
|
381
|
+
- is keep-alive or workspace state intentionally absent?
|
|
382
|
+
|
|
383
|
+
### When the page feels like part of a workbench
|
|
384
|
+
|
|
385
|
+
Start with `routerViewTabs` and `ModelTabs`.
|
|
386
|
+
|
|
387
|
+
Ask:
|
|
388
|
+
|
|
389
|
+
- does this route need stable workspace grouping?
|
|
390
|
+
- does it need several inner work items?
|
|
391
|
+
- does page-level dirty/title/form state matter visibly?
|
|
392
|
+
|
|
393
|
+
### When the page feels like a linear routed cache
|
|
394
|
+
|
|
395
|
+
Start with `routerViewStack` and `ModelStack`.
|
|
396
|
+
|
|
397
|
+
Ask:
|
|
398
|
+
|
|
399
|
+
- does each route visit stand alone?
|
|
400
|
+
- is fullPath-level identity enough?
|
|
401
|
+
- do I want pruning and keep-alive without the two-level workspace model?
|
|
402
|
+
|
|
403
|
+
## Suggested source-reading path
|
|
404
|
+
|
|
405
|
+
When the question is specifically about routed hosts, read these files in order:
|
|
406
|
+
|
|
407
|
+
1. `zova/src/suite-vendor/a-zova/modules/a-router/src/lib/routerViewBase.tsx`
|
|
408
|
+
2. `zova/src/suite-vendor/a-zova/modules/a-router/src/component/routerViewEmpty/controller.tsx`
|
|
409
|
+
3. `zova/src/suite-vendor/a-zova/modules/a-routertabs/src/component/routerViewTabs/controller.tsx`
|
|
410
|
+
4. `zova/src/suite-vendor/a-zova/modules/a-routertabs/src/model/tabs.ts`
|
|
411
|
+
5. `zova/src/suite-vendor/a-zova/modules/a-routerstack/src/component/routerViewStack/controller.tsx`
|
|
412
|
+
6. `zova/src/suite-vendor/a-zova/modules/a-routerstack/src/model/stack.ts`
|
|
413
|
+
7. the active layout controller/render pair that consumes the host you care about
|
|
414
|
+
|
|
415
|
+
In the current Basic source, the most important app-level consumers are:
|
|
416
|
+
|
|
417
|
+
- `home-layoutadmin`
|
|
418
|
+
- `home-layoutweb`
|
|
419
|
+
|
|
420
|
+
## Common mistakes to avoid
|
|
421
|
+
|
|
422
|
+
### Mistake 1: treating `RouterView` as the whole routed contract
|
|
423
|
+
|
|
424
|
+
In Zova, the routed host can add keep-alive, grouping, task-state, and shell-specific behavior on top of route matching.
|
|
425
|
+
|
|
426
|
+
### Mistake 2: assuming router tabs are only a UI widget
|
|
427
|
+
|
|
428
|
+
In Zova, `a-routertabs` is a routed host plus a shared workbench-state model.
|
|
429
|
+
|
|
430
|
+
### Mistake 3: assuming `a-routerstack` is just a smaller copy of `a-routertabs`
|
|
431
|
+
|
|
432
|
+
It is not.
|
|
433
|
+
|
|
434
|
+
`a-routerstack` uses a different identity model and does not carry the same page-meta and workspace semantics.
|
|
435
|
+
|
|
436
|
+
### Mistake 4: assuming current Basic layout usage defines the full framework contract
|
|
437
|
+
|
|
438
|
+
Current Basic source confirms active consumers for `routerViewTabs`, but `routerViewStack` still exists as a reusable framework host primitive even when the current public layouts do not use it.
|
|
439
|
+
|
|
440
|
+
## Edition note
|
|
441
|
+
|
|
442
|
+
This guide describes the shared routed-host architecture and the current public Cabloy Basic source.
|
|
443
|
+
|
|
444
|
+
That means the host contract is not limited to one visible Admin tab row. However, layout-level presentation and actual host selection can still vary by edition, flavor, or downstream app.
|
|
445
|
+
|
|
446
|
+
## Final takeaway
|
|
447
|
+
|
|
448
|
+
If [Zova Router Under the Hood](/frontend/zova-router-under-the-hood) explains how a route becomes routable, this page explains how that routed page is actually hosted after route resolution.
|
|
449
|
+
|
|
450
|
+
That host layer is where Zova distinguishes among plain routed output, workbench tabs, and stack-style routed caching.
|
|
@@ -58,7 +58,8 @@ A practical contract-consumption reading is:
|
|
|
58
58
|
|
|
59
59
|
- [OpenAPI Guide](/backend/openapi-guide) explains backend contract emission
|
|
60
60
|
- [Backend OpenAPI to Frontend SDK](/fullstack/openapi-to-sdk) explains the fullstack contract bridge
|
|
61
|
-
- [OpenAPI SDK Guide](/frontend/openapi-sdk-guide), [API Schema Guide](/frontend/api-schema-guide), and [SDK Guide](/frontend/sdk-guide) explain different frontend consumption layers
|
|
61
|
+
- [OpenAPI SDK Guide](/frontend/openapi-sdk-guide), [Generated Contract Consumption Specimen](/frontend/generated-contract-consumption-specimen), [API Schema Guide](/frontend/api-schema-guide), and [SDK Guide](/frontend/sdk-guide) explain different frontend consumption layers
|
|
62
|
+
- [A-OpenAPI Under the Hood](/frontend/a-openapi-under-the-hood) explains the lower-level runtime behind `$sdk`, bootstrap, permissions, and schema extraction
|
|
62
63
|
|
|
63
64
|
## Implementation checks for frontend data-loading changes
|
|
64
65
|
|
|
@@ -64,7 +64,7 @@ A module can provide system-level main lifecycle entrypoints.
|
|
|
64
64
|
Representative creation command:
|
|
65
65
|
|
|
66
66
|
```bash
|
|
67
|
-
npm run zova :init:mainSys
|
|
67
|
+
npm run zova :init:mainSys training-student
|
|
68
68
|
```
|
|
69
69
|
|
|
70
70
|
Representative pattern:
|
|
@@ -84,7 +84,7 @@ A module can also attach richer system lifecycle behavior through monkey-based h
|
|
|
84
84
|
Representative creation command:
|
|
85
85
|
|
|
86
86
|
```bash
|
|
87
|
-
npm run zova :init:monkeySys
|
|
87
|
+
npm run zova :init:monkeySys training-student
|
|
88
88
|
```
|
|
89
89
|
|
|
90
90
|
Representative pattern:
|