cabloy 5.1.136 → 5.1.138

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 (617) hide show
  1. package/.cabloy-version +1 -1
  2. package/.claude/skills/cabloy-backend-scaffold/SKILL.md +13 -0
  3. package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +11 -0
  4. package/.claude/skills/cabloy-contract-loop/SKILL.md +17 -0
  5. package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +35 -0
  6. package/.claude/skills/cabloy-frontend-scaffold/evals/evals.json +1 -1
  7. package/.claude/skills/cabloy-frontend-scaffold/references/follow-up-checklist.md +4 -0
  8. package/.claude/skills/cabloy-zova-source-reading/SKILL.md +21 -0
  9. package/.claude/skills/cabloy-zova-source-reading/references/core-reading-paths.md +26 -0
  10. package/CHANGELOG.md +31 -0
  11. package/CLAUDE.md +5 -1
  12. package/cabloy-docs/.vitepress/config.mjs +1 -0
  13. package/cabloy-docs/.vitepress/theme/custom.css +124 -0
  14. package/cabloy-docs/backend/auth-guide.md +8 -0
  15. package/cabloy-docs/backend/config-guide.md +2 -0
  16. package/cabloy-docs/backend/controller-aop-guide.md +8 -0
  17. package/cabloy-docs/backend/controller-guide.md +33 -0
  18. package/cabloy-docs/backend/event-guide.md +3 -3
  19. package/cabloy-docs/backend/mail-guide.md +1 -1
  20. package/cabloy-docs/backend/markdown-guide.md +1 -1
  21. package/cabloy-docs/backend/runtime-and-flavors.md +29 -0
  22. package/cabloy-docs/backend/user-access-guide.md +2 -2
  23. package/cabloy-docs/blogs/ai-react-nextjs-enterprise-architecture-cabloy/cover-en-v1.png +0 -0
  24. package/cabloy-docs/blogs/ai-react-nextjs-enterprise-architecture-cabloy/index.md +177 -0
  25. package/cabloy-docs/blogs/cabloy-fullstack-resource-addressing/cover-en-v1.png +0 -0
  26. package/cabloy-docs/blogs/cabloy-fullstack-resource-addressing/index.md +430 -0
  27. package/cabloy-docs/blogs/index.md +69 -0
  28. package/cabloy-docs/blogs/nextjs-integrated-fullstack-cabloy-contract-loop/cover-en-v1.png +0 -0
  29. package/cabloy-docs/blogs/nextjs-integrated-fullstack-cabloy-contract-loop/index.md +195 -0
  30. package/cabloy-docs/blogs/vue-object-oriented-zova-beginner-mental-model/cover-en-v1.png +0 -0
  31. package/cabloy-docs/blogs/vue-object-oriented-zova-beginner-mental-model/index.md +483 -0
  32. package/cabloy-docs/frontend/a-openapi-under-the-hood.md +13 -0
  33. package/cabloy-docs/frontend/api-schema-guide.md +79 -0
  34. package/cabloy-docs/frontend/environment-config-guide.md +2 -0
  35. package/cabloy-docs/frontend/form-guide.md +37 -0
  36. package/cabloy-docs/frontend/markdown-guide.md +3 -0
  37. package/cabloy-docs/frontend/model-resource-owner-pattern.md +26 -1
  38. package/cabloy-docs/frontend/module-scope.md +24 -0
  39. package/cabloy-docs/frontend/modules-and-suites.md +23 -1
  40. package/cabloy-docs/frontend/navigation-guards-guide.md +2 -0
  41. package/cabloy-docs/frontend/page-params-guide.md +2 -0
  42. package/cabloy-docs/frontend/page-route-guide.md +10 -3
  43. package/cabloy-docs/frontend/route-alias-guide.md +12 -6
  44. package/cabloy-docs/frontend/ssr-env.md +15 -6
  45. package/cabloy-docs/frontend/ssr-overview.md +10 -0
  46. package/cabloy-docs/frontend/ssr-review-checklist.md +1 -0
  47. package/cabloy-docs/frontend/zova-form-under-the-hood.md +6 -0
  48. package/cabloy-docs/frontend/zova-router-under-the-hood.md +4 -5
  49. package/cabloy-docs/fullstack/a-pay-payment-suite.md +1 -1
  50. package/cabloy-docs/fullstack/deploy-cloudflare-docker.md +14 -8
  51. package/e2e/specs/a-commerce/commerce.spec.ts +17 -2
  52. package/e2e/specs/cabloy-basic/account.spec.ts +519 -0
  53. package/e2e/specs/cabloy-basic/basic.spec.ts +15 -3
  54. package/package.json +1 -1
  55. package/vona/env/.env +2 -0
  56. package/vona/packages-cli/cli/package.json +1 -1
  57. package/vona/packages-cli/cli-set-api/cli/templates/tools/crudStart/boilerplate/src/controller/{{resourceName}}.ts_ +14 -11
  58. package/vona/packages-cli/cli-set-api/cli/templates/tools/crudStart/snippets/3-en-us.ts +11 -1
  59. package/vona/packages-cli/cli-set-api/cli/templates/tools/crudStart/snippets/4-zh-cn.ts +11 -1
  60. package/vona/packages-cli/cli-set-api/package.json +1 -1
  61. package/vona/packages-cli/cli-set-api/src/lib/bean/cli.tools.metadata.ts +1 -0
  62. package/vona/packages-cli/cli-set-api/src/lib/bean/toolsMetadata/generateOnions.ts +4 -3
  63. package/vona/packages-vona/vona/package.json +1 -1
  64. package/vona/pnpm-lock.yaml +237 -66
  65. package/vona/pnpm-workspace.yaml +1 -1
  66. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/index.ts +33 -37
  67. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuSelectResItem.tsx +3 -0
  68. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/dto/skuView.tsx +3 -0
  69. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/entity/sku.tsx +17 -2
  70. package/vona/src/suite/a-commerce/modules/commerce-catalog/src/service/sku.ts +12 -2
  71. package/vona/src/suite/a-commerce/modules/commerce-catalog/test/skuPresentation.test.ts +52 -4
  72. package/vona/src/suite/a-commerce/modules/commerce-member/src/.metadata/index.ts +34 -36
  73. package/vona/src/suite/a-commerce/modules/commerce-payment/src/.metadata/index.ts +29 -33
  74. package/vona/src/suite/a-commerce/modules/commerce-promotion/src/.metadata/index.ts +34 -37
  75. package/vona/src/suite/a-commerce/modules/commerce-seed/src/.metadata/index.ts +8 -9
  76. package/vona/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/index.ts +33 -35
  77. package/vona/src/suite/a-commerce/modules/commerce-siteweb/src/.metadata/index.ts +11 -11
  78. package/vona/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +45 -42
  79. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditSelectResItem.tsx +4 -0
  80. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockAuditView.tsx +6 -1
  81. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceSelectResItem.tsx +4 -0
  82. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockBalanceView.tsx +6 -1
  83. package/vona/src/suite/a-commerce/modules/commerce-trade/src/dto/stockSkuRef.tsx +16 -0
  84. package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/stockAudit.tsx +17 -2
  85. package/vona/src/suite/a-commerce/modules/commerce-trade/src/entity/stockBalance.tsx +17 -2
  86. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockAudit.ts +31 -2
  87. package/vona/src/suite/a-commerce/modules/commerce-trade/src/service/stockBalance.ts +31 -2
  88. package/vona/src/suite/a-commerce/modules/commerce-trade/test/stockPresentation.test.ts +116 -4
  89. package/vona/src/suite/a-demo/modules/demo-basic/src/.metadata/index.ts +11 -11
  90. package/vona/src/suite/a-home/modules/home-base/src/.metadata/index.ts +0 -3
  91. package/vona/src/suite/a-home/modules/home-index/src/.metadata/index.ts +12 -13
  92. package/vona/src/suite/a-home/modules/home-user/package.json +9 -1
  93. package/vona/src/suite/a-home/modules/home-user/src/.metadata/index.ts +333 -78
  94. package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.activation.ts +21 -0
  95. package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.activationCurrent.ts +15 -0
  96. package/vona/src/{suite-vendor/a-vona/modules/a-mailconfirm → suite/a-home/modules/home-user}/src/bean/cacheRedis.passwordReset.ts +6 -2
  97. package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.passwordResetCurrent.ts +15 -0
  98. package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.passwordResetRecipient.ts +13 -0
  99. package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.passwordSet.ts +22 -0
  100. package/vona/src/suite/a-home/modules/home-user/src/bean/cacheRedis.passwordSetCurrent.ts +15 -0
  101. package/vona/src/suite/a-home/modules/home-user/src/bean/imageScene.homeUserAvatar.ts +18 -0
  102. package/vona/src/suite/a-home/modules/home-user/src/bean/meta.redlock.ts +18 -0
  103. package/vona/src/suite/a-home/modules/home-user/src/bean/meta.version.ts +0 -1
  104. package/vona/src/suite/a-home/modules/home-user/src/bean/zodRefine.passwordConfirm.ts +8 -4
  105. package/vona/src/suite/a-home/modules/home-user/src/config/config.ts +10 -1
  106. package/vona/src/suite/a-home/modules/home-user/src/config/locale/en-us.ts +35 -3
  107. package/vona/src/suite/a-home/modules/home-user/src/config/locale/zh-cn.ts +35 -3
  108. package/vona/src/suite/a-home/modules/home-user/src/controller/account.ts +147 -0
  109. package/vona/src/suite/a-home/modules/home-user/src/controller/passport.ts +27 -7
  110. package/vona/src/suite/a-home/modules/home-user/src/dto/accountActivation.ts +12 -0
  111. package/vona/src/suite/a-home/modules/home-user/src/dto/accountCurrent.ts +31 -0
  112. package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordChange.ts +41 -0
  113. package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordReset.ts +35 -0
  114. package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordResetRequest.ts +20 -0
  115. package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordResetRequestResult.ts +13 -0
  116. package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordSet.ts +35 -0
  117. package/vona/src/suite/a-home/modules/home-user/src/dto/accountPasswordSetIssue.ts +15 -0
  118. package/vona/src/suite/a-home/modules/home-user/src/dto/accountProfileUpdate.ts +53 -0
  119. package/vona/src/suite/a-home/modules/home-user/src/dto/accountRelogin.ts +12 -0
  120. package/vona/src/suite/a-home/modules/home-user/src/dto/passport.ts +2 -2
  121. package/vona/src/suite/a-home/modules/home-user/src/dto/passportUser.ts +43 -0
  122. package/vona/src/suite/a-home/modules/home-user/src/dto/register.ts +40 -5
  123. package/vona/src/suite/a-home/modules/home-user/src/service/account.ts +693 -0
  124. package/vona/src/suite/a-home/modules/home-user/test/account.test.ts +249 -0
  125. package/vona/src/suite/a-home/modules/home-user/test/accountActivation.test.ts +344 -0
  126. package/vona/src/suite/a-home/modules/home-user/test/accountOpenapi.test.ts +158 -0
  127. package/vona/src/suite/a-home/modules/home-user/test/accountPasswordReset.test.ts +724 -0
  128. package/vona/src/suite/a-home/modules/home-user/test/accountPasswordSet.test.ts +799 -0
  129. package/vona/src/suite/a-training/modules/training-record/src/.metadata/index.ts +73 -65
  130. package/vona/src/suite/a-training/modules/training-recordsubject/src/.metadata/index.ts +26 -17
  131. package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +47 -39
  132. package/vona/src/suite/cabloy-basic/modules/basic-metrics/src/.metadata/index.ts +22 -23
  133. package/vona/src/suite/cabloy-basic/modules/basic-siteadmin/src/.metadata/index.ts +15 -15
  134. package/vona/src/suite/cabloy-basic/modules/basic-siteweb/src/.metadata/index.ts +11 -11
  135. package/vona/src/suite-vendor/a-auth/modules/a-auth/package.json +1 -1
  136. package/vona/src/suite-vendor/a-auth/modules/a-auth/src/.metadata/index.ts +55 -41
  137. package/vona/src/suite-vendor/a-auth/modules/auth-oauth/package.json +1 -1
  138. package/vona/src/suite-vendor/a-auth/modules/auth-oauth/src/.metadata/index.ts +8 -8
  139. package/vona/src/suite-vendor/a-auth/modules/auth-simple/package.json +4 -2
  140. package/vona/src/suite-vendor/a-auth/modules/auth-simple/src/.metadata/index.ts +51 -27
  141. package/vona/src/suite-vendor/a-auth/modules/auth-simple/src/bean/meta.redlock.ts +11 -0
  142. package/vona/src/suite-vendor/a-auth/modules/auth-simple/src/service/authSimple.ts +53 -2
  143. package/vona/src/suite-vendor/a-auth/modules/auth-simple/test/authSimple.test.ts +56 -0
  144. package/vona/src/suite-vendor/a-auth/package.json +2 -2
  145. package/vona/src/suite-vendor/a-cabloy/modules/a-cabloy/package.json +1 -1
  146. package/vona/src/suite-vendor/a-cabloy/modules/a-cabloy/src/.metadata/index.ts +4 -4
  147. package/vona/src/suite-vendor/a-cabloy/modules/a-datasharding/package.json +1 -1
  148. package/vona/src/suite-vendor/a-cabloy/modules/a-datasharding/src/.metadata/index.ts +23 -24
  149. package/vona/src/suite-vendor/a-cabloy/modules/a-datasource/package.json +1 -1
  150. package/vona/src/suite-vendor/a-cabloy/modules/a-datasource/src/.metadata/index.ts +31 -22
  151. package/vona/src/suite-vendor/{a-vona/modules/a-mailconfirm → a-cabloy/modules/a-rbac}/package.json +13 -5
  152. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/.metadata/index.ts +147 -0
  153. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/.metadata/this.ts +2 -0
  154. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/bean.rbacCatalog.ts +95 -0
  155. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/bean.rbacScope.ts +218 -0
  156. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/event.policyInvalidated.ts +17 -0
  157. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/event.resolvePolicy.ts +13 -0
  158. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/guard.rbac.ts +102 -0
  159. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/bean/index.ts +5 -0
  160. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/config/config.ts +10 -0
  161. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/index.ts +3 -0
  162. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/lib/index.ts +1 -0
  163. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/lib/rbac.ts +46 -0
  164. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/types/index.ts +2 -0
  165. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/types/rbac.ts +46 -0
  166. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/src/types/scope.ts +27 -0
  167. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/test/rbacCatalogGuard.test.ts +445 -0
  168. package/vona/src/suite-vendor/a-cabloy/modules/a-rbac/test/rbacScopeCurrent.test.ts +172 -0
  169. package/vona/src/suite-vendor/a-cabloy/modules/a-socket/package.json +1 -1
  170. package/vona/src/suite-vendor/a-cabloy/modules/a-socket/src/.metadata/index.ts +27 -31
  171. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/package.json +1 -1
  172. package/vona/src/suite-vendor/a-cabloy/modules/a-ssr/src/.metadata/index.ts +37 -45
  173. package/vona/src/suite-vendor/a-cabloy/modules/a-ssrhmr/package.json +1 -1
  174. package/vona/src/suite-vendor/a-cabloy/modules/a-ssrhmr/src/.metadata/index.ts +12 -12
  175. package/vona/src/suite-vendor/a-cabloy/modules/a-status/package.json +1 -1
  176. package/vona/src/suite-vendor/a-cabloy/modules/a-status/src/.metadata/index.ts +27 -19
  177. package/vona/src/suite-vendor/a-cabloy/package.json +2 -1
  178. package/vona/src/suite-vendor/a-cabloy/tsconfig.json +3 -0
  179. package/vona/src/suite-vendor/a-captcha/modules/a-captcha/package.json +1 -1
  180. package/vona/src/suite-vendor/a-captcha/modules/a-captcha/src/.metadata/index.ts +27 -29
  181. package/vona/src/suite-vendor/a-captcha/modules/captcha-simple/package.json +1 -1
  182. package/vona/src/suite-vendor/a-captcha/modules/captcha-simple/src/.metadata/index.ts +16 -17
  183. package/vona/src/suite-vendor/a-captcha/package.json +1 -1
  184. package/vona/src/suite-vendor/a-file/modules/a-file/package.json +1 -1
  185. package/vona/src/suite-vendor/a-file/modules/a-file/src/.metadata/index.ts +56 -38
  186. package/vona/src/suite-vendor/a-file/modules/file-cloudflare/package.json +1 -1
  187. package/vona/src/suite-vendor/a-file/modules/file-cloudflare/src/.metadata/index.ts +12 -13
  188. package/vona/src/suite-vendor/a-file/modules/file-native/package.json +1 -1
  189. package/vona/src/suite-vendor/a-file/modules/file-native/src/.metadata/index.ts +11 -12
  190. package/vona/src/suite-vendor/a-file/package.json +4 -4
  191. package/vona/src/suite-vendor/a-image/modules/a-image/package.json +1 -1
  192. package/vona/src/suite-vendor/a-image/modules/a-image/src/.metadata/index.ts +56 -38
  193. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/package.json +1 -1
  194. package/vona/src/suite-vendor/a-image/modules/image-cloudflare/src/.metadata/index.ts +12 -13
  195. package/vona/src/suite-vendor/a-image/modules/image-native/package.json +1 -1
  196. package/vona/src/suite-vendor/a-image/modules/image-native/src/.metadata/index.ts +11 -12
  197. package/vona/src/suite-vendor/a-image/package.json +1 -1
  198. package/vona/src/suite-vendor/a-pay/modules/a-pay/package.json +1 -1
  199. package/vona/src/suite-vendor/a-pay/modules/a-pay/src/.metadata/index.ts +0 -8
  200. package/vona/src/suite-vendor/a-pay/modules/pay-mock/package.json +1 -1
  201. package/vona/src/suite-vendor/a-pay/modules/pay-mock/src/.metadata/index.ts +21 -22
  202. package/vona/src/suite-vendor/a-pay/modules/pay-paypal/package.json +1 -1
  203. package/vona/src/suite-vendor/a-pay/modules/pay-paypal/src/.metadata/index.ts +8 -8
  204. package/vona/src/suite-vendor/a-pay/modules/pay-stripe/package.json +1 -1
  205. package/vona/src/suite-vendor/a-pay/modules/pay-stripe/src/.metadata/index.ts +8 -8
  206. package/vona/src/suite-vendor/a-pay/package.json +5 -5
  207. package/vona/src/suite-vendor/a-paypal/modules/a-paypal/package.json +1 -1
  208. package/vona/src/suite-vendor/a-paypal/modules/a-paypal/src/.metadata/index.ts +46 -40
  209. package/vona/src/suite-vendor/a-paypal/package.json +1 -1
  210. package/vona/src/suite-vendor/a-vona/modules/a-aspect/cli/guard/boilerplate/{{sceneName}}.{{beanName}}.ts_ +6 -8
  211. package/vona/src/suite-vendor/a-vona/modules/a-aspect/package.json +1 -1
  212. package/vona/src/suite-vendor/a-vona/modules/a-aspect/src/.metadata/index.ts +8 -16
  213. package/vona/src/suite-vendor/a-vona/modules/a-aspect/src/lib/utils/guardBase.ts +22 -0
  214. package/vona/src/suite-vendor/a-vona/modules/a-aspect/src/lib/utils/index.ts +1 -0
  215. package/vona/src/suite-vendor/a-vona/modules/a-aspect/src/types/guard.ts +4 -1
  216. package/vona/src/suite-vendor/a-vona/modules/a-aspectutils/package.json +1 -1
  217. package/vona/src/suite-vendor/a-vona/modules/a-aspectutils/src/.metadata/index.ts +8 -10
  218. package/vona/src/suite-vendor/a-vona/modules/a-bean/package.json +1 -1
  219. package/vona/src/suite-vendor/a-vona/modules/a-bean/src/.metadata/index.ts +4 -4
  220. package/vona/src/suite-vendor/a-vona/modules/a-beanmutate/package.json +1 -1
  221. package/vona/src/suite-vendor/a-vona/modules/a-beanmutate/src/.metadata/index.ts +17 -19
  222. package/vona/src/suite-vendor/a-vona/modules/a-body/package.json +1 -1
  223. package/vona/src/suite-vendor/a-vona/modules/a-body/src/.metadata/index.ts +12 -12
  224. package/vona/src/suite-vendor/a-vona/modules/a-body/src/bean/interceptor.bodyReq.ts +1 -1
  225. package/vona/src/suite-vendor/a-vona/modules/a-body/src/types/bodyParser.ts +1 -1
  226. package/vona/src/suite-vendor/a-vona/modules/a-broadcast/package.json +1 -1
  227. package/vona/src/suite-vendor/a-vona/modules/a-broadcast/src/.metadata/index.ts +8 -9
  228. package/vona/src/suite-vendor/a-vona/modules/a-cache/package.json +1 -1
  229. package/vona/src/suite-vendor/a-vona/modules/a-cache/src/.metadata/index.ts +14 -14
  230. package/vona/src/suite-vendor/a-vona/modules/a-caching/package.json +1 -1
  231. package/vona/src/suite-vendor/a-vona/modules/a-caching/src/.metadata/index.ts +8 -8
  232. package/vona/src/suite-vendor/a-vona/modules/a-core/package.json +1 -1
  233. package/vona/src/suite-vendor/a-vona/modules/a-core/src/.metadata/index.ts +20 -22
  234. package/vona/src/suite-vendor/a-vona/modules/a-election/package.json +1 -1
  235. package/vona/src/suite-vendor/a-vona/modules/a-election/src/.metadata/index.ts +15 -16
  236. package/vona/src/suite-vendor/a-vona/modules/a-error/package.json +1 -1
  237. package/vona/src/suite-vendor/a-vona/modules/a-error/src/.metadata/index.ts +19 -21
  238. package/vona/src/suite-vendor/a-vona/modules/a-event/package.json +1 -1
  239. package/vona/src/suite-vendor/a-vona/modules/a-event/src/.metadata/index.ts +16 -18
  240. package/vona/src/suite-vendor/a-vona/modules/a-executor/package.json +1 -1
  241. package/vona/src/suite-vendor/a-vona/modules/a-executor/src/.metadata/index.ts +12 -13
  242. package/vona/src/suite-vendor/a-vona/modules/a-hmr/package.json +1 -1
  243. package/vona/src/suite-vendor/a-vona/modules/a-hmr/src/.metadata/index.ts +24 -28
  244. package/vona/src/suite-vendor/a-vona/modules/a-hmrbase/package.json +1 -1
  245. package/vona/src/suite-vendor/a-vona/modules/a-hmrbase/src/.metadata/index.ts +4 -4
  246. package/vona/src/suite-vendor/a-vona/modules/a-index/package.json +1 -1
  247. package/vona/src/suite-vendor/a-vona/modules/a-index/src/.metadata/index.ts +11 -13
  248. package/vona/src/suite-vendor/a-vona/modules/a-instance/package.json +1 -1
  249. package/vona/src/suite-vendor/a-vona/modules/a-instance/src/.metadata/index.ts +42 -35
  250. package/vona/src/suite-vendor/a-vona/modules/a-jwt/package.json +1 -1
  251. package/vona/src/suite-vendor/a-vona/modules/a-jwt/src/.metadata/index.ts +15 -17
  252. package/vona/src/suite-vendor/a-vona/modules/a-locale/package.json +1 -1
  253. package/vona/src/suite-vendor/a-vona/modules/a-locale/src/.metadata/index.ts +3 -3
  254. package/vona/src/suite-vendor/a-vona/modules/a-locale/src/main.ts +4 -1
  255. package/vona/src/suite-vendor/a-vona/modules/a-logger/package.json +1 -1
  256. package/vona/src/suite-vendor/a-vona/modules/a-logger/src/.metadata/index.ts +20 -20
  257. package/vona/src/suite-vendor/a-vona/modules/a-mail/package.json +3 -3
  258. package/vona/src/suite-vendor/a-vona/modules/a-mail/src/.metadata/index.ts +38 -30
  259. package/vona/src/suite-vendor/a-vona/modules/a-mail/src/types/config.ts +1 -0
  260. package/vona/src/suite-vendor/a-vona/modules/a-menu/package.json +1 -1
  261. package/vona/src/suite-vendor/a-vona/modules/a-menu/src/.metadata/index.ts +8 -8
  262. package/vona/src/suite-vendor/a-vona/modules/a-meta/package.json +1 -1
  263. package/vona/src/suite-vendor/a-vona/modules/a-meta/src/.metadata/index.ts +4 -4
  264. package/vona/src/suite-vendor/a-vona/modules/a-metrics/package.json +1 -1
  265. package/vona/src/suite-vendor/a-vona/modules/a-metrics/src/.metadata/index.ts +15 -18
  266. package/vona/src/suite-vendor/a-vona/modules/a-onion/package.json +1 -1
  267. package/vona/src/suite-vendor/a-vona/modules/a-onion/src/.metadata/index.ts +11 -11
  268. package/vona/src/suite-vendor/a-vona/modules/a-openapi/package.json +1 -1
  269. package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/.metadata/index.ts +15 -16
  270. package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/types/decorator.ts +2 -1
  271. package/vona/src/suite-vendor/a-vona/modules/a-openapi/src/types/permissions.ts +24 -1
  272. package/vona/src/suite-vendor/a-vona/modules/a-openapischema/package.json +1 -1
  273. package/vona/src/suite-vendor/a-vona/modules/a-openapischema/src/.metadata/index.ts +17 -17
  274. package/vona/src/suite-vendor/a-vona/modules/a-openapiutils/package.json +1 -1
  275. package/vona/src/suite-vendor/a-vona/modules/a-openapiutils/src/.metadata/index.ts +3 -3
  276. package/vona/src/suite-vendor/a-vona/modules/a-orm/package.json +1 -1
  277. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/.metadata/index.ts +34 -39
  278. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/lib/bean.model/bean.model_view.ts +10 -6
  279. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/columns_.ts +1 -2
  280. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/databaseDialectBase_.ts +37 -1
  281. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/transactionFiber_.ts +8 -2
  282. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/service/transaction_.ts +5 -8
  283. package/vona/src/suite-vendor/a-vona/modules/a-orm/src/types/columns.ts +1 -0
  284. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/package.json +1 -1
  285. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/src/.metadata/index.ts +8 -8
  286. package/vona/src/suite-vendor/a-vona/modules/a-ormdialect/src/bean/databaseDialect.mysql.ts +28 -0
  287. package/vona/src/suite-vendor/a-vona/modules/a-ormutils/package.json +1 -1
  288. package/vona/src/suite-vendor/a-vona/modules/a-ormutils/src/.metadata/index.ts +4 -4
  289. package/vona/src/suite-vendor/a-vona/modules/a-permission/package.json +4 -1
  290. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/.metadata/index.ts +35 -22
  291. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/bean.permission.ts +61 -8
  292. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/event.retrievePermissionAction.ts +2 -2
  293. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/bean/summerCache.permissionActionByUser.ts +24 -0
  294. package/vona/src/suite-vendor/a-vona/modules/a-permission/src/dto/permissions.tsx +18 -1
  295. package/vona/src/suite-vendor/a-vona/modules/a-permission/test/permission.test.ts +340 -0
  296. package/vona/src/suite-vendor/a-vona/modules/a-play/package.json +1 -1
  297. package/vona/src/suite-vendor/a-vona/modules/a-play/src/.metadata/index.ts +13 -13
  298. package/vona/src/suite-vendor/a-vona/modules/a-printtip/package.json +1 -1
  299. package/vona/src/suite-vendor/a-vona/modules/a-printtip/src/.metadata/index.ts +11 -12
  300. package/vona/src/suite-vendor/a-vona/modules/a-queue/package.json +1 -1
  301. package/vona/src/suite-vendor/a-vona/modules/a-queue/src/.metadata/index.ts +15 -17
  302. package/vona/src/suite-vendor/a-vona/modules/a-ratelimit/package.json +1 -1
  303. package/vona/src/suite-vendor/a-vona/modules/a-ratelimit/src/.metadata/index.ts +0 -1
  304. package/vona/src/suite-vendor/a-vona/modules/a-redis/package.json +1 -1
  305. package/vona/src/suite-vendor/a-vona/modules/a-redis/src/.metadata/index.ts +12 -13
  306. package/vona/src/suite-vendor/a-vona/modules/a-redlock/package.json +1 -1
  307. package/vona/src/suite-vendor/a-vona/modules/a-redlock/src/.metadata/index.ts +7 -8
  308. package/vona/src/suite-vendor/a-vona/modules/a-retryable/package.json +1 -1
  309. package/vona/src/suite-vendor/a-vona/modules/a-retryable/src/.metadata/index.ts +8 -8
  310. package/vona/src/suite-vendor/a-vona/modules/a-runtime/package.json +1 -1
  311. package/vona/src/suite-vendor/a-vona/modules/a-runtime/src/.metadata/index.ts +12 -13
  312. package/vona/src/suite-vendor/a-vona/modules/a-schedule/package.json +1 -1
  313. package/vona/src/suite-vendor/a-vona/modules/a-schedule/src/.metadata/index.ts +23 -26
  314. package/vona/src/suite-vendor/a-vona/modules/a-security/package.json +1 -1
  315. package/vona/src/suite-vendor/a-vona/modules/a-security/src/.metadata/index.ts +12 -12
  316. package/vona/src/suite-vendor/a-vona/modules/a-security/src/bean/bean.security.ts +78 -0
  317. package/vona/src/suite-vendor/a-vona/modules/a-security/src/bean/middlewareSystem.cors.ts +4 -2
  318. package/vona/src/suite-vendor/a-vona/modules/a-security/src/index.ts +1 -0
  319. package/vona/src/suite-vendor/a-vona/modules/a-security/src/types/index.ts +7 -0
  320. package/vona/src/suite-vendor/a-vona/modules/a-security/test/origin.test.ts +178 -0
  321. package/vona/src/suite-vendor/a-vona/modules/a-serialization/package.json +1 -1
  322. package/vona/src/suite-vendor/a-vona/modules/a-serialization/src/.metadata/index.ts +16 -16
  323. package/vona/src/suite-vendor/a-vona/modules/a-startup/package.json +1 -1
  324. package/vona/src/suite-vendor/a-vona/modules/a-startup/src/.metadata/index.ts +19 -22
  325. package/vona/src/suite-vendor/a-vona/modules/a-static/package.json +1 -1
  326. package/vona/src/suite-vendor/a-vona/modules/a-static/src/.metadata/index.ts +13 -14
  327. package/vona/src/suite-vendor/a-vona/modules/a-summer/package.json +1 -1
  328. package/vona/src/suite-vendor/a-vona/modules/a-summer/src/.metadata/index.ts +10 -10
  329. package/vona/src/suite-vendor/a-vona/modules/a-swagger/package.json +1 -1
  330. package/vona/src/suite-vendor/a-vona/modules/a-swagger/src/.metadata/index.ts +16 -17
  331. package/vona/src/suite-vendor/a-vona/modules/a-telemetry/package.json +1 -1
  332. package/vona/src/suite-vendor/a-vona/modules/a-telemetry/src/.metadata/index.ts +15 -16
  333. package/vona/src/suite-vendor/a-vona/modules/a-upload/package.json +1 -1
  334. package/vona/src/suite-vendor/a-vona/modules/a-upload/src/.metadata/index.ts +8 -8
  335. package/vona/src/suite-vendor/a-vona/modules/a-user/package.json +1 -1
  336. package/vona/src/suite-vendor/a-vona/modules/a-user/src/.metadata/index.ts +26 -35
  337. package/vona/src/suite-vendor/a-vona/modules/a-user/src/bean/guard.passport.ts +4 -2
  338. package/vona/src/suite-vendor/a-vona/modules/a-user/src/bean/guard.roleName.ts +5 -23
  339. package/vona/src/suite-vendor/a-vona/modules/a-user/src/lib/passport.ts +17 -2
  340. package/vona/src/suite-vendor/a-vona/modules/a-validation/package.json +1 -1
  341. package/vona/src/suite-vendor/a-vona/modules/a-validation/src/.metadata/index.ts +7 -7
  342. package/vona/src/suite-vendor/a-vona/modules/a-version/package.json +1 -1
  343. package/vona/src/suite-vendor/a-vona/modules/a-version/src/.metadata/index.ts +62 -37
  344. package/vona/src/suite-vendor/a-vona/modules/a-vona/package.json +1 -2
  345. package/vona/src/suite-vendor/a-vona/modules/a-vona/src/.metadata/index.ts +4 -4
  346. package/vona/src/suite-vendor/a-vona/modules/a-web/package.json +1 -1
  347. package/vona/src/suite-vendor/a-vona/modules/a-web/src/.metadata/index.ts +27 -30
  348. package/vona/src/suite-vendor/a-vona/modules/a-web/src/lib/decorator/arguments.ts +5 -0
  349. package/vona/src/suite-vendor/a-vona/modules/a-web/src/lib/decorator/pipesArgument.ts +3 -1
  350. package/vona/src/suite-vendor/a-vona/modules/a-web/src/lib/middleware/extractValue.ts +5 -0
  351. package/vona/src/suite-vendor/a-vona/modules/a-web/src/types/controller.ts +3 -0
  352. package/vona/src/suite-vendor/a-vona/modules/a-worker/package.json +1 -1
  353. package/vona/src/suite-vendor/a-vona/modules/a-worker/src/.metadata/index.ts +15 -15
  354. package/vona/src/suite-vendor/a-vona/modules/a-zod/package.json +1 -1
  355. package/vona/src/suite-vendor/a-vona/modules/a-zod/src/.metadata/index.ts +4 -4
  356. package/vona/src/suite-vendor/a-vona/package.json +2 -3
  357. package/vona/src/suite-vendor/a-vona/tsconfig.json +0 -3
  358. package/zova/env/.env.admin +1 -0
  359. package/zova/env/.env.ssr.web +0 -1
  360. package/zova/env/.env.web +1 -0
  361. package/zova/package.original.json +1 -1
  362. package/zova/packages-cli/cli/package.json +2 -2
  363. package/zova/packages-cli/cli-set-front/package.json +1 -1
  364. package/zova/packages-cli/cli-set-front/src/lib/bean/cli.openapi.generate.ts +15 -4
  365. package/zova/packages-cli/cli-set-front/src/lib/bean/cli.tools.metadata.ts +1 -0
  366. package/zova/packages-utils/zova-jsx/package.json +2 -2
  367. package/zova/packages-zova/zova/package.json +3 -3
  368. package/zova/packages-zova/zova-core/package.json +1 -1
  369. package/zova/packages-zova/zova-core/src/core/component/locale.ts +10 -3
  370. package/zova/packages-zova/zova-core/src/core/sys/util.ts +6 -0
  371. package/zova/pnpm-lock.yaml +94 -25
  372. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/.metadata/index.ts +21 -21
  373. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/openapi/schemas.ts +92 -46
  374. package/zova/src/suite/a-commerce/modules/commerce-catalog/src/api/openapi/types.ts +834 -499
  375. package/zova/src/suite/a-commerce/modules/commerce-member/src/.metadata/index.ts +22 -22
  376. package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/schemas.ts +104 -50
  377. package/zova/src/suite/a-commerce/modules/commerce-member/src/api/openapi/types.ts +1202 -667
  378. package/zova/src/suite/a-commerce/modules/commerce-payment/src/.metadata/index.ts +5 -5
  379. package/zova/src/suite/a-commerce/modules/commerce-promotion/src/.metadata/index.ts +18 -18
  380. package/zova/src/suite/a-commerce/modules/commerce-promotion/src/api/openapi/schemas.ts +136 -62
  381. package/zova/src/suite/a-commerce/modules/commerce-promotion/src/api/openapi/types.ts +1564 -874
  382. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/.metadata/index.ts +24 -24
  383. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/openapi/schemas.ts +413 -59
  384. package/zova/src/suite/a-commerce/modules/commerce-siteadmin/src/api/openapi/types.ts +6290 -1946
  385. package/zova/src/suite/a-commerce/modules/commerce-siteweb/src/.metadata/index.ts +5 -5
  386. package/zova/src/suite/a-commerce/modules/commerce-trade/src/.metadata/index.ts +29 -29
  387. package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/schemas.ts +112 -58
  388. package/zova/src/suite/a-commerce/modules/commerce-trade/src/api/openapi/types.ts +980 -721
  389. package/zova/src/suite/a-commerce/modules/commerce-trade/src/bean/tableCell.actionRefund.tsx +1 -1
  390. package/zova/src/suite/a-commerce/modules/commerce-trade/src/bean/tableCell.actionShip.tsx +1 -1
  391. package/zova/src/suite/a-commerce/modules/commerce-trade/src/page/payment/controller.tsx +1 -3
  392. package/zova/src/suite/a-demo/modules/demo-basic/src/.metadata/index.ts +23 -23
  393. package/zova/src/suite/a-demo/modules/demo-todo/src/.metadata/index.ts +17 -17
  394. package/zova/src/suite/a-devui/modules/devui-adapter/src/.metadata/index.ts +10 -10
  395. package/zova/src/suite/a-home/modules/home-api/cli/openapi.config.ts +1 -0
  396. package/zova/src/suite/a-home/modules/home-api/mock/passport.fake.ts +1 -1
  397. package/zova/src/suite/a-home/modules/home-api/src/.metadata/index.ts +61 -31
  398. package/zova/src/suite/a-home/modules/home-api/src/api/homeUserAccount.ts +171 -0
  399. package/zova/src/suite/a-home/modules/home-api/src/api/openapi/schemas.ts +96 -50
  400. package/zova/src/suite/a-home/modules/home-api/src/api/openapi/types.ts +857 -504
  401. package/zova/src/suite/a-home/modules/home-api/src/apiSchema/homeUserAccount.ts +62 -0
  402. package/zova/src/suite/a-home/modules/home-base/assets/img/avatar_user.png +0 -0
  403. package/zova/src/suite/a-home/modules/home-base/src/.metadata/index.ts +16 -16
  404. package/zova/src/suite/a-home/modules/home-base/src/config/config.ts +5 -0
  405. package/zova/src/suite/a-home/modules/home-base/src/service/routerGuards.ts +1 -8
  406. package/zova/src/suite/a-home/modules/home-icon/src/.metadata/index.ts +5 -5
  407. package/zova/src/suite/a-home/modules/home-indexadmin/src/.metadata/index.ts +11 -11
  408. package/zova/src/suite/a-home/modules/home-indexweb/src/.metadata/index.ts +9 -9
  409. package/zova/src/suite/a-home/modules/home-layoutadmin/src/.metadata/index.ts +19 -19
  410. package/zova/src/suite/a-home/modules/home-layoutadmin/src/component/layoutAdmin/render.user.tsx +19 -2
  411. package/zova/src/suite/a-home/modules/home-layoutadmin/src/config/locale/en-us.ts +1 -0
  412. package/zova/src/suite/a-home/modules/home-layoutadmin/src/config/locale/zh-cn.ts +1 -0
  413. package/zova/src/suite/a-home/modules/home-layoutempty/src/.metadata/index.ts +7 -7
  414. package/zova/src/suite/a-home/modules/home-layoutweb/src/.metadata/component/layoutWeb.ts +1 -0
  415. package/zova/src/suite/a-home/modules/home-layoutweb/src/.metadata/index.ts +23 -15
  416. package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.header.tsx +1 -0
  417. package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.tsx +4 -0
  418. package/zova/src/suite/a-home/modules/home-layoutweb/src/component/layoutWeb/render.user.tsx +68 -0
  419. package/zova/src/suite/a-home/modules/home-layoutweb/src/config/locale/en-us.ts +11 -8
  420. package/zova/src/suite/a-home/modules/home-layoutweb/src/config/locale/zh-cn.ts +11 -8
  421. package/zova/src/suite/a-home/modules/home-login/src/.metadata/index.ts +38 -18
  422. package/zova/src/suite/a-home/modules/home-login/src/.metadata/page/passwordResetRequest.ts +9 -0
  423. package/zova/src/suite/a-home/modules/home-login/src/.metadata/page/register.ts +5 -0
  424. package/zova/src/suite/a-home/modules/home-login/src/config/locale/en-us.ts +14 -0
  425. package/zova/src/suite/a-home/modules/home-login/src/config/locale/zh-cn.ts +12 -0
  426. package/zova/src/suite/a-home/modules/home-login/src/page/login/controller.tsx +10 -0
  427. package/zova/src/suite/a-home/modules/home-login/src/page/login/render.tsx +14 -0
  428. package/zova/src/suite/a-home/modules/home-login/src/page/passwordResetRequest/controller.tsx +130 -0
  429. package/zova/src/suite/a-home/modules/home-login/src/page/register/controller.tsx +124 -0
  430. package/zova/src/suite/a-home/modules/home-login/src/routes.ts +20 -0
  431. package/zova/src/suite/a-home/modules/home-passport/src/.metadata/index.ts +8 -8
  432. package/zova/src/suite/a-home/modules/home-passport/src/lib/permissionActionMatcher.ts +37 -0
  433. package/zova/src/suite/a-home/modules/home-passport/src/model/passport.ts +32 -12
  434. package/zova/src/suite/a-home/modules/home-passport/test/lib/permissionActionMatcher.test.ts +80 -0
  435. package/zova/src/suite/a-home/modules/home-theme/src/.metadata/index.ts +13 -13
  436. package/zova/src/suite/a-home/modules/home-user/package.json +60 -0
  437. package/zova/src/suite/a-home/modules/home-user/src/.metadata/index.ts +168 -0
  438. package/zova/src/suite/a-home/modules/home-user/src/.metadata/locales.ts +7 -0
  439. package/zova/src/suite/a-home/modules/home-user/src/.metadata/page/account.ts +5 -0
  440. package/zova/src/suite/a-home/modules/home-user/src/.metadata/page/activation.ts +16 -0
  441. package/zova/src/suite/a-home/modules/home-user/src/.metadata/page/passwordReset.ts +16 -0
  442. package/zova/src/suite/a-home/modules/home-user/src/.metadata/page/passwordSet.ts +16 -0
  443. package/zova/src/suite/a-home/modules/home-user/src/.metadata/this.ts +2 -0
  444. package/zova/src/suite/a-home/modules/home-user/src/config/locale/en-us.ts +52 -0
  445. package/zova/src/suite/a-home/modules/home-user/src/config/locale/zh-cn.ts +49 -0
  446. package/zova/src/suite/a-home/modules/home-user/src/index.ts +2 -0
  447. package/zova/src/suite/a-home/modules/home-user/src/model/account.ts +126 -0
  448. package/zova/src/suite/a-home/modules/home-user/src/page/account/controller.tsx +357 -0
  449. package/zova/src/suite/a-home/modules/home-user/src/page/activation/controller.tsx +83 -0
  450. package/zova/src/suite/a-home/modules/home-user/src/page/passwordReset/controller.tsx +138 -0
  451. package/zova/src/suite/a-home/modules/home-user/src/page/passwordSet/controller.tsx +138 -0
  452. package/zova/src/suite/a-home/modules/home-user/src/routes.ts +44 -0
  453. package/zova/src/suite/a-home/modules/home-user/tsconfig.build.json +13 -0
  454. package/zova/src/suite/a-home/modules/home-user/tsconfig.json +5 -0
  455. package/zova/src/suite/a-home/package.json +2 -1
  456. package/zova/src/suite/a-training/modules/training-student/src/.metadata/index.ts +25 -25
  457. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +136 -62
  458. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +1601 -884
  459. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionDeleteForce.tsx +1 -1
  460. package/zova/src/suite/cabloy-basic/modules/basic-adapter/src/.metadata/index.ts +4 -4
  461. package/zova/src/suite/cabloy-basic/modules/basic-app/src/.metadata/index.ts +12 -12
  462. package/zova/src/suite/cabloy-basic/modules/basic-captcha/src/.metadata/index.ts +8 -8
  463. package/zova/src/suite/cabloy-basic/modules/basic-commands/src/.metadata/index.ts +9 -9
  464. package/zova/src/suite/cabloy-basic/modules/basic-commandssync/src/.metadata/index.ts +9 -9
  465. package/zova/src/suite/cabloy-basic/modules/basic-currency/src/.metadata/index.ts +13 -13
  466. package/zova/src/suite/cabloy-basic/modules/basic-date/src/.metadata/index.ts +13 -13
  467. package/zova/src/suite/cabloy-basic/modules/basic-details/src/.metadata/index.ts +21 -21
  468. package/zova/src/suite/cabloy-basic/modules/basic-file/src/.metadata/index.ts +26 -26
  469. package/zova/src/suite/cabloy-basic/modules/basic-file/src/api/openapi/schemas.ts +417 -59
  470. package/zova/src/suite/cabloy-basic/modules/basic-file/src/api/openapi/types.ts +6316 -1926
  471. package/zova/src/suite/cabloy-basic/modules/basic-form/src/.metadata/index.ts +12 -12
  472. package/zova/src/suite/cabloy-basic/modules/basic-image/src/.metadata/component/imageUploader.ts +31 -0
  473. package/zova/src/suite/cabloy-basic/modules/basic-image/src/.metadata/index.ts +39 -26
  474. package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/openapi/schemas.ts +417 -59
  475. package/zova/src/suite/cabloy-basic/modules/basic-image/src/api/openapi/types.ts +6316 -1926
  476. package/zova/src/suite/cabloy-basic/modules/basic-image/src/component/formFieldImage/controller.tsx +194 -514
  477. package/zova/src/suite/cabloy-basic/modules/basic-image/src/component/imageUploader/controller.tsx +386 -0
  478. package/zova/src/suite/cabloy-basic/modules/basic-image/src/config/locale/en-us.ts +1 -0
  479. package/zova/src/suite/cabloy-basic/modules/basic-image/src/config/locale/zh-cn.ts +1 -0
  480. package/zova/src/suite/cabloy-basic/modules/basic-image/src/lib/imageTransform.tsx +296 -0
  481. package/zova/src/suite/cabloy-basic/modules/basic-image/src/lib/index.ts +1 -0
  482. package/zova/src/suite/cabloy-basic/modules/basic-input/src/.metadata/index.ts +9 -9
  483. package/zova/src/suite/cabloy-basic/modules/basic-metrics/src/.metadata/index.ts +19 -19
  484. package/zova/src/suite/cabloy-basic/modules/basic-page/src/.metadata/index.ts +8 -8
  485. package/zova/src/suite/cabloy-basic/modules/basic-pageentry/src/.metadata/index.ts +8 -8
  486. package/zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx +9 -2
  487. package/zova/src/suite/cabloy-basic/modules/basic-resource/src/.metadata/index.ts +13 -13
  488. package/zova/src/suite/cabloy-basic/modules/basic-select/src/.metadata/index.ts +13 -13
  489. package/zova/src/suite/cabloy-basic/modules/basic-select/src/bean/tableCell.select.tsx +2 -3
  490. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +2 -3
  491. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/select/controller.tsx +7 -7
  492. package/zova/src/suite/cabloy-basic/modules/basic-select/src/lib/utils.ts +5 -0
  493. package/zova/src/suite/cabloy-basic/modules/basic-select/test/lib/utils.test.ts +28 -0
  494. package/zova/src/suite/cabloy-basic/modules/basic-table/src/.metadata/index.ts +16 -16
  495. package/zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionOperationsRow.tsx +3 -1
  496. package/zova/src/suite/cabloy-basic/modules/basic-text/src/.metadata/index.ts +13 -13
  497. package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/package.json +52 -0
  498. package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/src/.metadata/index.ts +26 -0
  499. package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/src/.metadata/this.ts +2 -0
  500. package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/src/index.ts +1 -0
  501. package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/tsconfig.build.json +13 -0
  502. package/zova/src/suite-vendor/a-cabloy/modules/a-rbac/tsconfig.json +5 -0
  503. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/package.json +1 -1
  504. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/.metadata/index.ts +15 -15
  505. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/lib/deleteRequest.ts +12 -0
  506. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts +12 -6
  507. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/test/lib/deleteRequest.test.ts +37 -0
  508. package/zova/src/suite-vendor/a-cabloy/modules/rest-resource/test/model/resource.types.ts +24 -0
  509. package/zova/src/suite-vendor/a-cabloy/package.json +3 -2
  510. package/zova/src/suite-vendor/a-pay/modules/a-pay/cli/openapi.config.ts +1 -1
  511. package/zova/src/suite-vendor/a-pay/modules/a-pay/package.json +1 -1
  512. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/.metadata/index.ts +43 -43
  513. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/api/openapi/schemas.ts +120 -58
  514. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/api/openapi/types.ts +1408 -938
  515. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/api/payPaymentSession.ts +74 -0
  516. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/apiSchema/payPaymentSession.ts +25 -0
  517. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/model/paymentSession.ts +3 -3
  518. package/zova/src/suite-vendor/a-pay/modules/pay-mock/cli/openapi.config.ts +1 -1
  519. package/zova/src/suite-vendor/a-pay/modules/pay-mock/package.json +1 -1
  520. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/.metadata/index.ts +34 -34
  521. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/api/openapi/schemas.ts +140 -66
  522. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/api/openapi/types.ts +1621 -891
  523. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/api/payMockMockPayment.ts +34 -0
  524. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/apiSchema/payMockMockPayment.ts +13 -0
  525. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/model/payMockPayment.ts +3 -3
  526. package/zova/src/suite-vendor/a-pay/modules/pay-paypal/package.json +1 -1
  527. package/zova/src/suite-vendor/a-pay/modules/pay-paypal/src/.metadata/index.ts +4 -4
  528. package/zova/src/suite-vendor/a-pay/modules/pay-stripe/package.json +1 -1
  529. package/zova/src/suite-vendor/a-pay/modules/pay-stripe/src/.metadata/index.ts +4 -4
  530. package/zova/src/suite-vendor/a-pay/package.json +5 -5
  531. package/zova/src/suite-vendor/a-zova/modules/a-api/package.json +1 -1
  532. package/zova/src/suite-vendor/a-zova/modules/a-api/src/.metadata/index.ts +7 -7
  533. package/zova/src/suite-vendor/a-zova/modules/a-app/package.json +1 -1
  534. package/zova/src/suite-vendor/a-zova/modules/a-app/src/.metadata/index.ts +8 -8
  535. package/zova/src/suite-vendor/a-zova/modules/a-bean/package.json +1 -1
  536. package/zova/src/suite-vendor/a-zova/modules/a-bean/src/.metadata/index.ts +15 -15
  537. package/zova/src/suite-vendor/a-zova/modules/a-behavior/package.json +1 -1
  538. package/zova/src/suite-vendor/a-zova/modules/a-behavior/src/.metadata/index.ts +25 -25
  539. package/zova/src/suite-vendor/a-zova/modules/a-behaviors/package.json +1 -1
  540. package/zova/src/suite-vendor/a-zova/modules/a-behaviors/src/.metadata/index.ts +9 -9
  541. package/zova/src/suite-vendor/a-zova/modules/a-boundary/package.json +1 -1
  542. package/zova/src/suite-vendor/a-zova/modules/a-boundary/src/.metadata/index.ts +5 -5
  543. package/zova/src/suite-vendor/a-zova/modules/a-command/package.json +1 -1
  544. package/zova/src/suite-vendor/a-zova/modules/a-command/src/.metadata/index.ts +5 -5
  545. package/zova/src/suite-vendor/a-zova/modules/a-fetch/package.json +1 -1
  546. package/zova/src/suite-vendor/a-zova/modules/a-fetch/src/.metadata/index.ts +14 -14
  547. package/zova/src/suite-vendor/a-zova/modules/a-form/package.json +1 -1
  548. package/zova/src/suite-vendor/a-zova/modules/a-form/src/.metadata/index.ts +12 -12
  549. package/zova/src/suite-vendor/a-zova/modules/a-icon/package.json +1 -1
  550. package/zova/src/suite-vendor/a-zova/modules/a-icon/src/.metadata/index.ts +18 -18
  551. package/zova/src/suite-vendor/a-zova/modules/a-interceptor/package.json +1 -1
  552. package/zova/src/suite-vendor/a-zova/modules/a-interceptor/src/.metadata/index.ts +8 -8
  553. package/zova/src/suite-vendor/a-zova/modules/a-logger/package.json +1 -1
  554. package/zova/src/suite-vendor/a-zova/modules/a-logger/src/.metadata/index.ts +9 -9
  555. package/zova/src/suite-vendor/a-zova/modules/a-meta/package.json +1 -1
  556. package/zova/src/suite-vendor/a-zova/modules/a-meta/src/.metadata/index.ts +5 -5
  557. package/zova/src/suite-vendor/a-zova/modules/a-model/package.json +1 -1
  558. package/zova/src/suite-vendor/a-zova/modules/a-model/src/.metadata/index.ts +12 -12
  559. package/zova/src/suite-vendor/a-zova/modules/a-openapi/package.json +3 -2
  560. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/.metadata/index.ts +13 -13
  561. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/monkey.ts +16 -27
  562. package/zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/permissions.ts +18 -1
  563. package/zova/src/suite-vendor/a-zova/modules/a-router/package.json +1 -1
  564. package/zova/src/suite-vendor/a-zova/modules/a-router/src/.metadata/index.ts +27 -27
  565. package/zova/src/suite-vendor/a-zova/modules/a-router/src/monkey.ts +9 -6
  566. package/zova/src/suite-vendor/a-zova/modules/a-router/src/monkeySys.ts +15 -5
  567. package/zova/src/suite-vendor/a-zova/modules/a-router/src/types/router.ts +2 -2
  568. package/zova/src/suite-vendor/a-zova/modules/a-routerstack/package.json +1 -1
  569. package/zova/src/suite-vendor/a-zova/modules/a-routerstack/src/.metadata/index.ts +13 -13
  570. package/zova/src/suite-vendor/a-zova/modules/a-routertabs/package.json +1 -1
  571. package/zova/src/suite-vendor/a-zova/modules/a-routertabs/src/.metadata/index.ts +13 -13
  572. package/zova/src/suite-vendor/a-zova/modules/a-ssr/package.json +1 -1
  573. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/.metadata/index.ts +9 -9
  574. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssr.ts +15 -4
  575. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssrNavigation.ts +40 -0
  576. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/lib/ssrProfile.ts +6 -1
  577. package/zova/src/suite-vendor/a-zova/modules/a-ssr/src/monkey.ts +20 -6
  578. package/zova/src/suite-vendor/a-zova/modules/a-ssr/test/lib/ssrNavigation.test.ts +69 -0
  579. package/zova/src/suite-vendor/a-zova/modules/a-ssr/test/lib/ssrProfile.test.ts +25 -6
  580. package/zova/src/suite-vendor/a-zova/modules/a-ssrhmr/package.json +1 -1
  581. package/zova/src/suite-vendor/a-zova/modules/a-ssrhmr/src/.metadata/index.ts +4 -4
  582. package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/package.json +1 -1
  583. package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/src/.metadata/index.ts +10 -10
  584. package/zova/src/suite-vendor/a-zova/modules/a-ssrserver/src/service/ssrHandler.ts +1 -2
  585. package/zova/src/suite-vendor/a-zova/modules/a-style/package.json +1 -1
  586. package/zova/src/suite-vendor/a-zova/modules/a-style/src/.metadata/index.ts +9 -9
  587. package/zova/src/suite-vendor/a-zova/modules/a-style/src/bean/bean.theme.ts +2 -2
  588. package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
  589. package/zova/src/suite-vendor/a-zova/modules/a-table/src/.metadata/index.ts +12 -12
  590. package/zova/src/suite-vendor/a-zova/modules/a-zod/package.json +1 -1
  591. package/zova/src/suite-vendor/a-zova/modules/a-zod/src/.metadata/index.ts +9 -9
  592. package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
  593. package/zova/src/suite-vendor/a-zova/modules/a-zova/src/.metadata/index.ts +5 -5
  594. package/zova/src/suite-vendor/a-zova/package.json +26 -26
  595. package/vona/src/suite/a-home/modules/home-user/src/bean/eventListener.emailConfirmCallback.ts +0 -32
  596. package/vona/src/suite/a-home/modules/home-user/src/bean/eventListener.passwordResetCallback.ts +0 -30
  597. package/vona/src/suite/a-home/modules/home-user/src/bean/eventListener.register.ts +0 -27
  598. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/.metadata/index.ts +0 -207
  599. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/.metadata/locales.ts +0 -18
  600. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/.metadata/this.ts +0 -2
  601. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/bean.mailConfirm.ts +0 -63
  602. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/cacheRedis.emailConfirm.ts +0 -17
  603. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/event.emailConfirmCallback.ts +0 -13
  604. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/bean/event.passwordResetCallback.ts +0 -13
  605. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/config/locale/en-us.ts +0 -13
  606. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/config/locale/mail/en-us.ts +0 -29
  607. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/config/locale/mail/zh-cn.ts +0 -29
  608. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/config/locale/zh-cn.ts +0 -13
  609. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/controller/mail.ts +0 -34
  610. package/vona/src/suite-vendor/a-vona/modules/a-mailconfirm/src/index.ts +0 -2
  611. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/api/paymentSession.ts +0 -74
  612. package/zova/src/suite-vendor/a-pay/modules/a-pay/src/apiSchema/paymentSession.ts +0 -25
  613. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/api/payMockPayment.ts +0 -34
  614. package/zova/src/suite-vendor/a-pay/modules/pay-mock/src/apiSchema/payMockPayment.ts +0 -13
  615. /package/vona/patches/{zova-core@5.1.84.patch → zova-core@5.1.85.patch} +0 -0
  616. /package/vona/src/suite-vendor/{a-vona/modules/a-mailconfirm → a-cabloy/modules/a-rbac}/tsconfig.build.json +0 -0
  617. /package/vona/src/suite-vendor/{a-vona/modules/a-mailconfirm → a-cabloy/modules/a-rbac}/tsconfig.json +0 -0
@@ -1,15 +1,14 @@
1
1
  import type { TableIdentity } from 'table-identity';
2
+ import type { VNode } from 'vue';
2
3
  import type { IComponentOptions } from 'zova';
3
4
  import type { IJsxRenderContextFormField } from 'zova-module-a-form';
4
5
  import type { ControllerFormField, IFormFieldComponentOptions } from 'zova-module-a-form';
5
6
  import type { IImageSceneRecord, IResourceFormFieldOptionsBase } from 'zova-module-a-openapi';
6
7
 
7
8
  import { classes } from 'typestyle';
8
- import { CircleStencil, Cropper, RectangleStencil } from 'vue-advanced-cropper';
9
9
  import { BeanControllerBase, ClientOnly, Use } from 'zova';
10
10
  import { Controller } from 'zova-module-a-bean';
11
11
  import { ZFormField } from 'zova-module-a-form';
12
- import { $QueryEnsureLoaded } from 'zova-module-a-model';
13
12
  import {
14
13
  buildImagePreviewTitle,
15
14
  inferImageRelationName,
@@ -18,8 +17,12 @@ import {
18
17
  } from 'zova-module-basic-image';
19
18
 
20
19
  import type { IImageTransformOptions } from '../../types/image.js';
20
+ import type {
21
+ IImageUploaderRenderState,
22
+ IImageUploaderResult,
23
+ } from '../imageUploader/controller.jsx';
21
24
 
22
- import { ModelImage } from '../../model/image.js';
25
+ import { ZImageUploader } from '../../.metadata/component/imageUploader.js';
23
26
  import 'vue-advanced-cropper/dist/style.css';
24
27
 
25
28
  declare module 'zova-module-a-openapi' {
@@ -58,12 +61,6 @@ export interface ControllerFormFieldImageProps extends IFormFieldComponentOption
58
61
  options?: IResourceFormFieldImageOptions;
59
62
  }
60
63
 
61
- interface IUploadPolicyState {
62
- acceptAttr: string;
63
- multiple: boolean;
64
- pending: boolean;
65
- }
66
-
67
64
  interface IImagePreviewItem {
68
65
  id: TableIdentity;
69
66
  url?: string;
@@ -92,16 +89,12 @@ export class ControllerFormFieldImage extends BeanControllerBase {
92
89
 
93
90
  static $componentOptions: IComponentOptions = { inheritAttrs: false, deepExtendDefault: true };
94
91
 
95
- fileInputRef?: HTMLInputElement;
96
92
  errorMessage?: string;
97
- isUploading = false;
93
+ effectiveMultiple = false;
98
94
  currentValue?: TableIdentity | TableIdentity[] | string;
99
95
  currentOptions: IResourceFormFieldImageOptions = {};
100
96
  $$formField?: ControllerFormField;
101
97
 
102
- @Use()
103
- $$modelImage: ModelImage;
104
-
105
98
  uploadedPreviewMap: Record<string, IImagePreviewItem> = {};
106
99
 
107
100
  @Use({ injectionScope: 'host' })
@@ -120,82 +113,142 @@ export class ControllerFormFieldImage extends BeanControllerBase {
120
113
  this.$$formField = $$formField;
121
114
  this.currentValue = propsBucket.value as any;
122
115
  this.currentOptions = propsBucket.options ?? {};
123
- const uploadPolicyState = this._getUploadPolicyState(this.currentOptions);
124
- const items = this._getPreviewItems(propsBucket.value, uploadPolicyState.multiple);
125
- const maxCount = this._getMaxCount(this.currentOptions);
126
116
  const hasValidationError = !$$formField.field.state.meta.isValid;
127
- const cardClass = classes(
128
- 'rounded-box border border-base-300 bg-base-100 p-4',
129
- (hasValidationError || !!this.errorMessage) && 'border-error',
130
- props.class,
131
- );
117
+ const imageScene = this.currentOptions.imageScene;
118
+ if (!imageScene) {
119
+ return this._renderUploadSceneRequired(
120
+ hasValidationError,
121
+ props.class,
122
+ propsBucket.options?.placeholder,
123
+ );
124
+ }
132
125
  return (
133
- <div class={cardClass}>
134
- <ClientOnly>
135
- <input
136
- ref={ref => {
137
- this.fileInputRef = ref as HTMLInputElement;
138
- }}
139
- class="hidden"
140
- type="file"
141
- accept={uploadPolicyState.acceptAttr}
142
- multiple={uploadPolicyState.multiple}
143
- onChange={event => {
144
- void this._handleFileChange(event, propsBucket.disableNotifyChanged);
145
- }}
146
- />
147
- </ClientOnly>
148
- <div class="flex flex-wrap items-center gap-3">
149
- {items.length < maxCount && (
150
- <button
151
- type="button"
152
- disabled={this.isUploading || uploadPolicyState.pending}
153
- class={classes(
154
- 'btn btn-primary',
155
- (this.isUploading || uploadPolicyState.pending) && 'btn-disabled',
156
- )}
157
- onClick={() => {
158
- if (this.isUploading || uploadPolicyState.pending) return;
159
- this._applyInputPolicy(uploadPolicyState);
160
- this.fileInputRef?.click();
161
- }}
162
- >
163
- {this._getUploadButtonText(items.length, uploadPolicyState.multiple)}
164
- </button>
165
- )}
166
- {this.isUploading && (
167
- <span class="inline-flex items-center gap-2 text-sm text-base-content/70">
168
- <span class="loading loading-spinner loading-sm text-primary"></span>
169
- {this.scope.locale.Uploading()}
170
- </span>
171
- )}
172
- {!items.length && !this.isUploading && (
173
- <span class="text-sm text-base-content/60">
174
- {propsBucket.options?.placeholder ?? this.scope.locale.NoImageSelected()}
175
- </span>
176
- )}
177
- </div>
178
- {!!this.errorMessage && <p class="mt-3 text-sm text-error">{this.errorMessage}</p>}
179
- {!!items.length && (
180
- <div class="mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3">
181
- {items.map((item, index) => {
182
- return this._renderPreviewCard(
183
- item,
184
- index,
185
- items,
186
- false,
187
- propsBucket.disableNotifyChanged,
188
- );
189
- })}
190
- </div>
191
- )}
192
- </div>
126
+ <ZImageUploader
127
+ imageScene={imageScene}
128
+ accept={this.currentOptions.accept}
129
+ mimeTypes={this.currentOptions.mimeTypes}
130
+ extensions={this.currentOptions.extensions}
131
+ maxSize={this.currentOptions.maxSize}
132
+ minSize={this.currentOptions.minSize}
133
+ multiple={this.currentOptions.multiple !== false}
134
+ onBeforeUpload={(fileCount, policy) => {
135
+ return this._validateUploadCount(fileCount, policy.multiple);
136
+ }}
137
+ crop={this._getCropOptions(this.currentOptions)}
138
+ resize={this.currentOptions.resize}
139
+ onUploadedBatch={(uploaded, policy) => {
140
+ this._handleUploaded(uploaded, propsBucket.disableNotifyChanged, policy.multiple);
141
+ }}
142
+ onError={error => {
143
+ this.errorMessage = error.message;
144
+ }}
145
+ slotDefault={state => {
146
+ const multiple = state.policy.multiple;
147
+ this.effectiveMultiple = multiple;
148
+ const items = this._getPreviewItems(propsBucket.value, multiple);
149
+ const maxCount = this._getMaxCount(this.currentOptions, multiple);
150
+ return this._renderUploadContent(
151
+ state,
152
+ items,
153
+ maxCount,
154
+ hasValidationError,
155
+ props.class,
156
+ propsBucket.options?.placeholder,
157
+ propsBucket.disableNotifyChanged,
158
+ );
159
+ }}
160
+ ></ZImageUploader>
193
161
  );
194
162
  }}
195
163
  ></ZFormField>
196
164
  );
197
165
  }
198
166
 
167
+ private _renderUploadSceneRequired(
168
+ hasValidationError: boolean,
169
+ propsClass: string | undefined,
170
+ placeholder: string | undefined,
171
+ ): VNode {
172
+ const message = this.scope.locale.ImageUploadSceneRequired();
173
+ return (
174
+ <div
175
+ class={classes(
176
+ 'rounded-box border border-base-300 bg-base-100 p-4',
177
+ (hasValidationError || !!this.errorMessage) && 'border-error',
178
+ propsClass,
179
+ )}
180
+ >
181
+ <span class="text-sm text-base-content/60">
182
+ {placeholder ?? this.scope.locale.NoImageSelected()}
183
+ </span>
184
+ <p class="mt-3 text-sm text-error">{message}</p>
185
+ </div>
186
+ );
187
+ }
188
+
189
+ private _renderUploadContent(
190
+ state: IImageUploaderRenderState,
191
+ items: IImagePreviewItem[],
192
+ maxCount: number,
193
+ hasValidationError: boolean,
194
+ propsClass: string | undefined,
195
+ placeholder: string | undefined,
196
+ disableNotifyChanged: boolean | undefined,
197
+ ): VNode {
198
+ const cardClass = classes(
199
+ 'rounded-box border border-base-300 bg-base-100 p-4',
200
+ (hasValidationError || !!this.errorMessage || !!state.errorMessage) && 'border-error',
201
+ propsClass,
202
+ );
203
+ return (
204
+ <div class={cardClass}>
205
+ <div class="flex flex-wrap items-center gap-3">
206
+ {items.length < maxCount && (
207
+ <button
208
+ type="button"
209
+ disabled={state.isUploading || state.policy.pending}
210
+ class={classes(
211
+ 'btn btn-primary',
212
+ (state.isUploading || state.policy.pending) && 'btn-disabled',
213
+ )}
214
+ onClick={state.chooseFiles}
215
+ >
216
+ {this._getUploadButtonText(items.length, state.policy.multiple)}
217
+ </button>
218
+ )}
219
+ {state.isUploading && (
220
+ <span class="inline-flex items-center gap-2 text-sm text-base-content/70">
221
+ <span class="loading loading-spinner loading-sm text-primary"></span>
222
+ {this.scope.locale.Uploading()}
223
+ </span>
224
+ )}
225
+ {!items.length && !state.isUploading && (
226
+ <span class="text-sm text-base-content/60">
227
+ {placeholder ?? this.scope.locale.NoImageSelected()}
228
+ </span>
229
+ )}
230
+ </div>
231
+ {!!(this.errorMessage || state.errorMessage) && (
232
+ <p class="mt-3 text-sm text-error">{this.errorMessage || state.errorMessage}</p>
233
+ )}
234
+ {!!items.length && (
235
+ <div
236
+ class={classes(
237
+ 'mt-4 grid w-full gap-4',
238
+ state.policy.multiple
239
+ ? 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3'
240
+ : 'grid-cols-1 max-w-xl',
241
+ )}
242
+ >
243
+ {items.map((item, index) =>
244
+ this._renderPreviewCard(item, index, items, false, disableNotifyChanged),
245
+ )}
246
+ </div>
247
+ )}
248
+ </div>
249
+ );
250
+ }
251
+
199
252
  private _renderReadonlyPreset() {
200
253
  return (
201
254
  <ZFormField
@@ -203,7 +256,10 @@ export class ControllerFormFieldImage extends BeanControllerBase {
203
256
  slotDefault={({ propsBucket, props }) => {
204
257
  this.currentValue = propsBucket.value as any;
205
258
  this.currentOptions = propsBucket.options ?? {};
206
- const items = this._getPreviewItems(propsBucket.value);
259
+ const items = this._getPreviewItems(
260
+ propsBucket.value,
261
+ Array.isArray(propsBucket.value) && this.currentOptions.multiple !== false,
262
+ );
207
263
  return <div class={props.class}>{this._renderReadonlyItems(items)}</div>;
208
264
  }}
209
265
  ></ZFormField>
@@ -216,8 +272,14 @@ export class ControllerFormFieldImage extends BeanControllerBase {
216
272
  <span class="text-sm text-base-content/60">{this.scope.locale.NoImageSelected()}</span>
217
273
  );
218
274
  }
275
+ const multiple = Array.isArray(this.currentValue) && this.currentOptions.multiple !== false;
219
276
  return (
220
- <div class="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3">
277
+ <div
278
+ class={classes(
279
+ 'grid gap-4',
280
+ multiple ? 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3' : 'grid-cols-1',
281
+ )}
282
+ >
221
283
  {items.map((item, index) => this._renderPreviewCard(item, index, items, true, false))}
222
284
  </div>
223
285
  );
@@ -300,143 +362,67 @@ export class ControllerFormFieldImage extends BeanControllerBase {
300
362
  return itemCount > 0 ? this.scope.locale.ReplaceImage() : this.scope.locale.SelectImage();
301
363
  }
302
364
 
303
- private _getUploadPolicyQuery(options?: IResourceFormFieldImageOptions) {
304
- return this.$$modelImage.getUploadPolicy(options?.imageScene as string | undefined);
305
- }
306
-
307
- private _getUploadPolicyState(options?: IResourceFormFieldImageOptions): IUploadPolicyState {
308
- const query = this._getUploadPolicyQuery(options);
309
- const policy = query?.data;
310
- return {
311
- acceptAttr: this._getAcceptAttr(options, policy),
312
- multiple: this._getEffectiveMultiple(options, policy),
313
- pending: query ? query.data === undefined && !!(query.isPending || query.isFetching) : false,
314
- };
315
- }
316
-
317
- private _getCachedUploadPolicy(options?: IResourceFormFieldImageOptions) {
318
- return this._getUploadPolicyQuery(options)?.data;
319
- }
320
-
321
- private async _waitForUploadPolicy(options?: IResourceFormFieldImageOptions) {
322
- await $QueryEnsureLoaded(() => this._getUploadPolicyQuery(options));
323
- }
324
-
325
365
  private _getEffectiveMultiple(
326
366
  options?: IResourceFormFieldImageOptions,
327
- policy = this._getCachedUploadPolicy(options),
367
+ policyMultiple = this.effectiveMultiple,
328
368
  ) {
329
- return !!(options?.multiple ?? policy?.multiple);
369
+ return policyMultiple && options?.multiple !== false;
330
370
  }
331
371
 
332
- private _applyInputPolicy(uploadPolicyState: IUploadPolicyState) {
333
- if (!this.fileInputRef) return;
334
- this.fileInputRef.accept = uploadPolicyState.acceptAttr;
335
- this.fileInputRef.multiple = uploadPolicyState.multiple;
372
+ private _getCropOptions(options: IResourceFormFieldImageOptions) {
373
+ if (!options.enableCrop) return undefined;
374
+ return {
375
+ labels: {
376
+ title: this.scope.locale.CropImage(),
377
+ adjust: this.scope.locale.AdjustImage(),
378
+ cancel: this.scope.locale.CancelCrop(),
379
+ apply: this.scope.locale.ApplyCrop(),
380
+ },
381
+ aspectRatio: options.cropAspectRatio,
382
+ shape: options.cropShape,
383
+ } as const;
336
384
  }
337
385
 
338
- private async _handleFileChange(event: Event, disableNotifyChanged?: boolean) {
339
- const input = event.target as HTMLInputElement;
340
- const files = Array.from(input.files ?? []);
341
- input.value = '';
342
- if (files.length === 0) return;
343
- this.errorMessage = undefined;
344
- const options = this.currentOptions ?? {};
345
- const uploadTarget = this._resolveUploadTarget();
346
- this.isUploading = true;
347
- try {
348
- await this._waitForUploadPolicy(options);
349
- const multiple = this._getEffectiveMultiple(options);
350
- const currentIds = this._normalizeValueToImageIds(this.currentValue, multiple);
351
- const filesToHandle = multiple ? files : files.slice(0, 1);
352
- const maxCount = this._getMaxCount(options);
353
- const nextCountCandidate = multiple
354
- ? currentIds.length + filesToHandle.length
355
- : filesToHandle.length;
356
- if (nextCountCandidate > maxCount) {
357
- this.errorMessage = this.scope.locale.TooManyImages(maxCount);
358
- return;
359
- }
360
- const uploadedItems: IImagePreviewItem[] = [];
361
- for (const file of filesToHandle) {
362
- const validationMessage = this._validateFile(file, options);
363
- if (validationMessage) {
364
- this.errorMessage = validationMessage;
365
- continue;
366
- }
367
- const preparedFile = await this._prepareFile(file, options);
368
- if (!preparedFile) continue;
369
- const uploaded = await this._uploadPreparedFile(
370
- preparedFile,
371
- file,
372
- uploadTarget,
373
- !!this._getCachedUploadPolicy(options)?.directUpload,
374
- );
375
- const item: IImagePreviewItem = {
376
- id: uploaded.id,
377
- url: uploaded.url,
378
- filename: uploaded.filename,
379
- width: uploaded.width,
380
- height: uploaded.height,
381
- };
382
- this.uploadedPreviewMap[String(item.id)] = item;
383
- uploadedItems.push(item);
384
- }
385
- if (uploadedItems.length === 0) return;
386
- const nextIds = multiple
387
- ? [...currentIds, ...uploadedItems.map(item => item.id)]
388
- : [uploadedItems[uploadedItems.length - 1].id];
389
- this._setFieldValue(nextIds, disableNotifyChanged, multiple);
390
- this.errorMessage = undefined;
391
- } catch (err: any) {
392
- this.errorMessage = err?.message ?? this.scope.locale.ImageUploadFailed();
393
- } finally {
394
- this.isUploading = false;
395
- }
386
+ private _validateUploadCount(fileCount: number, multiple: boolean) {
387
+ const currentIds = this._normalizeValueToImageIds(this.currentValue, multiple);
388
+ const maxCount = this._getMaxCount(this.currentOptions, multiple);
389
+ const nextCountCandidate = multiple ? currentIds.length + fileCount : Math.min(fileCount, 1);
390
+ return nextCountCandidate > maxCount ? this.scope.locale.TooManyImages(maxCount) : undefined;
396
391
  }
397
392
 
398
- private async _uploadPreparedFile(
399
- preparedFile: File,
400
- sourceFile: File,
401
- uploadTarget: { imageScene: string },
402
- directUpload: boolean,
393
+ private _handleUploaded(
394
+ uploaded: IImageUploaderResult[],
395
+ disableNotifyChanged: boolean | undefined,
396
+ multiple: boolean,
403
397
  ) {
404
- if (!directUpload) {
405
- return await this.scope.api.image.upload({
406
- ...uploadTarget,
407
- image: preparedFile,
408
- });
398
+ const currentIds = this._normalizeValueToImageIds(this.currentValue, multiple);
399
+ const maxCount = this._getMaxCount(this.currentOptions, multiple);
400
+ const uploadedItems = uploaded.map(item => this._createPreviewItem(item));
401
+ const nextCountCandidate = multiple
402
+ ? currentIds.length + uploadedItems.length
403
+ : uploadedItems.length;
404
+ if (nextCountCandidate > maxCount) {
405
+ this.errorMessage = this.scope.locale.TooManyImages(maxCount);
406
+ return;
409
407
  }
410
-
411
- const mimeType = preparedFile.type || sourceFile.type;
412
- const directUploadRes = await this.scope.api.image.createDirectUpload({
413
- ...uploadTarget,
414
- filename: preparedFile.name,
415
- size: preparedFile.size,
416
- mimeType,
417
- });
418
- const formData = new FormData();
419
- formData.append('file', preparedFile);
420
- const providerRes = await fetch(directUploadRes.uploadUrl, {
421
- method: 'POST',
422
- body: formData,
423
- });
424
- if (!providerRes.ok) {
425
- throw new Error(`image direct upload failed: ${providerRes.status}`);
408
+ for (const item of uploadedItems) {
409
+ this.uploadedPreviewMap[String(item.id)] = item;
426
410
  }
427
- return await this.scope.api.image.finalizeDirectUpload({
428
- imageId: directUploadRes.id,
429
- });
411
+ const nextIds = multiple
412
+ ? [...currentIds, ...uploadedItems.map(item => item.id)]
413
+ : [uploadedItems[uploadedItems.length - 1].id];
414
+ this.errorMessage = undefined;
415
+ this._setFieldValue(nextIds, disableNotifyChanged, multiple);
430
416
  }
431
417
 
432
- private _resolveUploadTarget() {
433
- const imageScene = this.currentOptions.imageScene;
434
- if (!imageScene) {
435
- throw new Error('should specify image upload scene');
436
- }
418
+ private _createPreviewItem(uploaded: IImageUploaderResult): IImagePreviewItem {
437
419
  return {
438
- imageScene,
439
- } as const;
420
+ id: uploaded.id,
421
+ url: uploaded.url,
422
+ filename: uploaded.filename,
423
+ width: uploaded.width,
424
+ height: uploaded.height,
425
+ };
440
426
  }
441
427
 
442
428
  private _removeItem(imageId: TableIdentity, disableNotifyChanged?: boolean) {
@@ -445,7 +431,6 @@ export class ControllerFormFieldImage extends BeanControllerBase {
445
431
  const nextIds = currentIds.filter(item => String(item) !== String(imageId));
446
432
  delete this.uploadedPreviewMap[String(imageId)];
447
433
  this._setFieldValue(nextIds, disableNotifyChanged, multiple);
448
- this.errorMessage = undefined;
449
434
  }
450
435
 
451
436
  private _setFieldValue(
@@ -526,306 +511,11 @@ export class ControllerFormFieldImage extends BeanControllerBase {
526
511
  return [];
527
512
  }
528
513
 
529
- private _getMaxCount(options: IResourceFormFieldImageOptions) {
530
- if (!this._getEffectiveMultiple(options)) return 1;
514
+ private _getMaxCount(options: IResourceFormFieldImageOptions, multiple = this.effectiveMultiple) {
515
+ if (!multiple) return 1;
531
516
  return Math.max(options.maxCount ?? 1, 1);
532
517
  }
533
518
 
534
- private _getAcceptAttr(
535
- options?: IResourceFormFieldImageOptions,
536
- policy = this._getCachedUploadPolicy(options),
537
- ) {
538
- if (!options) return 'image/*';
539
- if (typeof options.accept === 'string') return options.accept;
540
- if (options.accept?.length) return options.accept.join(',');
541
- const parts = [
542
- ...(options.mimeTypes ?? policy?.mimeTypes ?? []),
543
- ...(options.extensions ?? policy?.extensions ?? []),
544
- ];
545
- return parts.length > 0 ? parts.join(',') : 'image/*';
546
- }
547
-
548
- private _validateFile(file: File, options: IResourceFormFieldImageOptions) {
549
- const acceptTokens = this._collectAcceptTokens(options);
550
- if (acceptTokens.length > 0 && !this._matchesAccept(file, acceptTokens)) {
551
- return this.scope.locale.InvalidImageType();
552
- }
553
- const maxSize = options.maxSize ?? this._getCachedUploadPolicy(options)?.maxSize;
554
- if (typeof maxSize === 'number' && file.size > maxSize) {
555
- return this.scope.locale.ImageTooLarge(this._formatBytes(maxSize));
556
- }
557
- if (options.minSize && file.size < options.minSize) {
558
- return this.scope.locale.ImageTooSmall(this._formatBytes(options.minSize));
559
- }
560
- return undefined;
561
- }
562
-
563
- private _collectAcceptTokens(options: IResourceFormFieldImageOptions) {
564
- const accept = options.accept
565
- ? Array.isArray(options.accept)
566
- ? options.accept
567
- : options.accept.split(',')
568
- : [];
569
- const policy = this._getCachedUploadPolicy(options);
570
- return [
571
- ...accept,
572
- ...(options.mimeTypes ?? policy?.mimeTypes ?? []),
573
- ...(options.extensions ?? policy?.extensions ?? []),
574
- ]
575
- .map(item => item.trim().toLowerCase())
576
- .filter(item => !!item);
577
- }
578
-
579
- private _matchesAccept(file: File, acceptTokens: string[]) {
580
- const mimeType = file.type.toLowerCase();
581
- const extension = this._getFileExtension(file.name);
582
- return acceptTokens.some(token => {
583
- if (token === 'image/*') return mimeType.startsWith('image/');
584
- if (token.startsWith('.')) return extension === token;
585
- if (token.endsWith('/*')) {
586
- const prefix = token.slice(0, token.length - 1);
587
- return mimeType.startsWith(prefix);
588
- }
589
- return mimeType === token;
590
- });
591
- }
592
-
593
- private _getFileExtension(filename: string) {
594
- const index = filename.lastIndexOf('.');
595
- if (index === -1) return '';
596
- return filename.slice(index).toLowerCase();
597
- }
598
-
599
- private async _prepareFile(file: File, options: IResourceFormFieldImageOptions) {
600
- if (!process.env.CLIENT) return file;
601
- let canvas: HTMLCanvasElement | undefined;
602
- if (options.enableCrop) {
603
- canvas = await this._openCropDialog(file, options);
604
- if (!canvas) return undefined;
605
- }
606
- const resizeOptions = options.resize;
607
- if (!canvas && !resizeOptions) {
608
- return file;
609
- }
610
- const sourceCanvas = canvas ?? (await this._createCanvasFromFile(file));
611
- const targetCanvas = this._resizeCanvas(sourceCanvas, resizeOptions);
612
- return await this._canvasToFile(targetCanvas, file, resizeOptions);
613
- }
614
-
615
- private async _openCropDialog(file: File, options: IResourceFormFieldImageOptions) {
616
- const src = URL.createObjectURL(file);
617
- try {
618
- return await new Promise<HTMLCanvasElement | undefined>(resolve => {
619
- let settled = false;
620
- let cropperRef: { getResult?: () => { canvas?: HTMLCanvasElement } } | undefined;
621
- const dialog = this.$appModal.dialog(
622
- {
623
- title: this.scope.locale.CropImage(),
624
- slotDefault: () => {
625
- return (
626
- <ClientOnly>
627
- <div class="space-y-4">
628
- <div class="h-105 overflow-hidden rounded-box bg-base-200">
629
- <Cropper
630
- ref={ref => {
631
- cropperRef = ref as any;
632
- }}
633
- class="h-full w-full"
634
- src={src}
635
- stencilComponent={
636
- options.cropShape === 'round' ? CircleStencil : RectangleStencil
637
- }
638
- stencilProps={{
639
- aspectRatio: options.cropAspectRatio,
640
- }}
641
- imageRestriction="stencil"
642
- ></Cropper>
643
- </div>
644
- <p class="text-sm text-base-content/70">{this.scope.locale.AdjustImage()}</p>
645
- </div>
646
- </ClientOnly>
647
- );
648
- },
649
- slotActions: modal => {
650
- return (
651
- <>
652
- <button
653
- type="button"
654
- class="btn btn-ghost"
655
- onClick={() => {
656
- if (settled) return;
657
- settled = true;
658
- modal.close();
659
- resolve(undefined);
660
- }}
661
- >
662
- {this.scope.locale.CancelCrop()}
663
- </button>
664
- <button
665
- type="button"
666
- class="btn btn-primary"
667
- onClick={() => {
668
- if (settled) return;
669
- const canvas = cropperRef?.getResult?.()?.canvas;
670
- settled = true;
671
- modal.close();
672
- resolve(canvas);
673
- }}
674
- >
675
- {this.scope.locale.ApplyCrop()}
676
- </button>
677
- </>
678
- );
679
- },
680
- onClose: () => {
681
- if (settled) return;
682
- settled = true;
683
- resolve(undefined);
684
- },
685
- },
686
- {
687
- maxWidth: 960,
688
- showCloseButton: true,
689
- closeOnBackdrop: false,
690
- },
691
- );
692
- void dialog;
693
- });
694
- } finally {
695
- URL.revokeObjectURL(src);
696
- }
697
- }
698
-
699
- private async _createCanvasFromFile(file: File) {
700
- const src = URL.createObjectURL(file);
701
- try {
702
- return await this._createCanvasFromUrl(src);
703
- } finally {
704
- URL.revokeObjectURL(src);
705
- }
706
- }
707
-
708
- private async _createCanvasFromUrl(src: string) {
709
- const image = await this._loadImage(src);
710
- const canvas = document.createElement('canvas');
711
- canvas.width = image.naturalWidth || image.width;
712
- canvas.height = image.naturalHeight || image.height;
713
- const context = canvas.getContext('2d');
714
- if (!context) throw new Error(this.scope.locale.ImageUploadFailed());
715
- context.drawImage(image, 0, 0, canvas.width, canvas.height);
716
- return canvas;
717
- }
718
-
719
- private _resizeCanvas(
720
- sourceCanvas: HTMLCanvasElement,
721
- resizeOptions?: IResourceFormFieldImageResizeOptions,
722
- ) {
723
- if (!resizeOptions?.width && !resizeOptions?.height) {
724
- return sourceCanvas;
725
- }
726
- const sourceWidth = sourceCanvas.width;
727
- const sourceHeight = sourceCanvas.height;
728
- const fallbackRatio = sourceWidth / Math.max(sourceHeight, 1);
729
- const targetWidth =
730
- resizeOptions.width ?? Math.round((resizeOptions.height ?? sourceHeight) * fallbackRatio);
731
- const targetHeight =
732
- resizeOptions.height ?? Math.round(targetWidth / Math.max(fallbackRatio, 0.0001));
733
- const canvas = document.createElement('canvas');
734
- canvas.width = targetWidth;
735
- canvas.height = targetHeight;
736
- const context = canvas.getContext('2d');
737
- if (!context) return sourceCanvas;
738
- if (resizeOptions.background) {
739
- context.fillStyle = resizeOptions.background;
740
- context.fillRect(0, 0, targetWidth, targetHeight);
741
- }
742
- const fit = resizeOptions.fit ?? 'cover';
743
- if (fit === 'cover' || fit === 'crop') {
744
- const scale = Math.max(targetWidth / sourceWidth, targetHeight / sourceHeight);
745
- const width = sourceWidth * scale;
746
- const height = sourceHeight * scale;
747
- const left = (targetWidth - width) / 2;
748
- const top = (targetHeight - height) / 2;
749
- context.drawImage(sourceCanvas, left, top, width, height);
750
- return canvas;
751
- }
752
- const scaleContain = Math.min(targetWidth / sourceWidth, targetHeight / sourceHeight);
753
- const scale = fit === 'scale-down' ? Math.min(1, scaleContain) : scaleContain;
754
- const width = sourceWidth * scale;
755
- const height = sourceHeight * scale;
756
- const left = (targetWidth - width) / 2;
757
- const top = (targetHeight - height) / 2;
758
- context.drawImage(sourceCanvas, left, top, width, height);
759
- return canvas;
760
- }
761
-
762
- private async _canvasToFile(
763
- canvas: HTMLCanvasElement,
764
- file: File,
765
- resizeOptions?: IResourceFormFieldImageResizeOptions,
766
- ) {
767
- const mimeType = this._resolveMimeType(file.type, resizeOptions?.format);
768
- const quality = this._resolveQuality(resizeOptions?.quality);
769
- const blob = await new Promise<Blob>((resolve, reject) => {
770
- canvas.toBlob(
771
- result => {
772
- if (!result) {
773
- reject(new Error(this.scope.locale.ImageUploadFailed()));
774
- return;
775
- }
776
- resolve(result);
777
- },
778
- mimeType,
779
- quality,
780
- );
781
- });
782
- return new File([blob], this._replaceExtension(file.name, mimeType), {
783
- type: mimeType,
784
- lastModified: Date.now(),
785
- });
786
- }
787
-
788
- private _resolveMimeType(
789
- fileType: string | undefined,
790
- format?: IImageTransformOptions['format'],
791
- ) {
792
- if (format === 'jpeg') return 'image/jpeg';
793
- if (format === 'png') return 'image/png';
794
- if (format === 'webp') return 'image/webp';
795
- if (format === 'avif') return 'image/avif';
796
- if (fileType && fileType.startsWith('image/')) return fileType;
797
- return 'image/jpeg';
798
- }
799
-
800
- private _resolveQuality(quality?: number) {
801
- if (quality === undefined) return 0.92;
802
- if (quality > 1) return Math.min(quality / 100, 1);
803
- return quality;
804
- }
805
-
806
- private _replaceExtension(filename: string, mimeType: string) {
807
- const ext =
808
- mimeType === 'image/png'
809
- ? '.png'
810
- : mimeType === 'image/webp'
811
- ? '.webp'
812
- : mimeType === 'image/avif'
813
- ? '.avif'
814
- : '.jpg';
815
- const index = filename.lastIndexOf('.');
816
- if (index === -1) return `${filename}${ext}`;
817
- return `${filename.slice(0, index)}${ext}`;
818
- }
819
-
820
- private _loadImage(src: string) {
821
- return new Promise<HTMLImageElement>((resolve, reject) => {
822
- const image = new Image();
823
- image.onload = () => resolve(image);
824
- image.onerror = () => reject(new Error(this.scope.locale.ImageUploadFailed()));
825
- image.src = src;
826
- });
827
- }
828
-
829
519
  private async _openPreviewDialog(items: IImagePreviewItem[], currentIndex: number) {
830
520
  const passportCode = await this._ensureDeliveryPassportCode();
831
521
  const previewItems = items
@@ -879,14 +569,4 @@ export class ControllerFormFieldImage extends BeanControllerBase {
879
569
  private _resolvePreviewUrl(url: string, passportCode?: string) {
880
570
  return resolveImagePreviewUrl(url, this.sys.config.api.baseURL, passportCode);
881
571
  }
882
-
883
- private _formatBytes(bytes: number) {
884
- if (bytes >= 1024 * 1024) {
885
- return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
886
- }
887
- if (bytes >= 1024) {
888
- return `${Math.round(bytes / 1024)} KB`;
889
- }
890
- return `${bytes} B`;
891
- }
892
572
  }