@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,147 +0,0 @@
1
- import type {
2
- AclActionParams,
3
- AclCanParams,
4
- AclRoleData,
5
- AclSnapshot,
6
- ResourceAcl,
7
- } from "./types";
8
- import ignore from "ignore";
9
- import { getRecordActionPermission } from "./record-permissions";
10
- import { resolveAclDataSourceKey } from "./data-source";
11
-
12
- const REFINE_ACTION_MAP: Record<string, string> = {
13
- list: "list",
14
- show: "get",
15
- create: "create",
16
- edit: "update",
17
- delete: "destroy",
18
- clone: "create",
19
- };
20
-
21
- const getResourceAcl = (params?: AclCanParams["params"]) =>
22
- params?.resource?.meta?.acl as ResourceAcl | undefined;
23
-
24
- export const mapRefineAction = (action: string) =>
25
- REFINE_ACTION_MAP[action] ?? action;
26
-
27
- export const getAclDataForDataSource = (
28
- snapshot: AclSnapshot,
29
- dataSourceKey = "main"
30
- ): AclRoleData => {
31
- const dataSourceAcl = snapshot.meta.dataSources?.[dataSourceKey];
32
- return dataSourceAcl
33
- ? {
34
- ...snapshot.data,
35
- ...dataSourceAcl,
36
- snippets: snapshot.data.snippets,
37
- }
38
- : snapshot.data;
39
- };
40
-
41
- export const resolveActionPermission = ({
42
- snapshot,
43
- resource,
44
- action,
45
- dataSourceKey = "main",
46
- }: {
47
- snapshot: AclSnapshot;
48
- resource: string;
49
- action: string;
50
- dataSourceKey?: string;
51
- }): AclActionParams | null => {
52
- const data = getAclDataForDataSource(snapshot, dataSourceKey);
53
- if (data.allowAll) return {};
54
-
55
- const canonicalAction = data.actionAlias?.[action] ?? action;
56
- if (data.resources?.includes(resource)) {
57
- return (
58
- data.actions?.[`${resource}:${canonicalAction}`] ??
59
- data.actions?.[`${resource}:${action}`] ??
60
- null
61
- );
62
- }
63
-
64
- const strategyAllowed = data.strategy?.actions?.some(
65
- (item) => item.split(":")[0] === canonicalAction
66
- );
67
- return strategyAllowed ? {} : null;
68
- };
69
-
70
- const matchesSnippet = (snippets: string[], target: string) =>
71
- !target || target === "*" || ignore().add(snippets).ignores(target);
72
-
73
- export const canAccessWithSnapshot = (
74
- snapshot: AclSnapshot,
75
- { resource, action, params }: AclCanParams
76
- ) => {
77
- if (snapshot.status !== "ready") return false;
78
-
79
- const resourceAcl = getResourceAcl(params);
80
- if (resourceAcl === false || resourceAcl?.type === "authenticated") {
81
- return true;
82
- }
83
-
84
- if (resourceAcl?.type === "snippet") {
85
- return (
86
- snapshot.data.allowAll ||
87
- matchesSnippet(snapshot.data.snippets ?? [], resourceAcl.name)
88
- );
89
- }
90
-
91
- if (resourceAcl?.type === "route") {
92
- return (
93
- snapshot.data.allowAll ||
94
- (snapshot.data.allowMenuItemIds ?? [])
95
- .map(String)
96
- .includes(String(resourceAcl.routeId))
97
- );
98
- }
99
-
100
- const targetResource =
101
- resourceAcl?.type === "collection" && resourceAcl.resource
102
- ? resourceAcl.resource
103
- : resource;
104
- if (!targetResource) return true;
105
-
106
- const dataSourceKey =
107
- resolveAclDataSourceKey(
108
- params,
109
- params?.meta as { dataSourceKey?: unknown; acl?: ResourceAcl } | undefined,
110
- params?.resource?.meta as
111
- | { dataSourceKey?: unknown; acl?: ResourceAcl }
112
- | undefined
113
- ) ?? "main";
114
- const mappedAction =
115
- (resourceAcl?.type === "collection" && resourceAcl.actionMap?.[action]) ||
116
- mapRefineAction(action);
117
- const permission = resolveActionPermission({
118
- snapshot,
119
- resource: targetResource,
120
- action: mappedAction,
121
- dataSourceKey,
122
- });
123
- if (!permission) return false;
124
-
125
- if (params?.id !== undefined) {
126
- const recordPermission = getRecordActionPermission({
127
- dataSourceKey,
128
- resource: targetResource,
129
- action: mappedAction,
130
- id: params.id,
131
- actionAlias: getAclDataForDataSource(snapshot, dataSourceKey).actionAlias,
132
- });
133
- if (recordPermission !== undefined) return recordPermission;
134
- }
135
-
136
- if (typeof params?.field === "string") {
137
- const fields = [
138
- ...(permission.fields ?? []),
139
- ...(permission.whitelist ?? []),
140
- ...(permission.appends ?? []),
141
- ];
142
- if (!fields.length) return true;
143
- return fields.includes(params.field);
144
- }
145
-
146
- return true;
147
- };
@@ -1,15 +0,0 @@
1
- import { Outlet } from "react-router";
2
-
3
- import { ResourceAccessGuard } from "@/components/access-control/resource-access-guard";
4
- import { UserList } from "./list";
5
-
6
- export function UserResourceLayout() {
7
- return (
8
- <>
9
- <ResourceAccessGuard resource="users" action="list">
10
- <UserList />
11
- </ResourceAccessGuard>
12
- <Outlet />
13
- </>
14
- );
15
- }
@@ -1,278 +0,0 @@
1
- import {
2
- useGetLocale,
3
- useShow,
4
- useTranslate,
5
- } from "@refinedev/core";
6
- import { useNavigate, useOutlet, useParams } from "react-router";
7
- import { Pencil, RotateCw } from "lucide-react";
8
-
9
- import { LoadingState } from "@/components/app-shell/loading-state";
10
- import { EditButton } from "@/components/resources/buttons/edit";
11
- import { RefreshButton } from "@/components/resources/buttons/refresh";
12
- import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
13
- import { Separator } from "@/components/ui/separator";
14
- import { Skeleton } from "@/components/ui/skeleton";
15
- import { RouteDrawer } from "@/extensions/nocobase-route-surfaces";
16
- import { useAIPageElementHandle } from "@/extensions/nocobase-ai";
17
- import { RoleBadges } from "./role-badges";
18
- import { resolveRoleLabel } from "./role-utils";
19
- import { getUserRolePath, userRoutes } from "./routes";
20
- import type { UserRecord } from "./types";
21
-
22
- export const UserShow = () => {
23
- const translate = useTranslate();
24
- const getLocale = useGetLocale();
25
- const locale = getLocale();
26
- const navigate = useNavigate();
27
- const { id } = useParams<{ id: string }>();
28
- const nestedDrawer = useOutlet();
29
- const { result: record, query } = useShow<UserRecord>({
30
- resource: "users",
31
- id,
32
- meta: {
33
- appends: ["roles"],
34
- },
35
- });
36
-
37
- const displayName =
38
- record?.nickname ||
39
- record?.username ||
40
- record?.email ||
41
- translate("users.detail.unnamed", { ns: "app" }, "Unnamed user");
42
- const roles = record?.roles ?? [];
43
- const detailContext = useAIPageElementHandle({
44
- id: `users-detail-${id ?? "current"}`,
45
- title: `${translate(
46
- "users.ai.detail",
47
- { ns: "app" },
48
- "User details"
49
- )}: ${displayName}`,
50
- kind: "detail",
51
- getContext: () => ({
52
- resource: "users",
53
- record: {
54
- id: record?.id,
55
- nickname: record?.nickname,
56
- username: record?.username,
57
- email: record?.email,
58
- phone: record?.phone,
59
- roles: roles.map((role) => ({
60
- name: role.name,
61
- title: resolveRoleLabel(role),
62
- })),
63
- createdAt: record?.createdAt,
64
- updatedAt: record?.updatedAt,
65
- },
66
- }),
67
- });
68
-
69
- const formatDate = (value?: string) =>
70
- value
71
- ? new Intl.DateTimeFormat(locale, {
72
- dateStyle: "medium",
73
- timeStyle: "short",
74
- }).format(new Date(value))
75
- : "-";
76
-
77
- return (
78
- <RouteDrawer
79
- title={
80
- query.isLoading && !record ? (
81
- <Skeleton className="h-6 w-40" />
82
- ) : (
83
- displayName
84
- )
85
- }
86
- description={translate(
87
- "users.drawer.show.description",
88
- { ns: "app" },
89
- "Review this user's identity, contact information, and roles."
90
- )}
91
- closeLabel={translate("buttons.close", "Close")}
92
- closeTo={userRoutes.list}
93
- nested={nestedDrawer}
94
- actions={
95
- record ? (
96
- <>
97
- <RefreshButton
98
- resource="users"
99
- recordItemId={record.id}
100
- variant="outline"
101
- size="icon-sm"
102
- aria-label={translate("buttons.refresh", "Refresh")}
103
- title={translate("buttons.refresh", "Refresh")}
104
- >
105
- <RotateCw />
106
- </RefreshButton>
107
- <EditButton
108
- resource="users"
109
- recordItemId={record.id}
110
- variant="outline"
111
- size="icon-sm"
112
- aria-label={translate(
113
- "users.actions.edit",
114
- { ns: "app" },
115
- "Edit user"
116
- )}
117
- title={translate(
118
- "users.actions.edit",
119
- { ns: "app" },
120
- "Edit user"
121
- )}
122
- onClick={() => navigate("edit")}
123
- >
124
- <Pencil />
125
- </EditButton>
126
- </>
127
- ) : null
128
- }
129
- >
130
- <div
131
- ref={detailContext.ref}
132
- className="min-h-0 flex-1 overflow-y-auto px-5 py-5"
133
- >
134
- {query.isLoading ? (
135
- <LoadingState className="min-h-64" />
136
- ) : query.isError ? (
137
- <Alert variant="destructive">
138
- <AlertTitle>
139
- {translate(
140
- "users.detail.loadError.title",
141
- { ns: "app" },
142
- "Unable to load user"
143
- )}
144
- </AlertTitle>
145
- <AlertDescription>
146
- {translate(
147
- "users.detail.loadError.description",
148
- { ns: "app" },
149
- "The user may no longer exist, or you may not have permission to view it."
150
- )}
151
- </AlertDescription>
152
- </Alert>
153
- ) : (
154
- <div className="space-y-5">
155
- <DetailSection
156
- title={translate(
157
- "users.detail.identity",
158
- { ns: "app" },
159
- "Identity"
160
- )}
161
- items={[
162
- [
163
- translate("users.fields.id", { ns: "app" }, "ID"),
164
- record?.id ?? "-",
165
- ],
166
- [
167
- translate(
168
- "users.fields.nickname",
169
- { ns: "app" },
170
- "Nickname"
171
- ),
172
- record?.nickname || "-",
173
- ],
174
- [
175
- translate(
176
- "users.fields.username",
177
- { ns: "app" },
178
- "Username"
179
- ),
180
- record?.username || "-",
181
- ],
182
- ]}
183
- />
184
-
185
- <Separator />
186
-
187
- <DetailSection
188
- title={translate(
189
- "users.detail.contact",
190
- { ns: "app" },
191
- "Contact"
192
- )}
193
- items={[
194
- [
195
- translate("users.fields.email", { ns: "app" }, "Email"),
196
- record?.email || "-",
197
- ],
198
- [
199
- translate("users.fields.phone", { ns: "app" }, "Phone"),
200
- record?.phone || "-",
201
- ],
202
- ]}
203
- />
204
-
205
- <Separator />
206
-
207
- <section className="space-y-3">
208
- <h3 className="text-sm font-medium">
209
- {translate("users.detail.access", { ns: "app" }, "Access")}
210
- </h3>
211
- <RoleBadges
212
- roles={roles}
213
- onSelect={(role) =>
214
- id ? navigate(getUserRolePath(id, role.name)) : undefined
215
- }
216
- empty={translate(
217
- "users.detail.noRoles",
218
- { ns: "app" },
219
- "No assigned roles"
220
- )}
221
- />
222
- </section>
223
-
224
- <Separator />
225
-
226
- <DetailSection
227
- title={translate(
228
- "users.detail.timestamps",
229
- { ns: "app" },
230
- "Timestamps"
231
- )}
232
- items={[
233
- [
234
- translate(
235
- "users.fields.createdAt",
236
- { ns: "app" },
237
- "Created at"
238
- ),
239
- formatDate(record?.createdAt),
240
- ],
241
- [
242
- translate(
243
- "users.fields.updatedAt",
244
- { ns: "app" },
245
- "Updated at"
246
- ),
247
- formatDate(record?.updatedAt),
248
- ],
249
- ]}
250
- />
251
- </div>
252
- )}
253
- </div>
254
- </RouteDrawer>
255
- );
256
- };
257
-
258
- function DetailSection({
259
- title,
260
- items,
261
- }: {
262
- title: string;
263
- items: Array<[label: string, value: string | number]>;
264
- }) {
265
- return (
266
- <section className="space-y-3">
267
- <h3 className="text-sm font-medium">{title}</h3>
268
- <dl className="grid gap-4 sm:grid-cols-2">
269
- {items.map(([label, value]) => (
270
- <div key={label} className="space-y-1">
271
- <dt className="text-xs text-muted-foreground">{label}</dt>
272
- <dd className="text-sm font-medium break-words">{value}</dd>
273
- </div>
274
- ))}
275
- </dl>
276
- </section>
277
- );
278
- }