@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.
- package/.env.example +5 -0
- package/.github/workflows/publish.yml +106 -0
- package/.gitignore +33 -0
- package/AGENTS.md +19 -0
- package/README.MD +61 -180
- package/dist/assets/{LineDraw-C0m1GONT.js → LineDraw-iG-ADes-.js} +1 -1
- package/dist/assets/{SymbolDraw-CCospe5G.js → SymbolDraw-DXoSw1tM.js} +1 -1
- package/dist/assets/VisualMapping-C_ee4Eht.js +1 -0
- package/dist/assets/auth-method-demo-DaOCuvsq.js +1 -0
- package/dist/assets/auto-login-provider-5Uxza9Ms.js +2 -0
- package/dist/assets/auto-login-provider-DyaPGK2D.js +1 -0
- package/dist/assets/auto-redirect-provider-CfwRvYOI.js +1 -0
- package/dist/assets/auto-redirect-provider-Cr3jmYts.js +1 -0
- package/dist/assets/auto-redirect-provider-QkJQRBbG.js +1 -0
- package/dist/assets/calendar-DjDRfD5t.js +1 -0
- package/dist/assets/card-DuQBOS6A.js +1 -0
- package/dist/assets/cas-sign-in-button-CyqG1QME.js +1 -0
- package/dist/assets/components-D-ptYjX_.js +20 -0
- package/dist/assets/configuration-gate-C08mkkiX.js +1 -0
- package/dist/assets/{createClipPathFromCoordSys-uEftn1Mq.js → createClipPathFromCoordSys-wj34-b1B.js} +1 -1
- package/dist/assets/createSeriesDataSimply-D0A6SAVQ.js +1 -0
- package/dist/assets/customGraphicKeyframeAnimation-DWrhrHL_.js +3 -0
- package/dist/assets/demo-BYWHeKUe.js +1 -0
- package/dist/assets/demo-CPWoNtx8.js +1 -0
- package/dist/assets/demo-CyvJk5zV.js +1 -0
- package/dist/assets/demo-D4OiKplc.js +1 -0
- package/dist/assets/demo-DBueJg0m.js +1 -0
- package/dist/assets/demo-DkIhyiRK.js +1 -0
- package/dist/assets/demo-tpTjO0sC.js +1 -0
- package/dist/assets/dingtalk-sign-in-button-DSWsSruv.js +1 -0
- package/dist/assets/echarts-preview-DxHNfq1C.js +1 -0
- package/dist/assets/{echarts-runtime-CEgJbv68.js → echarts-runtime-D8kXn6ME.js} +3 -3
- package/dist/assets/{echarts-runtime-advanced-Buhm2BHz.js → echarts-runtime-advanced-QY8v95qK.js} +1 -1
- package/dist/assets/{echarts-runtime-common-DLAdBAIa.js → echarts-runtime-common-D-yqAK-r.js} +1 -1
- package/dist/assets/{echarts-runtime-components-ypnyLkYx.js → echarts-runtime-components-P4-i8jPU.js} +1 -1
- package/dist/assets/{echarts-runtime-hierarchy-ClStquCF.js → echarts-runtime-hierarchy-ByQZ-DbP.js} +1 -1
- package/dist/assets/floating-BFVEyPEp.js +15 -0
- package/dist/assets/index-BgCbGDMc.js +43 -0
- package/dist/assets/index-Btk35Nx-.js +23 -0
- package/dist/assets/index-CwNxd66J.js +1 -0
- package/dist/assets/index-MB-jfQld.js +686 -0
- package/dist/assets/index-NH3aqqQz.css +1 -0
- package/dist/assets/index-gFtCXH3o.js +58 -0
- package/dist/assets/index-um5hdKdZ.js +23 -0
- package/dist/assets/{labelHelper-C137W5gU.js → labelHelper-DQqRy3a_.js} +1 -1
- package/dist/assets/ldap-sign-in-form--6Gt3yGq.js +1 -0
- package/dist/assets/oidc-sign-in-button-CQdRcR_p.js +1 -0
- package/dist/assets/{page-context-Cxx11gzg.js → page-context-CnQ4GYM7.js} +10 -10
- package/dist/assets/prompt-card-B2RS4nt2.js +1 -0
- package/dist/assets/prompt-output-DZHRM2ft.js +1 -0
- package/dist/assets/saml-sign-in-button-BHL5a0JV.js +1 -0
- package/dist/assets/{sectorHelper-Fqgz3uEk.js → sectorHelper-DN_Vv6OL.js} +1 -1
- package/dist/assets/shortcut-C5x5LQWU.js +47 -0
- package/dist/assets/sms-sign-in-form-DTX9GV2I.js +1 -0
- package/dist/assets/{static.browser-CfQQzERe.js → static.browser-jI1psK0d.js} +8 -8
- package/dist/assets/{switch-DrxImI8F.js → switch-CRL8PmRI.js} +1 -1
- package/dist/assets/{tool-cards-BGfsY8JF.js → tool-cards-DFttLAfo.js} +6 -7
- package/dist/assets/use-authenticator-sign-in-CRGjzXju.js +1 -0
- package/dist/assets/use-dingtalk-sign-in-8WYzJ2jf.js +1 -0
- package/dist/assets/use-wecom-sign-in-C9j8wfCD.js +1 -0
- package/dist/assets/wecom-sign-in-button-mIS1zGSU.js +1 -0
- package/dist/index.html +2 -2
- package/dist/index.raw.html +5 -2
- package/package.json +3 -5
- package/scripts/build-html.mjs +12 -0
- package/src/App.css +2 -0
- package/src/App.tsx +35 -186
- package/src/app/development.tsx +154 -0
- package/src/app/extension.ts +5 -0
- package/src/app/extensions.tsx +18 -4
- package/src/app/routes.tsx +65 -0
- package/src/components/access-control/acl-bootstrap.tsx +11 -3
- package/src/components/access-control/acl-gate.tsx +7 -6
- package/src/components/access-control/can-access.tsx +17 -0
- package/src/components/access-control/navigate-to-accessible-resource.tsx +8 -3
- package/src/components/app-shell/sidebar.tsx +21 -5
- package/src/components/auth/auto-redirect-provider.tsx +2 -1
- package/src/extensions/nocobase-acl/README.md +74 -0
- package/{registry → src/extensions}/nocobase-acl/components/acl-boundary.tsx +22 -25
- package/{registry → src/extensions}/nocobase-acl/components/role-switcher.tsx +26 -23
- package/src/extensions/nocobase-acl/demo/acl-preview-provider.tsx +81 -0
- package/{registry → src/extensions}/nocobase-acl/demo/boundary-api.tsx +58 -0
- package/{registry → src/extensions}/nocobase-acl/demo/index.tsx +243 -105
- package/{registry → src/extensions}/nocobase-acl/demo/prompt-generator.tsx +3 -1
- package/src/extensions/nocobase-acl/extension.tsx +73 -0
- package/{registry → src/extensions}/nocobase-ai/README.md +21 -5
- package/{registry → src/extensions}/nocobase-ai/components/chat/chat-composer.tsx +3 -1
- package/{registry → src/extensions}/nocobase-ai/components/chat/chat-messages.tsx +38 -3
- package/{registry → src/extensions}/nocobase-ai/components/chat/tool-call-card.tsx +1 -9
- package/{registry → src/extensions}/nocobase-ai/components/index.ts +5 -0
- package/src/extensions/nocobase-ai/components/surfaces/chat-dialog.tsx +17 -0
- package/src/extensions/nocobase-ai/components/surfaces/chat-side-panel.tsx +35 -0
- package/src/extensions/nocobase-ai/components/surfaces/chat-surface.tsx +108 -0
- package/{registry → src/extensions}/nocobase-ai/components/triggers/ai-chat-floating-trigger.tsx +2 -2
- package/{registry → src/extensions}/nocobase-ai/demo/configuration-gate.tsx +4 -1
- package/{registry → src/extensions}/nocobase-ai/demo/container-showcase.tsx +2 -2
- package/{registry → src/extensions}/nocobase-ai/demo/floating.tsx +45 -15
- package/{registry → src/extensions}/nocobase-ai/demo/index.tsx +116 -74
- package/{registry → src/extensions}/nocobase-ai/demo/prompt-generator.tsx +3 -3
- package/{registry → src/extensions}/nocobase-ai/demo/tool-cards.tsx +2 -3
- package/src/extensions/nocobase-ai/extension.tsx +160 -0
- package/{registry → src/extensions}/nocobase-ai/global-ai-chat.tsx +12 -28
- package/{registry → src/extensions}/nocobase-ai/providers/ai-provider.tsx +14 -1
- package/{registry → src/extensions}/nocobase-ai/providers/chat-context.tsx +1 -0
- package/{registry → src/extensions}/nocobase-ai/providers/chat-provider.tsx +29 -8
- package/{registry → src/extensions}/nocobase-ai/providers/use-chat-attachments.ts +6 -1
- package/{registry → src/extensions}/nocobase-ai/providers/use-chat-work-context.ts +4 -1
- package/{registry → src/extensions}/nocobase-route-surfaces/README.md +2 -1
- package/{registry → src/extensions}/nocobase-route-surfaces/demo/index.tsx +33 -7
- package/{registry → src/extensions}/nocobase-route-surfaces/demo/scenarios.ts +20 -14
- package/{registry → src/extensions}/nocobase-route-surfaces/extension.tsx +55 -52
- package/src/{pages/users → extensions/nocobase-users-example}/create.tsx +4 -4
- package/src/{pages/users → extensions/nocobase-users-example}/edit.tsx +5 -9
- package/src/extensions/nocobase-users-example/extension.tsx +109 -0
- package/src/{pages/users → extensions/nocobase-users-example}/form-context.ts +11 -9
- package/src/extensions/nocobase-users-example/layout.tsx +16 -0
- package/src/{pages/users → extensions/nocobase-users-example}/list.tsx +1 -1
- package/src/extensions/nocobase-users-example/locales/en-US.ts +77 -0
- package/src/extensions/nocobase-users-example/locales/index.ts +8 -0
- package/src/extensions/nocobase-users-example/locales/zh-CN.ts +73 -0
- package/src/extensions/nocobase-users-example/optional-ai.ts +67 -0
- package/src/{pages/users → extensions/nocobase-users-example}/role-detail.tsx +4 -15
- package/src/{pages/users → extensions/nocobase-users-example}/routes.ts +1 -4
- package/src/extensions/nocobase-users-example/show.tsx +266 -0
- package/src/lib/nocobase/acl/context.ts +32 -0
- package/src/lib/nocobase/acl/evaluator.ts +186 -0
- package/src/lib/nocobase/acl/hooks.ts +40 -0
- package/src/lib/nocobase/acl/index.ts +4 -1
- package/src/lib/nocobase/acl/menu.ts +6 -6
- package/src/lib/nocobase/acl/record-permissions.ts +37 -7
- package/src/lib/nocobase/acl/store-provider.tsx +14 -0
- package/src/lib/nocobase/acl/store.ts +92 -86
- package/src/lib/nocobase/acl/types.ts +52 -32
- package/src/lib/nocobase/auth-session.ts +128 -0
- package/src/lib/nocobase/client.ts +48 -50
- package/src/locales/en-US.ts +0 -78
- package/src/locales/index.ts +2 -7
- package/src/locales/zh-CN.ts +0 -74
- package/src/providers/access-control.ts +43 -8
- package/src/providers/auth-callback.ts +1 -0
- package/src/providers/auth.ts +24 -26
- package/src/providers/constants.ts +0 -4
- package/src/providers/data.ts +14 -26
- package/src/providers/runtime-config.ts +40 -0
- package/src/vite-env.d.ts +9 -0
- package/tests/auth-session-regression.mjs +101 -0
- package/tsconfig.json +2 -1
- package/vite.config.ts +9 -1
- package/dist/assets/VisualMapping-Cbv1v7Cd.js +0 -1
- package/dist/assets/ai-employee-shortcut-B253WWow.js +0 -1
- package/dist/assets/calendar-B3dXXyIv.js +0 -1
- package/dist/assets/chat-inline-xpQ9iq4p.js +0 -1
- package/dist/assets/chat-side-panel-layout-BVWsp5rr.js +0 -1
- package/dist/assets/components-ChhJaNRc.js +0 -20
- package/dist/assets/configuration-gate-Dwdq_lxf.js +0 -1
- package/dist/assets/createSeriesDataSimply-CI7l7Ufv.js +0 -1
- package/dist/assets/customGraphicKeyframeAnimation-DE3jSfMd.js +0 -3
- package/dist/assets/echarts-preview-C-cNUtJF.js +0 -1
- package/dist/assets/floating-BarTmn-b.js +0 -13
- package/dist/assets/index-BJIcYTdc.js +0 -53
- package/dist/assets/index-C6xNKxpg.js +0 -656
- package/dist/assets/index-D4JQi1TM.js +0 -54
- package/dist/assets/index-YA7-AUO8.css +0 -1
- package/dist/assets/index-g8zWVpP9.js +0 -23
- package/dist/assets/prompt-card-BsYMW_rq.js +0 -1
- package/dist/assets/shortcut-xtghDP63.js +0 -47
- package/registry/nocobase-acl/README.md +0 -19
- package/registry/nocobase-acl/extension.tsx +0 -71
- package/registry/nocobase-acl/tests/acl-regression.mjs +0 -314
- package/registry/nocobase-ai/components/surfaces/chat-dialog.tsx +0 -31
- package/registry/nocobase-ai/components/surfaces/chat-side-panel.tsx +0 -74
- package/registry/nocobase-ai/extension.tsx +0 -158
- package/registry/nocobase-ai/tests/business-report-regression.mjs +0 -70
- package/registry/nocobase-ai/tests/form-filler-regression.mjs +0 -129
- package/registry/nocobase-ai/tests/frontend-tool-regression.mjs +0 -128
- package/registry/nocobase-ai/tests/page-context-regression.mjs +0 -48
- package/registry/nocobase-ai/tests/stream-regression.mjs +0 -207
- package/registry/nocobase-auth-cas/README.md +0 -6
- package/registry/nocobase-auth-cas/cas-sign-in-button.tsx +0 -41
- package/registry/nocobase-auth-cas/demo.tsx +0 -20
- package/registry/nocobase-auth-cas/extension.tsx +0 -46
- package/registry/nocobase-auth-cas/index.ts +0 -1
- package/registry/nocobase-auth-cas/use-cas-sign-in.ts +0 -29
- package/registry/nocobase-auth-dingtalk/README.md +0 -7
- package/registry/nocobase-auth-dingtalk/auto-login-provider.tsx +0 -154
- package/registry/nocobase-auth-dingtalk/demo.tsx +0 -23
- package/registry/nocobase-auth-dingtalk/dingtalk-sign-in-button.tsx +0 -45
- package/registry/nocobase-auth-dingtalk/extension.tsx +0 -55
- package/registry/nocobase-auth-dingtalk/index.ts +0 -4
- package/registry/nocobase-auth-dingtalk/use-dingtalk-sign-in.ts +0 -64
- package/registry/nocobase-auth-ldap/README.md +0 -6
- package/registry/nocobase-auth-ldap/demo.tsx +0 -21
- package/registry/nocobase-auth-ldap/extension.tsx +0 -46
- package/registry/nocobase-auth-ldap/index.ts +0 -1
- package/registry/nocobase-auth-ldap/ldap-sign-in-form.tsx +0 -69
- package/registry/nocobase-auth-ldap/use-ldap-sign-in.ts +0 -5
- package/registry/nocobase-auth-oidc/README.md +0 -11
- package/registry/nocobase-auth-oidc/auto-redirect-provider.tsx +0 -13
- package/registry/nocobase-auth-oidc/demo.tsx +0 -20
- package/registry/nocobase-auth-oidc/extension.tsx +0 -51
- package/registry/nocobase-auth-oidc/index.ts +0 -1
- package/registry/nocobase-auth-oidc/oidc-sign-in-button.tsx +0 -44
- package/registry/nocobase-auth-oidc/use-oidc-sign-in.ts +0 -58
- package/registry/nocobase-auth-saml/README.md +0 -6
- package/registry/nocobase-auth-saml/auto-redirect-provider.tsx +0 -13
- package/registry/nocobase-auth-saml/demo.tsx +0 -20
- package/registry/nocobase-auth-saml/extension.tsx +0 -51
- package/registry/nocobase-auth-saml/index.ts +0 -1
- package/registry/nocobase-auth-saml/saml-sign-in-button.tsx +0 -43
- package/registry/nocobase-auth-saml/use-saml-sign-in.ts +0 -51
- package/registry/nocobase-auth-sms/README.md +0 -7
- package/registry/nocobase-auth-sms/demo.tsx +0 -25
- package/registry/nocobase-auth-sms/extension.tsx +0 -46
- package/registry/nocobase-auth-sms/index.ts +0 -1
- package/registry/nocobase-auth-sms/sms-sign-in-form.tsx +0 -107
- package/registry/nocobase-auth-sms/use-sms-sign-in.ts +0 -88
- package/registry/nocobase-auth-wecom/README.md +0 -6
- package/registry/nocobase-auth-wecom/auto-login-provider.tsx +0 -21
- package/registry/nocobase-auth-wecom/demo.tsx +0 -23
- package/registry/nocobase-auth-wecom/extension.tsx +0 -49
- package/registry/nocobase-auth-wecom/index.ts +0 -1
- package/registry/nocobase-auth-wecom/use-wecom-sign-in.ts +0 -62
- package/registry/nocobase-auth-wecom/wecom-sign-in-button.tsx +0 -70
- package/registry/nocobase-i18n/README.md +0 -44
- package/registry/nocobase-i18n/components/index.ts +0 -1
- package/registry/nocobase-i18n/components/language-switcher.tsx +0 -138
- package/registry/nocobase-i18n/demo/index.tsx +0 -209
- package/registry/nocobase-i18n/demo/prompt-generator.tsx +0 -132
- package/registry/nocobase-i18n/extension.tsx +0 -45
- package/registry/nocobase-i18n/index.ts +0 -7
- package/registry/nocobase-i18n/locales/en-US.ts +0 -39
- package/registry/nocobase-i18n/locales/index.ts +0 -8
- package/registry/nocobase-i18n/locales/zh-CN.ts +0 -35
- package/registry/nocobase-i18n/provider.tsx +0 -44
- package/registry/nocobase-i18n/server-resources.ts +0 -166
- package/registry/nocobase-i18n/tests/i18n-regression.mjs +0 -51
- package/registry.config.json +0 -302
- package/scripts/registry.mjs +0 -164
- package/src/components/access-control/resource-access-guard.tsx +0 -21
- package/src/components/access-control/use-acl-runtime.ts +0 -28
- package/src/lib/nocobase/acl/action.ts +0 -147
- package/src/pages/users/layout.tsx +0 -15
- package/src/pages/users/show.tsx +0 -278
- /package/{registry → src/extensions}/nocobase-acl/components/index.ts +0 -0
- /package/{registry → src/extensions}/nocobase-acl/components/role-options.ts +0 -0
- /package/{registry → src/extensions}/nocobase-acl/demo/components.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-acl/demo/lazy-route.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-acl/demo/role-switcher-prompt-generator.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-acl/demo/scenario-section.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-acl/index.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/adapters/react-hook-form.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/assets/nocobase-ai-chat.svg +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/ai-root-provider.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/ai-employee-avatar.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-attachment.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-compact.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-empty-state.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-header.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-history-dialog.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-message.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/chat-window.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/conversation-list.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/markdown-message.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/model-select-options.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/reasoning-panel.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/sub-agent-conversation.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/user-prompt-editor.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/chat/work-context-chip.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/page-elements/ai-form.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/page-elements/page-element-provider.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-inline.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-page.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-side-panel-layout.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/surfaces/chat-surface-actions.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/builtin-tool-renderers.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/business-report-dialog.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/business-report-renderer.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/business-report-utils.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/chart-renderer.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-preview.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-advanced.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-common.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-components.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime-hierarchy.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/echarts-runtime.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/sub-agent-renderer.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/suggestions-renderer.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/tool-renderer-provider.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/tool-renderer-utils.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/tools/workflow-renderer.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/components/triggers/ai-employee-shortcut.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/demo/interaction-showcase.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/demo/page-context-prompt-generator.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/demo/page-context.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/demo/page-element-showcase.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/demo/prompt-card.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/demo/shortcut.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/index.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/avatars.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/chat-controller.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/chat-message-utils.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/chat-reducer.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/chat-task-utils.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/chat-transport.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/form-registry.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/frontend-tool-registry.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/index.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/model.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/page-context.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/stream-coalescer.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/stream-event-utils.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/stream-parser.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/sub-agent-stream.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/types.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/ui-message-stream.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/use-automatic-tool-approval.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/use-chat-message-actions.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/use-chat-runtime.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/use-conversation-catalog.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/providers/use-conversation-history.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/services/index.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/services/nocobase-ai-service.ts +0 -0
- /package/{registry → src/extensions}/nocobase-ai/services/types.ts +0 -0
- /package/{registry → src/extensions}/nocobase-route-surfaces/demo/lazy-route.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-route-surfaces/demo/prompt-generator.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-route-surfaces/index.ts +0 -0
- /package/{registry → src/extensions}/nocobase-route-surfaces/route-dialog.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-route-surfaces/route-drawer.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-route-surfaces/route-page.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-route-surfaces/route-surface-context.ts +0 -0
- /package/{registry → src/extensions}/nocobase-route-surfaces/use-refine-unsaved-changes.tsx +0 -0
- /package/{registry → src/extensions}/nocobase-route-surfaces/use-route-surface-close.ts +0 -0
- /package/{registry → src/extensions}/nocobase-route-surfaces/use-route-surface-state.ts +0 -0
- /package/src/{pages/users → extensions/nocobase-users-example}/form-fields.tsx +0 -0
- /package/src/{pages/users → extensions/nocobase-users-example}/index.ts +0 -0
- /package/src/{pages/users → extensions/nocobase-users-example}/role-badges.tsx +0 -0
- /package/src/{pages/users → extensions/nocobase-users-example}/role-utils.ts +0 -0
- /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
|
-
|
|
5
|
-
|
|
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 (
|
|
11
|
-
const
|
|
12
|
-
const can =
|
|
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
|
-
|
|
34
|
-
|
|
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
|
+
};
|
package/src/providers/auth.ts
CHANGED
|
@@ -30,7 +30,7 @@ type NocoBaseSignOutResponse = {
|
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
type CurrentUserCache = {
|
|
33
|
-
|
|
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
|
-
|
|
54
|
+
const sessionKey = token ?? "cookie";
|
|
55
55
|
|
|
56
56
|
const cached = currentUserCache;
|
|
57
|
-
if (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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";
|
package/src/providers/data.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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
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
|
-
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};
|