cabloy 5.1.60 → 5.1.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/.claude/hooks/contract-loop-gate.ts +296 -0
  2. package/.claude/settings.json +16 -0
  3. package/.claude/skills/cabloy-backend-scaffold/SKILL.md +2 -0
  4. package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -0
  5. package/.claude/skills/cabloy-contract-loop/SKILL.md +89 -16
  6. package/.claude/skills/cabloy-contract-loop/references/contract-loop-map.md +102 -14
  7. package/.claude/skills/cabloy-contract-loop/references/resource-custom-state-pattern.md +4 -0
  8. package/.claude/skills/cabloy-contract-loop/references/verification-checklist.md +32 -14
  9. package/.claude/skills/cabloy-domain-planning/SKILL.md +212 -0
  10. package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +13 -0
  11. package/.claude/skills/cabloy-frontend-scaffold/references/follow-up-checklist.md +2 -0
  12. package/.claude/skills/cabloy-module-removal/SKILL.md +144 -0
  13. package/.claude/skills/cabloy-resource-field-update/SKILL.md +7 -0
  14. package/.claude/skills/cabloy-zova-source-reading/SKILL.md +221 -0
  15. package/.claude/skills/cabloy-zova-source-reading/references/analysis-modes.md +91 -0
  16. package/.claude/skills/cabloy-zova-source-reading/references/core-reading-paths.md +117 -0
  17. package/CHANGELOG.md +64 -0
  18. package/CLAUDE.md +11 -0
  19. package/cabloy-docs/.vitepress/config.mjs +197 -5
  20. package/cabloy-docs/ai/cli-to-skill-map.md +7 -0
  21. package/cabloy-docs/ai/docs-skills-rules-mapping.md +22 -0
  22. package/cabloy-docs/ai/future-skill-roadmap.md +12 -7
  23. package/cabloy-docs/ai/introduction.md +1 -0
  24. package/cabloy-docs/ai/playbook-backend-module.md +6 -0
  25. package/cabloy-docs/ai/playbook-module-removal.md +164 -0
  26. package/cabloy-docs/ai/skills.md +12 -0
  27. package/cabloy-docs/backend/backend-contract-emission-output-inspection.md +189 -0
  28. package/cabloy-docs/backend/backend-contract-emission-source-reading-map.md +160 -0
  29. package/cabloy-docs/backend/backend-contract-emission-specimen.md +170 -0
  30. package/cabloy-docs/backend/backend-resource-module-contract-chain.md +323 -0
  31. package/cabloy-docs/backend/backend-source-reading-debug-checklist.md +173 -0
  32. package/cabloy-docs/backend/backend-source-reading-roadmap.md +129 -0
  33. package/cabloy-docs/backend/backend-source-reading-verify-playbook.md +166 -0
  34. package/cabloy-docs/backend/bean-scene-authoring.md +4 -4
  35. package/cabloy-docs/backend/broadcast-guide.md +3 -3
  36. package/cabloy-docs/backend/cli.md +20 -11
  37. package/cabloy-docs/backend/config-guide.md +4 -4
  38. package/cabloy-docs/backend/controller-aop-guide.md +10 -10
  39. package/cabloy-docs/backend/controller-guide.md +12 -2
  40. package/cabloy-docs/backend/crud-workflow.md +7 -3
  41. package/cabloy-docs/backend/dto-guide.md +18 -2
  42. package/cabloy-docs/backend/dto-infer-generation.md +201 -25
  43. package/cabloy-docs/backend/election-guide.md +2 -2
  44. package/cabloy-docs/backend/entity-guide.md +30 -3
  45. package/cabloy-docs/backend/error-guide.md +3 -3
  46. package/cabloy-docs/backend/event-guide.md +4 -4
  47. package/cabloy-docs/backend/external-aop-guide.md +2 -2
  48. package/cabloy-docs/backend/field-indexes.md +9 -3
  49. package/cabloy-docs/backend/foundation.md +8 -8
  50. package/cabloy-docs/backend/i18n-guide.md +6 -6
  51. package/cabloy-docs/backend/internal-aop-guide.md +2 -2
  52. package/cabloy-docs/backend/introduction.md +15 -0
  53. package/cabloy-docs/backend/migration-and-changes.md +3 -3
  54. package/cabloy-docs/backend/model-guide.md +16 -6
  55. package/cabloy-docs/backend/openapi-guide.md +3 -0
  56. package/cabloy-docs/backend/queue-guide.md +3 -3
  57. package/cabloy-docs/backend/redlock-guide.md +2 -2
  58. package/cabloy-docs/backend/schedule-guide.md +2 -2
  59. package/cabloy-docs/backend/scripts.md +8 -0
  60. package/cabloy-docs/backend/serialization-guide.md +12 -2
  61. package/cabloy-docs/backend/service-guide.md +18 -9
  62. package/cabloy-docs/backend/startup-guide.md +5 -5
  63. package/cabloy-docs/backend/status-guide.md +271 -0
  64. package/cabloy-docs/backend/unit-testing.md +3 -3
  65. package/cabloy-docs/backend/vona-source-reading-map.md +157 -0
  66. package/cabloy-docs/backend/websocket-protocol-guide.md +5 -5
  67. package/cabloy-docs/backend/websocket-usage-guide.md +15 -8
  68. package/cabloy-docs/frontend/a-model-under-the-hood.md +281 -0
  69. package/cabloy-docs/frontend/a-openapi-under-the-hood.md +248 -0
  70. package/cabloy-docs/frontend/a-router-guide.md +307 -0
  71. package/cabloy-docs/frontend/api-guide.md +6 -4
  72. package/cabloy-docs/frontend/api-schema-guide.md +1 -0
  73. package/cabloy-docs/frontend/app-startup-guide.md +7 -4
  74. package/cabloy-docs/frontend/bean-scene-authoring.md +3 -1
  75. package/cabloy-docs/frontend/behavior-guide.md +16 -16
  76. package/cabloy-docs/frontend/cli.md +14 -2
  77. package/cabloy-docs/frontend/command-scene-authoring.md +504 -0
  78. package/cabloy-docs/frontend/component-guide.md +5 -5
  79. package/cabloy-docs/frontend/component-props-guide.md +1 -1
  80. package/cabloy-docs/frontend/component-v-model-guide.md +2 -2
  81. package/cabloy-docs/frontend/design-principles.md +6 -0
  82. package/cabloy-docs/frontend/fetch-interceptor-guide.md +440 -0
  83. package/cabloy-docs/frontend/filter-query-select-data-flow-guide.md +260 -0
  84. package/cabloy-docs/frontend/form-guide.md +786 -0
  85. package/cabloy-docs/frontend/form-scene-to-page-meta-guide.md +303 -0
  86. package/cabloy-docs/frontend/foundation.md +33 -0
  87. package/cabloy-docs/frontend/frontend-source-reading-roadmap.md +249 -0
  88. package/cabloy-docs/frontend/generated-contract-consumption-debug-checklist.md +190 -0
  89. package/cabloy-docs/frontend/generated-contract-consumption-entry-branch.md +205 -0
  90. package/cabloy-docs/frontend/generated-contract-consumption-list-branch.md +157 -0
  91. package/cabloy-docs/frontend/generated-contract-consumption-specimen.md +203 -0
  92. package/cabloy-docs/frontend/generated-contract-consumption-verify-playbook.md +189 -0
  93. package/cabloy-docs/frontend/generic-component-guide.md +1 -1
  94. package/cabloy-docs/frontend/introduction.md +38 -5
  95. package/cabloy-docs/frontend/ioc-and-beans.md +6 -0
  96. package/cabloy-docs/frontend/mock-guide.md +1 -0
  97. package/cabloy-docs/frontend/model-architecture.md +288 -39
  98. package/cabloy-docs/frontend/model-resource-best-practices.md +379 -0
  99. package/cabloy-docs/frontend/model-resource-cookbook.md +508 -0
  100. package/cabloy-docs/frontend/model-resource-internals-deep-dive.md +238 -0
  101. package/cabloy-docs/frontend/model-resource-owner-pattern.md +402 -0
  102. package/cabloy-docs/frontend/model-resource-usage-guide.md +334 -0
  103. package/cabloy-docs/frontend/model-state-guide.md +371 -15
  104. package/cabloy-docs/frontend/module-scope.md +8 -8
  105. package/cabloy-docs/frontend/modules-and-suites.md +2 -1
  106. package/cabloy-docs/frontend/navigation-guards-guide.md +7 -0
  107. package/cabloy-docs/frontend/openapi-sdk-guide.md +17 -6
  108. package/cabloy-docs/frontend/page-guide.md +15 -9
  109. package/cabloy-docs/frontend/page-meta-guide.md +466 -0
  110. package/cabloy-docs/frontend/page-params-guide.md +3 -3
  111. package/cabloy-docs/frontend/page-query-guide.md +2 -2
  112. package/cabloy-docs/frontend/page-route-guide.md +6 -0
  113. package/cabloy-docs/frontend/permission-formscene-action-visibility-guide.md +263 -0
  114. package/cabloy-docs/frontend/quickstart.md +18 -2
  115. package/cabloy-docs/frontend/reading-zova-for-vue-developers.md +266 -0
  116. package/cabloy-docs/frontend/resource-entry-page-deep-dive.md +271 -0
  117. package/cabloy-docs/frontend/resource-list-page-deep-dive.md +279 -0
  118. package/cabloy-docs/frontend/rest-resource-source-reading-map.md +522 -0
  119. package/cabloy-docs/frontend/rest-resource-under-the-hood.md +622 -0
  120. package/cabloy-docs/frontend/root-behaviors-guide.md +282 -0
  121. package/cabloy-docs/frontend/route-alias-guide.md +6 -0
  122. package/cabloy-docs/frontend/router-stack-guide.md +229 -0
  123. package/cabloy-docs/frontend/router-tabs-introduction.md +26 -3
  124. package/cabloy-docs/frontend/router-tabs-layout-integration.md +367 -0
  125. package/cabloy-docs/frontend/router-tabs-mechanism.md +6 -0
  126. package/cabloy-docs/frontend/router-tabs-route-meta-cookbook.md +7 -0
  127. package/cabloy-docs/frontend/router-tabs-vs-stack.md +167 -0
  128. package/cabloy-docs/frontend/router-view-hosts-guide.md +450 -0
  129. package/cabloy-docs/frontend/server-data.md +4 -1
  130. package/cabloy-docs/frontend/system-startup-guide.md +2 -2
  131. package/cabloy-docs/frontend/table-action-visibility-permission-flow-guide.md +263 -0
  132. package/cabloy-docs/frontend/table-cell-cookbook.md +568 -0
  133. package/cabloy-docs/frontend/table-guide.md +373 -0
  134. package/cabloy-docs/frontend/table-resource-crud-cookbook.md +496 -0
  135. package/cabloy-docs/frontend/zova-app-guide.md +251 -0
  136. package/cabloy-docs/frontend/zova-form-source-reading-map.md +293 -0
  137. package/cabloy-docs/frontend/zova-form-under-the-hood.md +561 -0
  138. package/cabloy-docs/frontend/zova-reactivity-under-the-hood.md +320 -0
  139. package/cabloy-docs/frontend/zova-router-under-the-hood.md +561 -0
  140. package/cabloy-docs/frontend/zova-source-reading-map.md +421 -0
  141. package/cabloy-docs/frontend/zova-table-controller-render-supplement.md +225 -0
  142. package/cabloy-docs/frontend/zova-table-source-reading-map.md +317 -0
  143. package/cabloy-docs/frontend/zova-table-under-the-hood.md +532 -0
  144. package/cabloy-docs/frontend/zova-vs-vue3-comparison.md +308 -0
  145. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-debug-checklist.md +245 -0
  146. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-source-reading-map.md +139 -0
  147. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-verify-playbook.md +248 -0
  148. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions.md +511 -0
  149. package/cabloy-docs/fullstack/contract-loop-playbook.md +356 -0
  150. package/cabloy-docs/fullstack/edition-collaboration-differences.md +6 -0
  151. package/cabloy-docs/fullstack/frontend-metadata-to-backend.md +199 -23
  152. package/cabloy-docs/fullstack/introduction.md +15 -1
  153. package/cabloy-docs/fullstack/openapi-to-sdk.md +135 -11
  154. package/cabloy-docs/fullstack/suites-and-modules.md +333 -0
  155. package/cabloy-docs/fullstack/tutorial-1-first-module.md +3 -0
  156. package/cabloy-docs/fullstack/tutorial-2-first-crud.md +4 -0
  157. package/cabloy-docs/fullstack/tutorial-3-frontend-metadata-sharing.md +6 -2
  158. package/cabloy-docs/fullstack/tutorial-4-custom-level-renderers.md +60 -23
  159. package/cabloy-docs/fullstack/tutorial-5-backend-contract-sharing.md +14 -7
  160. package/cabloy-docs/fullstack/tutorial-6-one-contract-four-uses.md +6 -0
  161. package/cabloy-docs/fullstack/tutorials-overview.md +17 -4
  162. package/cabloy-docs/reference/bean-scene-boilerplates.md +15 -13
  163. package/cabloy-docs/reference/package-map.md +4 -3
  164. package/package.json +2 -1
  165. package/scripts/init.ts +2 -18
  166. package/scripts/initTestData.ts +25 -0
  167. package/scripts/upgrade.ts +17 -2
  168. package/vona/pnpm-lock.yaml +48 -194
  169. package/vona/src/suite/a-training/modules/training-student/package.json +53 -0
  170. package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +400 -0
  171. package/vona/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +18 -0
  172. package/vona/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
  173. package/vona/src/suite/a-training/modules/training-student/src/bean/meta.index.ts +12 -0
  174. package/vona/src/suite/a-training/modules/training-student/src/bean/meta.version.ts +21 -0
  175. package/vona/src/suite/a-training/modules/training-student/src/bean/ssrMenu.student.ts +29 -0
  176. package/vona/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +15 -0
  177. package/vona/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +15 -0
  178. package/vona/src/suite/a-training/modules/training-student/src/controller/student.ts +74 -0
  179. package/vona/src/suite/a-training/modules/training-student/src/dto/studentCreate.tsx +28 -0
  180. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectReq.tsx +44 -0
  181. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectRes.tsx +11 -0
  182. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectResItem.tsx +45 -0
  183. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSummary.tsx +42 -0
  184. package/vona/src/suite/a-training/modules/training-student/src/dto/studentUpdate.tsx +28 -0
  185. package/vona/src/suite/a-training/modules/training-student/src/dto/studentView.tsx +25 -0
  186. package/vona/src/suite/a-training/modules/training-student/src/entity/student.tsx +84 -0
  187. package/vona/src/suite/a-training/modules/training-student/src/index.ts +2 -0
  188. package/vona/src/suite/a-training/modules/training-student/src/model/student.ts +10 -0
  189. package/vona/src/suite/a-training/modules/training-student/src/service/student.ts +57 -0
  190. package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +173 -0
  191. package/vona/src/suite/a-training/modules/training-student/tsconfig.build.json +11 -0
  192. package/vona/src/suite/a-training/modules/training-student/tsconfig.json +7 -0
  193. package/vona/src/suite/a-training/package.json +12 -0
  194. package/vona/src/suite/a-training/tsconfig.base.json +4 -0
  195. package/vona/src/suite/a-training/tsconfig.json +10 -0
  196. package/zova/packages-cli/cli/package.json +2 -2
  197. package/zova/packages-cli/cli-set-front/cli/templates/openapi/config/boilerplate/module/openapi.config.ts +6 -1
  198. package/zova/packages-cli/cli-set-front/package.json +1 -1
  199. package/zova/packages-cli/cli-set-front/src/lib/bean/cli.openapi.generate.ts +34 -4
  200. package/zova/packages-zova/zova/package.json +2 -2
  201. package/zova/pnpm-lock.yaml +416 -690
  202. package/zova/src/suite/a-training/modules/training-student/cli/openapi.config.ts +9 -0
  203. package/zova/src/suite/a-training/modules/training-student/package.json +52 -0
  204. package/zova/src/suite/a-training/modules/training-student/src/.metadata/component/formFieldLevel.ts +31 -0
  205. package/zova/src/suite/a-training/modules/training-student/src/.metadata/index.ts +258 -0
  206. package/zova/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +7 -0
  207. package/zova/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
  208. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/baseURL.ts +5 -0
  209. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/index.ts +3 -0
  210. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +196 -0
  211. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +4146 -0
  212. package/zova/src/suite/a-training/modules/training-student/src/api/trainingStudent.ts +151 -0
  213. package/zova/src/suite/a-training/modules/training-student/src/apiSchema/trainingStudent.ts +43 -0
  214. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionDeleteForce.tsx +51 -0
  215. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionSummary.tsx +56 -0
  216. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.level.tsx +63 -0
  217. package/zova/src/suite/a-training/modules/training-student/src/component/formFieldLevel/controller.tsx +117 -0
  218. package/zova/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +9 -0
  219. package/zova/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +9 -0
  220. package/zova/src/suite/a-training/modules/training-student/src/index.ts +2 -0
  221. package/zova/src/suite/a-training/modules/training-student/src/model/student.ts +42 -0
  222. package/zova/src/suite/a-training/modules/training-student/tsconfig.build.json +13 -0
  223. package/zova/src/suite/a-training/modules/training-student/tsconfig.json +5 -0
  224. package/zova/src/suite/a-training/package.json +12 -0
  225. package/zova/src/suite/a-training/tsconfig.base.json +4 -0
  226. package/zova/src/suite/a-training/tsconfig.json +4 -0
  227. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +29 -7
  228. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/select/controller.tsx +34 -11
  229. package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
  230. package/zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx +3 -3
  231. package/zova/src/suite-vendor/a-zova/modules/a-table/src/lib/tableCell.ts +1 -1
  232. package/zova/src/suite-vendor/a-zova/package.json +2 -2
@@ -0,0 +1,151 @@
1
+ import type { IApiActionOptions } from 'zova-module-a-api';
2
+
3
+ import { Api, BeanApiBase } from 'zova-module-a-api';
4
+
5
+ import type { components, paths } from './openapi/index.js';
6
+
7
+ import { OpenApiBaseURL } from './openapi/index.js';
8
+
9
+ /** TrainingStudent_select */
10
+ export const ApiApiTrainingStudentselectPath = '/api/training/student';
11
+ export type ApiApiTrainingStudentselectPath = '/api/training/student';
12
+ export type ApiApiTrainingStudentselectMethod = 'get';
13
+ export type ApiApiTrainingStudentselectRequestQuery =
14
+ paths[ApiApiTrainingStudentselectPath][ApiApiTrainingStudentselectMethod]['parameters']['query'];
15
+ export type ApiApiTrainingStudentselectResponseBody =
16
+ paths[ApiApiTrainingStudentselectPath][ApiApiTrainingStudentselectMethod]['responses']['200']['content']['application/json']['data'];
17
+
18
+ /** TrainingStudent_create */
19
+ export const ApiApiTrainingStudentcreatePath = '/api/training/student';
20
+ export type ApiApiTrainingStudentcreatePath = '/api/training/student';
21
+ export type ApiApiTrainingStudentcreateMethod = 'post';
22
+ export type ApiApiTrainingStudentcreateRequestBody =
23
+ components['schemas']['training-student.dto.studentCreate'];
24
+ export type ApiApiTrainingStudentcreateResponseBody =
25
+ paths[ApiApiTrainingStudentcreatePath][ApiApiTrainingStudentcreateMethod]['responses']['200']['content']['application/json']['data'];
26
+
27
+ /** TrainingStudent_view */
28
+ export const ApiApiTrainingStudentviewPath = '/api/training/student/{id}';
29
+ export type ApiApiTrainingStudentviewPath = '/api/training/student/{id}';
30
+ export type ApiApiTrainingStudentviewMethod = 'get';
31
+ export type ApiApiTrainingStudentviewRequestParams =
32
+ paths[ApiApiTrainingStudentviewPath][ApiApiTrainingStudentviewMethod]['parameters']['path'];
33
+ export type ApiApiTrainingStudentviewResponseBody =
34
+ paths[ApiApiTrainingStudentviewPath][ApiApiTrainingStudentviewMethod]['responses']['200']['content']['application/json']['data'];
35
+
36
+ /** TrainingStudent_delete */
37
+ export const ApiApiTrainingStudentdeletePath = '/api/training/student/{id}';
38
+ export type ApiApiTrainingStudentdeletePath = '/api/training/student/{id}';
39
+ export type ApiApiTrainingStudentdeleteMethod = 'delete';
40
+ export type ApiApiTrainingStudentdeleteRequestParams =
41
+ paths[ApiApiTrainingStudentdeletePath][ApiApiTrainingStudentdeleteMethod]['parameters']['path'];
42
+ export type ApiApiTrainingStudentdeleteResponseBody =
43
+ paths[ApiApiTrainingStudentdeletePath][ApiApiTrainingStudentdeleteMethod]['responses']['200']['content']['application/json']['data'];
44
+
45
+ /** TrainingStudent_update */
46
+ export const ApiApiTrainingStudentupdatePath = '/api/training/student/{id}';
47
+ export type ApiApiTrainingStudentupdatePath = '/api/training/student/{id}';
48
+ export type ApiApiTrainingStudentupdateMethod = 'patch';
49
+ export type ApiApiTrainingStudentupdateRequestParams =
50
+ paths[ApiApiTrainingStudentupdatePath][ApiApiTrainingStudentupdateMethod]['parameters']['path'];
51
+ export type ApiApiTrainingStudentupdateRequestBody =
52
+ components['schemas']['training-student.dto.studentUpdate'];
53
+ export type ApiApiTrainingStudentupdateResponseBody =
54
+ paths[ApiApiTrainingStudentupdatePath][ApiApiTrainingStudentupdateMethod]['responses']['200']['content']['application/json']['data'];
55
+
56
+ /** TrainingStudent_summary */
57
+ export const ApiApiTrainingStudentsummaryPath = '/api/training/student/summary/{id}';
58
+ export type ApiApiTrainingStudentsummaryPath = '/api/training/student/summary/{id}';
59
+ export type ApiApiTrainingStudentsummaryMethod = 'get';
60
+ export type ApiApiTrainingStudentsummaryRequestParams =
61
+ paths[ApiApiTrainingStudentsummaryPath][ApiApiTrainingStudentsummaryMethod]['parameters']['path'];
62
+ export type ApiApiTrainingStudentsummaryResponseBody =
63
+ paths[ApiApiTrainingStudentsummaryPath][ApiApiTrainingStudentsummaryMethod]['responses']['200']['content']['application/json']['data'];
64
+
65
+ /** TrainingStudent_deleteForce */
66
+ export const ApiApiTrainingStudentdeleteForcePath = '/api/training/student/deleteForce/{id}';
67
+ export type ApiApiTrainingStudentdeleteForcePath = '/api/training/student/deleteForce/{id}';
68
+ export type ApiApiTrainingStudentdeleteForceMethod = 'delete';
69
+ export type ApiApiTrainingStudentdeleteForceRequestParams =
70
+ paths[ApiApiTrainingStudentdeleteForcePath][ApiApiTrainingStudentdeleteForceMethod]['parameters']['path'];
71
+ export type ApiApiTrainingStudentdeleteForceResponseBody =
72
+ paths[ApiApiTrainingStudentdeleteForcePath][ApiApiTrainingStudentdeleteForceMethod]['responses']['200']['content']['application/json']['data'];
73
+
74
+ @Api()
75
+ export class ApiTrainingStudent extends BeanApiBase {
76
+ select(
77
+ options?: {
78
+ query?: ApiApiTrainingStudentselectRequestQuery;
79
+ } & IApiActionOptions,
80
+ ) {
81
+ return this.$fetch.get<any, ApiApiTrainingStudentselectResponseBody>(
82
+ ApiApiTrainingStudentselectPath,
83
+ this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
84
+ );
85
+ }
86
+
87
+ create(body: ApiApiTrainingStudentcreateRequestBody, options?: IApiActionOptions) {
88
+ return this.$fetch.post<any, ApiApiTrainingStudentcreateResponseBody>(
89
+ ApiApiTrainingStudentcreatePath,
90
+ body,
91
+ this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
92
+ );
93
+ }
94
+
95
+ view(
96
+ options: {
97
+ params: ApiApiTrainingStudentviewRequestParams;
98
+ } & IApiActionOptions,
99
+ ) {
100
+ return this.$fetch.get<any, ApiApiTrainingStudentviewResponseBody>(
101
+ this.$pathTranslate(ApiApiTrainingStudentviewPath, options.params),
102
+ this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
103
+ );
104
+ }
105
+
106
+ delete(
107
+ options: {
108
+ params: ApiApiTrainingStudentdeleteRequestParams;
109
+ } & IApiActionOptions,
110
+ ) {
111
+ return this.$fetch.delete<any, ApiApiTrainingStudentdeleteResponseBody>(
112
+ this.$pathTranslate(ApiApiTrainingStudentdeletePath, options.params),
113
+ this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
114
+ );
115
+ }
116
+
117
+ update(
118
+ body: ApiApiTrainingStudentupdateRequestBody,
119
+ options: {
120
+ params: ApiApiTrainingStudentupdateRequestParams;
121
+ } & IApiActionOptions,
122
+ ) {
123
+ return this.$fetch.patch<any, ApiApiTrainingStudentupdateResponseBody>(
124
+ this.$pathTranslate(ApiApiTrainingStudentupdatePath, options.params),
125
+ body,
126
+ this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
127
+ );
128
+ }
129
+
130
+ summary(
131
+ options: {
132
+ params: ApiApiTrainingStudentsummaryRequestParams;
133
+ } & IApiActionOptions,
134
+ ) {
135
+ return this.$fetch.get<any, ApiApiTrainingStudentsummaryResponseBody>(
136
+ this.$pathTranslate(ApiApiTrainingStudentsummaryPath, options.params),
137
+ this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
138
+ );
139
+ }
140
+
141
+ deleteForce(
142
+ options: {
143
+ params: ApiApiTrainingStudentdeleteForceRequestParams;
144
+ } & IApiActionOptions,
145
+ ) {
146
+ return this.$fetch.delete<any, ApiApiTrainingStudentdeleteForceResponseBody>(
147
+ this.$pathTranslate(ApiApiTrainingStudentdeleteForcePath, options.params),
148
+ this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
149
+ );
150
+ }
151
+ }
@@ -0,0 +1,43 @@
1
+ import { BeanBase } from 'zova';
2
+ import { ApiSchema, IApiSchemaOptions } from 'zova-module-a-api';
3
+
4
+ import {
5
+ ApiApiTrainingStudentselectPath,
6
+ ApiApiTrainingStudentcreatePath,
7
+ ApiApiTrainingStudentviewPath,
8
+ ApiApiTrainingStudentdeletePath,
9
+ ApiApiTrainingStudentupdatePath,
10
+ ApiApiTrainingStudentsummaryPath,
11
+ ApiApiTrainingStudentdeleteForcePath,
12
+ } from '../api/trainingStudent.js';
13
+
14
+ @ApiSchema()
15
+ export class ApiSchemaTrainingStudent extends BeanBase {
16
+ select(options?: IApiSchemaOptions) {
17
+ return this.$sdk.createApiSchemas(ApiApiTrainingStudentselectPath, 'get', options);
18
+ }
19
+
20
+ create(options?: IApiSchemaOptions) {
21
+ return this.$sdk.createApiSchemas(ApiApiTrainingStudentcreatePath, 'post', options);
22
+ }
23
+
24
+ view(options?: IApiSchemaOptions) {
25
+ return this.$sdk.createApiSchemas(ApiApiTrainingStudentviewPath, 'get', options);
26
+ }
27
+
28
+ delete(options?: IApiSchemaOptions) {
29
+ return this.$sdk.createApiSchemas(ApiApiTrainingStudentdeletePath, 'delete', options);
30
+ }
31
+
32
+ update(options?: IApiSchemaOptions) {
33
+ return this.$sdk.createApiSchemas(ApiApiTrainingStudentupdatePath, 'patch', options);
34
+ }
35
+
36
+ summary(options?: IApiSchemaOptions) {
37
+ return this.$sdk.createApiSchemas(ApiApiTrainingStudentsummaryPath, 'get', options);
38
+ }
39
+
40
+ deleteForce(options?: IApiSchemaOptions) {
41
+ return this.$sdk.createApiSchemas(ApiApiTrainingStudentdeleteForcePath, 'delete', options);
42
+ }
43
+ }
@@ -0,0 +1,51 @@
1
+ import type { IResourceTableActionRowOptionsBase } from 'zova-module-a-openapi';
2
+ import type {
3
+ IJsxRenderContextTableCell,
4
+ ITableCellRender,
5
+ NextTableCellRender,
6
+ } from 'zova-module-a-table';
7
+
8
+ import { BeanBase } from 'zova';
9
+ import { TableCell } from 'zova-module-a-table';
10
+
11
+ import type { ModelStudent } from '../model/student.ts';
12
+
13
+ declare module 'zova-module-a-openapi' {
14
+ export interface IResourceTableActionRowRecord {
15
+ 'training-student:actionDeleteForce'?: ITableCellOptionsActionDeleteForce;
16
+ }
17
+ }
18
+
19
+ export interface ITableCellOptionsActionDeleteForce extends IResourceTableActionRowOptionsBase {}
20
+
21
+ @TableCell<ITableCellOptionsActionDeleteForce>({
22
+ class: 'btn btn-outline btn-error join-item',
23
+ })
24
+ export class TableCellActionDeleteForce extends BeanBase implements ITableCellRender {
25
+ render(
26
+ options: ITableCellOptionsActionDeleteForce,
27
+ renderContext: IJsxRenderContextTableCell,
28
+ _next: NextTableCellRender,
29
+ ) {
30
+ return (
31
+ <button
32
+ class={options.class}
33
+ type="button"
34
+ onClick={async e => {
35
+ e.preventDefault();
36
+ e.stopPropagation();
37
+ // eslint-disable-next-line no-alert
38
+ if (!window.confirm(this.scope.locale.ForceDeleteConfirm())) return;
39
+ const modelStudent = await this._getModelStudent();
40
+ await modelStudent.deleteForce(renderContext.cellContext.row.id).mutateAsync();
41
+ }}
42
+ >
43
+ {this.scope.locale.ForceDelete()}
44
+ </button>
45
+ );
46
+ }
47
+
48
+ private async _getModelStudent() {
49
+ return (await this.bean._getBean('training-student.model.student', true)) as ModelStudent;
50
+ }
51
+ }
@@ -0,0 +1,56 @@
1
+ import type { TableIdentity } from 'table-identity';
2
+ import type { IResourceTableActionRowOptionsBase } from 'zova-module-a-openapi';
3
+ import type {
4
+ IJsxRenderContextTableCell,
5
+ ITableCellRender,
6
+ NextTableCellRender,
7
+ } from 'zova-module-a-table';
8
+ import type { ModelStudent } from 'zova-module-training-student';
9
+
10
+ import { BeanBase } from 'zova';
11
+ import { TableCell } from 'zova-module-a-table';
12
+
13
+ declare module 'zova-module-a-openapi' {
14
+ export interface IResourceTableActionRowRecord {
15
+ 'training-student:actionSummary'?: ITableCellOptionsActionSummary;
16
+ }
17
+ }
18
+
19
+ export interface ITableCellOptionsActionSummary extends IResourceTableActionRowOptionsBase {}
20
+
21
+ @TableCell<ITableCellOptionsActionSummary>({
22
+ class: 'btn btn-outline btn-info join-item',
23
+ })
24
+ export class TableCellActionSummary extends BeanBase implements ITableCellRender {
25
+ render(
26
+ options: ITableCellOptionsActionSummary,
27
+ renderContext: IJsxRenderContextTableCell,
28
+ _next: NextTableCellRender,
29
+ ) {
30
+ const { $host, cellContext, ctx } = renderContext;
31
+ return (
32
+ <button
33
+ class={options.class}
34
+ type="button"
35
+ onClick={async () => {
36
+ const id = cellContext.row.id as TableIdentity;
37
+ const modelStudent = (await ctx.bean._getBean(
38
+ 'training-student.model.student',
39
+ true,
40
+ )) as ModelStudent;
41
+ const querySummary = modelStudent.summary(id);
42
+ const { data: summary } = await querySummary.refetch();
43
+ const message = [
44
+ `${this.scope.locale.Id()}: ${summary?.id ?? '-'}`,
45
+ `${this.scope.locale.Name()}: ${summary?.name ?? '-'}`,
46
+ `${this.scope.locale.Level()}: ${summary?.level ?? '-'}`,
47
+ `${this.scope.locale.Description()}: ${summary?.description ?? '-'}`,
48
+ ].join('\n');
49
+ await $host.$performCommand('basic-commands:alert', { message }, renderContext);
50
+ }}
51
+ >
52
+ {this.scope.locale.Summary()}
53
+ </button>
54
+ );
55
+ }
56
+ }
@@ -0,0 +1,63 @@
1
+ import type { IResourceTableCellOptionsBase } from 'zova-module-a-openapi';
2
+ import type {
3
+ IJsxRenderContextTableCell,
4
+ ITableCellRender,
5
+ NextTableCellRender,
6
+ } from 'zova-module-a-table';
7
+
8
+ import { classes } from 'typestyle';
9
+ import { BeanBase } from 'zova';
10
+ import { TableCell } from 'zova-module-a-table';
11
+
12
+ declare module 'zova-module-a-openapi' {
13
+ export interface IResourceTableCellRecord {
14
+ 'training-student:level'?: ITableCellOptionsLevel;
15
+ }
16
+ }
17
+
18
+ export interface ITableCellOptionsLevelItem {
19
+ value?: any;
20
+ title?: string;
21
+ }
22
+
23
+ export interface ITableCellOptionsLevel extends IResourceTableCellOptionsBase {
24
+ items?: ITableCellOptionsLevelItem[];
25
+ itemValue?: string;
26
+ itemTitle?: string;
27
+ }
28
+
29
+ @TableCell<ITableCellOptionsLevel>({
30
+ itemValue: 'value',
31
+ itemTitle: 'title',
32
+ })
33
+ export class TableCellLevel extends BeanBase implements ITableCellRender {
34
+ render(
35
+ options: ITableCellOptionsLevel,
36
+ _renderContext: IJsxRenderContextTableCell,
37
+ next: NextTableCellRender,
38
+ ) {
39
+ const value = next();
40
+ const item = options.items?.find(
41
+ item => String(item[String(options.itemValue)]) === String(value),
42
+ );
43
+ const title = item?.[String(options.itemTitle)] ?? value;
44
+ return (
45
+ <span
46
+ class={classes(
47
+ 'badge badge-sm font-medium border-0 whitespace-nowrap px-2',
48
+ this._getBadgeClass(value),
49
+ options.class,
50
+ )}
51
+ >
52
+ {title}
53
+ </span>
54
+ );
55
+ }
56
+
57
+ private _getBadgeClass(value: unknown) {
58
+ if (String(value) === '1') return 'badge-warning text-warning-content';
59
+ if (String(value) === '2') return 'badge-info text-info-content';
60
+ if (String(value) === '3') return 'badge-success text-success-content';
61
+ return 'badge-neutral text-neutral-content';
62
+ }
63
+ }
@@ -0,0 +1,117 @@
1
+ import type { IComponentOptions } from 'zova';
2
+ import type { IFormFieldComponentOptions } from 'zova-module-a-form';
3
+ import type { IResourceFormFieldOptionsBase } from 'zova-module-a-openapi';
4
+
5
+ import { classes } from 'typestyle';
6
+ import { BeanControllerBase } from 'zova';
7
+ import { Controller } from 'zova-module-a-bean';
8
+ import { ZFormField } from 'zova-module-a-form';
9
+
10
+ declare module 'zova-module-a-openapi' {
11
+ export interface IResourceFormFieldRecord {
12
+ 'training-student:formFieldLevel'?: IResourceFormFieldLevelOptions;
13
+ }
14
+ }
15
+
16
+ export interface IResourceFormFieldLevelItem {
17
+ value?: any;
18
+ title?: string;
19
+ }
20
+
21
+ export interface IResourceFormFieldLevelOptions extends IResourceFormFieldOptionsBase {
22
+ items?: IResourceFormFieldLevelItem[];
23
+ itemValue?: string;
24
+ itemTitle?: string;
25
+ placeholder?: string;
26
+ }
27
+
28
+ export interface ControllerFormFieldLevelProps extends IFormFieldComponentOptions {
29
+ options?: IResourceFormFieldLevelOptions;
30
+ }
31
+
32
+ @Controller()
33
+ export class ControllerFormFieldLevel extends BeanControllerBase {
34
+ static $propsDefault = {
35
+ options: {
36
+ itemValue: 'value',
37
+ itemTitle: 'title',
38
+ },
39
+ };
40
+
41
+ static $componentOptions: IComponentOptions = { inheritAttrs: false, deepExtendDefault: true };
42
+
43
+ protected async __init__() {}
44
+
45
+ protected render() {
46
+ const propsFormField = this.$props as ControllerFormFieldLevelProps;
47
+ return (
48
+ <ZFormField
49
+ {...propsFormField}
50
+ slotDefault={({ propsBucket, props }, $$formField) => {
51
+ const items = propsBucket.options.items ?? [];
52
+ const value = propsBucket.value;
53
+ const itemSelected = items.find(
54
+ item => String(item[String(propsBucket.options.itemValue)]) === String(value),
55
+ );
56
+ if (propsBucket.readonly) {
57
+ return (
58
+ <div class={classes('flex min-h-12 items-center', props.class)}>
59
+ <span
60
+ class={classes(
61
+ 'badge badge-lg font-semibold border-0 px-4 py-3 tracking-wide',
62
+ this._getBadgeClass(value),
63
+ )}
64
+ >
65
+ {itemSelected?.[String(propsBucket.options.itemTitle)] ??
66
+ propsBucket.options.placeholder ??
67
+ ''}
68
+ </span>
69
+ </div>
70
+ );
71
+ }
72
+ return (
73
+ <div class={classes('flex flex-wrap gap-2', props.class)}>
74
+ {items.map(item => {
75
+ const itemValue = item[String(propsBucket.options.itemValue)];
76
+ const selected = String(itemValue) === String(value);
77
+ return (
78
+ <button
79
+ key={String(itemValue)}
80
+ type="button"
81
+ class={classes(
82
+ 'btn btn-sm rounded-full border-0 px-4 font-medium transition-colors',
83
+ selected
84
+ ? this._getButtonClass(itemValue)
85
+ : 'btn-outline text-base-content/70',
86
+ !$$formField.field.state.meta.isValid && 'btn-error',
87
+ )}
88
+ onClick={() => {
89
+ $$formField.setValue(itemValue, propsBucket.disableNotifyChanged);
90
+ $$formField.handleBlur();
91
+ }}
92
+ >
93
+ {item[String(propsBucket.options.itemTitle)]}
94
+ </button>
95
+ );
96
+ })}
97
+ </div>
98
+ );
99
+ }}
100
+ ></ZFormField>
101
+ );
102
+ }
103
+
104
+ private _getBadgeClass(value: unknown) {
105
+ if (String(value) === '1') return 'badge-warning text-warning-content';
106
+ if (String(value) === '2') return 'badge-info text-info-content';
107
+ if (String(value) === '3') return 'badge-success text-success-content';
108
+ return 'badge-neutral text-neutral-content';
109
+ }
110
+
111
+ private _getButtonClass(value: unknown) {
112
+ if (String(value) === '1') return 'btn-warning text-warning-content';
113
+ if (String(value) === '2') return 'btn-info text-info-content';
114
+ if (String(value) === '3') return 'btn-success text-success-content';
115
+ return 'btn-neutral text-neutral-content';
116
+ }
117
+ }
@@ -0,0 +1,9 @@
1
+ export default {
2
+ Summary: 'Summary',
3
+ ForceDelete: 'Force Delete',
4
+ ForceDeleteConfirm: 'Are you sure you want to permanently delete this student?',
5
+ Id: 'ID',
6
+ Name: 'Name',
7
+ Level: 'Level',
8
+ Description: 'Description',
9
+ };
@@ -0,0 +1,9 @@
1
+ export default {
2
+ Summary: '摘要',
3
+ ForceDelete: '强制删除',
4
+ ForceDeleteConfirm: '您确认要永久删除该学生吗?',
5
+ Id: 'ID',
6
+ Name: '名称',
7
+ Level: '阶段',
8
+ Description: '描述',
9
+ };
@@ -0,0 +1,2 @@
1
+ export * from './.metadata/locales.js';
2
+ export * from './.metadata/index.js';
@@ -0,0 +1,42 @@
1
+ import type { TableIdentity } from 'table-identity';
2
+ import type { IDecoratorModelOptions } from 'zova-module-a-model';
3
+ import type { ModelResource } from 'zova-module-rest-resource';
4
+
5
+ import { Use, usePrepareArg } from 'zova';
6
+ import { BeanModelBase, Model } from 'zova-module-a-model';
7
+
8
+ export interface IModelOptionsStudent extends IDecoratorModelOptions {}
9
+
10
+ const StudentResource = 'training-student:student';
11
+
12
+ @Model<IModelOptionsStudent>()
13
+ export class ModelStudent extends BeanModelBase {
14
+ @Use({ beanFullName: 'rest-resource.model.resource' })
15
+ protected get $$modelResource(): ModelResource {
16
+ return usePrepareArg(StudentResource, true);
17
+ }
18
+
19
+ summary(id: TableIdentity) {
20
+ return this.$$modelResource.queryItem({
21
+ id,
22
+ action: 'summary',
23
+ queryFn: async () => {
24
+ const res = await this.scope.api.trainingStudent.summary({ params: { id } });
25
+ return res ?? null;
26
+ },
27
+ meta: {
28
+ disableSuspenseOnInit: true,
29
+ },
30
+ });
31
+ }
32
+
33
+ deleteForce(id: TableIdentity) {
34
+ return this.$$modelResource.mutationItem<void, void>({
35
+ id,
36
+ action: 'deleteForce',
37
+ mutationFn: async () => {
38
+ await this.scope.api.trainingStudent.deleteForce({ params: { id } });
39
+ },
40
+ });
41
+ }
42
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "extends": "../../tsconfig.base",
3
+ "compilerOptions": {
4
+ "rootDir": "src",
5
+ "outDir": "dist",
6
+ "declaration": true,
7
+ "declarationMap": true,
8
+ "emitDeclarationOnly": true,
9
+ "allowImportingTsExtensions": true,
10
+ "noEmit": false
11
+ },
12
+ "include": ["src", "src/.metadata/**/*"]
13
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": "../../tsconfig.base",
3
+ "compilerOptions": {},
4
+ "include": ["src", "src/.metadata/**/*"]
5
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "zova-suite-a-training",
3
+ "version": "5.0.0",
4
+ "description": "",
5
+ "author": "",
6
+ "files": [],
7
+ "type": "module",
8
+ "dependencies": {
9
+ "zova-module-training-student": "^5.0.0"
10
+ },
11
+ "title": "a-training"
12
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "extends": "../../../tsconfig.base",
3
+ "compilerOptions": {}
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "extends": "./tsconfig.base",
3
+ "compilerOptions": {}
4
+ }
@@ -49,8 +49,12 @@ export class ControllerFormFieldSelect extends BeanControllerBase {
49
49
  <ZFormField
50
50
  {...this.$props}
51
51
  slotDefault={({ propsBucket, props }, $$formField) => {
52
- const className = !propsBucket.needHandleBorder
53
- ? classes(props.class, 'select select-ghost')
52
+ const needClearableEmptyOption = !propsBucket.needHandleBorder;
53
+ const className = needClearableEmptyOption
54
+ ? classes(
55
+ props.class,
56
+ 'grow w-full h-full min-h-0 border-0 rounded-none bg-transparent pl-0 pr-8 py-0 shadow-none outline-none focus:outline-none focus:shadow-none focus:border-0',
57
+ )
54
58
  : classes(
55
59
  props.class,
56
60
  'select',
@@ -61,23 +65,41 @@ export class ControllerFormFieldSelect extends BeanControllerBase {
61
65
  'onUpdate:modelValue': (value: any) => {
62
66
  $$formField.setValue(value, propsBucket.disableNotifyChanged);
63
67
  },
68
+ 'onBlur': () => {
69
+ $$formField.handleBlur();
70
+ },
64
71
  ...propsBucket.options,
65
72
  ...props,
66
73
  'class': className,
67
74
  };
68
- propsNew.items = this._ensureEmptyItemFallback(propsNew.items, propsNew.placeholder);
75
+ if (needClearableEmptyOption) {
76
+ propsNew.items = this._ensureEmptyItemFallback(
77
+ propsNew.items,
78
+ propsNew.placeholder,
79
+ true,
80
+ );
81
+ propsNew.placeholder = undefined;
82
+ } else if (!propsNew.placeholder) {
83
+ propsNew.items = this._ensureEmptyItemFallback(propsNew.items, undefined);
84
+ }
69
85
  return <ZSelect {...propsNew}></ZSelect>;
70
86
  }}
71
87
  ></ZFormField>
72
88
  );
73
89
  }
74
90
 
75
- private _ensureEmptyItemFallback(items: any[] | undefined, placeholder: unknown): any[] | undefined {
76
- if (!!placeholder || !items?.length) return items;
91
+ private _ensureEmptyItemFallback(
92
+ items: any[] | undefined,
93
+ placeholder: unknown,
94
+ force = false,
95
+ ): any[] | undefined {
96
+ if (!items?.length) return items;
77
97
  const valueKey = String(this.$props.options.itemValue);
78
98
  const titleKey = String(this.$props.options.itemTitle);
79
- if (items[0]?.[valueKey] === undefined) return items;
80
- return [{ [valueKey]: undefined, [titleKey]: '' }, ...items];
99
+ const emptyValue = '';
100
+ if (items[0]?.[valueKey] === emptyValue) return items;
101
+ if (!force && !!placeholder) return items;
102
+ return [{ [valueKey]: emptyValue, [titleKey]: placeholder ?? '' }, ...items];
81
103
  }
82
104
 
83
105
  private _getValueByItems() {