@nocobase/portal-template-default 1.0.9 → 1.0.10

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 (304) 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/package.json +3 -5
  7. package/scripts/build-html.mjs +12 -0
  8. package/src/App.css +2 -0
  9. package/src/App.tsx +35 -186
  10. package/src/app/development.tsx +154 -0
  11. package/src/app/extension.ts +5 -0
  12. package/src/app/extensions.tsx +18 -4
  13. package/src/app/routes.tsx +65 -0
  14. package/src/components/access-control/acl-bootstrap.tsx +11 -3
  15. package/src/components/access-control/acl-gate.tsx +7 -6
  16. package/src/components/access-control/can-access.tsx +17 -0
  17. package/src/components/access-control/navigate-to-accessible-resource.tsx +8 -3
  18. package/src/components/app-shell/sidebar.tsx +21 -5
  19. package/src/components/auth/auto-redirect-provider.tsx +2 -1
  20. package/src/extensions/nocobase-acl/README.md +74 -0
  21. package/{registry → src/extensions}/nocobase-acl/components/acl-boundary.tsx +22 -25
  22. package/{registry → src/extensions}/nocobase-acl/components/role-switcher.tsx +26 -23
  23. package/src/extensions/nocobase-acl/demo/acl-preview-provider.tsx +81 -0
  24. package/{registry → src/extensions}/nocobase-acl/demo/boundary-api.tsx +58 -0
  25. package/{registry → src/extensions}/nocobase-acl/demo/index.tsx +243 -105
  26. package/{registry → src/extensions}/nocobase-acl/demo/prompt-generator.tsx +3 -1
  27. package/src/extensions/nocobase-acl/extension.tsx +73 -0
  28. package/{registry → src/extensions}/nocobase-ai/README.md +21 -5
  29. package/{registry → src/extensions}/nocobase-ai/components/chat/chat-composer.tsx +3 -1
  30. package/{registry → src/extensions}/nocobase-ai/components/chat/chat-messages.tsx +38 -3
  31. package/{registry → src/extensions}/nocobase-ai/components/chat/tool-call-card.tsx +1 -9
  32. package/{registry → src/extensions}/nocobase-ai/components/index.ts +5 -0
  33. package/src/extensions/nocobase-ai/components/surfaces/chat-dialog.tsx +17 -0
  34. package/src/extensions/nocobase-ai/components/surfaces/chat-side-panel.tsx +35 -0
  35. package/src/extensions/nocobase-ai/components/surfaces/chat-surface.tsx +108 -0
  36. package/{registry → src/extensions}/nocobase-ai/components/triggers/ai-chat-floating-trigger.tsx +2 -2
  37. package/{registry → src/extensions}/nocobase-ai/demo/configuration-gate.tsx +4 -1
  38. package/{registry → src/extensions}/nocobase-ai/demo/container-showcase.tsx +2 -2
  39. package/{registry → src/extensions}/nocobase-ai/demo/floating.tsx +45 -15
  40. package/{registry → src/extensions}/nocobase-ai/demo/index.tsx +116 -74
  41. package/{registry → src/extensions}/nocobase-ai/demo/prompt-generator.tsx +3 -3
  42. package/{registry → src/extensions}/nocobase-ai/demo/tool-cards.tsx +2 -3
  43. package/src/extensions/nocobase-ai/extension.tsx +160 -0
  44. package/{registry → src/extensions}/nocobase-ai/global-ai-chat.tsx +12 -28
  45. package/{registry → src/extensions}/nocobase-ai/providers/ai-provider.tsx +14 -1
  46. package/{registry → src/extensions}/nocobase-ai/providers/chat-context.tsx +1 -0
  47. package/{registry → src/extensions}/nocobase-ai/providers/chat-provider.tsx +29 -8
  48. package/{registry → src/extensions}/nocobase-ai/providers/use-chat-attachments.ts +6 -1
  49. package/{registry → src/extensions}/nocobase-ai/providers/use-chat-work-context.ts +4 -1
  50. package/{registry → src/extensions}/nocobase-route-surfaces/README.md +2 -1
  51. package/{registry → src/extensions}/nocobase-route-surfaces/demo/index.tsx +33 -7
  52. package/{registry → src/extensions}/nocobase-route-surfaces/demo/scenarios.ts +20 -14
  53. package/{registry → src/extensions}/nocobase-route-surfaces/extension.tsx +55 -52
  54. package/src/{pages/users → extensions/nocobase-users-example}/create.tsx +4 -4
  55. package/src/{pages/users → extensions/nocobase-users-example}/edit.tsx +5 -9
  56. package/src/extensions/nocobase-users-example/extension.tsx +109 -0
  57. package/src/{pages/users → extensions/nocobase-users-example}/form-context.ts +11 -9
  58. package/src/extensions/nocobase-users-example/layout.tsx +16 -0
  59. package/src/{pages/users → extensions/nocobase-users-example}/list.tsx +1 -1
  60. package/src/extensions/nocobase-users-example/locales/en-US.ts +77 -0
  61. package/src/extensions/nocobase-users-example/locales/index.ts +8 -0
  62. package/src/extensions/nocobase-users-example/locales/zh-CN.ts +73 -0
  63. package/src/extensions/nocobase-users-example/optional-ai.ts +67 -0
  64. package/src/{pages/users → extensions/nocobase-users-example}/role-detail.tsx +4 -15
  65. package/src/{pages/users → extensions/nocobase-users-example}/routes.ts +1 -4
  66. package/src/extensions/nocobase-users-example/show.tsx +266 -0
  67. package/src/lib/nocobase/acl/context.ts +32 -0
  68. package/src/lib/nocobase/acl/evaluator.ts +186 -0
  69. package/src/lib/nocobase/acl/hooks.ts +40 -0
  70. package/src/lib/nocobase/acl/index.ts +4 -1
  71. package/src/lib/nocobase/acl/menu.ts +6 -6
  72. package/src/lib/nocobase/acl/record-permissions.ts +37 -7
  73. package/src/lib/nocobase/acl/store-provider.tsx +14 -0
  74. package/src/lib/nocobase/acl/store.ts +92 -86
  75. package/src/lib/nocobase/acl/types.ts +52 -32
  76. package/src/lib/nocobase/auth-session.ts +128 -0
  77. package/src/lib/nocobase/client.ts +48 -50
  78. package/src/locales/en-US.ts +0 -78
  79. package/src/locales/index.ts +2 -7
  80. package/src/locales/zh-CN.ts +0 -74
  81. package/src/providers/access-control.ts +43 -8
  82. package/src/providers/auth-callback.ts +1 -0
  83. package/src/providers/auth.ts +24 -26
  84. package/src/providers/constants.ts +0 -4
  85. package/src/providers/data.ts +14 -26
  86. package/src/providers/runtime-config.ts +40 -0
  87. package/src/vite-env.d.ts +9 -0
  88. package/tests/auth-session-regression.mjs +101 -0
  89. package/tsconfig.json +2 -1
  90. package/vite.config.ts +9 -1
  91. package/dist/assets/CoordinateSystem-C8P-Cleg.js +0 -1
  92. package/dist/assets/LegendVisualProvider-Bdgkckq-.js +0 -1
  93. package/dist/assets/LineDraw-C0m1GONT.js +0 -1
  94. package/dist/assets/SymbolDraw-CCospe5G.js +0 -1
  95. package/dist/assets/VisualMapping-Cbv1v7Cd.js +0 -1
  96. package/dist/assets/ai-employee-shortcut-B253WWow.js +0 -1
  97. package/dist/assets/calendar-B3dXXyIv.js +0 -1
  98. package/dist/assets/chat-inline-xpQ9iq4p.js +0 -1
  99. package/dist/assets/chat-side-panel-layout-BVWsp5rr.js +0 -1
  100. package/dist/assets/components-ChhJaNRc.js +0 -20
  101. package/dist/assets/configuration-gate-Dwdq_lxf.js +0 -1
  102. package/dist/assets/createClipPathFromCoordSys-uEftn1Mq.js +0 -1
  103. package/dist/assets/createSeriesDataSimply-CI7l7Ufv.js +0 -1
  104. package/dist/assets/customGraphicKeyframeAnimation-DE3jSfMd.js +0 -3
  105. package/dist/assets/echarts-preview-C-cNUtJF.js +0 -1
  106. package/dist/assets/echarts-runtime-CEgJbv68.js +0 -58
  107. package/dist/assets/echarts-runtime-advanced-Buhm2BHz.js +0 -1
  108. package/dist/assets/echarts-runtime-common-DLAdBAIa.js +0 -1
  109. package/dist/assets/echarts-runtime-components-ypnyLkYx.js +0 -1
  110. package/dist/assets/echarts-runtime-hierarchy-ClStquCF.js +0 -1
  111. package/dist/assets/floating-BarTmn-b.js +0 -13
  112. package/dist/assets/index-BJIcYTdc.js +0 -53
  113. package/dist/assets/index-C6xNKxpg.js +0 -656
  114. package/dist/assets/index-D4JQi1TM.js +0 -54
  115. package/dist/assets/index-YA7-AUO8.css +0 -1
  116. package/dist/assets/index-g8zWVpP9.js +0 -23
  117. package/dist/assets/labelHelper-C137W5gU.js +0 -1
  118. package/dist/assets/nocobase-ai-chat-VTMaZFQB.svg +0 -50
  119. package/dist/assets/page-context-Cxx11gzg.js +0 -73
  120. package/dist/assets/prompt-card-BsYMW_rq.js +0 -1
  121. package/dist/assets/sectorHelper-Fqgz3uEk.js +0 -1
  122. package/dist/assets/shortcut-xtghDP63.js +0 -47
  123. package/dist/assets/static.browser-CfQQzERe.js +0 -30
  124. package/dist/assets/switch-DrxImI8F.js +0 -1
  125. package/dist/assets/tool-cards-BGfsY8JF.js +0 -41
  126. package/dist/favicon.ico +0 -0
  127. package/dist/index.html +0 -40
  128. package/dist/index.raw.html +0 -46
  129. package/dist/logo-dark.png +0 -0
  130. package/dist/logo-mark-dark.png +0 -0
  131. package/dist/logo-mark.png +0 -0
  132. package/dist/logo.png +0 -0
  133. package/registry/nocobase-acl/README.md +0 -19
  134. package/registry/nocobase-acl/extension.tsx +0 -71
  135. package/registry/nocobase-acl/tests/acl-regression.mjs +0 -314
  136. package/registry/nocobase-ai/components/surfaces/chat-dialog.tsx +0 -31
  137. package/registry/nocobase-ai/components/surfaces/chat-side-panel.tsx +0 -74
  138. package/registry/nocobase-ai/extension.tsx +0 -158
  139. package/registry/nocobase-ai/tests/business-report-regression.mjs +0 -70
  140. package/registry/nocobase-ai/tests/form-filler-regression.mjs +0 -129
  141. package/registry/nocobase-ai/tests/frontend-tool-regression.mjs +0 -128
  142. package/registry/nocobase-ai/tests/page-context-regression.mjs +0 -48
  143. package/registry/nocobase-ai/tests/stream-regression.mjs +0 -207
  144. package/registry/nocobase-auth-cas/README.md +0 -6
  145. package/registry/nocobase-auth-cas/cas-sign-in-button.tsx +0 -41
  146. package/registry/nocobase-auth-cas/demo.tsx +0 -20
  147. package/registry/nocobase-auth-cas/extension.tsx +0 -46
  148. package/registry/nocobase-auth-cas/index.ts +0 -1
  149. package/registry/nocobase-auth-cas/use-cas-sign-in.ts +0 -29
  150. package/registry/nocobase-auth-dingtalk/README.md +0 -7
  151. package/registry/nocobase-auth-dingtalk/auto-login-provider.tsx +0 -154
  152. package/registry/nocobase-auth-dingtalk/demo.tsx +0 -23
  153. package/registry/nocobase-auth-dingtalk/dingtalk-sign-in-button.tsx +0 -45
  154. package/registry/nocobase-auth-dingtalk/extension.tsx +0 -55
  155. package/registry/nocobase-auth-dingtalk/index.ts +0 -4
  156. package/registry/nocobase-auth-dingtalk/use-dingtalk-sign-in.ts +0 -64
  157. package/registry/nocobase-auth-ldap/README.md +0 -6
  158. package/registry/nocobase-auth-ldap/demo.tsx +0 -21
  159. package/registry/nocobase-auth-ldap/extension.tsx +0 -46
  160. package/registry/nocobase-auth-ldap/index.ts +0 -1
  161. package/registry/nocobase-auth-ldap/ldap-sign-in-form.tsx +0 -69
  162. package/registry/nocobase-auth-ldap/use-ldap-sign-in.ts +0 -5
  163. package/registry/nocobase-auth-oidc/README.md +0 -11
  164. package/registry/nocobase-auth-oidc/auto-redirect-provider.tsx +0 -13
  165. package/registry/nocobase-auth-oidc/demo.tsx +0 -20
  166. package/registry/nocobase-auth-oidc/extension.tsx +0 -51
  167. package/registry/nocobase-auth-oidc/index.ts +0 -1
  168. package/registry/nocobase-auth-oidc/oidc-sign-in-button.tsx +0 -44
  169. package/registry/nocobase-auth-oidc/use-oidc-sign-in.ts +0 -58
  170. package/registry/nocobase-auth-saml/README.md +0 -6
  171. package/registry/nocobase-auth-saml/auto-redirect-provider.tsx +0 -13
  172. package/registry/nocobase-auth-saml/demo.tsx +0 -20
  173. package/registry/nocobase-auth-saml/extension.tsx +0 -51
  174. package/registry/nocobase-auth-saml/index.ts +0 -1
  175. package/registry/nocobase-auth-saml/saml-sign-in-button.tsx +0 -43
  176. package/registry/nocobase-auth-saml/use-saml-sign-in.ts +0 -51
  177. package/registry/nocobase-auth-sms/README.md +0 -7
  178. package/registry/nocobase-auth-sms/demo.tsx +0 -25
  179. package/registry/nocobase-auth-sms/extension.tsx +0 -46
  180. package/registry/nocobase-auth-sms/index.ts +0 -1
  181. package/registry/nocobase-auth-sms/sms-sign-in-form.tsx +0 -107
  182. package/registry/nocobase-auth-sms/use-sms-sign-in.ts +0 -88
  183. package/registry/nocobase-auth-wecom/README.md +0 -6
  184. package/registry/nocobase-auth-wecom/auto-login-provider.tsx +0 -21
  185. package/registry/nocobase-auth-wecom/demo.tsx +0 -23
  186. package/registry/nocobase-auth-wecom/extension.tsx +0 -49
  187. package/registry/nocobase-auth-wecom/index.ts +0 -1
  188. package/registry/nocobase-auth-wecom/use-wecom-sign-in.ts +0 -62
  189. package/registry/nocobase-auth-wecom/wecom-sign-in-button.tsx +0 -70
  190. package/registry/nocobase-i18n/README.md +0 -44
  191. package/registry/nocobase-i18n/components/index.ts +0 -1
  192. package/registry/nocobase-i18n/components/language-switcher.tsx +0 -138
  193. package/registry/nocobase-i18n/demo/index.tsx +0 -209
  194. package/registry/nocobase-i18n/demo/prompt-generator.tsx +0 -132
  195. package/registry/nocobase-i18n/extension.tsx +0 -45
  196. package/registry/nocobase-i18n/index.ts +0 -7
  197. package/registry/nocobase-i18n/locales/en-US.ts +0 -39
  198. package/registry/nocobase-i18n/locales/index.ts +0 -8
  199. package/registry/nocobase-i18n/locales/zh-CN.ts +0 -35
  200. package/registry/nocobase-i18n/provider.tsx +0 -44
  201. package/registry/nocobase-i18n/server-resources.ts +0 -166
  202. package/registry/nocobase-i18n/tests/i18n-regression.mjs +0 -51
  203. package/registry.config.json +0 -302
  204. package/scripts/registry.mjs +0 -164
  205. package/src/components/access-control/resource-access-guard.tsx +0 -21
  206. package/src/components/access-control/use-acl-runtime.ts +0 -28
  207. package/src/lib/nocobase/acl/action.ts +0 -147
  208. package/src/pages/users/layout.tsx +0 -15
  209. package/src/pages/users/show.tsx +0 -278
  210. /package/{registry → src/extensions}/nocobase-acl/components/index.ts +0 -0
  211. /package/{registry → src/extensions}/nocobase-acl/components/role-options.ts +0 -0
  212. /package/{registry → src/extensions}/nocobase-acl/demo/components.tsx +0 -0
  213. /package/{registry → src/extensions}/nocobase-acl/demo/lazy-route.tsx +0 -0
  214. /package/{registry → src/extensions}/nocobase-acl/demo/role-switcher-prompt-generator.tsx +0 -0
  215. /package/{registry → src/extensions}/nocobase-acl/demo/scenario-section.tsx +0 -0
  216. /package/{registry → src/extensions}/nocobase-acl/index.ts +0 -0
  217. /package/{registry → src/extensions}/nocobase-ai/adapters/react-hook-form.ts +0 -0
  218. /package/{registry → src/extensions}/nocobase-ai/assets/nocobase-ai-chat.svg +0 -0
  219. /package/{registry → src/extensions}/nocobase-ai/components/ai-root-provider.tsx +0 -0
  220. /package/{registry → src/extensions}/nocobase-ai/components/chat/ai-employee-avatar.tsx +0 -0
  221. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-attachment.tsx +0 -0
  222. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-compact.tsx +0 -0
  223. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-empty-state.tsx +0 -0
  224. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-header.tsx +0 -0
  225. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-history-dialog.tsx +0 -0
  226. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-message.tsx +0 -0
  227. /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-window.tsx +0 -0
  228. /package/{registry → src/extensions}/nocobase-ai/components/chat/conversation-list.tsx +0 -0
  229. /package/{registry → src/extensions}/nocobase-ai/components/chat/markdown-message.tsx +0 -0
  230. /package/{registry → src/extensions}/nocobase-ai/components/chat/model-select-options.tsx +0 -0
  231. /package/{registry → src/extensions}/nocobase-ai/components/chat/reasoning-panel.tsx +0 -0
  232. /package/{registry → src/extensions}/nocobase-ai/components/chat/sub-agent-conversation.tsx +0 -0
  233. /package/{registry → src/extensions}/nocobase-ai/components/chat/user-prompt-editor.tsx +0 -0
  234. /package/{registry → src/extensions}/nocobase-ai/components/chat/work-context-chip.tsx +0 -0
  235. /package/{registry → src/extensions}/nocobase-ai/components/page-elements/ai-form.tsx +0 -0
  236. /package/{registry → src/extensions}/nocobase-ai/components/page-elements/page-element-provider.tsx +0 -0
  237. /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-inline.tsx +0 -0
  238. /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-page.tsx +0 -0
  239. /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-side-panel-layout.tsx +0 -0
  240. /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-surface-actions.tsx +0 -0
  241. /package/{registry → src/extensions}/nocobase-ai/components/tools/builtin-tool-renderers.tsx +0 -0
  242. /package/{registry → src/extensions}/nocobase-ai/components/tools/business-report-dialog.tsx +0 -0
  243. /package/{registry → src/extensions}/nocobase-ai/components/tools/business-report-renderer.tsx +0 -0
  244. /package/{registry → src/extensions}/nocobase-ai/components/tools/business-report-utils.tsx +0 -0
  245. /package/{registry → src/extensions}/nocobase-ai/components/tools/chart-renderer.tsx +0 -0
  246. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-preview.tsx +0 -0
  247. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-advanced.ts +0 -0
  248. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-common.ts +0 -0
  249. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-components.ts +0 -0
  250. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-hierarchy.ts +0 -0
  251. /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime.ts +0 -0
  252. /package/{registry → src/extensions}/nocobase-ai/components/tools/sub-agent-renderer.tsx +0 -0
  253. /package/{registry → src/extensions}/nocobase-ai/components/tools/suggestions-renderer.tsx +0 -0
  254. /package/{registry → src/extensions}/nocobase-ai/components/tools/tool-renderer-provider.tsx +0 -0
  255. /package/{registry → src/extensions}/nocobase-ai/components/tools/tool-renderer-utils.ts +0 -0
  256. /package/{registry → src/extensions}/nocobase-ai/components/tools/workflow-renderer.tsx +0 -0
  257. /package/{registry → src/extensions}/nocobase-ai/components/triggers/ai-employee-shortcut.tsx +0 -0
  258. /package/{registry → src/extensions}/nocobase-ai/demo/interaction-showcase.tsx +0 -0
  259. /package/{registry → src/extensions}/nocobase-ai/demo/page-context-prompt-generator.tsx +0 -0
  260. /package/{registry → src/extensions}/nocobase-ai/demo/page-context.tsx +0 -0
  261. /package/{registry → src/extensions}/nocobase-ai/demo/page-element-showcase.tsx +0 -0
  262. /package/{registry → src/extensions}/nocobase-ai/demo/prompt-card.tsx +0 -0
  263. /package/{registry → src/extensions}/nocobase-ai/demo/shortcut.tsx +0 -0
  264. /package/{registry → src/extensions}/nocobase-ai/index.ts +0 -0
  265. /package/{registry → src/extensions}/nocobase-ai/providers/avatars.ts +0 -0
  266. /package/{registry → src/extensions}/nocobase-ai/providers/chat-controller.ts +0 -0
  267. /package/{registry → src/extensions}/nocobase-ai/providers/chat-message-utils.ts +0 -0
  268. /package/{registry → src/extensions}/nocobase-ai/providers/chat-reducer.ts +0 -0
  269. /package/{registry → src/extensions}/nocobase-ai/providers/chat-task-utils.ts +0 -0
  270. /package/{registry → src/extensions}/nocobase-ai/providers/chat-transport.ts +0 -0
  271. /package/{registry → src/extensions}/nocobase-ai/providers/form-registry.tsx +0 -0
  272. /package/{registry → src/extensions}/nocobase-ai/providers/frontend-tool-registry.tsx +0 -0
  273. /package/{registry → src/extensions}/nocobase-ai/providers/index.ts +0 -0
  274. /package/{registry → src/extensions}/nocobase-ai/providers/model.ts +0 -0
  275. /package/{registry → src/extensions}/nocobase-ai/providers/page-context.tsx +0 -0
  276. /package/{registry → src/extensions}/nocobase-ai/providers/stream-coalescer.ts +0 -0
  277. /package/{registry → src/extensions}/nocobase-ai/providers/stream-event-utils.ts +0 -0
  278. /package/{registry → src/extensions}/nocobase-ai/providers/stream-parser.ts +0 -0
  279. /package/{registry → src/extensions}/nocobase-ai/providers/sub-agent-stream.ts +0 -0
  280. /package/{registry → src/extensions}/nocobase-ai/providers/types.ts +0 -0
  281. /package/{registry → src/extensions}/nocobase-ai/providers/ui-message-stream.ts +0 -0
  282. /package/{registry → src/extensions}/nocobase-ai/providers/use-automatic-tool-approval.ts +0 -0
  283. /package/{registry → src/extensions}/nocobase-ai/providers/use-chat-message-actions.ts +0 -0
  284. /package/{registry → src/extensions}/nocobase-ai/providers/use-chat-runtime.ts +0 -0
  285. /package/{registry → src/extensions}/nocobase-ai/providers/use-conversation-catalog.ts +0 -0
  286. /package/{registry → src/extensions}/nocobase-ai/providers/use-conversation-history.ts +0 -0
  287. /package/{registry → src/extensions}/nocobase-ai/services/index.ts +0 -0
  288. /package/{registry → src/extensions}/nocobase-ai/services/nocobase-ai-service.ts +0 -0
  289. /package/{registry → src/extensions}/nocobase-ai/services/types.ts +0 -0
  290. /package/{registry → src/extensions}/nocobase-route-surfaces/demo/lazy-route.tsx +0 -0
  291. /package/{registry → src/extensions}/nocobase-route-surfaces/demo/prompt-generator.tsx +0 -0
  292. /package/{registry → src/extensions}/nocobase-route-surfaces/index.ts +0 -0
  293. /package/{registry → src/extensions}/nocobase-route-surfaces/route-dialog.tsx +0 -0
  294. /package/{registry → src/extensions}/nocobase-route-surfaces/route-drawer.tsx +0 -0
  295. /package/{registry → src/extensions}/nocobase-route-surfaces/route-page.tsx +0 -0
  296. /package/{registry → src/extensions}/nocobase-route-surfaces/route-surface-context.ts +0 -0
  297. /package/{registry → src/extensions}/nocobase-route-surfaces/use-refine-unsaved-changes.tsx +0 -0
  298. /package/{registry → src/extensions}/nocobase-route-surfaces/use-route-surface-close.ts +0 -0
  299. /package/{registry → src/extensions}/nocobase-route-surfaces/use-route-surface-state.ts +0 -0
  300. /package/src/{pages/users → extensions/nocobase-users-example}/form-fields.tsx +0 -0
  301. /package/src/{pages/users → extensions/nocobase-users-example}/index.ts +0 -0
  302. /package/src/{pages/users → extensions/nocobase-users-example}/role-badges.tsx +0 -0
  303. /package/src/{pages/users → extensions/nocobase-users-example}/role-utils.ts +0 -0
  304. /package/src/{pages/users → extensions/nocobase-users-example}/types.ts +0 -0
@@ -1,15 +1,42 @@
1
1
  import type { AccessControlProvider } from "@refinedev/core";
2
2
 
3
3
  import {
4
- canAccessWithSnapshot,
5
- getAclSnapshot,
4
+ aclStore,
5
+ evaluateAccess,
6
+ getAclState,
6
7
  loadAcl,
8
+ type AclAccessRequest,
9
+ type RoleConstraint,
7
10
  } from "@/lib/nocobase/acl";
8
11
 
12
+ const toAclAccessRequest = ({
13
+ resource,
14
+ action,
15
+ params,
16
+ }: Parameters<AccessControlProvider["can"]>[0]): AclAccessRequest => ({
17
+ resource,
18
+ action,
19
+ id: params?.id,
20
+ field: typeof params?.field === "string" ? params.field : undefined,
21
+ dataSourceKey:
22
+ typeof params?.dataSourceKey === "string"
23
+ ? params.dataSourceKey
24
+ : undefined,
25
+ roles: params?.roles as RoleConstraint | undefined,
26
+ meta: params?.meta as Record<string, unknown> | undefined,
27
+ resourceItem: params?.resource,
28
+ });
29
+
9
30
  export const accessControlProvider: AccessControlProvider = {
10
- can: async ({ resource, action, params }) => {
11
- const snapshot = await loadAcl();
12
- const can = canAccessWithSnapshot(snapshot, { resource, action, params });
31
+ can: async (request) => {
32
+ const state = await loadAcl();
33
+ const can =
34
+ state.status === "ready" &&
35
+ evaluateAccess(
36
+ state.permissions,
37
+ toAclAccessRequest(request),
38
+ aclStore.recordPermissions.getPermission
39
+ );
13
40
 
14
41
  return {
15
42
  can,
@@ -29,6 +56,14 @@ export const accessControlProvider: AccessControlProvider = {
29
56
  },
30
57
  };
31
58
 
32
- export const canAccessCurrentAcl = (
33
- params: Parameters<typeof canAccessWithSnapshot>[1]
34
- ) => canAccessWithSnapshot(getAclSnapshot(), params);
59
+ export const canAccessCurrentAcl = (request: AclAccessRequest) => {
60
+ const state = getAclState();
61
+ return (
62
+ state.status === "ready" &&
63
+ evaluateAccess(
64
+ state.permissions,
65
+ request,
66
+ aclStore.recordPermissions.getPermission
67
+ )
68
+ );
69
+ };
@@ -12,6 +12,7 @@ export function captureAuthenticationCallback() {
12
12
 
13
13
  nocobaseClient.setToken(token);
14
14
  nocobaseClient.setAuthenticator(authenticator);
15
+ nocobaseClient.setRole(null);
15
16
  clearAcl();
16
17
 
17
18
  url.searchParams.delete("token");
@@ -30,7 +30,7 @@ type NocoBaseSignOutResponse = {
30
30
  };
31
31
 
32
32
  type CurrentUserCache = {
33
- token: string;
33
+ sessionKey: string;
34
34
  user: NocoBaseUser;
35
35
  expiresAt: number;
36
36
  };
@@ -51,10 +51,14 @@ const clearCurrentUserCache = () => {
51
51
 
52
52
  const getCurrentUser = async (): Promise<NocoBaseUser> => {
53
53
  const token = nocobaseClient.getToken();
54
- if (!token) throw new Error("No NocoBase token");
54
+ const sessionKey = token ?? "cookie";
55
55
 
56
56
  const cached = currentUserCache;
57
- if (cached && cached.token === token && cached.expiresAt > Date.now()) {
57
+ if (
58
+ cached &&
59
+ cached.sessionKey === sessionKey &&
60
+ cached.expiresAt > Date.now()
61
+ ) {
58
62
  return cached.user;
59
63
  }
60
64
 
@@ -63,10 +67,12 @@ const getCurrentUser = async (): Promise<NocoBaseUser> => {
63
67
  currentUserRequest = (async () => {
64
68
  const user = await nocobaseClient.action<NocoBaseUser>("auth", "check", {
65
69
  token,
66
- includeAuthenticator: true,
70
+ // A default authenticator header would override the server's
71
+ // authenticator cookie during a Cookie-only SSO session.
72
+ authenticator: token ? undefined : null,
67
73
  });
68
74
  currentUserCache = {
69
- token: nocobaseClient.getToken() ?? token,
75
+ sessionKey: nocobaseClient.getToken() ?? "cookie",
70
76
  user,
71
77
  expiresAt: Date.now() + CURRENT_USER_CACHE_MS,
72
78
  };
@@ -216,22 +222,18 @@ export const authProvider: AuthProvider = {
216
222
  const token = nocobaseClient.getToken();
217
223
  let redirect: string | undefined;
218
224
  try {
219
- if (token) {
220
- const result = await nocobaseClient.action<NocoBaseSignOutResponse>(
221
- "auth",
222
- "signOut",
223
- {
224
- method: "POST",
225
- token,
226
- includeAuthenticator: true,
227
- }
228
- );
229
- redirect = result?.redirect;
230
- }
225
+ const result = await nocobaseClient.action<NocoBaseSignOutResponse>(
226
+ "auth",
227
+ "signOut",
228
+ {
229
+ method: "POST",
230
+ token,
231
+ authenticator: token ? undefined : null,
232
+ }
233
+ );
234
+ redirect = result?.redirect;
231
235
  } finally {
232
- nocobaseClient.setToken(null);
233
- nocobaseClient.setAuthenticator(null);
234
- nocobaseClient.setRole(null);
236
+ nocobaseClient.clearAuthentication();
235
237
  clearCurrentUserCache();
236
238
  clearAcl();
237
239
  }
@@ -249,9 +251,7 @@ export const authProvider: AuthProvider = {
249
251
  await getCurrentUser();
250
252
  return { authenticated: true };
251
253
  } catch {
252
- nocobaseClient.setToken(null);
253
- nocobaseClient.setAuthenticator(null);
254
- nocobaseClient.setRole(null);
254
+ nocobaseClient.clearAuthentication();
255
255
  clearCurrentUserCache();
256
256
  clearAcl();
257
257
  return { authenticated: false, redirectTo: "/login" };
@@ -291,9 +291,7 @@ export const authProvider: AuthProvider = {
291
291
  (error as { status?: number; statusCode?: number }).statusCode;
292
292
 
293
293
  if (status === 401) {
294
- nocobaseClient.setToken(null);
295
- nocobaseClient.setAuthenticator(null);
296
- nocobaseClient.setRole(null);
294
+ nocobaseClient.clearAuthentication();
297
295
  clearCurrentUserCache();
298
296
  clearAcl();
299
297
  return { logout: true, redirectTo: "/login" };
@@ -36,9 +36,5 @@ const toProxyRelativeUrl = (url: string, target?: string) => {
36
36
 
37
37
  export const API_URL = toProxyRelativeUrl(rawApiUrl, proxyTarget);
38
38
  export const API_ORIGIN = getDefaultProxyTarget(rawApiUrl);
39
- export const NOCOBASE_TOKEN_KEY = "nocobase-auth-token";
40
- export const NOCOBASE_AUTHENTICATOR_KEY = "nocobase-authenticator";
41
- export const NOCOBASE_ROLE_KEY = "nocobase-auth-role";
42
- export const NOCOBASE_LOCALE_KEY = "nocobase-locale";
43
39
  export const NOCOBASE_AUTHENTICATOR =
44
40
  import.meta.env.NOCOBASE_AUTHENTICATOR ?? "basic";
@@ -24,7 +24,6 @@ import type {
24
24
 
25
25
  import { nocobaseClient } from "@/lib/nocobase/client";
26
26
  import {
27
- notifyRecordPermissionsChanged,
28
27
  resolveAclDataSourceKey,
29
28
  type ResourceAcl,
30
29
  updateRecordPermissions,
@@ -122,9 +121,7 @@ const request = async <T>(
122
121
  },
123
122
  body: options.body,
124
123
  token: options.meta?.token,
125
- headers: dataSourceKey
126
- ? { "X-Data-Source": dataSourceKey }
127
- : undefined,
124
+ headers: dataSourceKey ? { "X-Data-Source": dataSourceKey } : undefined,
128
125
  unwrap: options.unwrapData === false ? "none" : "data",
129
126
  });
130
127
  };
@@ -200,9 +197,7 @@ export const dataProvider: DataProvider = {
200
197
  ? { rows: response.data, count: response.meta?.count }
201
198
  : response.data ?? response;
202
199
  const records = list.rows ?? [];
203
- if (cacheAllowedActions({ resource, records, response, meta })) {
204
- notifyRecordPermissionsChanged();
205
- }
200
+ cacheAllowedActions({ resource, records, response, meta });
206
201
 
207
202
  return {
208
203
  data: records,
@@ -226,16 +221,12 @@ export const dataProvider: DataProvider = {
226
221
  }
227
222
  );
228
223
  const data = getResponseData(response);
229
- if (
230
- cacheAllowedActions({
231
- resource,
232
- records: [data],
233
- response: response as NocoBaseListResponse<TData>,
234
- meta,
235
- })
236
- ) {
237
- notifyRecordPermissionsChanged();
238
- }
224
+ cacheAllowedActions({
225
+ resource,
226
+ records: [data],
227
+ response: response as NocoBaseListResponse<TData>,
228
+ meta,
229
+ });
239
230
  return {
240
231
  data,
241
232
  };
@@ -256,17 +247,14 @@ export const dataProvider: DataProvider = {
256
247
  )
257
248
  );
258
249
  const data = responses.map(getResponseData);
259
- let permissionsChanged = false;
260
250
  responses.forEach((response, index) => {
261
- permissionsChanged =
262
- cacheAllowedActions({
263
- resource,
264
- records: [data[index]],
265
- response: response as NocoBaseListResponse<TData>,
266
- meta,
267
- }) || permissionsChanged;
251
+ cacheAllowedActions({
252
+ resource,
253
+ records: [data[index]],
254
+ response: response as NocoBaseListResponse<TData>,
255
+ meta,
256
+ });
268
257
  });
269
- if (permissionsChanged) notifyRecordPermissionsChanged();
270
258
  return { data };
271
259
  },
272
260
 
@@ -17,3 +17,43 @@ export const getPortalBase = () =>
17
17
 
18
18
  export const getRuntimeApiUrl = () =>
19
19
  getWindowValue("NOCOBASE_API_URL") ?? import.meta.env.NOCOBASE_API_URL;
20
+
21
+ const getAppNameFromPortalBase = (base: string) =>
22
+ base.match(/\/x\/apps\/([^/]+)(?:\/|$)/)?.[1];
23
+
24
+ const getAppNameFromApiUrl = (apiUrl?: string) =>
25
+ apiUrl?.match(/\/api\/__app\/([^/?#]+)(?:[/?#]|$)/)?.[1];
26
+
27
+ export const resolveNocoBaseAppName = (portalBase: string, apiUrl?: string) =>
28
+ getAppNameFromPortalBase(portalBase) ??
29
+ getAppNameFromApiUrl(apiUrl) ??
30
+ "main";
31
+
32
+ export const getNocoBaseAppName = () =>
33
+ resolveNocoBaseAppName(getPortalBase(), getRuntimeApiUrl());
34
+
35
+ export const resolvePortalUrl = (path = "/") => {
36
+ if (typeof window === "undefined") return path;
37
+ if (/^[a-z][a-z\d+.-]*:/i.test(path)) return path;
38
+
39
+ const portalBase = getPortalBase();
40
+ const relativePath = path.replace(/^\/+/, "");
41
+ const portalUrl = new URL(
42
+ relativePath,
43
+ `${window.location.origin}${portalBase}`
44
+ );
45
+ const apiUrl = new URL(
46
+ getRuntimeApiUrl() || "/api",
47
+ window.location.origin
48
+ );
49
+
50
+ // Same-origin deployments should use a root-relative callback. Besides
51
+ // avoiding unnecessary origin coupling, this remains compatible with older
52
+ // SSO plugins that only accept NocoBase-local redirect paths. A standalone
53
+ // Portal dev server keeps the absolute URL so the callback can return to
54
+ // Vite instead of the deployed Portal route.
55
+ if (apiUrl.origin === portalUrl.origin) {
56
+ return `${portalUrl.pathname}${portalUrl.search}${portalUrl.hash}`;
57
+ }
58
+ return portalUrl.toString();
59
+ };
package/src/vite-env.d.ts CHANGED
@@ -3,4 +3,13 @@
3
3
  interface Window {
4
4
  NOCOBASE_PORTAL_BASE?: string;
5
5
  NOCOBASE_API_URL?: string;
6
+ __nocobase_api_client_storage_prefix__?: string;
7
+ __nocobase_api_client_storage_type__?: string;
8
+ __nocobase_api_client_share_token__?: boolean | string;
9
+ }
10
+
11
+ interface ImportMetaEnv {
12
+ readonly API_CLIENT_STORAGE_PREFIX?: string;
13
+ readonly API_CLIENT_STORAGE_TYPE?: string;
14
+ readonly API_CLIENT_SHARE_TOKEN?: string;
6
15
  }
@@ -0,0 +1,101 @@
1
+ import assert from "node:assert/strict";
2
+ import { createServer } from "vite";
3
+
4
+ const server = await createServer({
5
+ appType: "custom",
6
+ logLevel: "silent",
7
+ server: { middlewareMode: true },
8
+ });
9
+
10
+ const createStorage = () => {
11
+ const values = new Map();
12
+ return {
13
+ getItem: (key) => values.get(key) ?? null,
14
+ setItem: (key, value) => values.set(key, value),
15
+ removeItem: (key) => values.delete(key),
16
+ };
17
+ };
18
+
19
+ try {
20
+ const { AuthSession } = await server.ssrLoadModule(
21
+ "/src/lib/nocobase/auth-session.ts"
22
+ );
23
+ const { resolveNocoBaseAppName, resolvePortalUrl } = await server.ssrLoadModule(
24
+ "/src/providers/runtime-config.ts"
25
+ );
26
+
27
+ assert.equal(
28
+ resolveNocoBaseAppName(
29
+ "/nocobase/x/apps/crm/customer/",
30
+ "/nocobase/api/__app/crm"
31
+ ),
32
+ "crm"
33
+ );
34
+ assert.equal(
35
+ resolveNocoBaseAppName("/x/customer/", "/api/__app/analytics"),
36
+ "analytics"
37
+ );
38
+ assert.equal(resolveNocoBaseAppName("/x/customer/", "/api"), "main");
39
+
40
+ const originalWindow = globalThis.window;
41
+ Object.defineProperty(globalThis, "window", {
42
+ configurable: true,
43
+ value: {
44
+ location: { origin: "http://localhost:14000" },
45
+ NOCOBASE_API_URL: "/api",
46
+ NOCOBASE_PORTAL_BASE: "/x/demo/",
47
+ },
48
+ });
49
+ assert.equal(
50
+ resolvePortalUrl("/users?tab=active#list"),
51
+ "/x/demo/users?tab=active#list"
52
+ );
53
+
54
+ window.NOCOBASE_API_URL = "/api/__app/crm";
55
+ window.NOCOBASE_PORTAL_BASE = "/x/apps/crm/customer/";
56
+ assert.equal(
57
+ resolvePortalUrl("/users?tab=active#list"),
58
+ "/x/apps/crm/customer/users?tab=active#list"
59
+ );
60
+
61
+ window.NOCOBASE_API_URL = "http://127.0.0.1:13000/api";
62
+ window.NOCOBASE_PORTAL_BASE = "/x/demo/";
63
+ assert.equal(
64
+ resolvePortalUrl("/users?tab=active#list"),
65
+ "http://localhost:14000/x/demo/users?tab=active#list"
66
+ );
67
+
68
+ if (originalWindow === undefined) {
69
+ delete globalThis.window;
70
+ } else {
71
+ Object.defineProperty(globalThis, "window", {
72
+ configurable: true,
73
+ value: originalWindow,
74
+ });
75
+ }
76
+
77
+ const main = new AuthSession({ appName: "main", storage: createStorage() });
78
+ assert.equal(main.getStorageKey("token"), "NOCOBASE_TOKEN");
79
+ assert.equal(main.getStorageKey("auth"), "NOCOBASE_AUTH");
80
+ assert.equal(main.getStorageKey("role"), "NOCOBASE_ROLE");
81
+
82
+ const subApp = new AuthSession({
83
+ appName: "crm",
84
+ storage: createStorage(),
85
+ });
86
+ assert.equal(subApp.getStorageKey("token"), "NOCOBASE_CRM_TOKEN");
87
+ assert.equal(subApp.getStorageKey("auth"), "NOCOBASE_CRM_AUTH");
88
+ assert.equal(subApp.getStorageKey("role"), "NOCOBASE_CRM_ROLE");
89
+
90
+ const sharedToken = new AuthSession({
91
+ appName: "crm",
92
+ shareToken: true,
93
+ storage: createStorage(),
94
+ });
95
+ assert.equal(sharedToken.getStorageKey("token"), "NOCOBASE_TOKEN");
96
+ assert.equal(sharedToken.getStorageKey("auth"), "NOCOBASE_CRM_AUTH");
97
+
98
+ console.log("NocoBase authentication session regression tests passed");
99
+ } finally {
100
+ await server.close();
101
+ }
package/tsconfig.json CHANGED
@@ -18,8 +18,9 @@
18
18
  "noUncheckedSideEffectImports": true,
19
19
  "baseUrl": ".",
20
20
  "paths": {
21
+ "@/extensions/*": ["./registry/*", "./src/extensions/*"],
21
22
  "@/*": ["./src/*"]
22
23
  }
23
24
  },
24
- "include": ["src"]
25
+ "include": ["src", "registry"]
25
26
  }
package/vite.config.ts CHANGED
@@ -37,6 +37,9 @@ const defaultRuntimeConfig = `<!-- nocobase-runtime-config:start -->
37
37
  <script>
38
38
  window.NOCOBASE_PORTAL_BASE = "/";
39
39
  window.NOCOBASE_API_URL = "/api";
40
+ window.__nocobase_api_client_storage_prefix__ = window.__nocobase_api_client_storage_prefix__ ?? "NOCOBASE_";
41
+ window.__nocobase_api_client_storage_type__ = window.__nocobase_api_client_storage_type__ ?? "localStorage";
42
+ window.__nocobase_api_client_share_token__ = window.__nocobase_api_client_share_token__ ?? false;
40
43
  </script>
41
44
  <!-- nocobase-runtime-config:end -->
42
45
  `;
@@ -96,13 +99,18 @@ export default defineConfig(({ mode }) => {
96
99
  : undefined;
97
100
 
98
101
  const portalBase = normalizeBase(env.NOCOBASE_PORTAL_BASE);
102
+ const registrySourceRoot = path.resolve(__dirname, "./registry");
103
+ const extensionsRoot = fs.existsSync(registrySourceRoot)
104
+ ? registrySourceRoot
105
+ : path.resolve(__dirname, "./src/extensions");
99
106
 
100
107
  return {
101
108
  base: portalBase,
102
- envPrefix: ["VITE_", "NOCOBASE_"],
109
+ envPrefix: ["VITE_", "NOCOBASE_", "API_CLIENT_"],
103
110
  plugins: [react(), tailwindcss(), copyRawIndexHtmlPlugin(portalBase)],
104
111
  resolve: {
105
112
  alias: {
113
+ "@/extensions": extensionsRoot,
106
114
  "@": path.resolve(__dirname, "./src"),
107
115
  },
108
116
  },
@@ -1 +0,0 @@
1
- function i(e,t){return e.type===t}export{i};
@@ -1 +0,0 @@
1
- function d(a){return{seriesType:a,reset:function(t,e){var n=e.findComponents({mainType:"legend"});if(!(!n||!n.length)){var i=t.getData();i.filterSelf(function(o){for(var u=i.getName(o),r=0;r<n.length;r++)if(!n[r].isSelected(u))return!1;return!0})}}}}var s=(function(){function a(t,e){this._getDataWithEncodedVisual=t,this._getRawData=e}return a.prototype.getAllNames=function(){var t=this._getRawData();return t.mapArray(t.getName)},a.prototype.containName=function(t){var e=this._getRawData();return e.indexOfName(t)>=0},a.prototype.indexOfName=function(t){var e=this._getDataWithEncodedVisual();return e.indexOfName(t)},a.prototype.getItemVisual=function(t,e){var n=this._getDataWithEncodedVisual();return n.getItemVisual(t,e)},a})();export{s as L,d};
@@ -1 +0,0 @@
1
- import{_ as I,dw as k,W as N,a4 as G,dx as H,dy as fe,b8 as he,dz as me,bk as pe,f as C,k as ce,aD as ve,dA as W,dB as K,c_ as re,dC as de,D as ye,br as ge,aK as _e,be as oe,P as be,j as Te,y as Y,x as Se,u as ae,z as j,r as Me,bs as Le,H as Pe,t as we,ac as Ce,ad as Ae,bh as Oe,G as ie,ae as ne,af as se,a as Re,I as Ie}from"./echarts-runtime-CEgJbv68.js";var F=H,Be=(function(a){I(r,a);function r(e){var t=a.call(this)||this;return t.type="view",t.dimensions=["x","y"],t._roamTransformable=new k,t._rawTransformable=new k,t.name=e,t}return r.prototype.setBoundingRect=function(e,t,o,i){return this._rect=new N(e,t,o,i),this._rect},r.prototype.getBoundingRect=function(){return this._rect},r.prototype.setViewRect=function(e,t,o,i){this._transformTo(e,t,o,i),this._viewRect=new N(e,t,o,i)},r.prototype._transformTo=function(e,t,o,i){var n=this.getBoundingRect(),s=this._rawTransformable;s.transform=n.calculateTransform(new N(e,t,o,i));var l=s.parent;s.parent=null,s.decomposeTransform(),s.parent=l,this._updateTransform()},r.prototype.setCenter=function(e,t){e&&(this._center=[G(e[0],t.getWidth()),G(e[1],t.getHeight())],this._updateCenterAndZoom())},r.prototype.setZoom=function(e){e=e||1;var t=this.zoomLimit;t&&(t.max!=null&&(e=Math.min(t.max,e)),t.min!=null&&(e=Math.max(t.min,e))),this._zoom=e,this._updateCenterAndZoom()},r.prototype.getDefaultCenter=function(){var e=this.getBoundingRect(),t=e.x+e.width/2,o=e.y+e.height/2;return[t,o]},r.prototype.getCenter=function(){return this._center||this.getDefaultCenter()},r.prototype.getZoom=function(){return this._zoom||1},r.prototype.getRoamTransform=function(){return this._roamTransformable.getLocalTransform()},r.prototype._updateCenterAndZoom=function(){var e=this._rawTransformable.getLocalTransform(),t=this._roamTransformable,o=this.getDefaultCenter(),i=this.getCenter(),n=this.getZoom();i=H([],i,e),o=H([],o,e),t.originX=i[0],t.originY=i[1],t.x=o[0]-i[0],t.y=o[1]-i[1],t.scaleX=t.scaleY=n,this._updateTransform()},r.prototype._updateTransform=function(){var e=this._roamTransformable,t=this._rawTransformable;t.parent=e,e.updateTransform(),t.updateTransform(),fe(this.transform||(this.transform=[]),t.transform||he()),this._rawTransform=t.getLocalTransform(),this.invTransform=this.invTransform||[],me(this.invTransform,this.transform),this.decomposeTransform()},r.prototype.getTransformInfo=function(){var e=this._rawTransformable,t=this._roamTransformable,o=new k;return o.transform=t.transform,o.decomposeTransform(),{roam:{x:o.x,y:o.y,scaleX:o.scaleX,scaleY:o.scaleY},raw:{x:e.x,y:e.y,scaleX:e.scaleX,scaleY:e.scaleY}}},r.prototype.getViewRect=function(){return this._viewRect},r.prototype.getViewRectAfterRoam=function(){var e=this.getBoundingRect().clone();return e.applyTransform(this.transform),e},r.prototype.dataToPoint=function(e,t,o){var i=t?this._rawTransform:this.transform;return o=o||[],i?F(o,e,i):pe(o,e)},r.prototype.pointToData=function(e){var t=this.invTransform;return t?F([],e,t):[e[0],e[1]]},r.prototype.convertToPixel=function(e,t,o){var i=U(t);return i===this?i.dataToPoint(o):null},r.prototype.convertFromPixel=function(e,t,o){var i=U(t);return i===this?i.pointToData(o):null},r.prototype.containPoint=function(e){return this.getViewRectAfterRoam().contain(e[0],e[1])},r.dimensions=["x","y"],r})(k);function U(a){var r=a.seriesModel;return r?r.coordinateSystem:null}function D(a,r){return a.pointToProjected?a.pointToProjected(r):a.pointToData(r)}function ze(a,r,e,t){var o=a.getZoom(),i=a.getCenter(),n=r.zoom,s=a.projectedToPoint?a.projectedToPoint(i):a.dataToPoint(i);if(r.dx!=null&&r.dy!=null&&(s[0]-=r.dx,s[1]-=r.dy,a.setCenter(D(a,s),t)),n!=null){if(e){var l=e.min||0,u=e.max||1/0;n=Math.max(Math.min(o*n,u),l)/o}a.scaleX*=n,a.scaleY*=n;var f=(r.originX-a.x)*(n-1),m=(r.originY-a.y)*(n-1);a.x-=f,a.y-=m,a.updateTransform(),a.setCenter(D(a,s),t),a.setZoom(n*o)}return{center:a.getCenter(),zoom:a.getZoom()}}var xe=(function(a){I(r,a);function r(e){var t=a.call(this)||this;t._zr=e;var o=C(t._mousedownHandler,t),i=C(t._mousemoveHandler,t),n=C(t._mouseupHandler,t),s=C(t._mousewheelHandler,t),l=C(t._pinchHandler,t);return t.enable=function(u,f){this.disable(),this._opt=ce(ve(f)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),u==null&&(u=!0),(u===!0||u==="move"||u==="pan")&&(e.on("mousedown",o),e.on("mousemove",i),e.on("mouseup",n)),(u===!0||u==="scale"||u==="zoom")&&(e.on("mousewheel",s),e.on("pinch",l))},t.disable=function(){e.off("mousedown",o),e.off("mousemove",i),e.off("mouseup",n),e.off("mousewheel",s),e.off("pinch",l)},t}return r.prototype.isDragging=function(){return this._dragging},r.prototype.isPinching=function(){return this._pinching},r.prototype.setPointerChecker=function(e){this.pointerChecker=e},r.prototype.dispose=function(){this.disable()},r.prototype._mousedownHandler=function(e){if(!W(e)){for(var t=e.target;t;){if(t.draggable)return;t=t.__hostTarget||t.parent}var o=e.offsetX,i=e.offsetY;this.pointerChecker&&this.pointerChecker(e,o,i)&&(this._x=o,this._y=i,this._dragging=!0)}},r.prototype._mousemoveHandler=function(e){if(!(!this._dragging||!E("moveOnMouseMove",e,this._opt)||e.gestureEvent==="pinch"||K(this._zr,"globalPan"))){var t=e.offsetX,o=e.offsetY,i=this._x,n=this._y,s=t-i,l=o-n;this._x=t,this._y=o,this._opt.preventDefaultMouseMove&&re(e.event),le(this,"pan","moveOnMouseMove",e,{dx:s,dy:l,oldX:i,oldY:n,newX:t,newY:o,isAvailableBehavior:null})}},r.prototype._mouseupHandler=function(e){W(e)||(this._dragging=!1)},r.prototype._mousewheelHandler=function(e){var t=E("zoomOnMouseWheel",e,this._opt),o=E("moveOnMouseWheel",e,this._opt),i=e.wheelDelta,n=Math.abs(i),s=e.offsetX,l=e.offsetY;if(!(i===0||!t&&!o)){if(t){var u=n>3?1.4:n>1?1.2:1.1,f=i>0?u:1/u;X(this,"zoom","zoomOnMouseWheel",e,{scale:f,originX:s,originY:l,isAvailableBehavior:null})}if(o){var m=Math.abs(i),h=(i>0?1:-1)*(m>3?.4:m>1?.15:.05);X(this,"scrollMove","moveOnMouseWheel",e,{scrollDelta:h,originX:s,originY:l,isAvailableBehavior:null})}}},r.prototype._pinchHandler=function(e){if(!K(this._zr,"globalPan")){var t=e.pinchScale>1?1.1:1/1.1;X(this,"zoom",null,e,{scale:t,originX:e.pinchX,originY:e.pinchY,isAvailableBehavior:null})}},r})(de);function X(a,r,e,t,o){a.pointerChecker&&a.pointerChecker(t,o.originX,o.originY)&&(re(t.event),le(a,r,e,t,o))}function le(a,r,e,t,o){o.isAvailableBehavior=C(E,null,e,t),a.trigger(r,o)}function E(a,r,e){var t=e[a];return!a||t&&(!ye(t)||r.event[t+"Key"])}function Ve(a,r,e){var t=a.target;t.x+=r,t.y+=e,t.dirty()}function He(a,r,e,t){var o=a.target,i=a.zoomLimit,n=a.zoom=a.zoom||1;if(n*=r,i){var s=i.min||0,l=i.max||1/0;n=Math.max(Math.min(l,n),s)}var u=n/a.zoom;a.zoom=n,o.x-=(e-o.x)*(u-1),o.y-=(t-o.y)*(u-1),o.scaleX*=u,o.scaleY*=u,o.dirty()}var $=ge.prototype,B=_e.prototype,ue=(function(){function a(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.percent=1}return a})();(function(a){I(r,a);function r(){return a!==null&&a.apply(this,arguments)||this}return r})(ue);function z(a){return isNaN(+a.cpx1)||isNaN(+a.cpy1)}var ke=(function(a){I(r,a);function r(e){var t=a.call(this,e)||this;return t.type="ec-line",t}return r.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},r.prototype.getDefaultShape=function(){return new ue},r.prototype.buildPath=function(e,t){z(t)?$.buildPath.call(this,e,t):B.buildPath.call(this,e,t)},r.prototype.pointAt=function(e){return z(this.shape)?$.pointAt.call(this,e):B.pointAt.call(this,e)},r.prototype.tangentAt=function(e){var t=this.shape,o=z(t)?[t.x2-t.x1,t.y2-t.y1]:B.tangentAt.call(this,e);return oe(o,o)},r})(be),x=["fromSymbol","toSymbol"];function q(a){return"_"+a+"Type"}function J(a,r,e){var t=r.getItemVisual(e,a);if(!t||t==="none")return t;var o=r.getItemVisual(e,a+"Size"),i=r.getItemVisual(e,a+"Rotate"),n=r.getItemVisual(e,a+"Offset"),s=r.getItemVisual(e,a+"KeepAspect"),l=ne(o),u=se(n||0,l);return t+l+u+(i||"")+(s||"")}function Q(a,r,e){var t=r.getItemVisual(e,a);if(!(!t||t==="none")){var o=r.getItemVisual(e,a+"Size"),i=r.getItemVisual(e,a+"Rotate"),n=r.getItemVisual(e,a+"Offset"),s=r.getItemVisual(e,a+"KeepAspect"),l=ne(o),u=se(n||0,l),f=Re(t,-l[0]/2+u[0],-l[1]/2+u[1],l[0],l[1],null,s);return f.__specifiedRotation=i==null||isNaN(i)?void 0:+i*Math.PI/180||0,f.name=a,f}}function Ee(a){var r=new ke({name:"line",subPixelOptimize:!0});return Z(r.shape,a),r}function Z(a,r){a.x1=r[0][0],a.y1=r[0][1],a.x2=r[1][0],a.y2=r[1][1],a.percent=1;var e=r[2];e?(a.cpx1=e[0],a.cpy1=e[1]):(a.cpx1=NaN,a.cpy1=NaN)}var Ne=(function(a){I(r,a);function r(e,t,o){var i=a.call(this)||this;return i._createLine(e,t,o),i}return r.prototype._createLine=function(e,t,o){var i=e.hostModel,n=e.getItemLayout(t),s=Ee(n);s.shape.percent=0,Te(s,{shape:{percent:1}},i,t),this.add(s),Y(x,function(l){var u=Q(l,e,t);this.add(u),this[q(l)]=J(l,e,t)},this),this._updateCommonStl(e,t,o)},r.prototype.updateData=function(e,t,o){var i=e.hostModel,n=this.childOfName("line"),s=e.getItemLayout(t),l={shape:{}};Z(l.shape,s),Se(n,l,i,t),Y(x,function(u){var f=J(u,e,t),m=q(u);if(this[m]!==f){this.remove(this.childOfName(u));var h=Q(u,e,t);this.add(h)}this[m]=f},this),this._updateCommonStl(e,t,o)},r.prototype.getLinePath=function(){return this.childAt(0)},r.prototype._updateCommonStl=function(e,t,o){var i=e.hostModel,n=this.childOfName("line"),s=o&&o.emphasisLineStyle,l=o&&o.blurLineStyle,u=o&&o.selectLineStyle,f=o&&o.labelStatesModels,m=o&&o.emphasisDisabled,h=o&&o.focus,A=o&&o.blurScope;if(!o||e.hasItemOption){var v=e.getItemModel(t),d=v.getModel("emphasis");s=d.getModel("lineStyle").getLineStyle(),l=v.getModel(["blur","lineStyle"]).getLineStyle(),u=v.getModel(["select","lineStyle"]).getLineStyle(),m=d.get("disabled"),h=d.get("focus"),A=d.get("blurScope"),f=ae(v)}var S=e.getItemVisual(t,"style"),b=S.stroke;n.useStyle(S),n.style.fill=null,n.style.strokeNoScale=!0,n.ensureState("emphasis").style=s,n.ensureState("blur").style=l,n.ensureState("select").style=u,Y(x,function(P){var p=this.childOfName(P);if(p){p.setColor(b),p.style.opacity=S.opacity;for(var M=0;M<j.length;M++){var c=j[M],w=n.getState(c);if(w){var L=w.style||{},O=p.ensureState(c),R=O.style||(O.style={});L.stroke!=null&&(R[p.__isEmptyBrush?"stroke":"fill"]=L.stroke),L.opacity!=null&&(R.opacity=L.opacity)}}p.markRedraw()}},this);var T=i.getRawValue(t);Me(this,f,{labelDataIndex:t,labelFetcher:{getFormattedLabel:function(P,p){return i.getFormattedLabel(P,p,e.dataType)}},inheritColor:b||"#000",defaultOpacity:S.opacity,defaultText:(T==null?e.getName(t):isFinite(T)?Le(T):T)+""});var g=this.getTextContent();if(g){var _=f.normal;g.__align=g.style.align,g.__verticalAlign=g.style.verticalAlign,g.__position=_.get("position")||"middle";var y=_.get("distance");Pe(y)||(y=[y,y]),g.__labelDistance=y}this.setTextConfig({position:null,local:!0,inside:!1}),we(this,h,A,m)},r.prototype.highlight=function(){Ce(this)},r.prototype.downplay=function(){Ae(this)},r.prototype.updateLayout=function(e,t){this.setLinePoints(e.getItemLayout(t))},r.prototype.setLinePoints=function(e){var t=this.childOfName("line");Z(t.shape,e),t.dirty()},r.prototype.beforeUpdate=function(){var e=this,t=e.childOfName("fromSymbol"),o=e.childOfName("toSymbol"),i=e.getTextContent();if(!t&&!o&&(!i||i.ignore))return;for(var n=1,s=this.parent;s;)s.scaleX&&(n/=s.scaleX),s=s.parent;var l=e.childOfName("line");if(!this.__dirty&&!l.__dirty)return;var u=l.shape.percent,f=l.pointAt(0),m=l.pointAt(u),h=Oe([],m,f);oe(h,h);function A(w,L){var O=w.__specifiedRotation;if(O==null){var R=l.tangentAt(L);w.attr("rotation",(L===1?-1:1)*Math.PI/2-Math.atan2(R[1],R[0]))}else w.attr("rotation",O)}if(t&&(t.setPosition(f),A(t,0),t.scaleX=t.scaleY=n*u,t.markRedraw()),o&&(o.setPosition(m),A(o,1),o.scaleX=o.scaleY=n*u,o.markRedraw()),i&&!i.ignore){i.x=i.y=0,i.originX=i.originY=0;var v=void 0,d=void 0,S=i.__labelDistance,b=S[0]*n,T=S[1]*n,g=u/2,_=l.tangentAt(g),y=[_[1],-_[0]],P=l.pointAt(g);y[1]>0&&(y[0]=-y[0],y[1]=-y[1]);var p=_[0]<0?-1:1;if(i.__position!=="start"&&i.__position!=="end"){var M=-Math.atan2(_[1],_[0]);m[0]<f[0]&&(M=Math.PI+M),i.rotation=M}var c=void 0;switch(i.__position){case"insideStartTop":case"insideMiddleTop":case"insideEndTop":case"middle":c=-T,d="bottom";break;case"insideStartBottom":case"insideMiddleBottom":case"insideEndBottom":c=T,d="top";break;default:c=0,d="middle"}switch(i.__position){case"end":i.x=h[0]*b+m[0],i.y=h[1]*T+m[1],v=h[0]>.8?"left":h[0]<-.8?"right":"center",d=h[1]>.8?"top":h[1]<-.8?"bottom":"middle";break;case"start":i.x=-h[0]*b+f[0],i.y=-h[1]*T+f[1],v=h[0]>.8?"right":h[0]<-.8?"left":"center",d=h[1]>.8?"bottom":h[1]<-.8?"top":"middle";break;case"insideStartTop":case"insideStart":case"insideStartBottom":i.x=b*p+f[0],i.y=f[1]+c,v=_[0]<0?"right":"left",i.originX=-b*p,i.originY=-c;break;case"insideMiddleTop":case"insideMiddle":case"insideMiddleBottom":case"middle":i.x=P[0],i.y=P[1]+c,v="center",i.originY=-c;break;case"insideEndTop":case"insideEnd":case"insideEndBottom":i.x=-b*p+m[0],i.y=m[1]+c,v=_[0]>=0?"right":"left",i.originX=b*p,i.originY=-c;break}i.scaleX=i.scaleY=n,i.setStyle({verticalAlign:i.__verticalAlign||d,align:i.__align||v})}},r})(ie),Ze=(function(){function a(r){this.group=new ie,this._LineCtor=r||Ne}return a.prototype.updateData=function(r){var e=this;this._progressiveEls=null;var t=this,o=t.group,i=t._lineData;t._lineData=r,i||o.removeAll();var n=ee(r);r.diff(i).add(function(s){e._doAdd(r,s,n)}).update(function(s,l){e._doUpdate(i,r,l,s,n)}).remove(function(s){o.remove(i.getItemGraphicEl(s))}).execute()},a.prototype.updateLayout=function(){var r=this._lineData;r&&r.eachItemGraphicEl(function(e,t){e.updateLayout(r,t)},this)},a.prototype.incrementalPrepareUpdate=function(r){this._seriesScope=ee(r),this._lineData=null,this.group.removeAll()},a.prototype.incrementalUpdate=function(r,e){this._progressiveEls=[];function t(s){!s.isGroup&&!Ye(s)&&(s.incremental=!0,s.ensureState("emphasis").hoverLayer=!0)}for(var o=r.start;o<r.end;o++){var i=e.getItemLayout(o);if(V(i)){var n=new this._LineCtor(e,o,this._seriesScope);n.traverse(t),this.group.add(n),e.setItemGraphicEl(o,n),this._progressiveEls.push(n)}}},a.prototype.remove=function(){this.group.removeAll()},a.prototype.eachRendered=function(r){Ie(this._progressiveEls||this.group,r)},a.prototype._doAdd=function(r,e,t){var o=r.getItemLayout(e);if(V(o)){var i=new this._LineCtor(r,e,t);r.setItemGraphicEl(e,i),this.group.add(i)}},a.prototype._doUpdate=function(r,e,t,o,i){var n=r.getItemGraphicEl(t);if(!V(e.getItemLayout(o))){this.group.remove(n);return}n?n.updateData(e,o,i):n=new this._LineCtor(e,o,i),e.setItemGraphicEl(o,n),this.group.add(n)},a})();function Ye(a){return a.animators&&a.animators.length>0}function ee(a){var r=a.hostModel,e=r.getModel("emphasis");return{lineStyle:r.getModel("lineStyle").getLineStyle(),emphasisLineStyle:e.getModel(["lineStyle"]).getLineStyle(),blurLineStyle:r.getModel(["blur","lineStyle"]).getLineStyle(),selectLineStyle:r.getModel(["select","lineStyle"]).getLineStyle(),emphasisDisabled:e.get("disabled"),blurScope:e.get("blurScope"),focus:e.get("focus"),labelStatesModels:ae(r)}}function te(a){return isNaN(a[0])||isNaN(a[1])}function V(a){return a&&!te(a[0])&&!te(a[1])}export{Ze as L,xe as R,Be as V,He as a,ze as b,Ne as c,Ve as u};
@@ -1 +0,0 @@
1
- import{_ as U,a as Z,ac as j,ad as k,x as G,J as F,j as H,u as N,af as B,al as J,N as C,r as K,t as $,l as q,ah as T,ae as Q,G as X,I as W,a9 as x}from"./echarts-runtime-CEgJbv68.js";import{a as ee}from"./labelHelper-C137W5gU.js";var te=(function(n){U(t,n);function t(e,l,i,a){var m=n.call(this)||this;return m.updateData(e,l,i,a),m}return t.prototype._createSymbol=function(e,l,i,a,m){this.removeAll();var s=Z(e,-1,-1,2,2,null,m);s.attr({z2:100,culling:!0,scaleX:a[0]/2,scaleY:a[1]/2}),s.drift=le,this._symbolType=e,this.add(s)},t.prototype.stopSymbolAnimation=function(e){this.childAt(0).stopAnimation(null,e)},t.prototype.getSymbolType=function(){return this._symbolType},t.prototype.getSymbolPath=function(){return this.childAt(0)},t.prototype.highlight=function(){j(this.childAt(0))},t.prototype.downplay=function(){k(this.childAt(0))},t.prototype.setZ=function(e,l){var i=this.childAt(0);i.zlevel=e,i.z=l},t.prototype.setDraggable=function(e,l){var i=this.childAt(0);i.draggable=e,i.cursor=!l&&e?"move":i.cursor},t.prototype.updateData=function(e,l,i,a){this.silent=!1;var m=e.getItemVisual(l,"symbol")||"circle",s=e.hostModel,c=t.getSymbolSize(e,l),h=m!==this._symbolType,y=a&&a.disableAnimation;if(h){var u=e.getItemVisual(l,"symbolKeepAspect");this._createSymbol(m,e,l,c,u)}else{var o=this.childAt(0);o.silent=!1;var r={scaleX:c[0]/2,scaleY:c[1]/2};y?o.attr(r):G(o,r,s,l),F(o)}if(this._updateCommon(e,l,c,i,a),h){var o=this.childAt(0);if(!y){var r={scaleX:this._sizeX,scaleY:this._sizeY,style:{opacity:o.style.opacity}};o.scaleX=o.scaleY=0,o.style.opacity=0,H(o,r,s,l)}}y&&this.childAt(0).stopAnimation("leave")},t.prototype._updateCommon=function(e,l,i,a,m){var s=this.childAt(0),c=e.hostModel,h,y,u,o,r,f,b,v,p;if(a&&(h=a.emphasisItemStyle,y=a.blurItemStyle,u=a.selectItemStyle,o=a.focus,r=a.blurScope,b=a.labelStatesModels,v=a.hoverScale,p=a.cursorStyle,f=a.emphasisDisabled),!a||e.hasItemOption){var g=a&&a.itemModel?a.itemModel:e.getItemModel(l),S=g.getModel("emphasis");h=S.getModel("itemStyle").getItemStyle(),u=g.getModel(["select","itemStyle"]).getItemStyle(),y=g.getModel(["blur","itemStyle"]).getItemStyle(),o=S.get("focus"),r=S.get("blurScope"),f=S.get("disabled"),b=N(g),v=S.getShallow("scale"),p=g.getShallow("cursor")}var V=e.getItemVisual(l,"symbolRotate");s.attr("rotation",(V||0)*Math.PI/180||0);var _=B(e.getItemVisual(l,"symbolOffset"),i);_&&(s.x=_[0],s.y=_[1]),p&&s.attr("cursor",p);var d=e.getItemVisual(l,"style"),E=d.fill;if(s instanceof J){var I=s.style;s.useStyle(C({image:I.image,x:I.x,y:I.y,width:I.width,height:I.height},d))}else s.__isEmptyBrush?s.useStyle(C({},d)):s.useStyle(d),s.style.decal=null,s.setColor(E,m&&m.symbolInnerColor),s.style.strokeNoScale=!0;var D=e.getItemVisual(l,"liftZ"),A=this._z2;D!=null?A==null&&(this._z2=s.z2,s.z2+=D):A!=null&&(s.z2=A,this._z2=null);var w=m&&m.useNameLabel;K(s,b,{labelFetcher:c,labelDataIndex:l,defaultText:R,inheritColor:E,defaultOpacity:d.opacity});function R(P){return w?e.getName(P):ee(e,P)}this._sizeX=i[0]/2,this._sizeY=i[1]/2;var z=s.ensureState("emphasis");z.style=h,s.ensureState("select").style=u,s.ensureState("blur").style=y;var O=v==null||v===!0?Math.max(1.1,3/this._sizeY):isFinite(v)&&v>0?+v:1;z.scaleX=this._sizeX*O,z.scaleY=this._sizeY*O,this.setSymbolScale(1),$(this,o,r,f)},t.prototype.setSymbolScale=function(e){this.scaleX=this.scaleY=e},t.prototype.fadeOut=function(e,l,i){var a=this.childAt(0),m=q(this).dataIndex,s=i&&i.animation;if(this.silent=a.silent=!0,i&&i.fadeLabel){var c=a.getTextContent();c&&T(c,{style:{opacity:0}},l,{dataIndex:m,removeOpt:s,cb:function(){a.removeTextContent()}})}else a.removeTextContent();T(a,{style:{opacity:0},scaleX:0,scaleY:0},l,{dataIndex:m,cb:e,removeOpt:s})},t.getSymbolSize=function(e,l){return Q(e.getItemVisual(l,"symbolSize"))},t})(X);function le(n,t){this.parent.drift(n,t)}function M(n,t,e,l){return t&&!isNaN(t[0])&&!isNaN(t[1])&&!(l.isIgnore&&l.isIgnore(e))&&!(l.clipShape&&!l.clipShape.contain(t[0],t[1]))&&n.getItemVisual(e,"symbol")!=="none"}function L(n){return n!=null&&!x(n)&&(n={isIgnore:n}),n||{}}function Y(n){var t=n.hostModel,e=t.getModel("emphasis");return{emphasisItemStyle:e.getModel("itemStyle").getItemStyle(),blurItemStyle:t.getModel(["blur","itemStyle"]).getItemStyle(),selectItemStyle:t.getModel(["select","itemStyle"]).getItemStyle(),focus:e.get("focus"),blurScope:e.get("blurScope"),emphasisDisabled:e.get("disabled"),hoverScale:e.get("scale"),labelStatesModels:N(t),cursorStyle:t.get("cursor")}}var ie=(function(){function n(t){this.group=new X,this._SymbolCtor=t||te}return n.prototype.updateData=function(t,e){this._progressiveEls=null,e=L(e);var l=this.group,i=t.hostModel,a=this._data,m=this._SymbolCtor,s=e.disableAnimation,c=Y(t),h={disableAnimation:s},y=e.getSymbolPoint||function(u){return t.getItemLayout(u)};a||l.removeAll(),t.diff(a).add(function(u){var o=y(u);if(M(t,o,u,e)){var r=new m(t,u,c,h);r.setPosition(o),t.setItemGraphicEl(u,r),l.add(r)}}).update(function(u,o){var r=a.getItemGraphicEl(o),f=y(u);if(!M(t,f,u,e)){l.remove(r);return}var b=t.getItemVisual(u,"symbol")||"circle",v=r&&r.getSymbolType&&r.getSymbolType();if(!r||v&&v!==b)l.remove(r),r=new m(t,u,c,h),r.setPosition(f);else{r.updateData(t,u,c,h);var p={x:f[0],y:f[1]};s?r.attr(p):G(r,p,i)}l.add(r),t.setItemGraphicEl(u,r)}).remove(function(u){var o=a.getItemGraphicEl(u);o&&o.fadeOut(function(){l.remove(o)},i)}).execute(),this._getSymbolPoint=y,this._data=t},n.prototype.updateLayout=function(){var t=this,e=this._data;e&&e.eachItemGraphicEl(function(l,i){var a=t._getSymbolPoint(i);l.setPosition(a),l.markRedraw()})},n.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=Y(t),this._data=null,this.group.removeAll()},n.prototype.incrementalUpdate=function(t,e,l){this._progressiveEls=[],l=L(l);function i(c){c.isGroup||(c.incremental=!0,c.ensureState("emphasis").hoverLayer=!0)}for(var a=t.start;a<t.end;a++){var m=e.getItemLayout(a);if(M(e,m,a,l)){var s=new this._SymbolCtor(e,a,this._seriesScope);s.traverse(i),s.setPosition(m),this.group.add(s),e.setItemGraphicEl(a,s),this._progressiveEls.push(s)}}},n.prototype.eachRendered=function(t){W(this._progressiveEls||this.group,t)},n.prototype.remove=function(t){var e=this.group,l=this._data;l&&t?l.eachItemGraphicEl(function(i){i.fadeOut(function(){e.remove(i)},l.hostModel)}):e.removeAll()},n})();export{ie as S,te as a};
@@ -1 +0,0 @@
1
- import{_ as j,m as S,k as $,bB as te,aD as se,D as O,o as he,aR as de,a1 as ve,c0 as ge,d4 as me,b$ as ye,b_ as xe,y as v,H as P,ai as Ve,c8 as Ae,ao as we,aC as Me,c7 as re,cc as be,c1 as Ie,a4 as G,cF as ie,d5 as Se,b as Te,aS as Le,aM as _e,as as D,a9 as H,d6 as Ce,f as ne,aN as Ne,d7 as X,d8 as Y,ba as ze,b9 as J}from"./echarts-runtime-CEgJbv68.js";var C=me.value;function R(r,e){return $({show:e},r)}var Pe=(function(r){j(e,r);function e(){var a=r!==null&&r.apply(this,arguments)||this;return a.type=e.type,a}return e.prototype.optionUpdated=function(){var a=this.get("boundaryGap"),t=this.get("splitNumber"),i=this.get("scale"),n=this.get("axisLine"),o=this.get("axisTick"),s=this.get("axisLabel"),u=this.get("axisName"),f=this.get(["axisName","show"]),l=this.get(["axisName","formatter"]),h=this.get("axisNameGap"),m=this.get("triggerEvent"),A=S(this.get("indicator")||[],function(c){c.max!=null&&c.max>0&&!c.min?c.min=0:c.min!=null&&c.min<0&&!c.max&&(c.max=0);var g=u;c.color!=null&&(g=$({color:c.color},u));var d=te(se(c),{boundaryGap:a,splitNumber:t,scale:i,axisLine:n,axisTick:o,axisLabel:s,name:c.text,showName:f,nameLocation:"end",nameGap:h,nameTextStyle:g,triggerEvent:m},!1);if(O(l)){var x=d.name;d.name=l.replace("{value}",x??"")}else he(l)&&(d.name=l(d.name,d));var y=new de(d,null,this.ecModel);return ve(y,ge.prototype),y.mainType="radar",y.componentIndex=this.componentIndex,y},this);this._indicatorModels=A},e.prototype.getIndicatorModels=function(){return this._indicatorModels},e.type="radar",e.defaultOption={z:0,center:["50%","50%"],radius:"75%",startAngle:90,axisName:{show:!0},boundaryGap:[0,0],splitNumber:5,axisNameGap:15,scale:!1,shape:"polygon",axisLine:te({lineStyle:{color:"#bbb"}},C.axisLine),axisLabel:R(C.axisLabel,!1),axisTick:R(C.axisTick,!1),splitLine:R(C.splitLine,!0),splitArea:R(C.splitArea,!0),indicator:[]},e})(ye),De=["axisLine","axisTickLabel","axisName"],He=(function(r){j(e,r);function e(){var a=r!==null&&r.apply(this,arguments)||this;return a.type=e.type,a}return e.prototype.render=function(a,t,i){var n=this.group;n.removeAll(),this._buildAxes(a),this._buildSplitLineAndArea(a)},e.prototype._buildAxes=function(a){var t=a.coordinateSystem,i=t.getIndicatorAxes(),n=S(i,function(o){var s=o.model.get("showName")?o.name:"",u=new xe(o.model,{axisName:s,position:[t.cx,t.cy],rotation:o.angle,labelDirection:-1,tickDirection:-1,nameDirection:1});return u});v(n,function(o){v(De,o.add,o),this.group.add(o.getGroup())},this)},e.prototype._buildSplitLineAndArea=function(a){var t=a.coordinateSystem,i=t.getIndicatorAxes();if(!i.length)return;var n=a.get("shape"),o=a.getModel("splitLine"),s=a.getModel("splitArea"),u=o.getModel("lineStyle"),f=s.getModel("areaStyle"),l=o.get("show"),h=s.get("show"),m=u.get("color"),A=f.get("color"),c=P(m)?m:[m],g=P(A)?A:[A],d=[],x=[];function y(V,b,L){var _=L%b.length;return V[_]=V[_]||[],_}if(n==="circle")for(var T=i[0].getTicksCoords(),ee=t.cx,ae=t.cy,p=0;p<T.length;p++){if(l){var w=y(d,c,p);d[w].push(new Ve({shape:{cx:ee,cy:ae,r:T[p].coord}}))}if(h&&p<T.length-1){var w=y(x,g,p);x[w].push(new Ae({shape:{cx:ee,cy:ae,r0:T[p].coord,r:T[p+1].coord}}))}}else for(var E,ce=S(i,function(V,b){var L=V.getTicksCoords();return E=E==null?L.length-1:Math.min(L.length-1,E),S(L,function(_){return t.coordToPoint(_.coord,b)})}),Z=[],p=0;p<=E;p++){for(var M=[],q=0;q<i.length;q++)M.push(ce[q][p]);if(M[0]&&M.push(M[0].slice()),l){var w=y(d,c,p);d[w].push(new we({shape:{points:M}}))}if(h&&Z){var w=y(x,g,p-1);x[w].push(new Me({shape:{points:M.concat(Z)}}))}Z=M.slice().reverse()}var fe=u.getLineStyle(),pe=f.getAreaStyle();v(x,function(V,b){this.group.add(re(V,{style:$({stroke:"none",fill:g[b%g.length]},pe),silent:!0}))},this),v(d,function(V,b){this.group.add(re(V,{style:$({fill:"none",stroke:c[b%c.length]},fe),silent:!0}))},this)},e.type="radar",e})(be),ke=(function(r){j(e,r);function e(a,t,i){var n=r.call(this,a,t,i)||this;return n.type="value",n.angle=0,n.name="",n}return e})(Ie),Ee=(function(){function r(e,a,t){this.dimensions=[],this._model=e,this._indicatorAxes=S(e.getIndicatorModels(),function(i,n){var o="indicator_"+n,s=new ke(o,new ie);return s.name=i.get("name"),s.model=i,i.axis=s,this.dimensions.push(o),s},this),this.resize(e,t)}return r.prototype.getIndicatorAxes=function(){return this._indicatorAxes},r.prototype.dataToPoint=function(e,a){var t=this._indicatorAxes[a];return this.coordToPoint(t.dataToCoord(e),a)},r.prototype.coordToPoint=function(e,a){var t=this._indicatorAxes[a],i=t.angle,n=this.cx+e*Math.cos(i),o=this.cy-e*Math.sin(i);return[n,o]},r.prototype.pointToData=function(e){var a=e[0]-this.cx,t=e[1]-this.cy,i=Math.sqrt(a*a+t*t);a/=i,t/=i;for(var n=Math.atan2(-t,a),o=1/0,s,u=-1,f=0;f<this._indicatorAxes.length;f++){var l=this._indicatorAxes[f],h=Math.abs(n-l.angle);h<o&&(s=l,u=f,o=h)}return[u,+(s&&s.coordToData(i))]},r.prototype.resize=function(e,a){var t=e.get("center"),i=a.getWidth(),n=a.getHeight(),o=Math.min(i,n)/2;this.cx=G(t[0],i),this.cy=G(t[1],n),this.startAngle=e.get("startAngle")*Math.PI/180;var s=e.get("radius");(O(s)||Te(s))&&(s=[0,s]),this.r0=G(s[0],o),this.r=G(s[1],o),v(this._indicatorAxes,function(u,f){u.setExtent(this.r0,this.r);var l=this.startAngle+f*Math.PI*2/this._indicatorAxes.length;l=Math.atan2(Math.sin(l),Math.cos(l)),u.angle=l},this)},r.prototype.update=function(e,a){var t=this._indicatorAxes,i=this._model;v(t,function(s){s.scale.setExtent(1/0,-1/0)}),e.eachSeriesByType("radar",function(s,u){if(!(s.get("coordinateSystem")!=="radar"||e.getComponent("radar",s.get("radarIndex"))!==i)){var f=s.getData();v(t,function(l){l.scale.unionExtentFromData(f,f.mapDimension(l.dim))})}},this);var n=i.get("splitNumber"),o=new ie;o.setExtent(0,n),o.setInterval(1),v(t,function(s,u){Se(s.scale,s.model,o)})},r.prototype.convertToPixel=function(e,a,t){return console.warn("Not implemented."),null},r.prototype.convertFromPixel=function(e,a,t){return console.warn("Not implemented."),null},r.prototype.containPoint=function(e){return console.warn("Not implemented."),!1},r.create=function(e,a){var t=[];return e.eachComponent("radar",function(i){var n=new r(i,e,a);t.push(n),i.coordinateSystem=n}),e.eachSeriesByType("radar",function(i){i.get("coordinateSystem")==="radar"&&(i.coordinateSystem=t[i.get("radarIndex")||0])}),t},r.dimensions=[],r})();function Ue(r){r.registerCoordinateSystem("radar",Ee),r.registerComponentModel(Pe),r.registerComponentView(He),r.registerVisual({seriesType:"radar",reset:function(e){var a=e.getData();a.each(function(t){a.setItemVisual(t,"legendIcon","roundRect")}),a.setVisual("legendIcon","roundRect")}})}var k=v,Ge=H,U=-1,le=(function(){function r(e){var a=e.mappingMethod,t=e.type,i=this.option=se(e);this.type=t,this.mappingMethod=a,this._normalizeData=Be[a];var n=r.visualHandlers[t];this.applyVisual=n.applyVisual,this.getColorMapper=n.getColorMapper,this._normalizedToVisual=n._normalizedToVisual[a],a==="piecewise"?(K(i),Re(i)):a==="category"?i.categories?Fe(i):K(i,!0):(_e(a!=="linear"||i.dataExtent),K(i))}return r.prototype.mapValueToVisual=function(e){var a=this._normalizeData(e);return this._normalizedToVisual(a,e)},r.prototype.getNormalizer=function(){return ne(this._normalizeData,this)},r.listVisualTypes=function(){return Ne(r.visualHandlers)},r.isValidType=function(e){return r.visualHandlers.hasOwnProperty(e)},r.eachVisual=function(e,a,t){H(e)?v(e,a,t):a.call(t,e)},r.mapVisual=function(e,a,t){var i,n=P(e)?[]:H(e)?{}:(i=!0,null);return r.eachVisual(e,function(o,s){var u=a.call(t,o,s);i?n=u:n[s]=u}),n},r.retrieveVisuals=function(e){var a={},t;return e&&k(r.visualHandlers,function(i,n){e.hasOwnProperty(n)&&(a[n]=e[n],t=!0)}),t?a:null},r.prepareVisualTypes=function(e){if(P(e))e=e.slice();else if(Ge(e)){var a=[];k(e,function(t,i){a.push(i)}),e=a}else return[];return e.sort(function(t,i){return i==="color"&&t!=="color"&&t.indexOf("color")===0?1:-1}),e},r.dependsOn=function(e,a){return a==="color"?!!(e&&e.indexOf(a)===0):e===a},r.findPieceIndex=function(e,a,t){for(var i,n=1/0,o=0,s=a.length;o<s;o++){var u=a[o].value;if(u!=null){if(u===e||O(u)&&u===e+"")return o;t&&m(u,o)}}for(var o=0,s=a.length;o<s;o++){var f=a[o],l=f.interval,h=f.close;if(l){if(l[0]===-1/0){if(B(h[1],e,l[1]))return o}else if(l[1]===1/0){if(B(h[0],l[0],e))return o}else if(B(h[0],l[0],e)&&B(h[1],e,l[1]))return o;t&&m(l[0],o),t&&m(l[1],o)}}if(t)return e===1/0?a.length-1:e===-1/0?0:i;function m(A,c){var g=Math.abs(A-e);g<n&&(n=g,i=c)}},r.visualHandlers={color:{applyVisual:N("color"),getColorMapper:function(){var e=this.option;return ne(e.mappingMethod==="category"?function(a,t){return!t&&(a=this._normalizeData(a)),z.call(this,a)}:function(a,t,i){var n=!!i;return!t&&(a=this._normalizeData(a)),i=Y(a,e.parsedVisual,i),n?i:X(i,"rgba")},this)},_normalizedToVisual:{linear:function(e){return X(Y(e,this.option.parsedVisual),"rgba")},category:z,piecewise:function(e,a){var t=W.call(this,a);return t==null&&(t=X(Y(e,this.option.parsedVisual),"rgba")),t},fixed:I}},colorHue:F(function(e,a){return J(e,a)}),colorSaturation:F(function(e,a){return J(e,null,a)}),colorLightness:F(function(e,a){return J(e,null,null,a)}),colorAlpha:F(function(e,a){return ze(e,a)}),decal:{applyVisual:N("decal"),_normalizedToVisual:{linear:null,category:z,piecewise:null,fixed:null}},opacity:{applyVisual:N("opacity"),_normalizedToVisual:Q([0,1])},liftZ:{applyVisual:N("liftZ"),_normalizedToVisual:{linear:I,category:I,piecewise:I,fixed:I}},symbol:{applyVisual:function(e,a,t){var i=this.mapValueToVisual(e);t("symbol",i)},_normalizedToVisual:{linear:oe,category:z,piecewise:function(e,a){var t=W.call(this,a);return t==null&&(t=oe.call(this,e)),t},fixed:I}},symbolSize:{applyVisual:N("symbolSize"),_normalizedToVisual:Q([0,1])}},r})();function Re(r){var e=r.pieceList;r.hasSpecialVisual=!1,v(e,function(a,t){a.originIndex=t,a.visual!=null&&(r.hasSpecialVisual=!0)})}function Fe(r){var e=r.categories,a=r.categoryMap={},t=r.visual;if(k(e,function(o,s){a[o]=s}),!P(t)){var i=[];H(t)?k(t,function(o,s){var u=a[s];i[u??U]=o}):i[U]=t,t=ue(r,i)}for(var n=e.length-1;n>=0;n--)t[n]==null&&(delete a[e[n]],e.pop())}function K(r,e){var a=r.visual,t=[];H(a)?k(a,function(n){t.push(n)}):a!=null&&t.push(a);var i={color:1,symbol:1};!e&&t.length===1&&!i.hasOwnProperty(r.type)&&(t[1]=t[0]),ue(r,t)}function F(r){return{applyVisual:function(e,a,t){var i=this.mapValueToVisual(e);t("color",r(a("color"),i))},_normalizedToVisual:Q([0,1])}}function oe(r){var e=this.option.visual;return e[Math.round(D(r,[0,1],[0,e.length-1],!0))]||{}}function N(r){return function(e,a,t){t(r,this.mapValueToVisual(e))}}function z(r){var e=this.option.visual;return e[this.option.loop&&r!==U?r%e.length:r]}function I(){return this.option.visual[0]}function Q(r){return{linear:function(e){return D(e,r,this.option.visual,!0)},category:z,piecewise:function(e,a){var t=W.call(this,a);return t==null&&(t=D(e,r,this.option.visual,!0)),t},fixed:I}}function W(r){var e=this.option,a=e.pieceList;if(e.hasSpecialVisual){var t=le.findPieceIndex(r,a),i=a[t];if(i&&i.visual)return i.visual[this.type]}}function ue(r,e){return r.visual=e,r.type==="color"&&(r.parsedVisual=S(e,function(a){var t=Ce(a);return t||[0,0,0,1]})),e}var Be={linear:function(r){return D(r,this.option.dataExtent,[0,1],!0)},piecewise:function(r){var e=this.option.pieceList,a=le.findPieceIndex(r,e,!0);if(a!=null)return D(a,[0,e.length-1],[0,1],!0)},category:function(r){var e=this.option.categories?this.option.categoryMap[r]:r;return e??U},fixed:Le};function B(r,e,a){return r?e<=a:e<a}export{le as V,Ue as i};
@@ -1 +0,0 @@
1
- import{aZ as A,r as I,b7 as S,b8 as w,j as e,b9 as z,ba as E,bb as x,c as H,bc as B,B as F,bd as M,be as P}from"./index-C6xNKxpg.js";function k({aiEmployee:n,tasks:i=[],context:r,target:f,auto:h,size:l=48,label:a,showNotice:c=!1,className:b,onTrigger:o}){const d=A(),[g,u]=I.useState(!1),j=S(),v=w(),N=f??j,t=typeof n=="string"?d.employees.find(s=>s.username===n):d.employees.find(s=>s.username===n.username)??n;if(!t)return null;const m=s=>{o==null||o(s),N.triggerTask({aiEmployee:t,task:s,tasks:s?void 0:i,context:r!=null&&r.length?r:v,auto:h,open:!0})},p=i.filter(s=>s.title);return e.jsxs(z,{children:[e.jsxs(E,{render:e.jsx("button",{type:"button",className:H("group/ai-shortcut relative inline-flex items-center gap-2 rounded-full outline-none transition-transform hover:scale-[1.04] focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",a&&"border bg-background pr-3 shadow-sm",b),onClick:()=>m(),onMouseEnter:()=>u(!0),onMouseLeave:()=>u(!1)}),children:[e.jsx(x,{employee:t,flip:g||c,className:"transition-[filter] group-hover/ai-shortcut:brightness-105",style:{width:l,height:l}}),a?e.jsx("span",{className:"text-sm font-medium",children:a}):null,c?e.jsx("span",{className:"absolute top-0 right-0 size-2.5 rounded-full border-2 border-background bg-foreground"}):null]}),e.jsxs(B,{side:"top",align:"start",className:"w-72 p-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(x,{employee:t,className:"size-10"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"truncate text-sm font-medium",children:t.nickname}),t.position?e.jsx("div",{className:"truncate text-xs text-muted-foreground",children:t.position}):null]})]}),t.bio??t.description?e.jsx("p",{className:"mt-3 border-t pt-3 text-xs leading-5 text-muted-foreground",children:t.bio??t.description}):null,p.length?e.jsx("div",{className:"mt-3 flex flex-wrap gap-1.5 border-t pt-3",children:p.map((s,C)=>e.jsxs(F,{variant:"secondary",size:"sm",className:"h-auto min-h-7 whitespace-normal py-1 text-left",onClick:y=>{y.stopPropagation(),m(s)},children:[s.autoSend?e.jsx(M,{className:"size-3.5"}):e.jsx(P,{className:"size-3.5"}),e.jsx("span",{children:s.title}),e.jsx("span",{className:"text-[10px] text-muted-foreground",children:s.autoSend?"Auto send":"Fill composer"})]},`${s.title}-${C}`))}):null]})]})}export{k as A};