@nocobase/portal-template-default 1.0.9 → 1.0.11

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 (338) hide show
  1. package/.env.example +5 -0
  2. package/.github/workflows/publish.yml +106 -0
  3. package/.gitignore +33 -0
  4. package/AGENTS.md +19 -0
  5. package/README.MD +61 -180
  6. package/dist/assets/{LineDraw-C0m1GONT.js → LineDraw-iG-ADes-.js} +1 -1
  7. package/dist/assets/{SymbolDraw-CCospe5G.js → SymbolDraw-DXoSw1tM.js} +1 -1
  8. package/dist/assets/VisualMapping-C_ee4Eht.js +1 -0
  9. package/dist/assets/auth-method-demo-DaOCuvsq.js +1 -0
  10. package/dist/assets/auto-login-provider-5Uxza9Ms.js +2 -0
  11. package/dist/assets/auto-login-provider-DyaPGK2D.js +1 -0
  12. package/dist/assets/auto-redirect-provider-CfwRvYOI.js +1 -0
  13. package/dist/assets/auto-redirect-provider-Cr3jmYts.js +1 -0
  14. package/dist/assets/auto-redirect-provider-QkJQRBbG.js +1 -0
  15. package/dist/assets/calendar-DjDRfD5t.js +1 -0
  16. package/dist/assets/card-DuQBOS6A.js +1 -0
  17. package/dist/assets/cas-sign-in-button-CyqG1QME.js +1 -0
  18. package/dist/assets/components-D-ptYjX_.js +20 -0
  19. package/dist/assets/configuration-gate-C08mkkiX.js +1 -0
  20. package/dist/assets/{createClipPathFromCoordSys-uEftn1Mq.js → createClipPathFromCoordSys-wj34-b1B.js} +1 -1
  21. package/dist/assets/createSeriesDataSimply-D0A6SAVQ.js +1 -0
  22. package/dist/assets/customGraphicKeyframeAnimation-DWrhrHL_.js +3 -0
  23. package/dist/assets/demo-BYWHeKUe.js +1 -0
  24. package/dist/assets/demo-CPWoNtx8.js +1 -0
  25. package/dist/assets/demo-CyvJk5zV.js +1 -0
  26. package/dist/assets/demo-D4OiKplc.js +1 -0
  27. package/dist/assets/demo-DBueJg0m.js +1 -0
  28. package/dist/assets/demo-DkIhyiRK.js +1 -0
  29. package/dist/assets/demo-tpTjO0sC.js +1 -0
  30. package/dist/assets/dingtalk-sign-in-button-DSWsSruv.js +1 -0
  31. package/dist/assets/echarts-preview-DxHNfq1C.js +1 -0
  32. package/dist/assets/{echarts-runtime-CEgJbv68.js → echarts-runtime-D8kXn6ME.js} +3 -3
  33. package/dist/assets/{echarts-runtime-advanced-Buhm2BHz.js → echarts-runtime-advanced-QY8v95qK.js} +1 -1
  34. package/dist/assets/{echarts-runtime-common-DLAdBAIa.js → echarts-runtime-common-D-yqAK-r.js} +1 -1
  35. package/dist/assets/{echarts-runtime-components-ypnyLkYx.js → echarts-runtime-components-P4-i8jPU.js} +1 -1
  36. package/dist/assets/{echarts-runtime-hierarchy-ClStquCF.js → echarts-runtime-hierarchy-ByQZ-DbP.js} +1 -1
  37. package/dist/assets/floating-BFVEyPEp.js +15 -0
  38. package/dist/assets/index-BgCbGDMc.js +43 -0
  39. package/dist/assets/index-Btk35Nx-.js +23 -0
  40. package/dist/assets/index-CwNxd66J.js +1 -0
  41. package/dist/assets/index-MB-jfQld.js +686 -0
  42. package/dist/assets/index-NH3aqqQz.css +1 -0
  43. package/dist/assets/index-gFtCXH3o.js +58 -0
  44. package/dist/assets/index-um5hdKdZ.js +23 -0
  45. package/dist/assets/{labelHelper-C137W5gU.js → labelHelper-DQqRy3a_.js} +1 -1
  46. package/dist/assets/ldap-sign-in-form--6Gt3yGq.js +1 -0
  47. package/dist/assets/oidc-sign-in-button-CQdRcR_p.js +1 -0
  48. package/dist/assets/{page-context-Cxx11gzg.js → page-context-CnQ4GYM7.js} +10 -10
  49. package/dist/assets/prompt-card-B2RS4nt2.js +1 -0
  50. package/dist/assets/prompt-output-DZHRM2ft.js +1 -0
  51. package/dist/assets/saml-sign-in-button-BHL5a0JV.js +1 -0
  52. package/dist/assets/{sectorHelper-Fqgz3uEk.js → sectorHelper-DN_Vv6OL.js} +1 -1
  53. package/dist/assets/shortcut-C5x5LQWU.js +47 -0
  54. package/dist/assets/sms-sign-in-form-DTX9GV2I.js +1 -0
  55. package/dist/assets/{static.browser-CfQQzERe.js → static.browser-jI1psK0d.js} +8 -8
  56. package/dist/assets/{switch-DrxImI8F.js → switch-CRL8PmRI.js} +1 -1
  57. package/dist/assets/{tool-cards-BGfsY8JF.js → tool-cards-DFttLAfo.js} +6 -7
  58. package/dist/assets/use-authenticator-sign-in-CRGjzXju.js +1 -0
  59. package/dist/assets/use-dingtalk-sign-in-8WYzJ2jf.js +1 -0
  60. package/dist/assets/use-wecom-sign-in-C9j8wfCD.js +1 -0
  61. package/dist/assets/wecom-sign-in-button-mIS1zGSU.js +1 -0
  62. package/dist/index.html +2 -2
  63. package/dist/index.raw.html +5 -2
  64. package/package.json +3 -5
  65. package/scripts/build-html.mjs +12 -0
  66. package/src/App.css +2 -0
  67. package/src/App.tsx +35 -186
  68. package/src/app/development.tsx +154 -0
  69. package/src/app/extension.ts +5 -0
  70. package/src/app/extensions.tsx +18 -4
  71. package/src/app/routes.tsx +65 -0
  72. package/src/components/access-control/acl-bootstrap.tsx +11 -3
  73. package/src/components/access-control/acl-gate.tsx +7 -6
  74. package/src/components/access-control/can-access.tsx +17 -0
  75. package/src/components/access-control/navigate-to-accessible-resource.tsx +8 -3
  76. package/src/components/app-shell/sidebar.tsx +21 -5
  77. package/src/components/auth/auto-redirect-provider.tsx +2 -1
  78. package/src/extensions/nocobase-acl/README.md +74 -0
  79. package/{registry → src/extensions}/nocobase-acl/components/acl-boundary.tsx +22 -25
  80. package/{registry → src/extensions}/nocobase-acl/components/role-switcher.tsx +26 -23
  81. package/src/extensions/nocobase-acl/demo/acl-preview-provider.tsx +81 -0
  82. package/{registry → src/extensions}/nocobase-acl/demo/boundary-api.tsx +58 -0
  83. package/{registry → src/extensions}/nocobase-acl/demo/index.tsx +243 -105
  84. package/{registry → src/extensions}/nocobase-acl/demo/prompt-generator.tsx +3 -1
  85. package/src/extensions/nocobase-acl/extension.tsx +73 -0
  86. package/{registry → src/extensions}/nocobase-ai/README.md +21 -5
  87. package/{registry → src/extensions}/nocobase-ai/components/chat/chat-composer.tsx +3 -1
  88. package/{registry → src/extensions}/nocobase-ai/components/chat/chat-messages.tsx +38 -3
  89. package/{registry → src/extensions}/nocobase-ai/components/chat/tool-call-card.tsx +1 -9
  90. package/{registry → src/extensions}/nocobase-ai/components/index.ts +5 -0
  91. package/src/extensions/nocobase-ai/components/surfaces/chat-dialog.tsx +17 -0
  92. package/src/extensions/nocobase-ai/components/surfaces/chat-side-panel.tsx +35 -0
  93. package/src/extensions/nocobase-ai/components/surfaces/chat-surface.tsx +108 -0
  94. package/{registry → src/extensions}/nocobase-ai/components/triggers/ai-chat-floating-trigger.tsx +2 -2
  95. package/{registry → src/extensions}/nocobase-ai/demo/configuration-gate.tsx +4 -1
  96. package/{registry → src/extensions}/nocobase-ai/demo/container-showcase.tsx +2 -2
  97. package/{registry → src/extensions}/nocobase-ai/demo/floating.tsx +45 -15
  98. package/{registry → src/extensions}/nocobase-ai/demo/index.tsx +116 -74
  99. package/{registry → src/extensions}/nocobase-ai/demo/prompt-generator.tsx +3 -3
  100. package/{registry → src/extensions}/nocobase-ai/demo/tool-cards.tsx +2 -3
  101. package/src/extensions/nocobase-ai/extension.tsx +160 -0
  102. package/{registry → src/extensions}/nocobase-ai/global-ai-chat.tsx +12 -28
  103. package/{registry → src/extensions}/nocobase-ai/providers/ai-provider.tsx +14 -1
  104. package/{registry → src/extensions}/nocobase-ai/providers/chat-context.tsx +1 -0
  105. package/{registry → src/extensions}/nocobase-ai/providers/chat-provider.tsx +29 -8
  106. package/{registry → src/extensions}/nocobase-ai/providers/use-chat-attachments.ts +6 -1
  107. package/{registry → src/extensions}/nocobase-ai/providers/use-chat-work-context.ts +4 -1
  108. package/{registry → src/extensions}/nocobase-route-surfaces/README.md +2 -1
  109. package/{registry → src/extensions}/nocobase-route-surfaces/demo/index.tsx +33 -7
  110. package/{registry → src/extensions}/nocobase-route-surfaces/demo/scenarios.ts +20 -14
  111. package/{registry → src/extensions}/nocobase-route-surfaces/extension.tsx +55 -52
  112. package/src/{pages/users → extensions/nocobase-users-example}/create.tsx +4 -4
  113. package/src/{pages/users → extensions/nocobase-users-example}/edit.tsx +5 -9
  114. package/src/extensions/nocobase-users-example/extension.tsx +109 -0
  115. package/src/{pages/users → extensions/nocobase-users-example}/form-context.ts +11 -9
  116. package/src/extensions/nocobase-users-example/layout.tsx +16 -0
  117. package/src/{pages/users → extensions/nocobase-users-example}/list.tsx +1 -1
  118. package/src/extensions/nocobase-users-example/locales/en-US.ts +77 -0
  119. package/src/extensions/nocobase-users-example/locales/index.ts +8 -0
  120. package/src/extensions/nocobase-users-example/locales/zh-CN.ts +73 -0
  121. package/src/extensions/nocobase-users-example/optional-ai.ts +67 -0
  122. package/src/{pages/users → extensions/nocobase-users-example}/role-detail.tsx +4 -15
  123. package/src/{pages/users → extensions/nocobase-users-example}/routes.ts +1 -4
  124. package/src/extensions/nocobase-users-example/show.tsx +266 -0
  125. package/src/lib/nocobase/acl/context.ts +32 -0
  126. package/src/lib/nocobase/acl/evaluator.ts +186 -0
  127. package/src/lib/nocobase/acl/hooks.ts +40 -0
  128. package/src/lib/nocobase/acl/index.ts +4 -1
  129. package/src/lib/nocobase/acl/menu.ts +6 -6
  130. package/src/lib/nocobase/acl/record-permissions.ts +37 -7
  131. package/src/lib/nocobase/acl/store-provider.tsx +14 -0
  132. package/src/lib/nocobase/acl/store.ts +92 -86
  133. package/src/lib/nocobase/acl/types.ts +52 -32
  134. package/src/lib/nocobase/auth-session.ts +128 -0
  135. package/src/lib/nocobase/client.ts +48 -50
  136. package/src/locales/en-US.ts +0 -78
  137. package/src/locales/index.ts +2 -7
  138. package/src/locales/zh-CN.ts +0 -74
  139. package/src/providers/access-control.ts +43 -8
  140. package/src/providers/auth-callback.ts +1 -0
  141. package/src/providers/auth.ts +24 -26
  142. package/src/providers/constants.ts +0 -4
  143. package/src/providers/data.ts +14 -26
  144. package/src/providers/runtime-config.ts +40 -0
  145. package/src/vite-env.d.ts +9 -0
  146. package/tests/auth-session-regression.mjs +101 -0
  147. package/tsconfig.json +2 -1
  148. package/vite.config.ts +9 -1
  149. package/dist/assets/VisualMapping-Cbv1v7Cd.js +0 -1
  150. package/dist/assets/ai-employee-shortcut-B253WWow.js +0 -1
  151. package/dist/assets/calendar-B3dXXyIv.js +0 -1
  152. package/dist/assets/chat-inline-xpQ9iq4p.js +0 -1
  153. package/dist/assets/chat-side-panel-layout-BVWsp5rr.js +0 -1
  154. package/dist/assets/components-ChhJaNRc.js +0 -20
  155. package/dist/assets/configuration-gate-Dwdq_lxf.js +0 -1
  156. package/dist/assets/createSeriesDataSimply-CI7l7Ufv.js +0 -1
  157. package/dist/assets/customGraphicKeyframeAnimation-DE3jSfMd.js +0 -3
  158. package/dist/assets/echarts-preview-C-cNUtJF.js +0 -1
  159. package/dist/assets/floating-BarTmn-b.js +0 -13
  160. package/dist/assets/index-BJIcYTdc.js +0 -53
  161. package/dist/assets/index-C6xNKxpg.js +0 -656
  162. package/dist/assets/index-D4JQi1TM.js +0 -54
  163. package/dist/assets/index-YA7-AUO8.css +0 -1
  164. package/dist/assets/index-g8zWVpP9.js +0 -23
  165. package/dist/assets/prompt-card-BsYMW_rq.js +0 -1
  166. package/dist/assets/shortcut-xtghDP63.js +0 -47
  167. package/registry/nocobase-acl/README.md +0 -19
  168. package/registry/nocobase-acl/extension.tsx +0 -71
  169. package/registry/nocobase-acl/tests/acl-regression.mjs +0 -314
  170. package/registry/nocobase-ai/components/surfaces/chat-dialog.tsx +0 -31
  171. package/registry/nocobase-ai/components/surfaces/chat-side-panel.tsx +0 -74
  172. package/registry/nocobase-ai/extension.tsx +0 -158
  173. package/registry/nocobase-ai/tests/business-report-regression.mjs +0 -70
  174. package/registry/nocobase-ai/tests/form-filler-regression.mjs +0 -129
  175. package/registry/nocobase-ai/tests/frontend-tool-regression.mjs +0 -128
  176. package/registry/nocobase-ai/tests/page-context-regression.mjs +0 -48
  177. package/registry/nocobase-ai/tests/stream-regression.mjs +0 -207
  178. package/registry/nocobase-auth-cas/README.md +0 -6
  179. package/registry/nocobase-auth-cas/cas-sign-in-button.tsx +0 -41
  180. package/registry/nocobase-auth-cas/demo.tsx +0 -20
  181. package/registry/nocobase-auth-cas/extension.tsx +0 -46
  182. package/registry/nocobase-auth-cas/index.ts +0 -1
  183. package/registry/nocobase-auth-cas/use-cas-sign-in.ts +0 -29
  184. package/registry/nocobase-auth-dingtalk/README.md +0 -7
  185. package/registry/nocobase-auth-dingtalk/auto-login-provider.tsx +0 -154
  186. package/registry/nocobase-auth-dingtalk/demo.tsx +0 -23
  187. package/registry/nocobase-auth-dingtalk/dingtalk-sign-in-button.tsx +0 -45
  188. package/registry/nocobase-auth-dingtalk/extension.tsx +0 -55
  189. package/registry/nocobase-auth-dingtalk/index.ts +0 -4
  190. package/registry/nocobase-auth-dingtalk/use-dingtalk-sign-in.ts +0 -64
  191. package/registry/nocobase-auth-ldap/README.md +0 -6
  192. package/registry/nocobase-auth-ldap/demo.tsx +0 -21
  193. package/registry/nocobase-auth-ldap/extension.tsx +0 -46
  194. package/registry/nocobase-auth-ldap/index.ts +0 -1
  195. package/registry/nocobase-auth-ldap/ldap-sign-in-form.tsx +0 -69
  196. package/registry/nocobase-auth-ldap/use-ldap-sign-in.ts +0 -5
  197. package/registry/nocobase-auth-oidc/README.md +0 -11
  198. package/registry/nocobase-auth-oidc/auto-redirect-provider.tsx +0 -13
  199. package/registry/nocobase-auth-oidc/demo.tsx +0 -20
  200. package/registry/nocobase-auth-oidc/extension.tsx +0 -51
  201. package/registry/nocobase-auth-oidc/index.ts +0 -1
  202. package/registry/nocobase-auth-oidc/oidc-sign-in-button.tsx +0 -44
  203. package/registry/nocobase-auth-oidc/use-oidc-sign-in.ts +0 -58
  204. package/registry/nocobase-auth-saml/README.md +0 -6
  205. package/registry/nocobase-auth-saml/auto-redirect-provider.tsx +0 -13
  206. package/registry/nocobase-auth-saml/demo.tsx +0 -20
  207. package/registry/nocobase-auth-saml/extension.tsx +0 -51
  208. package/registry/nocobase-auth-saml/index.ts +0 -1
  209. package/registry/nocobase-auth-saml/saml-sign-in-button.tsx +0 -43
  210. package/registry/nocobase-auth-saml/use-saml-sign-in.ts +0 -51
  211. package/registry/nocobase-auth-sms/README.md +0 -7
  212. package/registry/nocobase-auth-sms/demo.tsx +0 -25
  213. package/registry/nocobase-auth-sms/extension.tsx +0 -46
  214. package/registry/nocobase-auth-sms/index.ts +0 -1
  215. package/registry/nocobase-auth-sms/sms-sign-in-form.tsx +0 -107
  216. package/registry/nocobase-auth-sms/use-sms-sign-in.ts +0 -88
  217. package/registry/nocobase-auth-wecom/README.md +0 -6
  218. package/registry/nocobase-auth-wecom/auto-login-provider.tsx +0 -21
  219. package/registry/nocobase-auth-wecom/demo.tsx +0 -23
  220. package/registry/nocobase-auth-wecom/extension.tsx +0 -49
  221. package/registry/nocobase-auth-wecom/index.ts +0 -1
  222. package/registry/nocobase-auth-wecom/use-wecom-sign-in.ts +0 -62
  223. package/registry/nocobase-auth-wecom/wecom-sign-in-button.tsx +0 -70
  224. package/registry/nocobase-i18n/README.md +0 -44
  225. package/registry/nocobase-i18n/components/index.ts +0 -1
  226. package/registry/nocobase-i18n/components/language-switcher.tsx +0 -138
  227. package/registry/nocobase-i18n/demo/index.tsx +0 -209
  228. package/registry/nocobase-i18n/demo/prompt-generator.tsx +0 -132
  229. package/registry/nocobase-i18n/extension.tsx +0 -45
  230. package/registry/nocobase-i18n/index.ts +0 -7
  231. package/registry/nocobase-i18n/locales/en-US.ts +0 -39
  232. package/registry/nocobase-i18n/locales/index.ts +0 -8
  233. package/registry/nocobase-i18n/locales/zh-CN.ts +0 -35
  234. package/registry/nocobase-i18n/provider.tsx +0 -44
  235. package/registry/nocobase-i18n/server-resources.ts +0 -166
  236. package/registry/nocobase-i18n/tests/i18n-regression.mjs +0 -51
  237. package/registry.config.json +0 -302
  238. package/scripts/registry.mjs +0 -164
  239. package/src/components/access-control/resource-access-guard.tsx +0 -21
  240. package/src/components/access-control/use-acl-runtime.ts +0 -28
  241. package/src/lib/nocobase/acl/action.ts +0 -147
  242. package/src/pages/users/layout.tsx +0 -15
  243. package/src/pages/users/show.tsx +0 -278
  244. /package/{registry → src/extensions}/nocobase-acl/components/index.ts +0 -0
  245. /package/{registry → src/extensions}/nocobase-acl/components/role-options.ts +0 -0
  246. /package/{registry → src/extensions}/nocobase-acl/demo/components.tsx +0 -0
  247. /package/{registry → src/extensions}/nocobase-acl/demo/lazy-route.tsx +0 -0
  248. /package/{registry → src/extensions}/nocobase-acl/demo/role-switcher-prompt-generator.tsx +0 -0
  249. /package/{registry → src/extensions}/nocobase-acl/demo/scenario-section.tsx +0 -0
  250. /package/{registry → src/extensions}/nocobase-acl/index.ts +0 -0
  251. /package/{registry → src/extensions}/nocobase-ai/adapters/react-hook-form.ts +0 -0
  252. /package/{registry → src/extensions}/nocobase-ai/assets/nocobase-ai-chat.svg +0 -0
  253. /package/{registry → src/extensions}/nocobase-ai/components/ai-root-provider.tsx +0 -0
  254. /package/{registry → src/extensions}/nocobase-ai/components/chat/ai-employee-avatar.tsx +0 -0
  255. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-attachment.tsx +0 -0
  256. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-compact.tsx +0 -0
  257. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-empty-state.tsx +0 -0
  258. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-header.tsx +0 -0
  259. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-history-dialog.tsx +0 -0
  260. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-message.tsx +0 -0
  261. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-window.tsx +0 -0
  262. /package/{registry → src/extensions}/nocobase-ai/components/chat/conversation-list.tsx +0 -0
  263. /package/{registry → src/extensions}/nocobase-ai/components/chat/markdown-message.tsx +0 -0
  264. /package/{registry → src/extensions}/nocobase-ai/components/chat/model-select-options.tsx +0 -0
  265. /package/{registry → src/extensions}/nocobase-ai/components/chat/reasoning-panel.tsx +0 -0
  266. /package/{registry → src/extensions}/nocobase-ai/components/chat/sub-agent-conversation.tsx +0 -0
  267. /package/{registry → src/extensions}/nocobase-ai/components/chat/user-prompt-editor.tsx +0 -0
  268. /package/{registry → src/extensions}/nocobase-ai/components/chat/work-context-chip.tsx +0 -0
  269. /package/{registry → src/extensions}/nocobase-ai/components/page-elements/ai-form.tsx +0 -0
  270. /package/{registry → src/extensions}/nocobase-ai/components/page-elements/page-element-provider.tsx +0 -0
  271. /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-inline.tsx +0 -0
  272. /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-page.tsx +0 -0
  273. /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-side-panel-layout.tsx +0 -0
  274. /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-surface-actions.tsx +0 -0
  275. /package/{registry → src/extensions}/nocobase-ai/components/tools/builtin-tool-renderers.tsx +0 -0
  276. /package/{registry → src/extensions}/nocobase-ai/components/tools/business-report-dialog.tsx +0 -0
  277. /package/{registry → src/extensions}/nocobase-ai/components/tools/business-report-renderer.tsx +0 -0
  278. /package/{registry → src/extensions}/nocobase-ai/components/tools/business-report-utils.tsx +0 -0
  279. /package/{registry → src/extensions}/nocobase-ai/components/tools/chart-renderer.tsx +0 -0
  280. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-preview.tsx +0 -0
  281. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-advanced.ts +0 -0
  282. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-common.ts +0 -0
  283. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-components.ts +0 -0
  284. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-hierarchy.ts +0 -0
  285. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime.ts +0 -0
  286. /package/{registry → src/extensions}/nocobase-ai/components/tools/sub-agent-renderer.tsx +0 -0
  287. /package/{registry → src/extensions}/nocobase-ai/components/tools/suggestions-renderer.tsx +0 -0
  288. /package/{registry → src/extensions}/nocobase-ai/components/tools/tool-renderer-provider.tsx +0 -0
  289. /package/{registry → src/extensions}/nocobase-ai/components/tools/tool-renderer-utils.ts +0 -0
  290. /package/{registry → src/extensions}/nocobase-ai/components/tools/workflow-renderer.tsx +0 -0
  291. /package/{registry → src/extensions}/nocobase-ai/components/triggers/ai-employee-shortcut.tsx +0 -0
  292. /package/{registry → src/extensions}/nocobase-ai/demo/interaction-showcase.tsx +0 -0
  293. /package/{registry → src/extensions}/nocobase-ai/demo/page-context-prompt-generator.tsx +0 -0
  294. /package/{registry → src/extensions}/nocobase-ai/demo/page-context.tsx +0 -0
  295. /package/{registry → src/extensions}/nocobase-ai/demo/page-element-showcase.tsx +0 -0
  296. /package/{registry → src/extensions}/nocobase-ai/demo/prompt-card.tsx +0 -0
  297. /package/{registry → src/extensions}/nocobase-ai/demo/shortcut.tsx +0 -0
  298. /package/{registry → src/extensions}/nocobase-ai/index.ts +0 -0
  299. /package/{registry → src/extensions}/nocobase-ai/providers/avatars.ts +0 -0
  300. /package/{registry → src/extensions}/nocobase-ai/providers/chat-controller.ts +0 -0
  301. /package/{registry → src/extensions}/nocobase-ai/providers/chat-message-utils.ts +0 -0
  302. /package/{registry → src/extensions}/nocobase-ai/providers/chat-reducer.ts +0 -0
  303. /package/{registry → src/extensions}/nocobase-ai/providers/chat-task-utils.ts +0 -0
  304. /package/{registry → src/extensions}/nocobase-ai/providers/chat-transport.ts +0 -0
  305. /package/{registry → src/extensions}/nocobase-ai/providers/form-registry.tsx +0 -0
  306. /package/{registry → src/extensions}/nocobase-ai/providers/frontend-tool-registry.tsx +0 -0
  307. /package/{registry → src/extensions}/nocobase-ai/providers/index.ts +0 -0
  308. /package/{registry → src/extensions}/nocobase-ai/providers/model.ts +0 -0
  309. /package/{registry → src/extensions}/nocobase-ai/providers/page-context.tsx +0 -0
  310. /package/{registry → src/extensions}/nocobase-ai/providers/stream-coalescer.ts +0 -0
  311. /package/{registry → src/extensions}/nocobase-ai/providers/stream-event-utils.ts +0 -0
  312. /package/{registry → src/extensions}/nocobase-ai/providers/stream-parser.ts +0 -0
  313. /package/{registry → src/extensions}/nocobase-ai/providers/sub-agent-stream.ts +0 -0
  314. /package/{registry → src/extensions}/nocobase-ai/providers/types.ts +0 -0
  315. /package/{registry → src/extensions}/nocobase-ai/providers/ui-message-stream.ts +0 -0
  316. /package/{registry → src/extensions}/nocobase-ai/providers/use-automatic-tool-approval.ts +0 -0
  317. /package/{registry → src/extensions}/nocobase-ai/providers/use-chat-message-actions.ts +0 -0
  318. /package/{registry → src/extensions}/nocobase-ai/providers/use-chat-runtime.ts +0 -0
  319. /package/{registry → src/extensions}/nocobase-ai/providers/use-conversation-catalog.ts +0 -0
  320. /package/{registry → src/extensions}/nocobase-ai/providers/use-conversation-history.ts +0 -0
  321. /package/{registry → src/extensions}/nocobase-ai/services/index.ts +0 -0
  322. /package/{registry → src/extensions}/nocobase-ai/services/nocobase-ai-service.ts +0 -0
  323. /package/{registry → src/extensions}/nocobase-ai/services/types.ts +0 -0
  324. /package/{registry → src/extensions}/nocobase-route-surfaces/demo/lazy-route.tsx +0 -0
  325. /package/{registry → src/extensions}/nocobase-route-surfaces/demo/prompt-generator.tsx +0 -0
  326. /package/{registry → src/extensions}/nocobase-route-surfaces/index.ts +0 -0
  327. /package/{registry → src/extensions}/nocobase-route-surfaces/route-dialog.tsx +0 -0
  328. /package/{registry → src/extensions}/nocobase-route-surfaces/route-drawer.tsx +0 -0
  329. /package/{registry → src/extensions}/nocobase-route-surfaces/route-page.tsx +0 -0
  330. /package/{registry → src/extensions}/nocobase-route-surfaces/route-surface-context.ts +0 -0
  331. /package/{registry → src/extensions}/nocobase-route-surfaces/use-refine-unsaved-changes.tsx +0 -0
  332. /package/{registry → src/extensions}/nocobase-route-surfaces/use-route-surface-close.ts +0 -0
  333. /package/{registry → src/extensions}/nocobase-route-surfaces/use-route-surface-state.ts +0 -0
  334. /package/src/{pages/users → extensions/nocobase-users-example}/form-fields.tsx +0 -0
  335. /package/src/{pages/users → extensions/nocobase-users-example}/index.ts +0 -0
  336. /package/src/{pages/users → extensions/nocobase-users-example}/role-badges.tsx +0 -0
  337. /package/src/{pages/users → extensions/nocobase-users-example}/role-utils.ts +0 -0
  338. /package/src/{pages/users → extensions/nocobase-users-example}/types.ts +0 -0
@@ -1,25 +1,26 @@
1
1
  import type { BaseKey, IResourceItem } from "@refinedev/core";
2
2
 
3
- export type RoleMode =
4
- | "default"
5
- | "allow-use-union"
6
- | "only-use-union";
3
+ export type RoleMode = "default" | "allow-use-union" | "only-use-union";
7
4
 
8
5
  export type Role = {
9
6
  name: string;
10
7
  title?: string;
11
8
  };
12
9
 
10
+ export type RoleConstraint = {
11
+ anyOf?: string[];
12
+ allOf?: string[];
13
+ noneOf?: string[];
14
+ };
15
+
13
16
  export type AclActionParams = Record<string, unknown> & {
14
17
  fields?: string[];
15
18
  whitelist?: string[];
16
19
  appends?: string[];
17
20
  };
18
21
 
19
- export type AclRoleData = {
22
+ export type AclResourcePermissions = {
20
23
  snippets?: string[];
21
- role?: string;
22
- roleMode?: RoleMode;
23
24
  resources?: string[];
24
25
  actions?: Record<string, AclActionParams>;
25
26
  actionAlias?: Record<string, string>;
@@ -34,26 +35,44 @@ export type AclRoleData = {
34
35
  uiButtonSchemasBlacklist?: string[];
35
36
  };
36
37
 
37
- export type AclMeta = {
38
- dataSources?: Record<string, Partial<AclRoleData>>;
38
+ export type AclPermissionSet = AclResourcePermissions & {
39
+ currentRole?: string;
40
+ roles: string[];
41
+ roleMode?: RoleMode;
42
+ dataSources?: Record<string, Partial<AclResourcePermissions>>;
39
43
  };
40
44
 
41
45
  export type AclResponse = {
42
- data?: AclRoleData;
43
- meta?: AclMeta;
46
+ data?: AclResourcePermissions & {
47
+ role?: string;
48
+ roles?: string[];
49
+ roleMode?: RoleMode;
50
+ };
51
+ meta?: {
52
+ dataSources?: Record<string, Partial<AclResourcePermissions>>;
53
+ };
44
54
  };
45
55
 
46
- export type AclSnapshot = {
47
- status: "idle" | "loading" | "ready" | "error";
48
- identity?: string;
49
- data: AclRoleData;
50
- meta: AclMeta;
51
- error?: Error;
52
- version: number;
53
- };
56
+ export type AclState =
57
+ | {
58
+ status: "idle" | "loading";
59
+ permissions?: undefined;
60
+ error?: undefined;
61
+ }
62
+ | {
63
+ status: "ready";
64
+ permissions: AclPermissionSet;
65
+ error?: undefined;
66
+ }
67
+ | {
68
+ status: "error";
69
+ permissions?: undefined;
70
+ error: Error;
71
+ };
54
72
 
55
- export type ResourceAcl =
56
- | false
73
+ type ResourceAclRule = {
74
+ roles?: RoleConstraint;
75
+ } & (
57
76
  | {
58
77
  type: "authenticated";
59
78
  }
@@ -70,19 +89,20 @@ export type ResourceAcl =
70
89
  | {
71
90
  type: "route";
72
91
  routeId: string | number;
73
- };
92
+ }
93
+ );
74
94
 
75
- export type AclCanParams = {
95
+ export type ResourceAcl = false | ResourceAclRule;
96
+
97
+ export type AclAccessRequest = {
98
+ roles?: RoleConstraint;
76
99
  resource?: string;
77
- action: string;
78
- params?: {
79
- id?: BaseKey;
80
- field?: string;
81
- dataSourceKey?: string;
82
- meta?: Record<string, unknown>;
83
- resource?: IResourceItem;
84
- [key: string]: unknown;
85
- };
100
+ action?: string;
101
+ id?: BaseKey;
102
+ field?: string;
103
+ dataSourceKey?: string;
104
+ meta?: Record<string, unknown>;
105
+ resourceItem?: IResourceItem;
86
106
  };
87
107
 
88
108
  export type AclIdentity = {
@@ -0,0 +1,128 @@
1
+ import { getNocoBaseAppName } from "@/providers/runtime-config";
2
+
3
+ export type AuthStorageType = "localStorage" | "sessionStorage" | "memory";
4
+ export type AuthSessionField = "token" | "auth" | "role" | "locale";
5
+
6
+ type AuthSessionRuntime = Window & {
7
+ __nocobase_api_client_storage_prefix__?: string;
8
+ __nocobase_api_client_storage_type__?: string;
9
+ __nocobase_api_client_share_token__?: boolean | string;
10
+ };
11
+
12
+ type StorageLike = Pick<Storage, "getItem" | "setItem" | "removeItem">;
13
+
14
+ type AuthSessionOptions = {
15
+ appName?: string;
16
+ storagePrefix?: string;
17
+ storageType?: AuthStorageType;
18
+ shareToken?: boolean;
19
+ storage?: StorageLike;
20
+ };
21
+
22
+ const DEFAULT_STORAGE_PREFIX = "NOCOBASE_";
23
+ const DEFAULT_STORAGE_TYPE: AuthStorageType = "localStorage";
24
+ const memoryStorage = new Map<string, string>();
25
+
26
+ const memoryStorageAdapter: StorageLike = {
27
+ getItem: (key) => memoryStorage.get(key) ?? null,
28
+ setItem: (key, value) => memoryStorage.set(key, value),
29
+ removeItem: (key) => memoryStorage.delete(key),
30
+ };
31
+
32
+ const normalizeStorageType = (value?: string): AuthStorageType => {
33
+ if (value === "sessionStorage" || value === "memory") return value;
34
+ return DEFAULT_STORAGE_TYPE;
35
+ };
36
+
37
+ const parseBoolean = (value: boolean | string | undefined) =>
38
+ value === true || (typeof value === "string" && /^true$/i.test(value));
39
+
40
+ const getRuntimeWindow = () =>
41
+ typeof window === "undefined" ? undefined : (window as AuthSessionRuntime);
42
+
43
+ const getStorage = (type: AuthStorageType): StorageLike => {
44
+ if (typeof window === "undefined" || type === "memory") {
45
+ return memoryStorageAdapter;
46
+ }
47
+ return type === "sessionStorage" ? window.sessionStorage : window.localStorage;
48
+ };
49
+
50
+ const getCookie = (name: string) => {
51
+ if (typeof document === "undefined") return undefined;
52
+ const prefix = `${name}=`;
53
+ const value = document.cookie
54
+ .split(";")
55
+ .map((item) => item.trim())
56
+ .find((item) => item.startsWith(prefix))
57
+ ?.slice(prefix.length);
58
+ if (value === undefined) return undefined;
59
+ try {
60
+ return decodeURIComponent(value);
61
+ } catch {
62
+ return value;
63
+ }
64
+ };
65
+
66
+ export class AuthSession {
67
+ readonly appName: string;
68
+ readonly storagePrefix: string;
69
+ readonly storageType: AuthStorageType;
70
+ readonly shareToken: boolean;
71
+ private readonly storage: StorageLike;
72
+
73
+ constructor(options: AuthSessionOptions = {}) {
74
+ const runtime = getRuntimeWindow();
75
+ this.appName = options.appName ?? getNocoBaseAppName();
76
+ this.storagePrefix =
77
+ options.storagePrefix ||
78
+ runtime?.__nocobase_api_client_storage_prefix__ ||
79
+ import.meta.env.API_CLIENT_STORAGE_PREFIX ||
80
+ DEFAULT_STORAGE_PREFIX;
81
+ this.storageType =
82
+ options.storageType ??
83
+ normalizeStorageType(
84
+ runtime?.__nocobase_api_client_storage_type__ ??
85
+ import.meta.env.API_CLIENT_STORAGE_TYPE
86
+ );
87
+ this.shareToken =
88
+ options.shareToken ??
89
+ parseBoolean(
90
+ runtime?.__nocobase_api_client_share_token__ ??
91
+ import.meta.env.API_CLIENT_SHARE_TOKEN
92
+ );
93
+ this.storage = options.storage ?? getStorage(this.storageType);
94
+ }
95
+
96
+ getStorageKey(field: AuthSessionField) {
97
+ const isSharedSubAppToken =
98
+ field === "token" && this.appName !== "main" && this.shareToken;
99
+ const appPrefix =
100
+ this.appName === "main" || isSharedSubAppToken
101
+ ? this.storagePrefix
102
+ : `${this.storagePrefix}${this.appName.toUpperCase()}_`;
103
+ return `${appPrefix}${field}`.toUpperCase();
104
+ }
105
+
106
+ get(field: AuthSessionField) {
107
+ return this.storage.getItem(this.getStorageKey(field)) || undefined;
108
+ }
109
+
110
+ set(field: AuthSessionField, value?: string | null) {
111
+ const key = this.getStorageKey(field);
112
+ if (value) this.storage.setItem(key, value);
113
+ else this.storage.removeItem(key);
114
+ }
115
+
116
+ clearAuthentication() {
117
+ this.set("token", null);
118
+ this.set("auth", null);
119
+ this.set("role", null);
120
+ }
121
+
122
+ getCookie(type: "role" | "csrfToken") {
123
+ const prefix = type === "role" ? "nb_role" : "nb_csrf_token";
124
+ return getCookie(`${prefix}_${this.appName}`);
125
+ }
126
+ }
127
+
128
+ export const authSession = new AuthSession();
@@ -2,11 +2,8 @@ import {
2
2
  API_ORIGIN,
3
3
  API_URL,
4
4
  NOCOBASE_AUTHENTICATOR,
5
- NOCOBASE_AUTHENTICATOR_KEY,
6
- NOCOBASE_LOCALE_KEY,
7
- NOCOBASE_ROLE_KEY,
8
- NOCOBASE_TOKEN_KEY,
9
5
  } from "@/providers/constants";
6
+ import { authSession } from "./auth-session";
10
7
  import { getNocoBaseErrorMessage, NocoBaseHttpError } from "./error";
11
8
 
12
9
  type QueryValue =
@@ -26,7 +23,6 @@ export type NocoBaseRequestOptions = {
26
23
  authenticator?: string | null;
27
24
  role?: string;
28
25
  includeRole?: boolean;
29
- includeAuthenticator?: boolean;
30
26
  withAclMeta?: boolean;
31
27
  headers?: Record<string, string>;
32
28
  accept?: "json" | "stream";
@@ -36,6 +32,8 @@ export type NocoBaseRequestOptions = {
36
32
  const getBrowserLocale = () =>
37
33
  typeof navigator === "undefined" ? undefined : navigator.language;
38
34
 
35
+ const SAFE_METHODS = new Set(["GET", "HEAD", "OPTIONS"]);
36
+
39
37
  const getClientTimezone = () => {
40
38
  const offsetMinutes = -new Date().getTimezoneOffset();
41
39
  const sign = offsetMinutes >= 0 ? "+" : "-";
@@ -73,6 +71,10 @@ export class NocoBaseClient {
73
71
  return this.apiUrl;
74
72
  }
75
73
 
74
+ getAppName() {
75
+ return authSession.appName;
76
+ }
77
+
76
78
  resolveUrl(value: string) {
77
79
  if (!value || /^[a-z][a-z\d+.-]*:/i.test(value)) return value;
78
80
  const base =
@@ -87,18 +89,11 @@ export class NocoBaseClient {
87
89
  }
88
90
 
89
91
  getToken() {
90
- return (
91
- (typeof localStorage === "undefined"
92
- ? undefined
93
- : localStorage.getItem(NOCOBASE_TOKEN_KEY) ?? undefined) ??
94
- import.meta.env.NOCOBASE_API_TOKEN
95
- );
92
+ return authSession.get("token") ?? import.meta.env.NOCOBASE_API_TOKEN;
96
93
  }
97
94
 
98
95
  getStoredAuthenticator() {
99
- return typeof localStorage === "undefined"
100
- ? undefined
101
- : localStorage.getItem(NOCOBASE_AUTHENTICATOR_KEY) ?? undefined;
96
+ return authSession.get("auth");
102
97
  }
103
98
 
104
99
  getAuthenticator() {
@@ -106,36 +101,23 @@ export class NocoBaseClient {
106
101
  }
107
102
 
108
103
  setAuthenticator(authenticator?: string | null) {
109
- if (typeof localStorage === "undefined") return;
110
- if (authenticator) {
111
- localStorage.setItem(NOCOBASE_AUTHENTICATOR_KEY, authenticator);
112
- } else {
113
- localStorage.removeItem(NOCOBASE_AUTHENTICATOR_KEY);
114
- }
104
+ authSession.set("auth", authenticator);
115
105
  }
116
106
 
117
107
  setToken(token?: string | null) {
118
- if (typeof localStorage === "undefined") return;
119
- if (token) localStorage.setItem(NOCOBASE_TOKEN_KEY, token);
120
- else localStorage.removeItem(NOCOBASE_TOKEN_KEY);
108
+ authSession.set("token", token);
121
109
  }
122
110
 
123
111
  getRole() {
124
- return typeof localStorage === "undefined"
125
- ? undefined
126
- : localStorage.getItem(NOCOBASE_ROLE_KEY) ?? undefined;
112
+ return authSession.get("role") ?? authSession.getCookie("role");
127
113
  }
128
114
 
129
115
  setRole(role?: string | null) {
130
- if (typeof localStorage === "undefined") return;
131
- if (role) localStorage.setItem(NOCOBASE_ROLE_KEY, role);
132
- else localStorage.removeItem(NOCOBASE_ROLE_KEY);
116
+ authSession.set("role", role);
133
117
  }
134
118
 
135
119
  getStoredLocale() {
136
- return typeof localStorage === "undefined"
137
- ? undefined
138
- : localStorage.getItem(NOCOBASE_LOCALE_KEY) ?? undefined;
120
+ return authSession.get("locale");
139
121
  }
140
122
 
141
123
  getLocale() {
@@ -143,9 +125,11 @@ export class NocoBaseClient {
143
125
  }
144
126
 
145
127
  setLocale(locale?: string | null) {
146
- if (typeof localStorage === "undefined") return;
147
- if (locale) localStorage.setItem(NOCOBASE_LOCALE_KEY, locale);
148
- else localStorage.removeItem(NOCOBASE_LOCALE_KEY);
128
+ authSession.set("locale", locale);
129
+ }
130
+
131
+ clearAuthentication() {
132
+ authSession.clearAuthentication();
149
133
  }
150
134
 
151
135
  setRuntimeLocale(locale?: string | null) {
@@ -173,38 +157,35 @@ export class NocoBaseClient {
173
157
  }
174
158
 
175
159
  getHeaders({
160
+ method = "GET",
176
161
  token = this.getToken(),
177
162
  authenticator,
178
163
  role = this.getRole(),
179
164
  includeRole = true,
180
- includeAuthenticator = false,
181
165
  withAclMeta = true,
182
166
  headers,
183
167
  accept = "json",
184
168
  body,
185
169
  }: Pick<
186
170
  NocoBaseRequestOptions,
171
+ | "method"
187
172
  | "token"
188
173
  | "authenticator"
189
174
  | "role"
190
175
  | "includeRole"
191
- | "includeAuthenticator"
192
176
  | "withAclMeta"
193
177
  | "headers"
194
178
  | "accept"
195
179
  | "body"
196
- > = {}) {
180
+ > = {}): Record<string, string> {
197
181
  const resolvedAuthenticator =
198
182
  authenticator === null
199
183
  ? undefined
200
- : authenticator ??
201
- (includeAuthenticator
202
- ? this.getAuthenticator()
203
- : this.getStoredAuthenticator());
184
+ : authenticator ?? this.getStoredAuthenticator();
204
185
  const locale = this.getLocale();
205
186
  const formData =
206
187
  typeof FormData !== "undefined" && body instanceof FormData;
207
- return {
188
+ const requestHeaders: Record<string, string> = {
208
189
  Accept: accept === "stream" ? "text/event-stream" : "application/json",
209
190
  ...(body !== undefined && !formData
210
191
  ? { "Content-Type": "application/json" }
@@ -222,6 +203,17 @@ export class NocoBaseClient {
222
203
  ...(token ? { Authorization: `Bearer ${token}` } : {}),
223
204
  ...headers,
224
205
  };
206
+ const csrfToken = authSession.getCookie("csrfToken");
207
+ if (
208
+ !SAFE_METHODS.has(method) &&
209
+ csrfToken &&
210
+ !Object.keys(requestHeaders).some(
211
+ (key) => key.toLowerCase() === "x-csrf-token"
212
+ )
213
+ ) {
214
+ requestHeaders["X-CSRF-Token"] = csrfToken;
215
+ }
216
+ return requestHeaders;
225
217
  }
226
218
 
227
219
  async request<T>(
@@ -230,9 +222,11 @@ export class NocoBaseClient {
230
222
  ): Promise<T> {
231
223
  const method =
232
224
  options.method ?? (options.body === undefined ? "GET" : "POST");
225
+ const headers = this.getHeaders({ ...options, method, body: options.body });
233
226
  const response = await fetch(this.buildUrl(endpoint, options.query), {
234
227
  method,
235
- headers: this.getHeaders({ ...options, body: options.body }),
228
+ headers,
229
+ credentials: "include",
236
230
  body:
237
231
  options.body === undefined
238
232
  ? undefined
@@ -270,13 +264,17 @@ export class NocoBaseClient {
270
264
  endpoint: string,
271
265
  options: Omit<NocoBaseRequestOptions, "accept" | "unwrap"> = {}
272
266
  ) {
267
+ const method = options.method ?? "POST";
268
+ const headers = this.getHeaders({
269
+ ...options,
270
+ method,
271
+ accept: "stream",
272
+ body: options.body,
273
+ });
273
274
  const response = await fetch(this.buildUrl(endpoint, options.query), {
274
- method: options.method ?? "POST",
275
- headers: this.getHeaders({
276
- ...options,
277
- accept: "stream",
278
- body: options.body,
279
- }),
275
+ method,
276
+ headers,
277
+ credentials: "include",
280
278
  body:
281
279
  options.body === undefined ? undefined : JSON.stringify(options.body),
282
280
  signal: options.signal,
@@ -85,81 +85,3 @@ export const starter = {
85
85
  Anonymous: "Anonymous",
86
86
  "Full permissions": "Full permissions",
87
87
  } as const;
88
-
89
- export const app = {
90
- "resources.users": "Users",
91
- "resources.user": "User",
92
- "resources.users.description":
93
- "Manage the people who can sign in and work in this NocoBase application.",
94
- "users.fields.id": "ID",
95
- "users.fields.nickname": "Nickname",
96
- "users.fields.username": "Username",
97
- "users.fields.email": "Email",
98
- "users.fields.phone": "Phone",
99
- "users.fields.password": "Password",
100
- "users.fields.roles": "Roles",
101
- "users.fields.createdAt": "Created at",
102
- "users.fields.updatedAt": "Updated at",
103
- "users.fields.actions": "Actions",
104
- "users.filters.roles.placeholder": "Select roles...",
105
- "users.filters.roles.noResults": "No roles found.",
106
- "users.actions.view": "View user",
107
- "users.actions.edit": "Edit user",
108
- "users.actions.delete": "Delete user",
109
- "users.drawer.create.title": "Create user",
110
- "users.drawer.create.description":
111
- "Add a user who can sign in to this NocoBase application.",
112
- "users.drawer.edit.title": "Edit user",
113
- "users.drawer.edit.description":
114
- "Update this user's identity and contact information.",
115
- "users.drawer.show.description":
116
- "Review this user's identity, contact information, and roles.",
117
- "users.form.create.submit": "Create user",
118
- "users.form.create.submitting": "Creating...",
119
- "users.form.edit.submit": "Save changes",
120
- "users.form.edit.submitting": "Saving...",
121
- "users.form.cancel": "Cancel",
122
- "users.form.nickname.placeholder": "Enter a display name",
123
- "users.form.username.placeholder": "Enter a unique username",
124
- "users.form.email.placeholder": "Enter an email address",
125
- "users.form.phone.placeholder": "Enter a phone number",
126
- "users.form.password.placeholder": "Set an initial password",
127
- "users.form.password.aiNotice":
128
- "Passwords are never included in AI page context or Form filler.",
129
- "users.validation.username": "Username is required",
130
- "users.validation.email": "Email is required",
131
- "users.validation.emailFormat": "Enter a valid email address",
132
- "users.validation.phone": "Phone is required",
133
- "users.validation.password": "Password is required",
134
- "users.detail.identity": "Identity",
135
- "users.detail.contact": "Contact",
136
- "users.detail.access": "Access",
137
- "users.detail.timestamps": "Timestamps",
138
- "users.detail.noRoles": "No assigned roles",
139
- "users.detail.unnamed": "Unnamed user",
140
- "users.detail.loadError.title": "Unable to load user",
141
- "users.detail.loadError.description":
142
- "The user may no longer exist, or you may not have permission to view it.",
143
- "users.ai.table": "Users table",
144
- "users.ai.detail": "User details",
145
- "users.ai.createForm": "Create user form",
146
- "users.ai.editForm": "Edit user form",
147
- "common.yes": "Yes",
148
- "common.no": "No",
149
- "roles.drawer.description": "Review the role associated with this user.",
150
- "roles.fields.name": "Name",
151
- "roles.fields.title": "Title",
152
- "roles.fields.description": "Description",
153
- "roles.fields.default": "Default role",
154
- "roles.fields.hidden": "Hidden",
155
- "roles.fields.allowConfigure": "Can configure",
156
- "roles.fields.createdAt": "Created at",
157
- "roles.fields.updatedAt": "Updated at",
158
- "roles.detail.identity": "Role identity",
159
- "roles.detail.settings": "Settings",
160
- "roles.detail.actions": "Allowed actions",
161
- "roles.detail.timestamps": "Timestamps",
162
- "roles.detail.unavailable":
163
- "Additional role details are unavailable. Showing the relation data included with the user.",
164
- "roles.ai.detail": "Role details",
165
- } as const;
@@ -1,13 +1,8 @@
1
1
  import { registerTranslationResources } from "@/lib/i18n";
2
- import { app as enUSApp, starter as enUSStarter } from "./en-US";
3
- import { app as zhCNApp, starter as zhCNStarter } from "./zh-CN";
2
+ import { starter as enUSStarter } from "./en-US";
3
+ import { starter as zhCNStarter } from "./zh-CN";
4
4
 
5
5
  registerTranslationResources("starter", {
6
6
  "en-US": enUSStarter,
7
7
  "zh-CN": zhCNStarter,
8
8
  });
9
-
10
- registerTranslationResources("app", {
11
- "en-US": enUSApp,
12
- "zh-CN": zhCNApp,
13
- });
@@ -82,77 +82,3 @@ export const starter = {
82
82
  Anonymous: "匿名用户",
83
83
  "Full permissions": "全部权限",
84
84
  } as const;
85
-
86
- export const app = {
87
- "resources.users": "用户",
88
- "resources.user": "用户",
89
- "resources.users.description": "管理可以登录并使用此 NocoBase 应用的用户。",
90
- "users.fields.id": "ID",
91
- "users.fields.nickname": "昵称",
92
- "users.fields.username": "用户名",
93
- "users.fields.email": "邮箱",
94
- "users.fields.phone": "手机号",
95
- "users.fields.password": "密码",
96
- "users.fields.roles": "角色",
97
- "users.fields.createdAt": "创建时间",
98
- "users.fields.updatedAt": "更新时间",
99
- "users.fields.actions": "操作",
100
- "users.filters.roles.placeholder": "选择角色…",
101
- "users.filters.roles.noResults": "未找到角色。",
102
- "users.actions.view": "查看用户",
103
- "users.actions.edit": "编辑用户",
104
- "users.actions.delete": "删除用户",
105
- "users.drawer.create.title": "新建用户",
106
- "users.drawer.create.description": "添加可以登录此 NocoBase 应用的用户。",
107
- "users.drawer.edit.title": "编辑用户",
108
- "users.drawer.edit.description": "更新用户的身份和联系方式。",
109
- "users.drawer.show.description": "查看用户的身份、联系方式和关联角色。",
110
- "users.form.create.submit": "创建用户",
111
- "users.form.create.submitting": "正在创建...",
112
- "users.form.edit.submit": "保存修改",
113
- "users.form.edit.submitting": "正在保存...",
114
- "users.form.cancel": "取消",
115
- "users.form.nickname.placeholder": "输入显示名称",
116
- "users.form.username.placeholder": "输入唯一用户名",
117
- "users.form.email.placeholder": "输入邮箱地址",
118
- "users.form.phone.placeholder": "输入手机号",
119
- "users.form.password.placeholder": "设置初始密码",
120
- "users.form.password.aiNotice":
121
- "密码不会包含在 AI 页面上下文中,Form filler 也无法填写密码。",
122
- "users.validation.username": "请输入用户名",
123
- "users.validation.email": "请输入邮箱",
124
- "users.validation.emailFormat": "请输入有效的邮箱地址",
125
- "users.validation.phone": "请输入手机号",
126
- "users.validation.password": "请输入密码",
127
- "users.detail.identity": "身份信息",
128
- "users.detail.contact": "联系方式",
129
- "users.detail.access": "访问权限",
130
- "users.detail.timestamps": "时间信息",
131
- "users.detail.noRoles": "尚未分配角色",
132
- "users.detail.unnamed": "未命名用户",
133
- "users.detail.loadError.title": "无法加载用户",
134
- "users.detail.loadError.description":
135
- "该用户可能已不存在,或者你没有权限查看此用户。",
136
- "users.ai.table": "用户表格",
137
- "users.ai.detail": "用户详情",
138
- "users.ai.createForm": "新建用户表单",
139
- "users.ai.editForm": "编辑用户表单",
140
- "common.yes": "是",
141
- "common.no": "否",
142
- "roles.drawer.description": "查看与当前用户关联的角色信息。",
143
- "roles.fields.name": "名称",
144
- "roles.fields.title": "标题",
145
- "roles.fields.description": "描述",
146
- "roles.fields.default": "默认角色",
147
- "roles.fields.hidden": "隐藏",
148
- "roles.fields.allowConfigure": "允许配置",
149
- "roles.fields.createdAt": "创建时间",
150
- "roles.fields.updatedAt": "更新时间",
151
- "roles.detail.identity": "角色标识",
152
- "roles.detail.settings": "角色设置",
153
- "roles.detail.actions": "允许的操作",
154
- "roles.detail.timestamps": "时间信息",
155
- "roles.detail.unavailable":
156
- "无法加载更多角色详情,当前展示用户关联数据中已有的信息。",
157
- "roles.ai.detail": "角色详情",
158
- } as const;