@vertesia/ui 1.5.0-dev.20260910.052912Z → 1.5.1
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/lib/core/components/Link.js +1 -1
- package/lib/core/components/Link.js.map +1 -1
- package/lib/core/components/SelectList.d.ts.map +1 -1
- package/lib/core/components/SelectList.js +3 -3
- package/lib/core/components/SelectList.js.map +1 -1
- package/lib/core/components/SidePanel.d.ts.map +1 -1
- package/lib/core/components/SidePanel.js +2 -1
- package/lib/core/components/SidePanel.js.map +1 -1
- package/lib/core/components/Spinner.js +1 -1
- package/lib/core/components/Spinner.js.map +1 -1
- package/lib/core/components/TagsInput.js +7 -7
- package/lib/core/components/TagsInput.js.map +1 -1
- package/lib/core/components/shadcn/badge.js +1 -1
- package/lib/core/components/shadcn/badge.js.map +1 -1
- package/lib/core/components/shadcn/button.d.ts.map +1 -1
- package/lib/core/components/shadcn/button.js +2 -2
- package/lib/core/components/shadcn/button.js.map +1 -1
- package/lib/core/components/shadcn/filters/comboBox/DateCombobox.js +2 -2
- package/lib/core/components/shadcn/filters/comboBox/DateCombobox.js.map +1 -1
- package/lib/core/components/shadcn/filters/comboBox/SelectCombobox.js +1 -1
- package/lib/core/components/shadcn/filters/comboBox/SelectCombobox.js.map +1 -1
- package/lib/core/components/shadcn/filters/comboBox/StringListCombobox.js +1 -1
- package/lib/core/components/shadcn/filters/comboBox/StringListCombobox.js.map +1 -1
- package/lib/core/components/shadcn/filters/comboBox/TextCombobox.js +1 -1
- package/lib/core/components/shadcn/filters/comboBox/TextCombobox.js.map +1 -1
- package/lib/core/components/shadcn/filters/filter/dateFilter.js +1 -1
- package/lib/core/components/shadcn/filters/filter/dateFilter.js.map +1 -1
- package/lib/core/components/shadcn/filters/filters.js +1 -1
- package/lib/core/components/shadcn/filters/filters.js.map +1 -1
- package/lib/core/components/shadcn/overflowTabs.js +2 -2
- package/lib/core/components/shadcn/overflowTabs.js.map +1 -1
- package/lib/core/components/shadcn/tabs.js +1 -1
- package/lib/core/components/shadcn/tabs.js.map +1 -1
- package/lib/features/activity-doc/ActivityDoc.js +1 -1
- package/lib/features/activity-doc/ActivityDoc.js.map +1 -1
- package/lib/features/agent/chat/AskUserWidget.d.ts +1 -0
- package/lib/features/agent/chat/AskUserWidget.d.ts.map +1 -1
- package/lib/features/agent/chat/AskUserWidget.js +15 -4
- package/lib/features/agent/chat/AskUserWidget.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentConversation.js +51 -17
- package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +5 -3
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts +5 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js +9 -2
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +3 -2
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
- package/lib/features/agent/chat/hooks/useAgentPlans.d.ts +1 -1
- package/lib/features/agent/chat/hooks/useAgentPlans.d.ts.map +1 -1
- package/lib/features/agent/chat/hooks/useAgentPlans.js +5 -5
- package/lib/features/agent/chat/hooks/useAgentPlans.js.map +1 -1
- package/lib/features/layout/GenericPageNavHeader.js +1 -1
- package/lib/features/layout/GenericPageNavHeader.js.map +1 -1
- package/lib/features/magic-pdf/AnnotatedImageSlider.js +1 -1
- package/lib/features/magic-pdf/AnnotatedImageSlider.js.map +1 -1
- package/lib/features/magic-pdf/GroundedExtractionView.js +3 -3
- package/lib/features/magic-pdf/GroundedExtractionView.js.map +1 -1
- package/lib/features/oauth/McpConnectionsButton.d.ts +2 -2
- package/lib/features/oauth/McpConnectionsButton.d.ts.map +1 -1
- package/lib/features/oauth/McpConnectionsButton.js +9 -7
- package/lib/features/oauth/McpConnectionsButton.js.map +1 -1
- package/lib/features/oauth/McpConnectionsDialog.d.ts.map +1 -1
- package/lib/features/oauth/McpConnectionsDialog.js +7 -3
- package/lib/features/oauth/McpConnectionsDialog.js.map +1 -1
- package/lib/features/oauth/useMcpConnections.d.ts +4 -2
- package/lib/features/oauth/useMcpConnections.d.ts.map +1 -1
- package/lib/features/oauth/useMcpConnections.js +15 -9
- package/lib/features/oauth/useMcpConnections.js.map +1 -1
- package/lib/features/permissions/UserPermissionsProvider.js +1 -1
- package/lib/features/permissions/UserPermissionsProvider.js.map +1 -1
- package/lib/features/store/objects/DocumentPreviewPanel.js +5 -5
- package/lib/features/store/objects/DocumentPreviewPanel.js.map +1 -1
- package/lib/features/store/objects/components/DocumentInput.js +1 -1
- package/lib/features/store/objects/components/DocumentInput.js.map +1 -1
- package/lib/features/store/objects/selection/ObjectsActionContext.d.ts.map +1 -1
- package/lib/features/store/objects/selection/ObjectsActionContext.js +2 -0
- package/lib/features/store/objects/selection/ObjectsActionContext.js.map +1 -1
- package/lib/features/store/objects/selection/SelectionActions.d.ts +4 -2
- package/lib/features/store/objects/selection/SelectionActions.d.ts.map +1 -1
- package/lib/features/store/objects/selection/SelectionActions.js +6 -3
- package/lib/features/store/objects/selection/SelectionActions.js.map +1 -1
- package/lib/features/store/objects/selection/actions/RunIntakeAction.d.ts +8 -0
- package/lib/features/store/objects/selection/actions/RunIntakeAction.d.ts.map +1 -0
- package/lib/features/store/objects/selection/actions/RunIntakeAction.js +65 -0
- package/lib/features/store/objects/selection/actions/RunIntakeAction.js.map +1 -0
- package/lib/features/store/objects/selection/actions/index.d.ts +1 -0
- package/lib/features/store/objects/selection/actions/index.d.ts.map +1 -1
- package/lib/features/store/objects/selection/actions/index.js +1 -0
- package/lib/features/store/objects/selection/actions/index.js.map +1 -1
- package/lib/features/store/objects/upload/DocumentUploadModal.js +1 -1
- package/lib/features/store/objects/upload/DocumentUploadModal.js.map +1 -1
- package/lib/features/store/types/ContentObjectTypesTable.d.ts.map +1 -1
- package/lib/features/store/types/ContentObjectTypesTable.js +11 -3
- package/lib/features/store/types/ContentObjectTypesTable.js.map +1 -1
- package/lib/features/store/types/IntakePolicyEditor.d.ts.map +1 -1
- package/lib/features/store/types/IntakePolicyEditor.js +14 -14
- package/lib/features/store/types/IntakePolicyEditor.js.map +1 -1
- package/lib/features/store/types/TypeRegistry.d.ts +275 -150
- package/lib/features/store/types/TypeRegistry.d.ts.map +1 -1
- package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts +275 -150
- package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts.map +1 -1
- package/lib/features/user/UserInfo.d.ts +2 -0
- package/lib/features/user/UserInfo.d.ts.map +1 -1
- package/lib/features/user/UserInfo.js +1 -1
- package/lib/features/user/UserInfo.js.map +1 -1
- package/lib/i18n/locales/ar.json +28 -7
- package/lib/i18n/locales/de.json +24 -7
- package/lib/i18n/locales/en.json +24 -7
- package/lib/i18n/locales/es.json +24 -7
- package/lib/i18n/locales/fr.json +25 -7
- package/lib/i18n/locales/it.json +24 -7
- package/lib/i18n/locales/ja.json +24 -7
- package/lib/i18n/locales/ko.json +24 -7
- package/lib/i18n/locales/pt.json +24 -7
- package/lib/i18n/locales/ru.json +26 -7
- package/lib/i18n/locales/tr.json +24 -7
- package/lib/i18n/locales/zh-TW.json +24 -7
- package/lib/i18n/locales/zh.json +24 -7
- package/lib/router/RouteComponent.d.ts.map +1 -1
- package/lib/router/RouteComponent.js +15 -12
- package/lib/router/RouteComponent.js.map +1 -1
- package/lib/session/UserSession.d.ts.map +1 -1
- package/lib/session/UserSession.js +4 -0
- package/lib/session/UserSession.js.map +1 -1
- package/lib/shell/SplashScreen.js +1 -1
- package/lib/shell/SplashScreen.js.map +1 -1
- package/lib/shell/apps/AppInstallationProvider.d.ts +4 -4
- package/lib/shell/login/SignInIcons.d.ts.map +1 -1
- package/lib/shell/login/SignInIcons.js +2 -1
- package/lib/shell/login/SignInIcons.js.map +1 -1
- package/lib/shell/login/SignInPasswordStep.d.ts +9 -0
- package/lib/shell/login/SignInPasswordStep.d.ts.map +1 -0
- package/lib/shell/login/SignInPasswordStep.js +58 -0
- package/lib/shell/login/SignInPasswordStep.js.map +1 -0
- package/lib/shell/login/SignInPrimitives.d.ts +13 -0
- package/lib/shell/login/SignInPrimitives.d.ts.map +1 -1
- package/lib/shell/login/SignInPrimitives.js +11 -1
- package/lib/shell/login/SignInPrimitives.js.map +1 -1
- package/lib/shell/login/SignInProvidersStep.d.ts +3 -1
- package/lib/shell/login/SignInProvidersStep.d.ts.map +1 -1
- package/lib/shell/login/SignInProvidersStep.js +4 -2
- package/lib/shell/login/SignInProvidersStep.js.map +1 -1
- package/lib/shell/login/SignInReturningStep.d.ts +3 -1
- package/lib/shell/login/SignInReturningStep.d.ts.map +1 -1
- package/lib/shell/login/SignInReturningStep.js +18 -8
- package/lib/shell/login/SignInReturningStep.js.map +1 -1
- package/lib/shell/login/SignInTenantStep.d.ts +3 -1
- package/lib/shell/login/SignInTenantStep.d.ts.map +1 -1
- package/lib/shell/login/SignInTenantStep.js +2 -2
- package/lib/shell/login/SignInTenantStep.js.map +1 -1
- package/lib/shell/login/SignInWithProviderButton.d.ts +5 -3
- package/lib/shell/login/SignInWithProviderButton.d.ts.map +1 -1
- package/lib/shell/login/SignInWithProviderButton.js +8 -7
- package/lib/shell/login/SignInWithProviderButton.js.map +1 -1
- package/lib/shell/login/SigninScreen.d.ts.map +1 -1
- package/lib/shell/login/SigninScreen.js +13 -4
- package/lib/shell/login/SigninScreen.js.map +1 -1
- package/lib/shell/login/signInUtils.d.ts +20 -4
- package/lib/shell/login/signInUtils.d.ts.map +1 -1
- package/lib/shell/login/signInUtils.js +47 -1
- package/lib/shell/login/signInUtils.js.map +1 -1
- package/lib/vertesia-ui-core.js +3 -3
- package/lib/vertesia-ui-core.js.map +1 -1
- package/lib/vertesia-ui-features.js +33 -33
- package/lib/vertesia-ui-features.js.map +1 -1
- package/lib/vertesia-ui-i18n.BoNE1APG.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.BoNE1APG.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.BoPtiSPb.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.BoPtiSPb.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.C4BBW5v5.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.C4BBW5v5.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.C81wuNkY.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.C81wuNkY.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.C9GipKIH.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.C9GipKIH.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.CWsoS0W9.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.CWsoS0W9.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.Cr9NtzZB.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.Cr9NtzZB.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.DEpkHOD5.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.DEpkHOD5.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.DPXaRKFO.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.DPXaRKFO.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.D_QNm1Xg.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.D_QNm1Xg.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.F26Cc0f7.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.F26Cc0f7.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.YkXIESV_.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.YkXIESV_.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.js +3 -3
- package/lib/vertesia-ui-i18n.js.map +1 -1
- package/lib/vertesia-ui-router.js +1 -1
- package/lib/vertesia-ui-router.js.map +1 -1
- package/lib/vertesia-ui-session.js +1 -1
- package/lib/vertesia-ui-session.js.map +1 -1
- package/lib/vertesia-ui-shell.js +15 -9
- package/lib/vertesia-ui-shell.js.map +1 -1
- package/lib/vertesia-ui-widgets.js +2 -2
- package/lib/vertesia-ui-widgets.js.map +1 -1
- package/lib/widgets/json-view/JSONCode.js +1 -1
- package/lib/widgets/json-view/JSONCode.js.map +1 -1
- package/lib/widgets/upload/DropZone.d.ts.map +1 -1
- package/lib/widgets/upload/DropZone.js +1 -1
- package/lib/widgets/upload/DropZone.js.map +1 -1
- package/lib/widgets/xml-viewer/hooks/useCollapsible.d.ts +1 -1
- package/package.json +7 -7
- package/src/core/components/Link.tsx +1 -1
- package/src/core/components/SelectList.tsx +5 -2
- package/src/core/components/SidePanel.tsx +65 -60
- package/src/core/components/Spinner.tsx +1 -1
- package/src/core/components/TagsInput.tsx +7 -7
- package/src/core/components/shadcn/badge.tsx +1 -1
- package/src/core/components/shadcn/button.tsx +2 -3
- package/src/core/components/shadcn/filters/comboBox/DateCombobox.tsx +2 -2
- package/src/core/components/shadcn/filters/comboBox/SelectCombobox.tsx +1 -1
- package/src/core/components/shadcn/filters/comboBox/StringListCombobox.tsx +1 -1
- package/src/core/components/shadcn/filters/comboBox/TextCombobox.tsx +1 -1
- package/src/core/components/shadcn/filters/filter/dateFilter.tsx +1 -1
- package/src/core/components/shadcn/filters/filters.tsx +1 -1
- package/src/core/components/shadcn/overflowTabs.tsx +2 -2
- package/src/core/components/shadcn/tabs.tsx +1 -1
- package/src/css/utilities.css +7 -0
- package/src/features/activity-doc/ActivityDoc.tsx +1 -1
- package/src/features/agent/chat/AskUserWidget.test.tsx +24 -2
- package/src/features/agent/chat/AskUserWidget.tsx +19 -4
- package/src/features/agent/chat/ModernAgentConversation.test.tsx +150 -1
- package/src/features/agent/chat/ModernAgentConversation.tsx +59 -21
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +62 -0
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +8 -7
- package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +17 -1
- package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +4 -3
- package/src/features/agent/chat/hooks/useAgentPlans.test.ts +52 -0
- package/src/features/agent/chat/hooks/useAgentPlans.ts +5 -5
- package/src/features/layout/GenericPageNavHeader.test.tsx +36 -0
- package/src/features/layout/GenericPageNavHeader.tsx +1 -1
- package/src/features/magic-pdf/AnnotatedImageSlider.tsx +1 -1
- package/src/features/magic-pdf/GroundedExtractionView.tsx +3 -3
- package/src/features/oauth/McpConnectionsButton.test.tsx +56 -0
- package/src/features/oauth/McpConnectionsButton.tsx +9 -6
- package/src/features/oauth/McpConnectionsDialog.tsx +14 -5
- package/src/features/oauth/useMcpConnections.test.ts +10 -0
- package/src/features/oauth/useMcpConnections.ts +18 -10
- package/src/features/permissions/UserPermissionsProvider.tsx +1 -1
- package/src/features/store/objects/DocumentPreviewPanel.tsx +10 -10
- package/src/features/store/objects/components/DocumentInput.tsx +1 -1
- package/src/features/store/objects/selection/ObjectsActionContext.tsx +2 -0
- package/src/features/store/objects/selection/SelectionActions.tsx +13 -6
- package/src/features/store/objects/selection/actions/RunIntakeAction.tsx +69 -0
- package/src/features/store/objects/selection/actions/index.ts +1 -0
- package/src/features/store/objects/upload/DocumentUploadModal.tsx +1 -1
- package/src/features/store/types/ContentObjectTypesTable.tsx +20 -3
- package/src/features/store/types/IntakePolicyEditor.tsx +33 -28
- package/src/features/user/UserInfo.tsx +1 -1
- package/src/i18n/locales/ar.json +28 -7
- package/src/i18n/locales/de.json +24 -7
- package/src/i18n/locales/en.json +24 -7
- package/src/i18n/locales/es.json +24 -7
- package/src/i18n/locales/fr.json +25 -7
- package/src/i18n/locales/it.json +24 -7
- package/src/i18n/locales/ja.json +24 -7
- package/src/i18n/locales/ko.json +24 -7
- package/src/i18n/locales/pt.json +24 -7
- package/src/i18n/locales/ru.json +26 -7
- package/src/i18n/locales/tr.json +24 -7
- package/src/i18n/locales/zh-TW.json +24 -7
- package/src/i18n/locales/zh.json +24 -7
- package/src/router/RouteComponent.test.tsx +65 -1
- package/src/router/RouteComponent.tsx +18 -15
- package/src/session/UserSession.test.ts +65 -0
- package/src/session/UserSession.ts +4 -0
- package/src/shell/SplashScreen.tsx +1 -1
- package/src/shell/login/SignInIcons.tsx +2 -1
- package/src/shell/login/SignInPasswordRequired.test.tsx +82 -0
- package/src/shell/login/SignInPasswordStep.test.tsx +71 -0
- package/src/shell/login/SignInPasswordStep.tsx +103 -0
- package/src/shell/login/SignInPrimitives.tsx +53 -1
- package/src/shell/login/SignInProvidersStep.tsx +8 -4
- package/src/shell/login/SignInReturningStep.tsx +20 -8
- package/src/shell/login/SignInTenantStep.tsx +6 -2
- package/src/shell/login/SignInWithProviderButton.tsx +11 -7
- package/src/shell/login/SigninScreen.tsx +32 -3
- package/src/shell/login/signInPassword.test.ts +133 -0
- package/src/shell/login/signInUtils.ts +60 -7
- package/src/widgets/json-view/JSONCode.test.tsx +2 -2
- package/src/widgets/json-view/JSONCode.tsx +1 -1
- package/src/widgets/upload/DropZone.tsx +2 -4
- package/lib/features/store/objects/selection/actions/StartWorkflowButton.d.ts +0 -7
- package/lib/features/store/objects/selection/actions/StartWorkflowButton.d.ts.map +0 -1
- package/lib/features/store/objects/selection/actions/StartWorkflowButton.js +0 -51
- package/lib/features/store/objects/selection/actions/StartWorkflowButton.js.map +0 -1
- package/lib/vertesia-ui-i18n.BfN7iOHb.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.BfN7iOHb.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.BjH2zEZw.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.BjH2zEZw.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.BjSwAZXl.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.BjSwAZXl.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.C7PUm5Au.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.C7PUm5Au.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.CF_1mUS5.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.CF_1mUS5.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.ChfUl3_-.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.ChfUl3_-.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.D-Sk-5d1.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.D-Sk-5d1.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.D4rnu1_S.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.D4rnu1_S.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.DDf0-laK.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.DDf0-laK.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.DN79y06J.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.DN79y06J.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.DWLIciYQ.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.DWLIciYQ.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.DvF_YaAJ.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.DvF_YaAJ.chunk.js.map +0 -1
- package/src/features/store/objects/selection/actions/StartWorkflowButton.tsx +0 -104
package/src/i18n/locales/tr.json
CHANGED
|
@@ -245,6 +245,17 @@
|
|
|
245
245
|
"auth.email.placeholder": "siz@sirket.com",
|
|
246
246
|
"auth.email.title": "Vertesia'ya hoş geldiniz",
|
|
247
247
|
"auth.error": "Hata: {{message}}",
|
|
248
|
+
"auth.password.body": "Bu hesabın parolasını girin.",
|
|
249
|
+
"auth.password.continue": "Parolayla devam et",
|
|
250
|
+
"auth.password.eyebrow": "Parolayla oturum açma",
|
|
251
|
+
"auth.password.failed": "Oturumunuz açılamadı. Lütfen tekrar deneyin.",
|
|
252
|
+
"auth.password.invalidCredentials": "E-posta veya parola hatalı.",
|
|
253
|
+
"auth.password.label": "Parola",
|
|
254
|
+
"auth.password.notAvailable": "Bu e-posta için parolayla oturum açma kullanılamıyor.",
|
|
255
|
+
"auth.password.required": "Parolanızı girin.",
|
|
256
|
+
"auth.password.submit": "Oturum aç",
|
|
257
|
+
"auth.password.title": "Parolanızı girin",
|
|
258
|
+
"auth.password.tooManyAttempts": "Çok fazla deneme yapıldı. Birkaç dakika bekleyip tekrar deneyin.",
|
|
248
259
|
"auth.pending.authenticating": "Kimlik doğrulanıyor",
|
|
249
260
|
"auth.pending.body": "Bir saniye — sizi güvenli bir şekilde aktarıyoruz. Yalnızca birkaç saniye sürer.",
|
|
250
261
|
"auth.pending.cancel": "İptal",
|
|
@@ -365,6 +376,7 @@
|
|
|
365
376
|
"mcpConnections.label": "MCP",
|
|
366
377
|
"mcpConnections.manage": "MCP bağlantılarını yönet",
|
|
367
378
|
"mcpConnections.managedByApp": "Uygulama tarafından yönetiliyor",
|
|
379
|
+
"mcpConnections.noAuthentication": "Kimlik doğrulama yok",
|
|
368
380
|
"mcpConnections.settings": "Ayarlar",
|
|
369
381
|
"mcpConnections.subtitle": "Bu konuşma için kullanılabilen MCP sunucularını yönetin.",
|
|
370
382
|
"mcpConnections.title": "MCP",
|
|
@@ -474,10 +486,10 @@
|
|
|
474
486
|
"store.actions.changeContentTypeDesc": "Seçili belgelerin İçerik Türünü değiştirin",
|
|
475
487
|
"store.actions.changeType": "Türü Değiştir",
|
|
476
488
|
"store.actions.chooseExistingCollections": "Mevcut koleksiyonlardan seçin",
|
|
477
|
-
"store.actions.chooseWorkflowRule": "Başlatılacak bir iş akışı kuralı seçin:",
|
|
478
489
|
"store.actions.confirmDeleteAll": "Seçili tüm nesneleri silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.",
|
|
479
490
|
"store.actions.confirmDeleteSelected": "Seçili nesneleri silmek istediğinizden emin misiniz?\nBu, koleksiyonlardan kaldırma işlemi değildir.",
|
|
480
491
|
"store.actions.confirmRemoveFromCollection": "Seçili nesneleri bu koleksiyondan kaldırmak istediğinizden emin misiniz?",
|
|
492
|
+
"store.actions.confirmRunIntake": "Alımı yeniden çalıştırmak seçili nesneleri yeniden işler ve içerik türlerinin ve özelliklerinin üzerine yazabilir. Devam edilsin mi?",
|
|
481
493
|
"store.actions.createNew": "Yeni oluştur",
|
|
482
494
|
"store.actions.delete": "Sil",
|
|
483
495
|
"store.actions.deleteObjects": "Nesneleri Sil",
|
|
@@ -486,20 +498,22 @@
|
|
|
486
498
|
"store.actions.errorDeletingObjects": "Nesneler silinirken hata oluştu",
|
|
487
499
|
"store.actions.errorExportProperties": "Özellikleri Dışa Aktarma Hatası",
|
|
488
500
|
"store.actions.errorRemovingObjects": "Nesneler koleksiyondan kaldırılırken hata oluştu",
|
|
489
|
-
"store.actions.
|
|
501
|
+
"store.actions.errorStartingIntake": "Alım başlatılamadı",
|
|
490
502
|
"store.actions.exportAllObjectProperties": "Tüm Nesne Özelliklerini Dışa Aktar",
|
|
491
503
|
"store.actions.exportProperties": "Özellikleri Dışa Aktar",
|
|
504
|
+
"store.actions.intakeStarted": "Alım başlatıldı",
|
|
505
|
+
"store.actions.intakeStartedOn_one": "{{count}} nesne için alım başlatıldı",
|
|
506
|
+
"store.actions.intakeStartedOn_other": "{{count}} nesne için alım başlatıldı",
|
|
492
507
|
"store.actions.noCollectionContext": "Koleksiyon bağlamı yok",
|
|
493
508
|
"store.actions.noObjectsSelected": "Nesne seçilmedi",
|
|
494
509
|
"store.actions.pleaseSelectObjectsToDelete": "Lütfen silinecek nesneleri seçin",
|
|
495
510
|
"store.actions.pleaseSelectObjectsToRemove": "Lütfen koleksiyondan kaldırılacak nesneleri seçin",
|
|
511
|
+
"store.actions.pleaseSelectObjectsToRunIntake": "Alım çalıştırılacak nesneleri seçin",
|
|
496
512
|
"store.actions.removeFromCollection": "Koleksiyondan kaldır",
|
|
497
513
|
"store.actions.removeFromCollectionDesc": "Seçili nesneleri bu koleksiyondan kaldır",
|
|
514
|
+
"store.actions.runIntake": "Alımı çalıştır",
|
|
515
|
+
"store.actions.runIntakeDesc": "Seçili nesneler üzerinde standart alım hattını yeniden çalıştır",
|
|
498
516
|
"store.actions.selectCollection": "Koleksiyon Seçin",
|
|
499
|
-
"store.actions.startWorkflow": "İş Akışı Başlat",
|
|
500
|
-
"store.actions.startWorkflowByRule": "Kurala Göre İş Akışı Başlat",
|
|
501
|
-
"store.actions.startWorkflowDesc": "Seçili nesneler üzerinde bir iş akışı başlat",
|
|
502
|
-
"store.actions.workflowStarted": "İş akışı başlatıldı",
|
|
503
517
|
"store.allowedContentTypes": "İzin Verilen İçerik Türleri",
|
|
504
518
|
"store.allowedContentTypesOptionalDescription": "İsteğe bağlı olarak koleksiyona eklenebilecek içerik türlerini seçin. Ayarlanmamışsa tüm içerik türlerine izin verilir.",
|
|
505
519
|
"store.allowedContentTypesSelectDescription": "Koleksiyona eklenebilecek içerik türlerini seçin. Ayarlanmamışsa tüm içerik türlerine izin verilir.",
|
|
@@ -571,7 +585,6 @@
|
|
|
571
585
|
"store.failedToExportDocument": "Belge dışa aktarılamadı",
|
|
572
586
|
"store.failedToFetchRoleMappings": "Rol eşlemeleri getirilemedi",
|
|
573
587
|
"store.failedToFetchTypes": "ObjectType'lar getirilemedi",
|
|
574
|
-
"store.failedToFetchWorkflows": "İş akışları getirilemedi",
|
|
575
588
|
"store.failedToGetDownloadUrl": "İndirme URL'si alınamadı",
|
|
576
589
|
"store.failedToLoadDocument": "Belge yüklenemedi",
|
|
577
590
|
"store.failedToLoadType": "Tür yüklenemedi",
|
|
@@ -661,6 +674,7 @@
|
|
|
661
674
|
"store.showingFirst128K": "Yalnızca ilk 128K karakter gösteriliyor",
|
|
662
675
|
"store.size": "Boyut",
|
|
663
676
|
"store.staticCollection": "Statik Koleksiyon",
|
|
677
|
+
"store.status": "Durum",
|
|
664
678
|
"store.strictMode": "Katı Mod",
|
|
665
679
|
"store.successfullyCopied": "{{type}} panoya başarıyla kopyalandı",
|
|
666
680
|
"store.successfullyExportedTo": "{{format}} olarak başarıyla dışa aktarıldı",
|
|
@@ -675,6 +689,9 @@
|
|
|
675
689
|
"store.typeCreated": "Tür oluşturuldu",
|
|
676
690
|
"store.typeDescription": "İsteğe bağlı olarak koleksiyona özel özellikler ve veriler atamak için bir içerik türü seçin.",
|
|
677
691
|
"store.typeSelectDescription": "Koleksiyona özel özellikler ve veriler atamak için bir içerik türü seçin.",
|
|
692
|
+
"store.typeStatus.active": "Etkin",
|
|
693
|
+
"store.typeStatus.draft": "Taslak",
|
|
694
|
+
"store.typeStatus.draftHint": "Alım sırasında otomatik tür seçiminde sunulmaz. Bu tür belgelere yine de doğrudan atanabilir.",
|
|
678
695
|
"store.unknown": "Bilinmeyen",
|
|
679
696
|
"store.unsavedChanges": "Kaydedilmemiş değişiklikler",
|
|
680
697
|
"store.updated": "Güncelleme",
|
|
@@ -245,6 +245,17 @@
|
|
|
245
245
|
"auth.email.placeholder": "you@company.com",
|
|
246
246
|
"auth.email.title": "歡迎使用 Vertesia",
|
|
247
247
|
"auth.error": "錯誤:{{message}}",
|
|
248
|
+
"auth.password.body": "請輸入此帳戶的密碼。",
|
|
249
|
+
"auth.password.continue": "使用密碼繼續",
|
|
250
|
+
"auth.password.eyebrow": "密碼登入",
|
|
251
|
+
"auth.password.failed": "無法登入,請再試一次。",
|
|
252
|
+
"auth.password.invalidCredentials": "電子郵件或密碼不正確。",
|
|
253
|
+
"auth.password.label": "密碼",
|
|
254
|
+
"auth.password.notAvailable": "此電子郵件不支援密碼登入。",
|
|
255
|
+
"auth.password.required": "請輸入密碼。",
|
|
256
|
+
"auth.password.submit": "登入",
|
|
257
|
+
"auth.password.title": "輸入密碼",
|
|
258
|
+
"auth.password.tooManyAttempts": "嘗試次數過多。請稍候幾分鐘後再試一次。",
|
|
248
259
|
"auth.pending.authenticating": "驗證中",
|
|
249
260
|
"auth.pending.body": "請稍候 — 我們正在為您安全跳轉。只需稍待片刻。",
|
|
250
261
|
"auth.pending.cancel": "取消",
|
|
@@ -365,6 +376,7 @@
|
|
|
365
376
|
"mcpConnections.label": "MCP",
|
|
366
377
|
"mcpConnections.manage": "管理 MCP 連線",
|
|
367
378
|
"mcpConnections.managedByApp": "由應用程式管理",
|
|
379
|
+
"mcpConnections.noAuthentication": "無需驗證",
|
|
368
380
|
"mcpConnections.settings": "設定",
|
|
369
381
|
"mcpConnections.subtitle": "管理可用於此對話的 MCP 伺服器。",
|
|
370
382
|
"mcpConnections.title": "MCP",
|
|
@@ -474,10 +486,10 @@
|
|
|
474
486
|
"store.actions.changeContentTypeDesc": "變更選中文件的內容類型",
|
|
475
487
|
"store.actions.changeType": "變更類型",
|
|
476
488
|
"store.actions.chooseExistingCollections": "從現有集合中選擇",
|
|
477
|
-
"store.actions.chooseWorkflowRule": "選擇要啟動的工作流程規則:",
|
|
478
489
|
"store.actions.confirmDeleteAll": "確定要刪除所有選中的物件嗎?此操作無法復原。",
|
|
479
490
|
"store.actions.confirmDeleteSelected": "確定要刪除選中的物件嗎?\n這不是從集合中移除。",
|
|
480
491
|
"store.actions.confirmRemoveFromCollection": "確定要從此集合中移除所選物件嗎?",
|
|
492
|
+
"store.actions.confirmRunIntake": "重新執行內容擷取會重新處理選中的物件,可能覆寫其內容類型和屬性。是否繼續?",
|
|
481
493
|
"store.actions.createNew": "新建",
|
|
482
494
|
"store.actions.delete": "刪除",
|
|
483
495
|
"store.actions.deleteObjects": "刪除物件",
|
|
@@ -486,20 +498,22 @@
|
|
|
486
498
|
"store.actions.errorDeletingObjects": "刪除物件時出錯",
|
|
487
499
|
"store.actions.errorExportProperties": "匯出屬性時出錯",
|
|
488
500
|
"store.actions.errorRemovingObjects": "從集合中移除物件時出錯",
|
|
489
|
-
"store.actions.
|
|
501
|
+
"store.actions.errorStartingIntake": "啟動內容擷取失敗",
|
|
490
502
|
"store.actions.exportAllObjectProperties": "匯出所有物件屬性",
|
|
491
503
|
"store.actions.exportProperties": "匯出屬性",
|
|
504
|
+
"store.actions.intakeStarted": "內容擷取已啟動",
|
|
505
|
+
"store.actions.intakeStartedOn_one": "已對 {{count}} 個物件啟動內容擷取",
|
|
506
|
+
"store.actions.intakeStartedOn_other": "已對 {{count}} 個物件啟動內容擷取",
|
|
492
507
|
"store.actions.noCollectionContext": "沒有集合上下文",
|
|
493
508
|
"store.actions.noObjectsSelected": "未選擇任何物件",
|
|
494
509
|
"store.actions.pleaseSelectObjectsToDelete": "請選擇要刪除的物件",
|
|
495
510
|
"store.actions.pleaseSelectObjectsToRemove": "請選擇要從集合中移除的物件",
|
|
511
|
+
"store.actions.pleaseSelectObjectsToRunIntake": "請選擇要執行內容擷取的物件",
|
|
496
512
|
"store.actions.removeFromCollection": "從集合中移除",
|
|
497
513
|
"store.actions.removeFromCollectionDesc": "從此集合中移除所選物件",
|
|
514
|
+
"store.actions.runIntake": "執行內容擷取",
|
|
515
|
+
"store.actions.runIntakeDesc": "對選中的物件重新執行標準內容擷取流程",
|
|
498
516
|
"store.actions.selectCollection": "選擇集合",
|
|
499
|
-
"store.actions.startWorkflow": "啟動工作流程",
|
|
500
|
-
"store.actions.startWorkflowByRule": "按規則啟動工作流程",
|
|
501
|
-
"store.actions.startWorkflowDesc": "對選中的物件啟動工作流程",
|
|
502
|
-
"store.actions.workflowStarted": "工作流程已啟動",
|
|
503
517
|
"store.allowedContentTypes": "允許的內容類型",
|
|
504
518
|
"store.allowedContentTypesOptionalDescription": "可選擇限定可新增到集合中的內容類型。如果未設定,則允許所有內容類型。",
|
|
505
519
|
"store.allowedContentTypesSelectDescription": "選擇可新增到集合中的內容類型。如果未設定,則允許所有內容類型。",
|
|
@@ -571,7 +585,6 @@
|
|
|
571
585
|
"store.failedToExportDocument": "匯出文件失敗",
|
|
572
586
|
"store.failedToFetchRoleMappings": "取得角色對應失敗",
|
|
573
587
|
"store.failedToFetchTypes": "取得物件類型失敗",
|
|
574
|
-
"store.failedToFetchWorkflows": "取得工作流程失敗",
|
|
575
588
|
"store.failedToGetDownloadUrl": "取得下載URL失敗",
|
|
576
589
|
"store.failedToLoadDocument": "載入文件失敗",
|
|
577
590
|
"store.failedToLoadType": "載入類型失敗",
|
|
@@ -661,6 +674,7 @@
|
|
|
661
674
|
"store.showingFirst128K": "僅顯示前128K個字元",
|
|
662
675
|
"store.size": "大小",
|
|
663
676
|
"store.staticCollection": "靜態集合",
|
|
677
|
+
"store.status": "狀態",
|
|
664
678
|
"store.strictMode": "嚴格模式",
|
|
665
679
|
"store.successfullyCopied": "已成功複製{{type}}到剪貼簿",
|
|
666
680
|
"store.successfullyExportedTo": "已成功匯出為{{format}}",
|
|
@@ -675,6 +689,9 @@
|
|
|
675
689
|
"store.typeCreated": "類型已建立",
|
|
676
690
|
"store.typeDescription": "可選擇內容類型以為集合指派自訂屬性和資料。",
|
|
677
691
|
"store.typeSelectDescription": "選擇內容類型以為集合指派自訂屬性和資料。",
|
|
692
|
+
"store.typeStatus.active": "已啟用",
|
|
693
|
+
"store.typeStatus.draft": "草稿",
|
|
694
|
+
"store.typeStatus.draftHint": "匯入時不參與自動類型選擇。仍可將此類型直接指派給文件。",
|
|
678
695
|
"store.unknown": "未知",
|
|
679
696
|
"store.unsavedChanges": "未儲存的變更",
|
|
680
697
|
"store.updated": "更新時間",
|
package/src/i18n/locales/zh.json
CHANGED
|
@@ -245,6 +245,17 @@
|
|
|
245
245
|
"auth.email.placeholder": "you@company.com",
|
|
246
246
|
"auth.email.title": "欢迎使用 Vertesia",
|
|
247
247
|
"auth.error": "错误:{{message}}",
|
|
248
|
+
"auth.password.body": "请输入此账户的密码。",
|
|
249
|
+
"auth.password.continue": "使用密码继续",
|
|
250
|
+
"auth.password.eyebrow": "密码登录",
|
|
251
|
+
"auth.password.failed": "无法登录,请重试。",
|
|
252
|
+
"auth.password.invalidCredentials": "电子邮件或密码不正确。",
|
|
253
|
+
"auth.password.label": "密码",
|
|
254
|
+
"auth.password.notAvailable": "此电子邮件不支持密码登录。",
|
|
255
|
+
"auth.password.required": "请输入密码。",
|
|
256
|
+
"auth.password.submit": "登录",
|
|
257
|
+
"auth.password.title": "输入密码",
|
|
258
|
+
"auth.password.tooManyAttempts": "尝试次数过多。请等待几分钟后重试。",
|
|
248
259
|
"auth.pending.authenticating": "正在认证",
|
|
249
260
|
"auth.pending.body": "请稍候 — 我们正在为您安全跳转。只需稍候片刻。",
|
|
250
261
|
"auth.pending.cancel": "取消",
|
|
@@ -365,6 +376,7 @@
|
|
|
365
376
|
"mcpConnections.label": "MCP",
|
|
366
377
|
"mcpConnections.manage": "管理 MCP 连接",
|
|
367
378
|
"mcpConnections.managedByApp": "由应用管理",
|
|
379
|
+
"mcpConnections.noAuthentication": "无需身份验证",
|
|
368
380
|
"mcpConnections.settings": "设置",
|
|
369
381
|
"mcpConnections.subtitle": "管理可用于此对话的 MCP 服务器。",
|
|
370
382
|
"mcpConnections.title": "MCP",
|
|
@@ -474,10 +486,10 @@
|
|
|
474
486
|
"store.actions.changeContentTypeDesc": "更改选中文档的内容类型",
|
|
475
487
|
"store.actions.changeType": "更改类型",
|
|
476
488
|
"store.actions.chooseExistingCollections": "从现有集合中选择",
|
|
477
|
-
"store.actions.chooseWorkflowRule": "选择要启动的工作流规则:",
|
|
478
489
|
"store.actions.confirmDeleteAll": "确定要删除所有选中的对象吗?此操作无法撤销。",
|
|
479
490
|
"store.actions.confirmDeleteSelected": "确定要删除选中的对象吗?\n这不是从集合中移除。",
|
|
480
491
|
"store.actions.confirmRemoveFromCollection": "确定要从此集合中移除所选对象吗?",
|
|
492
|
+
"store.actions.confirmRunIntake": "重新运行内容摄取会重新处理选中的对象,可能覆盖其内容类型和属性。是否继续?",
|
|
481
493
|
"store.actions.createNew": "新建",
|
|
482
494
|
"store.actions.delete": "删除",
|
|
483
495
|
"store.actions.deleteObjects": "删除对象",
|
|
@@ -486,20 +498,22 @@
|
|
|
486
498
|
"store.actions.errorDeletingObjects": "删除对象时出错",
|
|
487
499
|
"store.actions.errorExportProperties": "导出属性时出错",
|
|
488
500
|
"store.actions.errorRemovingObjects": "从集合中移除对象时出错",
|
|
489
|
-
"store.actions.
|
|
501
|
+
"store.actions.errorStartingIntake": "启动内容摄取失败",
|
|
490
502
|
"store.actions.exportAllObjectProperties": "导出所有对象属性",
|
|
491
503
|
"store.actions.exportProperties": "导出属性",
|
|
504
|
+
"store.actions.intakeStarted": "内容摄取已启动",
|
|
505
|
+
"store.actions.intakeStartedOn_one": "已对 {{count}} 个对象启动内容摄取",
|
|
506
|
+
"store.actions.intakeStartedOn_other": "已对 {{count}} 个对象启动内容摄取",
|
|
492
507
|
"store.actions.noCollectionContext": "没有集合上下文",
|
|
493
508
|
"store.actions.noObjectsSelected": "未选择任何对象",
|
|
494
509
|
"store.actions.pleaseSelectObjectsToDelete": "请选择要删除的对象",
|
|
495
510
|
"store.actions.pleaseSelectObjectsToRemove": "请选择要从集合中移除的对象",
|
|
511
|
+
"store.actions.pleaseSelectObjectsToRunIntake": "请选择要运行内容摄取的对象",
|
|
496
512
|
"store.actions.removeFromCollection": "从集合中移除",
|
|
497
513
|
"store.actions.removeFromCollectionDesc": "从此集合中移除所选对象",
|
|
514
|
+
"store.actions.runIntake": "运行内容摄取",
|
|
515
|
+
"store.actions.runIntakeDesc": "对选中的对象重新运行标准内容摄取流程",
|
|
498
516
|
"store.actions.selectCollection": "选择集合",
|
|
499
|
-
"store.actions.startWorkflow": "启动工作流",
|
|
500
|
-
"store.actions.startWorkflowByRule": "按规则启动工作流",
|
|
501
|
-
"store.actions.startWorkflowDesc": "对选中的对象启动工作流",
|
|
502
|
-
"store.actions.workflowStarted": "工作流已启动",
|
|
503
517
|
"store.allowedContentTypes": "允许的内容类型",
|
|
504
518
|
"store.allowedContentTypesOptionalDescription": "可选择限定可添加到集合中的内容类型。如果未设置,则允许所有内容类型。",
|
|
505
519
|
"store.allowedContentTypesSelectDescription": "选择可添加到集合中的内容类型。如果未设置,则允许所有内容类型。",
|
|
@@ -571,7 +585,6 @@
|
|
|
571
585
|
"store.failedToExportDocument": "导出文档失败",
|
|
572
586
|
"store.failedToFetchRoleMappings": "获取角色映射失败",
|
|
573
587
|
"store.failedToFetchTypes": "获取对象类型失败",
|
|
574
|
-
"store.failedToFetchWorkflows": "获取工作流失败",
|
|
575
588
|
"store.failedToGetDownloadUrl": "获取下载URL失败",
|
|
576
589
|
"store.failedToLoadDocument": "加载文档失败",
|
|
577
590
|
"store.failedToLoadType": "加载类型失败",
|
|
@@ -661,6 +674,7 @@
|
|
|
661
674
|
"store.showingFirst128K": "仅显示前128K个字符",
|
|
662
675
|
"store.size": "大小",
|
|
663
676
|
"store.staticCollection": "静态集合",
|
|
677
|
+
"store.status": "状态",
|
|
664
678
|
"store.strictMode": "严格模式",
|
|
665
679
|
"store.successfullyCopied": "已成功复制{{type}}到剪贴板",
|
|
666
680
|
"store.successfullyExportedTo": "已成功导出为{{format}}",
|
|
@@ -675,6 +689,9 @@
|
|
|
675
689
|
"store.typeCreated": "类型已创建",
|
|
676
690
|
"store.typeDescription": "可选择内容类型以为集合分配自定义属性和数据。",
|
|
677
691
|
"store.typeSelectDescription": "选择内容类型以为集合分配自定义属性和数据。",
|
|
692
|
+
"store.typeStatus.active": "已启用",
|
|
693
|
+
"store.typeStatus.draft": "草稿",
|
|
694
|
+
"store.typeStatus.draftHint": "摄取时不参与自动类型选择。仍可将此类型直接分配给文档。",
|
|
678
695
|
"store.unknown": "未知",
|
|
679
696
|
"store.unsavedChanges": "未保存的更改",
|
|
680
697
|
"store.updated": "更新时间",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { act, cleanup, render, screen, waitFor } from '@testing-library/react';
|
|
2
|
-
import {
|
|
2
|
+
import { ErrorBoundary } from 'react-error-boundary';
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
4
|
import { prefetchLazyRoutes, RouteComponent } from './RouteComponent';
|
|
4
5
|
import { type LazyRouteModule, useNavigate } from './Router';
|
|
5
6
|
import { RouterProvider } from './RouterProvider';
|
|
@@ -38,6 +39,44 @@ describe('RouteComponent lazy routes', () => {
|
|
|
38
39
|
window.history.pushState({}, '', '/');
|
|
39
40
|
});
|
|
40
41
|
|
|
42
|
+
it.each(['missing module', 'rejected import', 'synchronous failure'] as const)(
|
|
43
|
+
'reports a %s through the error boundary instead of remaining on the spinner',
|
|
44
|
+
async (failure) => {
|
|
45
|
+
const error = new Error('Module could not be loaded');
|
|
46
|
+
const onError = vi.fn();
|
|
47
|
+
const consoleError = vi.spyOn(console, 'error').mockImplementation(() => undefined);
|
|
48
|
+
const routes = [
|
|
49
|
+
{
|
|
50
|
+
path: '/a',
|
|
51
|
+
LazyComponent: () => {
|
|
52
|
+
if (failure === 'synchronous failure') throw error;
|
|
53
|
+
return failure === 'missing module'
|
|
54
|
+
? Promise.resolve(undefined as unknown as LazyRouteModule)
|
|
55
|
+
: Promise.reject(error);
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
try {
|
|
60
|
+
render(
|
|
61
|
+
<ErrorBoundary fallback={<div>Route unavailable</div>} onError={onError}>
|
|
62
|
+
<RouterProvider routes={routes}>
|
|
63
|
+
<RouteComponent spinner={<div>loading</div>} />
|
|
64
|
+
</RouterProvider>
|
|
65
|
+
</ErrorBoundary>,
|
|
66
|
+
);
|
|
67
|
+
await screen.findByText('Route unavailable');
|
|
68
|
+
expect(screen.queryByText('loading')).toBeNull();
|
|
69
|
+
expect(onError.mock.calls[0][0]).toEqual(
|
|
70
|
+
failure === 'missing module'
|
|
71
|
+
? new Error('Lazy module for /a does not have a default export')
|
|
72
|
+
: error,
|
|
73
|
+
);
|
|
74
|
+
} finally {
|
|
75
|
+
consoleError.mockRestore();
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
);
|
|
79
|
+
|
|
41
80
|
it('stops showing the previous lazy route while the next one loads', async () => {
|
|
42
81
|
const pageA = deferredModule('Page A');
|
|
43
82
|
const pageB = deferredModule('Page B');
|
|
@@ -87,6 +126,31 @@ describe('RouteComponent lazy routes', () => {
|
|
|
87
126
|
expect(screen.getByText('Page B')).toBeDefined();
|
|
88
127
|
});
|
|
89
128
|
|
|
129
|
+
it('ignores a rejected import after navigating away', async () => {
|
|
130
|
+
let reject!: (error: Error) => void;
|
|
131
|
+
const promise = new Promise<LazyRouteModule>((_resolve, rejectPromise) => {
|
|
132
|
+
reject = rejectPromise;
|
|
133
|
+
});
|
|
134
|
+
const onError = vi.fn();
|
|
135
|
+
render(
|
|
136
|
+
<ErrorBoundary fallback={<div>Route unavailable</div>} onError={onError}>
|
|
137
|
+
<RouterProvider
|
|
138
|
+
routes={[
|
|
139
|
+
{ path: '/a', LazyComponent: () => promise },
|
|
140
|
+
{ path: '/b', Component: () => <div>Page B</div> },
|
|
141
|
+
]}
|
|
142
|
+
>
|
|
143
|
+
<CaptureNavigate />
|
|
144
|
+
<RouteComponent />
|
|
145
|
+
</RouterProvider>
|
|
146
|
+
</ErrorBoundary>,
|
|
147
|
+
);
|
|
148
|
+
await act(async () => navigateFn('/b'));
|
|
149
|
+
await act(async () => reject(new Error('Previous route failed')));
|
|
150
|
+
expect(screen.getByText('Page B')).toBeDefined();
|
|
151
|
+
expect(onError).not.toHaveBeenCalled();
|
|
152
|
+
});
|
|
153
|
+
|
|
90
154
|
it('renders a previously resolved lazy route synchronously on revisit', async () => {
|
|
91
155
|
const pageA = deferredModule('Page A');
|
|
92
156
|
const pageB = deferredModule('Page B');
|
|
@@ -13,14 +13,13 @@ import {
|
|
|
13
13
|
// between two lazy routes blanks the page for at least a frame, even when the module is loaded.
|
|
14
14
|
const resolvedComponents = new Map<LazyComponentRoute['LazyComponent'], LazyRouteModule['default']>();
|
|
15
15
|
|
|
16
|
-
function resolveLazyRoute(route: LazyComponentRoute): Promise<LazyRouteModule['default']> {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
});
|
|
16
|
+
async function resolveLazyRoute(route: LazyComponentRoute): Promise<LazyRouteModule['default']> {
|
|
17
|
+
const module = await route.LazyComponent();
|
|
18
|
+
if (!module?.default) {
|
|
19
|
+
throw new Error(`Lazy module for ${route.path} does not have a default export`);
|
|
20
|
+
}
|
|
21
|
+
resolvedComponents.set(route.LazyComponent, module.default);
|
|
22
|
+
return module.default;
|
|
24
23
|
}
|
|
25
24
|
|
|
26
25
|
/**
|
|
@@ -64,21 +63,25 @@ function LazyRouteComponent({ route, spinner }: LazyRouteComponentProps) {
|
|
|
64
63
|
const [Component, setComponent] = useState<LazyRouteModule['default'] | null>(
|
|
65
64
|
() => resolvedComponents.get(route.LazyComponent) ?? null,
|
|
66
65
|
);
|
|
66
|
+
const [error, setError] = useState<unknown>();
|
|
67
67
|
useEffect(() => {
|
|
68
68
|
// A slow import must not land after this instance moved on (unmount, or a route object
|
|
69
69
|
// swap without a path change): the stale module would overwrite the current one.
|
|
70
70
|
let stale = false;
|
|
71
|
-
void resolveLazyRoute(route).then(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
71
|
+
void resolveLazyRoute(route).then(
|
|
72
|
+
(component) => {
|
|
73
|
+
if (!stale) setComponent(() => component);
|
|
74
|
+
},
|
|
75
|
+
(error: unknown) => {
|
|
76
|
+
// Render failures through the surrounding error boundary, including import failures.
|
|
77
|
+
if (!stale) setError(() => error);
|
|
78
|
+
},
|
|
79
|
+
);
|
|
78
80
|
return () => {
|
|
79
81
|
stale = true;
|
|
80
82
|
};
|
|
81
83
|
}, [route]);
|
|
82
84
|
|
|
85
|
+
if (error !== undefined) throw error;
|
|
83
86
|
return Component ? <Component /> : spinner || null;
|
|
84
87
|
}
|
|
@@ -1,17 +1,64 @@
|
|
|
1
1
|
import type { VertesiaClient } from '@vertesia/client';
|
|
2
|
+
import { type AuthTokenPayload, PrincipalType } from '@vertesia/common';
|
|
2
3
|
import { describe, expect, it, vi } from 'vitest';
|
|
3
4
|
import { UserSession } from './UserSession';
|
|
4
5
|
|
|
6
|
+
const projectToken: AuthTokenPayload = {
|
|
7
|
+
sub: 'test-user',
|
|
8
|
+
name: 'Test User',
|
|
9
|
+
type: PrincipalType.User,
|
|
10
|
+
account: { id: 'test-account', name: 'Test Account' },
|
|
11
|
+
account_roles: [],
|
|
12
|
+
accounts: [],
|
|
13
|
+
project: { id: 'test-project', name: 'Test Project', account: 'test-account' },
|
|
14
|
+
apps: [],
|
|
15
|
+
iss: 'https://auth.example.com',
|
|
16
|
+
aud: 'test-client',
|
|
17
|
+
exp: 4102444800,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
function encodeToken(payload: AuthTokenPayload): string {
|
|
21
|
+
return `${btoa(JSON.stringify({ alg: 'none' }))}.${btoa(JSON.stringify(payload))}.`;
|
|
22
|
+
}
|
|
23
|
+
|
|
5
24
|
function createSession(onboardingProgress: () => Promise<Record<string, boolean>>) {
|
|
6
25
|
const client = {
|
|
7
26
|
account: { onboardingProgress },
|
|
27
|
+
withAuthCallback: vi.fn(),
|
|
8
28
|
} as unknown as VertesiaClient;
|
|
9
29
|
const setSession = vi.fn<(session: UserSession) => void>();
|
|
10
30
|
const session = new UserSession(client, setSession);
|
|
31
|
+
session.authToken = { ...projectToken };
|
|
11
32
|
return { session, setSession };
|
|
12
33
|
}
|
|
13
34
|
|
|
14
35
|
describe('UserSession.fetchOnboardingStatus', () => {
|
|
36
|
+
it('skips onboarding before authentication without publishing a status', async () => {
|
|
37
|
+
const onboardingProgress = vi.fn(async () => ({ project_created: true }));
|
|
38
|
+
const { session, setSession } = createSession(onboardingProgress);
|
|
39
|
+
session.authToken = undefined;
|
|
40
|
+
|
|
41
|
+
await expect(session.fetchOnboardingStatus()).resolves.toBe(false);
|
|
42
|
+
expect(onboardingProgress).not.toHaveBeenCalled();
|
|
43
|
+
expect(session.onboardingComplete).toBeUndefined();
|
|
44
|
+
expect(setSession).not.toHaveBeenCalled();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('defers onboarding during account-only login and loads it after project selection', async () => {
|
|
48
|
+
const onboardingProgress = vi.fn(async () => ({ project_created: true }));
|
|
49
|
+
const { session, setSession } = createSession(onboardingProgress);
|
|
50
|
+
|
|
51
|
+
await session.login(encodeToken({ ...projectToken, project: undefined }));
|
|
52
|
+
expect(onboardingProgress).not.toHaveBeenCalled();
|
|
53
|
+
expect(session.onboardingComplete).toBeUndefined();
|
|
54
|
+
expect(setSession).not.toHaveBeenCalled();
|
|
55
|
+
|
|
56
|
+
await session.login(encodeToken(projectToken));
|
|
57
|
+
expect(onboardingProgress).toHaveBeenCalledOnce();
|
|
58
|
+
expect(session.onboardingComplete).toBe(true);
|
|
59
|
+
expect(setSession).toHaveBeenCalledOnce();
|
|
60
|
+
});
|
|
61
|
+
|
|
15
62
|
it('does not replace the session when an incomplete status is unchanged', async () => {
|
|
16
63
|
const { session, setSession } = createSession(async () => ({ project_created: false }));
|
|
17
64
|
session.onboardingComplete = false;
|
|
@@ -37,3 +84,21 @@ describe('UserSession.fetchOnboardingStatus', () => {
|
|
|
37
84
|
expect(setSession.mock.calls[0]?.[0]?.onboardingComplete).toBe(false);
|
|
38
85
|
});
|
|
39
86
|
});
|
|
87
|
+
|
|
88
|
+
describe('UserSession.signOut', () => {
|
|
89
|
+
it('keeps the receiver when used as a callback, including cloned sessions', () => {
|
|
90
|
+
const { session } = createSession(async () => ({}));
|
|
91
|
+
const clone = session.clone();
|
|
92
|
+
const logout = vi.spyOn(session, 'logout').mockImplementation(() => undefined);
|
|
93
|
+
const cloneLogout = vi.spyOn(clone, 'logout').mockImplementation(() => undefined);
|
|
94
|
+
const { signOut } = session;
|
|
95
|
+
const { signOut: signOutClone } = clone;
|
|
96
|
+
|
|
97
|
+
signOut();
|
|
98
|
+
expect(logout).toHaveBeenCalledOnce();
|
|
99
|
+
expect(cloneLogout).not.toHaveBeenCalled();
|
|
100
|
+
signOutClone();
|
|
101
|
+
expect(cloneLogout).toHaveBeenCalledOnce();
|
|
102
|
+
expect(logout).toHaveBeenCalledOnce();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
@@ -44,6 +44,7 @@ class UserSession {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
this.logout = this.logout.bind(this);
|
|
47
|
+
this.signOut = this.signOut.bind(this);
|
|
47
48
|
}
|
|
48
49
|
|
|
49
50
|
get store() {
|
|
@@ -251,6 +252,9 @@ class UserSession {
|
|
|
251
252
|
}
|
|
252
253
|
|
|
253
254
|
async fetchOnboardingStatus(): Promise<boolean> {
|
|
255
|
+
if (!this.project?.id) {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
254
258
|
if (this.onboardingComplete) {
|
|
255
259
|
console.log('Onboarding already completed');
|
|
256
260
|
return false;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LockKeyhole } from 'lucide-react';
|
|
1
|
+
import { KeyRound, LockKeyhole } from 'lucide-react';
|
|
2
2
|
import type { ComponentType, SVGProps } from 'react';
|
|
3
3
|
import type { ProviderId } from './signInUtils';
|
|
4
4
|
|
|
@@ -58,6 +58,7 @@ export const PROVIDER_ICONS: Record<ProviderId, ComponentType<{ className?: stri
|
|
|
58
58
|
github: GithubIcon,
|
|
59
59
|
microsoft: MicrosoftIcon,
|
|
60
60
|
oidc: OidcIcon,
|
|
61
|
+
password: KeyRound,
|
|
61
62
|
};
|
|
62
63
|
|
|
63
64
|
export function providerIcon(provider: ProviderId | string | undefined): ComponentType<{ className?: string }> {
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
|
|
2
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
+
|
|
4
|
+
const mocks = vi.hoisted(() => ({ startSignIn: vi.fn() }));
|
|
5
|
+
|
|
6
|
+
vi.mock('@vertesia/ui/i18n', () => ({
|
|
7
|
+
useUITranslation: () => ({ t: (key: string) => key }),
|
|
8
|
+
}));
|
|
9
|
+
|
|
10
|
+
vi.mock('./signInUtils', async (importOriginal) => ({
|
|
11
|
+
...(await importOriginal<typeof import('./signInUtils')>()),
|
|
12
|
+
startSignIn: mocks.startSignIn,
|
|
13
|
+
}));
|
|
14
|
+
|
|
15
|
+
const { default: SignInProvidersStep } = await import('./SignInProvidersStep');
|
|
16
|
+
const { default: SignInReturningStep } = await import('./SignInReturningStep');
|
|
17
|
+
|
|
18
|
+
const EMAIL = 'claude@reviewers.vertesia.io';
|
|
19
|
+
|
|
20
|
+
// A provider click enters the pending screen before the redirect starts. When the address turns
|
|
21
|
+
// out to belong to a password tenant there is no redirect, so the step must hand over to the
|
|
22
|
+
// password step instead of leaving the user on the pending spinner.
|
|
23
|
+
describe('password-required after a provider click', () => {
|
|
24
|
+
afterEach(() => {
|
|
25
|
+
mocks.startSignIn.mockReset();
|
|
26
|
+
document.body.innerHTML = '';
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('routes the provider list to the password step', async () => {
|
|
30
|
+
mocks.startSignIn.mockResolvedValue({ ok: false, reason: 'password-required' });
|
|
31
|
+
const onPasswordRequired = vi.fn();
|
|
32
|
+
render(
|
|
33
|
+
<SignInProvidersStep
|
|
34
|
+
email={EMAIL}
|
|
35
|
+
onBack={vi.fn()}
|
|
36
|
+
onProviderClicked={vi.fn()}
|
|
37
|
+
onPasswordRequired={onPasswordRequired}
|
|
38
|
+
/>,
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
fireEvent.click(screen.getAllByRole('button', { name: /auth.continueWithProvider/ })[0]);
|
|
42
|
+
|
|
43
|
+
await waitFor(() => expect(onPasswordRequired).toHaveBeenCalledWith(EMAIL));
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('routes a returning user with a stale provider to the password step', async () => {
|
|
47
|
+
mocks.startSignIn.mockResolvedValue({ ok: false, reason: 'password-required' });
|
|
48
|
+
const onProviderClicked = vi.fn();
|
|
49
|
+
const onPasswordRequired = vi.fn();
|
|
50
|
+
render(
|
|
51
|
+
<SignInReturningStep
|
|
52
|
+
session={{ email: EMAIL, lastProvider: 'google' }}
|
|
53
|
+
onNotYou={vi.fn()}
|
|
54
|
+
onProviderClicked={onProviderClicked}
|
|
55
|
+
onPasswordRequired={onPasswordRequired}
|
|
56
|
+
/>,
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
fireEvent.click(screen.getByRole('button', { name: /auth.continueWithProvider/ }));
|
|
60
|
+
|
|
61
|
+
await waitFor(() => expect(onPasswordRequired).toHaveBeenCalledWith(EMAIL));
|
|
62
|
+
expect(onProviderClicked).toHaveBeenCalledWith('google');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('does not leave the redirect path when the sign-in started', async () => {
|
|
66
|
+
mocks.startSignIn.mockResolvedValue({ ok: true });
|
|
67
|
+
const onPasswordRequired = vi.fn();
|
|
68
|
+
render(
|
|
69
|
+
<SignInReturningStep
|
|
70
|
+
session={{ email: EMAIL, lastProvider: 'google' }}
|
|
71
|
+
onNotYou={vi.fn()}
|
|
72
|
+
onProviderClicked={vi.fn()}
|
|
73
|
+
onPasswordRequired={onPasswordRequired}
|
|
74
|
+
/>,
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
fireEvent.click(screen.getByRole('button', { name: /auth.continueWithProvider/ }));
|
|
78
|
+
|
|
79
|
+
await waitFor(() => expect(mocks.startSignIn).toHaveBeenCalledOnce());
|
|
80
|
+
expect(onPasswordRequired).not.toHaveBeenCalled();
|
|
81
|
+
});
|
|
82
|
+
});
|