cabloy 5.1.61 → 5.1.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +42 -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 +19 -28
- 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 +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 +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 +406 -680
- 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,263 @@
|
|
|
1
|
+
# Table Action Visibility and Permission Flow Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how row and bulk action visibility works in current Cabloy Basic list pages.
|
|
4
|
+
|
|
5
|
+
Use this page when you want to understand:
|
|
6
|
+
|
|
7
|
+
- why a row action is visible or hidden
|
|
8
|
+
- why a bulk action is visible or hidden
|
|
9
|
+
- where table action permissions come from
|
|
10
|
+
- how row action and bulk action visibility differ
|
|
11
|
+
- how the list-page action path differs from the entry-page `formScene`-aware path
|
|
12
|
+
|
|
13
|
+
## Why this page exists
|
|
14
|
+
|
|
15
|
+
Several existing docs already explain nearby pieces:
|
|
16
|
+
|
|
17
|
+
- [Table Guide](/frontend/table-guide) and [Zova Table Under the Hood](/frontend/zova-table-under-the-hood) explain table runtime and rendering
|
|
18
|
+
- [Model Resource Owner Pattern](/frontend/model-resource-owner-pattern) explains `ModelResource` as the owner of permissions and schema
|
|
19
|
+
- [Permission, formScene, and Action Visibility Guide](/frontend/permission-formscene-action-visibility-guide) explains the entry-page scene-aware action path
|
|
20
|
+
|
|
21
|
+
What those pages do not isolate directly is the list-page row/bulk action visibility path.
|
|
22
|
+
|
|
23
|
+
That is the gap this page fills.
|
|
24
|
+
|
|
25
|
+
In the current Basic source, list-page row and bulk action visibility are permission-driven, but they do not add the entry-page `formScene` prefilter layer.
|
|
26
|
+
|
|
27
|
+
## The shortest accurate mental model
|
|
28
|
+
|
|
29
|
+
A practical mental model is:
|
|
30
|
+
|
|
31
|
+
1. `ModelResource.permissions` is the permission source for the current resource
|
|
32
|
+
2. `blockPage` publishes those permissions into the page render scope
|
|
33
|
+
3. `blockTable` passes that scope into `ZTable`
|
|
34
|
+
4. row action visibility is decided in the table-cell operations-row renderer through `$passport.checkPermission(...)`
|
|
35
|
+
5. bulk action visibility is decided in the bulk-toolbar block through `$passport.checkPermission(...)`
|
|
36
|
+
6. row and bulk list-page flows do not add the entry-page `formScene` visibility prefilter
|
|
37
|
+
|
|
38
|
+
That means current list-page action visibility is a permission-gating problem first, not a form-scene filtering problem.
|
|
39
|
+
|
|
40
|
+
## What this guide is not
|
|
41
|
+
|
|
42
|
+
This page is not a general permission guide for all frontend action surfaces.
|
|
43
|
+
|
|
44
|
+
It is specifically about current **list-page** action visibility.
|
|
45
|
+
|
|
46
|
+
It is also not a page-entry action guide. If your question is about entry-page scene-aware toolbar actions, read [Permission, formScene, and Action Visibility Guide](/frontend/permission-formscene-action-visibility-guide).
|
|
47
|
+
|
|
48
|
+
## Source-confirmed reading path
|
|
49
|
+
|
|
50
|
+
When reading this topic, use this order:
|
|
51
|
+
|
|
52
|
+
1. `zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockPage/controller.tsx`
|
|
53
|
+
2. `zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockTable/controller.tsx`
|
|
54
|
+
3. `zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockToolbarBulk/controller.tsx`
|
|
55
|
+
4. `zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionOperationsRow.tsx`
|
|
56
|
+
5. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/permissions.ts`
|
|
57
|
+
6. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/tableActionRow.ts`
|
|
58
|
+
7. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/tableActionBulk.ts`
|
|
59
|
+
8. optional contrast: `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx`
|
|
60
|
+
|
|
61
|
+
That order moves from permission source/context exposure, to row/bulk consumers, to permission-hint type contracts, and finally to the entry-page contrast.
|
|
62
|
+
|
|
63
|
+
## Visibility flow by surface
|
|
64
|
+
|
|
65
|
+
### 1. Permission source: `ModelResource.permissions`
|
|
66
|
+
|
|
67
|
+
The list-page permission source lives in:
|
|
68
|
+
|
|
69
|
+
```text
|
|
70
|
+
zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The current source confirms:
|
|
74
|
+
|
|
75
|
+
- `permissions` is computed from `this.$sdk.getPermissions(this.resource).data`
|
|
76
|
+
|
|
77
|
+
That means action visibility in list pages is grounded in resource-owned permissions, not in ad hoc page-local permission state.
|
|
78
|
+
|
|
79
|
+
### 2. `blockPage` exposes permissions into page scope
|
|
80
|
+
|
|
81
|
+
The deeper list runtime lives in:
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockPage/controller.tsx
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
This controller exposes `permissions` through the shared page CEL/render scope.
|
|
88
|
+
|
|
89
|
+
That matters because downstream blocks and table renders do not fetch permissions independently. They consume the permission surface prepared by the page runtime.
|
|
90
|
+
|
|
91
|
+
### 3. `blockTable` passes page scope into `ZTable`
|
|
92
|
+
|
|
93
|
+
The table bridge lives in:
|
|
94
|
+
|
|
95
|
+
```text
|
|
96
|
+
zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockTable/controller.tsx
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
This bridge passes:
|
|
100
|
+
|
|
101
|
+
- `data`
|
|
102
|
+
- `schemaRow`
|
|
103
|
+
- `tableScope`
|
|
104
|
+
|
|
105
|
+
into `ZTable`.
|
|
106
|
+
|
|
107
|
+
That means table-cell action visibility runs inside a render scope that already contains the page/resource permission surface.
|
|
108
|
+
|
|
109
|
+
## Row action visibility
|
|
110
|
+
|
|
111
|
+
### 4. Row actions are filtered in the operations-row cell bean
|
|
112
|
+
|
|
113
|
+
The key row-action file is:
|
|
114
|
+
|
|
115
|
+
```text
|
|
116
|
+
zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionOperationsRow.tsx
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
This bean handles row action visibility in two related phases:
|
|
120
|
+
|
|
121
|
+
- `checkVisible(...)`
|
|
122
|
+
- `render(...)`
|
|
123
|
+
|
|
124
|
+
#### `checkVisible(...)`
|
|
125
|
+
|
|
126
|
+
The cell bean:
|
|
127
|
+
|
|
128
|
+
- iterates configured actions
|
|
129
|
+
- calls `$passport.checkPermission(permissions, actionName, permissionHint)` for each one
|
|
130
|
+
- collects only visible render providers
|
|
131
|
+
- prepares those renders in advance
|
|
132
|
+
- returns visible only if at least one action survives
|
|
133
|
+
|
|
134
|
+
This means the row-action container itself can disappear when no actions remain visible.
|
|
135
|
+
|
|
136
|
+
#### `render(...)`
|
|
137
|
+
|
|
138
|
+
At render time, the bean again filters actions with:
|
|
139
|
+
|
|
140
|
+
- `$passport.checkPermission(permissions, actionName, permissionHint)`
|
|
141
|
+
|
|
142
|
+
Only surviving actions are rendered into the row action container.
|
|
143
|
+
|
|
144
|
+
This is the clearest source-confirmed row-action rule:
|
|
145
|
+
|
|
146
|
+
- row action visibility is permission-driven
|
|
147
|
+
- it is resolved in the table-cell operations-row bean
|
|
148
|
+
|
|
149
|
+
## Bulk action visibility
|
|
150
|
+
|
|
151
|
+
### 5. Bulk actions are filtered in the bulk-toolbar block
|
|
152
|
+
|
|
153
|
+
The key bulk-action file is:
|
|
154
|
+
|
|
155
|
+
```text
|
|
156
|
+
zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockToolbarBulk/controller.tsx
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
This block:
|
|
160
|
+
|
|
161
|
+
- iterates configured bulk actions
|
|
162
|
+
- reads `action.options?.permission`
|
|
163
|
+
- calls `$passport.checkPermission(this.permissions, actionName, permissionHint)`
|
|
164
|
+
- renders only the permitted actions
|
|
165
|
+
|
|
166
|
+
This is the clearest source-confirmed bulk-action rule:
|
|
167
|
+
|
|
168
|
+
- bulk action visibility is permission-driven
|
|
169
|
+
- it is resolved in the bulk-toolbar block
|
|
170
|
+
|
|
171
|
+
## Row action hints vs bulk action hints
|
|
172
|
+
|
|
173
|
+
The permission hint contracts live in:
|
|
174
|
+
|
|
175
|
+
```text
|
|
176
|
+
zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/permissions.ts
|
|
177
|
+
zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/tableActionRow.ts
|
|
178
|
+
zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/tableActionBulk.ts
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
The important source-confirmed difference is:
|
|
182
|
+
|
|
183
|
+
- `IPermissionHintTableActionRow` can carry row-style permission hint fields such as `formScene`
|
|
184
|
+
- `IPermissionHintTableActionBulk` does not carry `formScene`
|
|
185
|
+
|
|
186
|
+
This is a type-contract distinction, not only a docs convention.
|
|
187
|
+
|
|
188
|
+
## What row and bulk actions do not do in current list pages
|
|
189
|
+
|
|
190
|
+
A common confusion is to assume that because entry-page actions can use `formScene`, table row or bulk actions automatically use the same scene-aware filter.
|
|
191
|
+
|
|
192
|
+
That is **not** the current list-page rule.
|
|
193
|
+
|
|
194
|
+
In current Basic list pages:
|
|
195
|
+
|
|
196
|
+
- row and bulk action visibility rely on permission gating
|
|
197
|
+
- they do not add the entry-page `formScene` prefilter path
|
|
198
|
+
|
|
199
|
+
So even if some row-style hint types can carry `formScene`, the current list-page row/bulk runtime path documented here should be read as permission-gating first.
|
|
200
|
+
|
|
201
|
+
## Contrast with the entry-page action path
|
|
202
|
+
|
|
203
|
+
A useful contrast file is:
|
|
204
|
+
|
|
205
|
+
```text
|
|
206
|
+
zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
That entry-page action row:
|
|
210
|
+
|
|
211
|
+
- checks `permissionHint.formScene` first against `$$pageEntry.formMeta.formScene`
|
|
212
|
+
- then calls `$passport.checkPermission(...)`
|
|
213
|
+
|
|
214
|
+
That is a different rule from current list-page row/bulk visibility.
|
|
215
|
+
|
|
216
|
+
So the practical split is:
|
|
217
|
+
|
|
218
|
+
- **entry-page toolbar** = scene-aware visibility prefilter + permission check
|
|
219
|
+
- **list-page row/bulk actions** = permission check path only
|
|
220
|
+
|
|
221
|
+
## What bulk actions can and cannot express today
|
|
222
|
+
|
|
223
|
+
Current public Basic source supports this rule clearly:
|
|
224
|
+
|
|
225
|
+
- bulk actions can express permission hints through `IPermissionHintTableActionBulk`
|
|
226
|
+
- bulk actions do not currently carry `formScene`
|
|
227
|
+
- bulk visibility should therefore not be documented as scene-aware unless the type/runtime contract changes
|
|
228
|
+
|
|
229
|
+
This is the safest public rule to teach.
|
|
230
|
+
|
|
231
|
+
## Debugging checklist
|
|
232
|
+
|
|
233
|
+
If a list-page action is missing unexpectedly, ask:
|
|
234
|
+
|
|
235
|
+
1. does `ModelResource.permissions` contain the expected action grant?
|
|
236
|
+
2. is the page/table render scope exposing the expected `permissions`?
|
|
237
|
+
3. is the action name correct for the configured renderer/action?
|
|
238
|
+
4. is the permission hint aligned with the intended action semantics?
|
|
239
|
+
5. for row actions, is the operations-row cell bean actually resolving a visible renderer set?
|
|
240
|
+
6. for bulk actions, is the bulk toolbar reading the expected action config?
|
|
241
|
+
7. are you accidentally expecting entry-page `formScene` behavior in a list-page action surface?
|
|
242
|
+
|
|
243
|
+
## Where to read next
|
|
244
|
+
|
|
245
|
+
Use these next steps depending on your question:
|
|
246
|
+
|
|
247
|
+
- if you want the list-page runtime path that hosts these actions, read [Resource List Page Deep Dive](/frontend/resource-list-page-deep-dive)
|
|
248
|
+
- if you want the entry-page scene-aware action path, read [Permission, formScene, and Action Visibility Guide](/frontend/permission-formscene-action-visibility-guide)
|
|
249
|
+
- if you want the broader resource-owner permission surface, read [Model Resource Owner Pattern](/frontend/model-resource-owner-pattern)
|
|
250
|
+
- if you want table runtime internals, read [Zova Table Under the Hood](/frontend/zova-table-under-the-hood)
|
|
251
|
+
|
|
252
|
+
## Final takeaway
|
|
253
|
+
|
|
254
|
+
The most accurate current Basic rule for list-page actions is:
|
|
255
|
+
|
|
256
|
+
- `ModelResource.permissions` is the permission source
|
|
257
|
+
- row action visibility is resolved in `tableCell.actionOperationsRow.tsx`
|
|
258
|
+
- bulk action visibility is resolved in `blockToolbarBulk/controller.tsx`
|
|
259
|
+
- both use `$passport.checkPermission(...)`
|
|
260
|
+
- current list-page row/bulk flows do **not** add the entry-page `formScene` prefilter
|
|
261
|
+
- bulk action hints do not carry `formScene`
|
|
262
|
+
|
|
263
|
+
That is the source-confirmed `table row / bulk action visibility` path in the current Cabloy Basic frontend architecture.
|