@micha.bigler/ui-core-micha 3.14.3 → 4.0.0
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/CHANGELOG.md +31 -0
- package/README.md +7 -0
- package/dist/auth/UserMenu.js +1 -1
- package/dist/auth/apiClient.js +7 -6
- package/dist/chat/ChatList.js +1 -1
- package/dist/chat/ChatThread.js +2 -1
- package/dist/chat/ChatWorkspace.js +1 -1
- package/dist/chat/ModelPicker.js +2 -5
- package/dist/chat/kitSxRegistry.js +9 -0
- package/dist/chat/useChatSocket.js +1 -1
- package/dist/components/LoginForm.js +1 -1
- package/dist/components/SecurityComponent.js +1 -1
- package/dist/components/UserListComponent.js +2 -8
- package/dist/components/charts/ChartFrame.js +1 -1
- package/dist/components/charts/ScatterChart.js +2 -1
- package/dist/components/charts/kitSxRegistry.js +6 -0
- package/dist/entries/charts.js +6 -0
- package/dist/entries/chat.js +8 -0
- package/dist/entries/markdown.js +1 -0
- package/dist/index.js +0 -14
- package/dist/layout/SectionNav.js +1 -1
- package/dist/messaging/AttachmentList.js +2 -2
- package/dist/messaging/Composer.js +2 -1
- package/dist/messaging/ConversationLaunchers.js +1 -4
- package/dist/messaging/ConversationList.js +1 -1
- package/dist/messaging/DirectMessageLauncher.js +1 -1
- package/dist/messaging/MessagingProvider.js +0 -0
- package/dist/messaging/PollCard.js +7 -5
- package/dist/messaging/ReadTicks.js +2 -2
- package/dist/messaging/Thread.js +5 -3
- package/dist/notifications/NotificationBell.js +4 -7
- package/dist/notifications/NotificationSettings.js +1 -1
- package/dist/onboarding/OnboardingProvider.js +3 -6
- package/dist/pages/AccountPage.js +1 -2
- package/dist/pages/LoginPage.js +2 -3
- package/dist/pages/PasswordChangePage.js +2 -3
- package/dist/pages/PasswordInvitePage.js +2 -3
- package/dist/pages/PasswordResetRequestPage.js +2 -3
- package/dist/pages/SignUpPage.js +2 -3
- package/dist/pages/SignupConfirmPage.js +2 -3
- package/dist/theme/createAppTheme.js +5 -4
- package/dist/theme/kitSxEntry.js +11 -0
- package/dist/theme/kitSxRegistry.js +2 -15
- package/dist/theme/themeCompleteness.js +3 -12
- package/dist/utils/auth-errors.js +4 -3
- package/package.json +41 -16
- package/.github/workflows/publish.yml +0 -126
- package/DESIGN.md +0 -60
- package/WORK_ORDERS.md +0 -148
- package/dev/entries.jsx +0 -721
- package/dev/fixtures.js +0 -26
- package/dev/main.jsx +0 -75
- package/dev/mockTransport.jsx +0 -128
- package/docs/CHART-LAYOUT.md +0 -157
- package/docs/DARK-TOKENS.md +0 -140
- package/docs/TYPE-SCALE.md +0 -111
- package/docs/messaging-deviations.md +0 -118
- package/index.html +0 -12
- package/renovate.json +0 -10
- package/scripts/chart-api-census.mjs +0 -415
- package/src/auth/AuthContext.jsx +0 -158
- package/src/auth/ReauthModal.jsx +0 -82
- package/src/auth/UserMenu.jsx +0 -121
- package/src/auth/apiClient.jsx +0 -232
- package/src/auth/authApi.jsx +0 -539
- package/src/auth/authConfig.jsx +0 -34
- package/src/auth/reauth.js +0 -47
- package/src/chat/ChatComposer.jsx +0 -36
- package/src/chat/ChatList.jsx +0 -87
- package/src/chat/ChatThread.jsx +0 -128
- package/src/chat/ChatWorkspace.jsx +0 -244
- package/src/chat/MarkdownReply.jsx +0 -22
- package/src/chat/ModelPicker.jsx +0 -85
- package/src/chat/api.js +0 -18
- package/src/chat/useChatSocket.js +0 -32
- package/src/chat/wire.js +0 -7
- package/src/components/AccessCodeManager.jsx +0 -288
- package/src/components/AccessCodeSingleUseToggle.jsx +0 -92
- package/src/components/AllowedEmailDomainsManager.jsx +0 -92
- package/src/components/AuthFactorRequirementCard.jsx +0 -95
- package/src/components/BulkInviteCsvTab.jsx +0 -198
- package/src/components/EmptyState.jsx +0 -38
- package/src/components/LoginForm.jsx +0 -159
- package/src/components/MFAComponent.jsx +0 -350
- package/src/components/MfaLoginComponent.jsx +0 -252
- package/src/components/MobileBottomNav.jsx +0 -82
- package/src/components/PasskeysComponent.jsx +0 -252
- package/src/components/PasswordChangeForm.jsx +0 -87
- package/src/components/PasswordResetRequestForm.jsx +0 -43
- package/src/components/PasswordSetForm.jsx +0 -97
- package/src/components/ProfileComponent.jsx +0 -348
- package/src/components/QrSignupManager.jsx +0 -404
- package/src/components/QrSignupValidityManager.jsx +0 -106
- package/src/components/RegistrationMethodsManager.jsx +0 -150
- package/src/components/SecurityComponent.jsx +0 -141
- package/src/components/SocialLoginButtons.jsx +0 -83
- package/src/components/SoftChip.jsx +0 -93
- package/src/components/StatTile.jsx +0 -39
- package/src/components/SupportRecoveryRequestsTab.jsx +0 -482
- package/src/components/TurnstileWidget.jsx +0 -99
- package/src/components/UserInviteComponent.jsx +0 -76
- package/src/components/UserListComponent.jsx +0 -618
- package/src/components/charts/BarChart.jsx +0 -102
- package/src/components/charts/ChartFrame.jsx +0 -214
- package/src/components/charts/LineChart.jsx +0 -126
- package/src/components/charts/ScatterChart.jsx +0 -299
- package/src/components/charts/TimeSeriesChart.jsx +0 -300
- package/src/components/charts/chartDefaults.js +0 -644
- package/src/components/charts/chartLabels.js +0 -36
- package/src/components/charts/exportChart.js +0 -258
- package/src/components/charts/formatters.js +0 -39
- package/src/components/charts/palette.js +0 -33
- package/src/components/charts/yearTickInterval.js +0 -7
- package/src/i18n/authTranslations.ts +0 -2651
- package/src/i18n/chartsTranslations.ts +0 -91
- package/src/i18n/chatTranslations.ts +0 -55
- package/src/i18n/messagingTranslations.ts +0 -120
- package/src/i18n/notificationsTranslations.ts +0 -32
- package/src/i18n/onboardingTranslations.ts +0 -29
- package/src/i18n/sectionNavTranslations.ts +0 -20
- package/src/i18n/uiCoreTranslations.js +0 -29
- package/src/i18n/userMenuTranslations.ts +0 -5
- package/src/index.js +0 -158
- package/src/layout/PageLayout.jsx +0 -36
- package/src/layout/SectionNav.jsx +0 -320
- package/src/messaging/AttachmentList.jsx +0 -145
- package/src/messaging/Composer.jsx +0 -197
- package/src/messaging/ConversationLaunchers.jsx +0 -51
- package/src/messaging/ConversationList.jsx +0 -109
- package/src/messaging/DirectMessageLauncher.jsx +0 -112
- package/src/messaging/MessageBubble.jsx +0 -183
- package/src/messaging/MessagingProvider.jsx +0 -0
- package/src/messaging/MessagingScopeConfig.jsx +0 -24
- package/src/messaging/PollCard.jsx +0 -163
- package/src/messaging/ReactionBar.jsx +0 -43
- package/src/messaging/ReadTicks.jsx +0 -82
- package/src/messaging/Thread.jsx +0 -195
- package/src/messaging/api.js +0 -48
- package/src/messaging/composerImageCompression.js +0 -35
- package/src/messaging/linkifyText.jsx +0 -37
- package/src/notifications/NotificationBell.jsx +0 -84
- package/src/notifications/NotificationSettings.jsx +0 -330
- package/src/notifications/NotificationsProvider.jsx +0 -224
- package/src/notifications/PopupSurface.jsx +0 -105
- package/src/notifications/api.js +0 -55
- package/src/notifications/feedApi.js +0 -18
- package/src/notifications/realtime.jsx +0 -138
- package/src/notifications/serviceWorker/sw.js +0 -50
- package/src/onboarding/OnboardingProvider.jsx +0 -326
- package/src/onboarding/OnboardingWizard.jsx +0 -61
- package/src/onboarding/WizardDialogShell.jsx +0 -51
- package/src/onboarding/api.js +0 -13
- package/src/onboarding/stepSelection.js +0 -16
- package/src/onboarding/steps/BrowserPushStep.jsx +0 -121
- package/src/onboarding/steps/CompleteNameStep.jsx +0 -46
- package/src/onboarding/steps/CookieConsentStep.jsx +0 -133
- package/src/onboarding/steps/PwaInstallStep.jsx +0 -47
- package/src/pages/AccountPage.jsx +0 -394
- package/src/pages/LoginPage.jsx +0 -343
- package/src/pages/PasswordChangePage.jsx +0 -62
- package/src/pages/PasswordInvitePage.jsx +0 -177
- package/src/pages/PasswordResetRequestPage.jsx +0 -68
- package/src/pages/SignUpPage.jsx +0 -268
- package/src/pages/SignupConfirmPage.jsx +0 -155
- package/src/testing/checkKitIntegration.js +0 -233
- package/src/theme/createAppTheme.js +0 -423
- package/src/theme/fonts.js +0 -3
- package/src/theme/index.js +0 -21
- package/src/theme/kitSxRegistry.js +0 -285
- package/src/theme/themeCompleteness.js +0 -1045
- package/src/theme/tokens.js +0 -478
- package/src/utils/auth-errors.js +0 -76
- package/src/utils/authService.js +0 -223
- package/src/utils/resolveErrorText.js +0 -28
- package/src/utils/webauthn.js +0 -51
- package/tests/AccountPage.profileStatements.test.jsx +0 -162
- package/tests/AccountPage.test.jsx +0 -200
- package/tests/AuthContext.test.jsx +0 -129
- package/tests/BarChart.test.jsx +0 -112
- package/tests/BrowserPushStep.test.jsx +0 -110
- package/tests/ChartFrame.test.jsx +0 -336
- package/tests/ConversationList.test.jsx +0 -144
- package/tests/CookieConsentStep.test.jsx +0 -69
- package/tests/EmptyState.test.jsx +0 -62
- package/tests/LineChart.test.jsx +0 -80
- package/tests/MessagingProvider.test.jsx +0 -50
- package/tests/MobileBottomNav.test.jsx +0 -319
- package/tests/NotificationBell.test.jsx +0 -60
- package/tests/NotificationSettings.test.jsx +0 -276
- package/tests/NotificationsProvider.test.jsx +0 -240
- package/tests/OnboardingProvider.test.jsx +0 -294
- package/tests/OnboardingWizard.test.jsx +0 -143
- package/tests/PasswordChangeForm.test.jsx +0 -70
- package/tests/PasswordInvitePage.test.jsx +0 -142
- package/tests/PasswordSetForm.test.jsx +0 -70
- package/tests/PopupSurface.test.jsx +0 -142
- package/tests/ProfileComponent.refresh.test.jsx +0 -194
- package/tests/QrSignupManager.registrationContext.test.jsx +0 -106
- package/tests/QrSignupManagerInfoBox.test.jsx +0 -49
- package/tests/ScatterChart.test.jsx +0 -270
- package/tests/SectionNav.test.jsx +0 -363
- package/tests/SignUpPage.test.jsx +0 -208
- package/tests/SoftChip.test.jsx +0 -105
- package/tests/StatTile.test.jsx +0 -57
- package/tests/Thread.test.jsx +0 -151
- package/tests/TimeSeriesChart.test.jsx +0 -367
- package/tests/UserListComponent.test.jsx +0 -192
- package/tests/UserMenu.test.jsx +0 -171
- package/tests/apiClientLanguage.test.js +0 -33
- package/tests/apiClientPublicPaths.test.js +0 -178
- package/tests/authApiLogin.test.js +0 -42
- package/tests/authApiRegistration.test.js +0 -31
- package/tests/authErrorCodeRendering.test.jsx +0 -77
- package/tests/authErrors.test.js +0 -74
- package/tests/authTranslations.test.js +0 -74
- package/tests/chart-api-census.test.js +0 -366
- package/tests/chartAxisTickBand.test.jsx +0 -95
- package/tests/chartDefaults.test.js +0 -902
- package/tests/chartLabels.test.js +0 -50
- package/tests/chartsPalette.test.js +0 -99
- package/tests/chatApi.test.js +0 -48
- package/tests/chatDriverNames.test.jsx +0 -71
- package/tests/chatExports.test.js +0 -3
- package/tests/chatList.test.jsx +0 -84
- package/tests/chatPicker.test.jsx +0 -82
- package/tests/chatSocket.test.jsx +0 -26
- package/tests/chatThread.test.jsx +0 -116
- package/tests/chatTranslations.test.js +0 -47
- package/tests/chatWorkspace.test.jsx +0 -234
- package/tests/checkKitIntegration.test.jsx +0 -219
- package/tests/createAppTheme.test.js +0 -132
- package/tests/createAppThemeDark.test.js +0 -127
- package/tests/createAppThemeLightGuard.test.js +0 -40
- package/tests/createAppThemePageContrast.test.js +0 -108
- package/tests/createAppThemeTypography.test.js +0 -53
- package/tests/errorCallSiteGuard.test.js +0 -32
- package/tests/exportChart.test.js +0 -313
- package/tests/feedApi.test.js +0 -46
- package/tests/fixtures/light-theme-baseline.json +0 -2234
- package/tests/i18nAggregate.test.js +0 -120
- package/tests/i18nGermanVariant.test.js +0 -65
- package/tests/loginPageErrorResolution.test.jsx +0 -102
- package/tests/messagingApi.test.js +0 -32
- package/tests/messagingChunk6.test.jsx +0 -116
- package/tests/messagingCompactBubble.test.jsx +0 -64
- package/tests/messagingComposer.test.jsx +0 -136
- package/tests/messagingComposerChunk5.test.jsx +0 -113
- package/tests/messagingContractConformance.test.js +0 -69
- package/tests/messagingDirectMessageLauncher.test.jsx +0 -151
- package/tests/messagingExports.test.js +0 -21
- package/tests/messagingInteractions.test.jsx +0 -136
- package/tests/messagingLastMessagePreview.test.jsx +0 -93
- package/tests/messagingLinkify.test.jsx +0 -51
- package/tests/messagingMessageActions.test.jsx +0 -163
- package/tests/messagingMsg6.test.jsx +0 -105
- package/tests/messagingMsg6f.test.jsx +0 -155
- package/tests/messagingMsg6g.test.jsx +0 -166
- package/tests/messagingMsg6h.test.jsx +0 -136
- package/tests/messagingMsg6i.test.jsx +0 -129
- package/tests/messagingPollRendering.test.jsx +0 -142
- package/tests/messagingReactionMerge.test.jsx +0 -77
- package/tests/messagingReadTicksTooltip.test.jsx +0 -36
- package/tests/messagingThreadReceipts.test.jsx +0 -178
- package/tests/messagingThreadingQuoting.test.jsx +0 -87
- package/tests/messagingUnreadLifecycle.test.jsx +0 -78
- package/tests/notificationsApi.test.js +0 -41
- package/tests/notificationsExports.test.js +0 -34
- package/tests/onboardingDescriptors.test.js +0 -132
- package/tests/packageTreeShaking.test.js +0 -126
- package/tests/realtime.test.jsx +0 -219
- package/tests/resolveErrorText.test.js +0 -72
- package/tests/stepSelection.test.js +0 -53
- package/tests/themeCompleteness.test.js +0 -626
- package/tests/timeSeriesLegend.test.js +0 -99
- package/tests/userScreenTranslations.test.jsx +0 -218
- package/tsconfig.build.json +0 -18
- package/vite.config.mjs +0 -6
- package/work-orders/AUTH-1.md +0 -74
- package/work-orders/AUTH-2.md +0 -74
- package/work-orders/AUTH-4.md +0 -183
- package/work-orders/AUTH-5.md +0 -154
- package/work-orders/AUTH-7.md +0 -181
- package/work-orders/AUTH-8.md +0 -184
- package/work-orders/CHART-1.md +0 -285
- package/work-orders/CHART-2.md +0 -222
- package/work-orders/CHART-3.md +0 -163
- package/work-orders/CHART-4.md +0 -203
- package/work-orders/CHART-5.md +0 -226
- package/work-orders/CHART-6.md +0 -428
- package/work-orders/CHART-7.md +0 -175
- package/work-orders/DX-1.md +0 -169
- package/work-orders/DX-2.md +0 -188
- package/work-orders/DX-3.md +0 -195
- package/work-orders/I18N-1.md +0 -254
- package/work-orders/I18N-3.md +0 -207
- package/work-orders/MSG-3.md +0 -375
- package/work-orders/MSG-3b.md +0 -1002
- package/work-orders/MSG-3c.md +0 -378
- package/work-orders/MSG-3d.md +0 -268
- package/work-orders/MSG-3e.md +0 -164
- package/work-orders/MSG-3f.md +0 -391
- package/work-orders/MSG-6e.md +0 -308
- package/work-orders/MSG-6f.md +0 -214
- package/work-orders/MSG-6g.md +0 -244
- package/work-orders/MSG-6h.md +0 -238
- package/work-orders/MSG-6i.md +0 -271
- package/work-orders/MSG-6j.md +0 -117
- package/work-orders/NOTIF-12.md +0 -214
- package/work-orders/NOTIF-13.md +0 -142
- package/work-orders/NOTIF-14.md +0 -151
- package/work-orders/PRIM-1.md +0 -177
- package/work-orders/SHELL-1.md +0 -255
- package/work-orders/SHELL-2.md +0 -197
- package/work-orders/SHELL-3.md +0 -359
- package/work-orders/SHELL-4.md +0 -351
- package/work-orders/SHELL-5.md +0 -345
- package/work-orders/SHELL-6.md +0 -210
- package/work-orders/THEME-1.md +0 -587
- package/work-orders/THEME-10.md +0 -303
- package/work-orders/THEME-11.md +0 -208
- package/work-orders/THEME-2.md +0 -339
- package/work-orders/THEME-3.md +0 -210
- package/work-orders/THEME-4.md +0 -271
- package/work-orders/THEME-5.md +0 -341
- package/work-orders/THEME-6.md +0 -247
- package/work-orders/THEME-7.md +0 -82
- package/work-orders/THEME-8.md +0 -211
- package/work-orders/THEME-9.md +0 -194
- package/work-orders/UCM-AUTH-10.md +0 -490
- package/work-orders/UCM-AUTH-11.md +0 -185
- package/work-orders/UCM-AUTH-12.md +0 -98
- package/work-orders/UCM-AUTH-13.md +0 -47
- package/work-orders/UCM-AUTH-9.md +0 -207
- package/work-orders/UCM-CHART-10.md +0 -150
- package/work-orders/UCM-CHART-11.md +0 -132
- package/work-orders/UCM-CHART-12.md +0 -348
- package/work-orders/UCM-CHART-13.md +0 -122
- package/work-orders/UCM-CHART-14.md +0 -198
- package/work-orders/UCM-CHART-15.md +0 -187
- package/work-orders/UCM-CHART-16.md +0 -169
- package/work-orders/UCM-CHART-17.md +0 -195
- package/work-orders/UCM-CHART-18.md +0 -200
- package/work-orders/UCM-CHART-8.md +0 -147
- package/work-orders/UCM-CHART-9.md +0 -265
- package/work-orders/UCM-CHAT-1.md +0 -190
- package/work-orders/UCM-CHAT-2.md +0 -75
- package/work-orders/UCM-DEP-1.md +0 -63
- package/work-orders/UCM-I18N-4.md +0 -226
- package/work-orders/UCM-I18N-5.md +0 -211
- package/work-orders/UCM-MSG-20.md +0 -192
- package/work-orders/UCM-PRIM-2.md +0 -114
- package/work-orders/UCM-SHELL-7.md +0 -134
- package/work-orders/UCM-SHELL-8.md +0 -125
- package/work-orders/UCM-TEST-1.md +0 -304
- package/work-orders/UCM-THEME-13.md +0 -69
- package/work-orders/UCM-THEME-14.md +0 -312
- package/work-orders/UCM-THEME-15.md +0 -356
- package/work-orders/UCM-THEME-16.md +0 -80
- package/work-orders/UCM-THEME-17.md +0 -111
- package/work-orders/UCM-THEME-18.md +0 -184
- package/work-orders/assets/AUTH-4-user-list-card.html +0 -407
- package/work-orders/assets/PRIM-1-dashboard-primitives.html +0 -624
- package/work-orders/assets/SHELL-2-account-navigation.html +0 -1159
- package/work-orders/assets/THEME-1-baseline-reference-sheet.html +0 -1352
- package/work-orders/assets/UCM-CHAT-1-ai-chat.html +0 -447
- package/work-orders/assets/UCM-THEME-13-dark-prototype.html +0 -390
- package/work-orders/assets/UCM-THEME-17-type-scale.html +0 -391
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 4.0.0 - UCM-DEP-2
|
|
4
|
+
|
|
5
|
+
Breaking: a consumer installs only the peers of the features it imports. The package gets an `exports` map, so deep
|
|
6
|
+
imports such as `.../dist/...` no longer resolve. Only `dist`, `README.md` and `CHANGELOG.md` are published.
|
|
7
|
+
|
|
8
|
+
Peers: `react-helmet` is gone (the seven auth/account pages render a native React 19 `<title>`, text unchanged).
|
|
9
|
+
`@mui/icons-material` is now a required peer (it was used at runtime but only a devDependency), same range as
|
|
10
|
+
`@mui/material`. `i18next` is `>= 26.2.0`. `@mui/x-charts`, `react-markdown` and `remark-gfm` are optional peers,
|
|
11
|
+
needed only for the sub-paths below. `react-markdown` and `remark-gfm` are no longer dependencies.
|
|
12
|
+
`qrcode.react` stays a required peer: `AccountPage` renders `QrSignupManager`, so QR stays in the main entry.
|
|
13
|
+
|
|
14
|
+
| Old import (main entry) | New import | Optional peers needed |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| `ChartFrame`, `BarChart`, `LineChart`, `TimeSeriesChart`, `ScatterChart`, `ScatterReferenceCurve`, `ScatterReferenceLine`, `scaleBubbleRadius` | `@micha.bigler/ui-core-micha/charts` | `@mui/x-charts` |
|
|
17
|
+
| `ChatWorkspace`, `ChatList`, `ChatThread`, `ChatComposer`, `ModelPicker`, `useChatSocket`, `createChatApi`, `defaultChatApi` | `@micha.bigler/ui-core-micha/chat` | `react-markdown`, `remark-gfm` |
|
|
18
|
+
| `MarkdownReply` | `@micha.bigler/ui-core-micha/markdown` | `react-markdown`, `remark-gfm` |
|
|
19
|
+
|
|
20
|
+
Unchanged in the main entry: `getNeutralChartPalette`, `useNeutralChartPalette`, the `formatShort*` and chart
|
|
21
|
+
formatter helpers, `yearTickInterval`, `chartsTranslations`, `chatTranslations`, auth, messaging, notifications,
|
|
22
|
+
onboarding, layout and theme exports.
|
|
23
|
+
|
|
24
|
+
`KIT_COMPONENT_SX_REGISTRY` now lists only components of the main entry. The sx registry entries of the moved
|
|
25
|
+
components are `CHARTS_KIT_SX_REGISTRY` (from `/charts`) and `CHAT_KIT_SX_REGISTRY` (from `/chat`); concatenate them
|
|
26
|
+
where a check needs the full set. The theme (`createAppTheme`) no longer reaches charts, chat or markdown modules.
|
|
27
|
+
|
|
28
|
+
## 3.14.4 - UCM-DEP-1
|
|
29
|
+
|
|
30
|
+
Dependency updates. The runtime dependency `@fontsource/dm-sans` moves to ^5.3.0; the peer dependency ranges are
|
|
31
|
+
unchanged. Tooling: TypeScript 7 (`moduleResolution: Bundler` in `tsconfig.build.json`), vitest 5, jsdom 30, pnpm 12
|
|
32
|
+
and updated GitHub Actions in both workflows. No source or API change.
|
|
33
|
+
|
|
3
34
|
## 3.14.3 - UCM-CHAT-1 publish fix
|
|
4
35
|
|
|
5
36
|
3.14.0 to 3.14.2 were never published: `themeCompleteness` rejected the chat components' inline `sx` on baseline-styled
|
package/README.md
CHANGED
|
@@ -37,3 +37,10 @@ it('kit integration is sound', async () => {
|
|
|
37
37
|
`StatTile` (a bordered KPI tile) and `SoftChip` (a soft tinted annotation/status chip, tones derived from `theme.palette[tone]`) live under `src/components/` and are exported from the package root.
|
|
38
38
|
|
|
39
39
|
`EmptyState` (an icon/title/description/action empty-section placeholder, built from theme tokens) lives under `src/components/` and is exported from the package root.
|
|
40
|
+
|
|
41
|
+
## Sub-path imports and optional peers
|
|
42
|
+
|
|
43
|
+
The main entry needs only the required peers. Charts, the chat surface and `MarkdownReply` live on sub-paths whose
|
|
44
|
+
extra peers are optional: `@micha.bigler/ui-core-micha/charts` (`@mui/x-charts`), `/chat` and `/markdown`
|
|
45
|
+
(`react-markdown`, `remark-gfm`). Install those peers only in apps that import the sub-path. The 4.0.0 entry in
|
|
46
|
+
`CHANGELOG.md` has the migration table.
|
package/dist/auth/UserMenu.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useContext, useState } from 'react';
|
|
3
3
|
import { Avatar, Box, Divider, IconButton, Menu, MenuItem, Typography, } from '@mui/material';
|
|
4
4
|
import { useTheme } from '@mui/material/styles';
|
package/dist/auth/apiClient.js
CHANGED
|
@@ -149,20 +149,21 @@ function extractAuthSignal(data) {
|
|
|
149
149
|
return { code: null, i18nKey: null };
|
|
150
150
|
}
|
|
151
151
|
apiClient.interceptors.response.use((response) => response, async (error) => {
|
|
152
|
-
var _a, _b, _c, _d, _e
|
|
153
|
-
|
|
154
|
-
const
|
|
152
|
+
var _a, _b, _c, _d, _e;
|
|
153
|
+
var _f, _g, _h, _j;
|
|
154
|
+
const status = (_f = (_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.status) !== null && _f !== void 0 ? _f : null;
|
|
155
|
+
const data = (_g = (_b = error === null || error === void 0 ? void 0 : error.response) === null || _b === void 0 ? void 0 : _b.data) !== null && _g !== void 0 ? _g : {};
|
|
155
156
|
const { code, i18nKey } = extractAuthSignal(data);
|
|
156
157
|
const isAuthStatus = status === 401 || status === 403;
|
|
157
158
|
const isNotAuthenticated = code === "not_authenticated" || i18nKey === "auth.not_authenticated";
|
|
158
159
|
// Reauthentication gate: allauth returns 401 + flows[{id:"reauthenticate"}]
|
|
159
160
|
// when the session is stale before a sensitive operation (e.g. adding a passkey).
|
|
160
161
|
// Show the password-confirm modal, wait for it to complete, then retry once.
|
|
161
|
-
const flows = (
|
|
162
|
+
const flows = (_j = (_h = (_c = data === null || data === void 0 ? void 0 : data.data) === null || _c === void 0 ? void 0 : _c.flows) !== null && _h !== void 0 ? _h : data === null || data === void 0 ? void 0 : data.flows) !== null && _j !== void 0 ? _j : [];
|
|
162
163
|
const needsReauth = status === 401 &&
|
|
163
164
|
Array.isArray(flows) &&
|
|
164
165
|
flows.some((f) => f.id === "reauthenticate");
|
|
165
|
-
if (needsReauth && !((
|
|
166
|
+
if (needsReauth && !((_d = error.config) === null || _d === void 0 ? void 0 : _d._reauthRetried)) {
|
|
166
167
|
try {
|
|
167
168
|
await requestReauth();
|
|
168
169
|
return apiClient(Object.assign(Object.assign({}, error.config), { _reauthRetried: true }));
|
|
@@ -175,7 +176,7 @@ apiClient.interceptors.response.use((response) => response, async (error) => {
|
|
|
175
176
|
// expect to handle 401 silently and must not trigger a redirect-on-mount.
|
|
176
177
|
// Carried as an axios config property, so it never travels to the backend
|
|
177
178
|
// (would otherwise trigger a CORS preflight on cross-origin requests).
|
|
178
|
-
const skipRedirect = ((
|
|
179
|
+
const skipRedirect = ((_e = error === null || error === void 0 ? void 0 : error.config) === null || _e === void 0 ? void 0 : _e.skipAuthRedirect) === true;
|
|
179
180
|
if (isAuthStatus && isNotAuthenticated && !skipRedirect) {
|
|
180
181
|
redirectToLoginOnce();
|
|
181
182
|
}
|
package/dist/chat/ChatList.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React, { useState } from 'react';
|
|
3
3
|
import { Badge, Box, Button, Collapse, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, IconButton, List, ListItem, ListItemButton, ListItemText, Menu, MenuItem, Stack, TextField } from '@mui/material';
|
|
4
4
|
import { MoreVert } from '@mui/icons-material';
|
package/dist/chat/ChatThread.js
CHANGED
|
@@ -43,7 +43,8 @@ export function ChatThread({ turns = [], tool = null, notice = null, hasOlder =
|
|
|
43
43
|
}, [(_a = turns[0]) === null || _a === void 0 ? void 0 : _a.id]);
|
|
44
44
|
const loadingOlder = useRef(false); // one request at a time, also across rapid scroll events
|
|
45
45
|
const loadOlder = async () => {
|
|
46
|
-
var _a
|
|
46
|
+
var _a;
|
|
47
|
+
var _b;
|
|
47
48
|
if (loadingOlder.current)
|
|
48
49
|
return;
|
|
49
50
|
loadingOlder.current = true;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
3
3
|
import { Alert, Box, Button, Chip, Drawer, Stack, Typography, useMediaQuery, useTheme } from '@mui/material';
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
package/dist/chat/ModelPicker.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React, { useMemo, useRef, useState } from 'react';
|
|
3
3
|
import { Box, Button, Chip, Drawer, List, ListItemButton, ListItemText, Popover, Stack, ToggleButton, ToggleButtonGroup, Typography, useMediaQuery, useTheme } from '@mui/material';
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
@@ -28,10 +28,7 @@ export function ModelPicker({ entries = [], selection, onChange, disabled = fals
|
|
|
28
28
|
onChange === null || onChange === void 0 ? void 0 : onChange({ entry: entry.id, effort });
|
|
29
29
|
};
|
|
30
30
|
const content = (_jsx(Box, { sx: { p: 2, minWidth: narrow ? 0 : 320, maxWidth: '100%' }, children: _jsxs(Stack, { spacing: 1.5, children: [Object.entries(groups).map(([driver, items]) => (_jsxs(Box, { role: "group", "aria-label": driverName(t, driver), children: [_jsx(Typography, { variant: "overline", color: "text.secondary", children: driverName(t, driver) }), _jsx(List, { dense: true, disablePadding: true, children: items.map((entry) => (_jsxs(ListItemButton, { selected: entry.id === (selection === null || selection === void 0 ? void 0 : selection.entry), onClick: () => pickEntry(entry), sx: { minHeight: 40, borderRadius: 1 }, children: [_jsx(ListItemText, { primary: entry.label || entry.model }), entry.billing === 'pay_per_use' ? _jsx(Chip, { size: "small", variant: "outlined", label: t('Chat.payPerUse') }) : null] }, entry.id))) })] }, driver))), _jsxs(Box, { children: [_jsx(Typography, { variant: "overline", color: "text.secondary", children: t('Chat.effortLabel') }), _jsx(ToggleButtonGroup, { exclusive: true, fullWidth: true, size: "small", "aria-label": t('Chat.effortLabel'), value: (selection === null || selection === void 0 ? void 0 : selection.effort) || null, onChange: (_event, effort) => { if (effort && active)
|
|
31
|
-
onChange === null || onChange === void 0 ? void 0 : onChange({ entry: active.id, effort }); }, children: EFFORT_LEVELS.map((effort) => {
|
|
32
|
-
var _a;
|
|
33
|
-
return (_jsx(ToggleButton, { value: effort, disabled: !((_a = active === null || active === void 0 ? void 0 : active.efforts) === null || _a === void 0 ? void 0 : _a.includes(effort)), sx: { minHeight: 40 }, children: t(`Chat.effort.${effort}`) }, effort));
|
|
34
|
-
}) })] })] }) }));
|
|
31
|
+
onChange === null || onChange === void 0 ? void 0 : onChange({ entry: active.id, effort }); }, children: EFFORT_LEVELS.map((effort) => { var _a; return (_jsx(ToggleButton, { value: effort, disabled: !((_a = active === null || active === void 0 ? void 0 : active.efforts) === null || _a === void 0 ? void 0 : _a.includes(effort)), sx: { minHeight: 40 }, children: t(`Chat.effort.${effort}`) }, effort)); }) })] })] }) }));
|
|
35
32
|
const label = active ? [active.label || active.model, (selection === null || selection === void 0 ? void 0 : selection.effort) && t(`Chat.effort.${selection.effort}`)].filter(Boolean).join(' · ') : t('Chat.chooseModel');
|
|
36
33
|
return (_jsxs(_Fragment, { children: [_jsx(Button, { ref: anchor, size: "small", color: "inherit", disabled: disabled || entries.length === 0, onClick: () => setOpen(true), "aria-haspopup": "dialog", children: label }), narrow ? (_jsx(Drawer, { anchor: "bottom", open: isOpen, onClose: () => setOpen(false), children: content })) : (_jsx(Popover, { open: isOpen, anchorEl: anchor.current, onClose: () => setOpen(false), anchorOrigin: { vertical: 'bottom', horizontal: 'left' }, children: content }))] }));
|
|
37
34
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { createKitSxEntry } from '../theme/kitSxEntry';
|
|
2
|
+
import { CHAT_LIST_ARCHIVED_ACTION_SX, CHAT_LIST_ROW_ACTION_SX } from './ChatList';
|
|
3
|
+
import { CHAT_THREAD_NOTICE_SX, CHAT_THREAD_TOOL_CHIP_SX } from './ChatThread';
|
|
4
|
+
export const CHAT_KIT_SX_REGISTRY = [
|
|
5
|
+
createKitSxEntry('ChatList.rowAction', 'MuiIconButton', CHAT_LIST_ROW_ACTION_SX, 'CHAT_LIST_ROW_ACTION_SX'),
|
|
6
|
+
createKitSxEntry('ChatList.archivedAction', 'MuiButton', CHAT_LIST_ARCHIVED_ACTION_SX, 'CHAT_LIST_ARCHIVED_ACTION_SX'),
|
|
7
|
+
createKitSxEntry('ChatThread.toolChip', 'MuiChip', CHAT_THREAD_TOOL_CHIP_SX, 'CHAT_THREAD_TOOL_CHIP_SX'),
|
|
8
|
+
createKitSxEntry('ChatThread.notice', 'MuiAlert', CHAT_THREAD_NOTICE_SX, 'CHAT_THREAD_NOTICE_SX'),
|
|
9
|
+
];
|
|
@@ -32,7 +32,7 @@ export function useChatSocket(chatId, { wsUrl = defaultChatWsUrl, onFrame, onOpe
|
|
|
32
32
|
if (frame && typeof frame === 'object')
|
|
33
33
|
(_b = (_a = callbacks.current).onFrame) === null || _b === void 0 ? void 0 : _b.call(_a, frame, chatId);
|
|
34
34
|
}
|
|
35
|
-
catch (
|
|
35
|
+
catch (_c) { /* Ignore malformed frames. */ } };
|
|
36
36
|
ws.onclose = (event) => {
|
|
37
37
|
var _a, _b, _c, _d, _e, _f;
|
|
38
38
|
if (!alive || socket.current !== ws)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React, { useState, useEffect } from 'react';
|
|
3
3
|
import { Box, TextField, Button, Typography, Divider, } from '@mui/material';
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// src/auth/components/SecurityComponent.jsx
|
|
3
3
|
import React, { useContext, useMemo, useState } from 'react';
|
|
4
4
|
import { Box, Typography, Divider, Alert, } from '@mui/material';
|
|
@@ -265,10 +265,7 @@ export function UserListComponent({ roles = DEFAULT_ROLES, currentUser, extraCol
|
|
|
265
265
|
align: 'center',
|
|
266
266
|
headerAlign: 'center',
|
|
267
267
|
valueGetter: (row) => { var _a; return Boolean(((_a = row === null || row === void 0 ? void 0 : row.profile) === null || _a === void 0 ? void 0 : _a.is_new) || (row === null || row === void 0 ? void 0 : row.is_new)); },
|
|
268
|
-
renderCell: (row) => {
|
|
269
|
-
var _a;
|
|
270
|
-
return renderBooleanStatusIcon(Boolean(((_a = row === null || row === void 0 ? void 0 : row.profile) === null || _a === void 0 ? void 0 : _a.is_new) || (row === null || row === void 0 ? void 0 : row.is_new)), t('Common.YES', 'Yes'), t('Common.NO', 'No'));
|
|
271
|
-
},
|
|
268
|
+
renderCell: (row) => { var _a; return renderBooleanStatusIcon(Boolean(((_a = row === null || row === void 0 ? void 0 : row.profile) === null || _a === void 0 ? void 0 : _a.is_new) || (row === null || row === void 0 ? void 0 : row.is_new)), t('Common.YES', 'Yes'), t('Common.NO', 'No')); },
|
|
272
269
|
});
|
|
273
270
|
}
|
|
274
271
|
if (showSuccessfulLoginColumn) {
|
|
@@ -281,10 +278,7 @@ export function UserListComponent({ roles = DEFAULT_ROLES, currentUser, extraCol
|
|
|
281
278
|
align: 'center',
|
|
282
279
|
headerAlign: 'center',
|
|
283
280
|
valueGetter: (row) => { var _a; return Boolean((_a = row === null || row === void 0 ? void 0 : row.successful_login) !== null && _a !== void 0 ? _a : row === null || row === void 0 ? void 0 : row.last_login); },
|
|
284
|
-
renderCell: (row) => {
|
|
285
|
-
var _a;
|
|
286
|
-
return renderBooleanStatusIcon(Boolean((_a = row === null || row === void 0 ? void 0 : row.successful_login) !== null && _a !== void 0 ? _a : row === null || row === void 0 ? void 0 : row.last_login), t('Common.YES', 'Yes'), t('Common.NO', 'No'));
|
|
287
|
-
},
|
|
281
|
+
renderCell: (row) => { var _a; return renderBooleanStatusIcon(Boolean((_a = row === null || row === void 0 ? void 0 : row.successful_login) !== null && _a !== void 0 ? _a : row === null || row === void 0 ? void 0 : row.last_login), t('Common.YES', 'Yes'), t('Common.NO', 'No')); },
|
|
288
282
|
});
|
|
289
283
|
}
|
|
290
284
|
if (showRoleColumn) {
|
|
@@ -9,7 +9,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
9
9
|
}
|
|
10
10
|
return t;
|
|
11
11
|
};
|
|
12
|
-
import {
|
|
12
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
13
|
import React, { useId, useRef, useState } from 'react';
|
|
14
14
|
import { Alert, Box, Button, CircularProgress, Paper, Stack, Tooltip, Typography, } from '@mui/material';
|
|
15
15
|
import { useTranslation } from 'react-i18next';
|
|
@@ -40,7 +40,8 @@ export function scaleBubbleRadius(value, maxValue, { minRadius = BUBBLE_MIN_RADI
|
|
|
40
40
|
// continuous-scale colour) can only be expressed by replacing the marker itself.
|
|
41
41
|
function makeMarkerSlot(seriesById, { sizeAccessor, chartMax, getPointStyle }) {
|
|
42
42
|
return function PresetScatterMarker(_a) {
|
|
43
|
-
var _b, _c
|
|
43
|
+
var _b, _c;
|
|
44
|
+
var _d, _e, _f, _g;
|
|
44
45
|
var { seriesId, dataIndex, color, x, y, isHighlighted, isFaded, size, onClick } = _a, rest = __rest(_a, ["seriesId", "dataIndex", "color", "x", "y", "isHighlighted", "isFaded", "size", "onClick"]);
|
|
45
46
|
const point = (_c = (_b = seriesById[seriesId]) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c[dataIndex];
|
|
46
47
|
const style = point && getPointStyle ? (getPointStyle(point, { seriesId, dataIndex }) || {}) : {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createKitSxEntry } from '../../theme/kitSxEntry';
|
|
2
|
+
import { CHART_FRAME_ALERT_SX, CHART_FRAME_ROOT_SX } from './ChartFrame';
|
|
3
|
+
export const CHARTS_KIT_SX_REGISTRY = [
|
|
4
|
+
createKitSxEntry('ChartFrame.root', 'MuiPaper', CHART_FRAME_ROOT_SX, 'CHART_FRAME_ROOT_SX'),
|
|
5
|
+
createKitSxEntry('ChartFrame.alert', 'MuiAlert', CHART_FRAME_ALERT_SX, 'CHART_FRAME_ALERT_SX'),
|
|
6
|
+
];
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ChartFrame } from '../components/charts/ChartFrame';
|
|
2
|
+
export { BarChart } from '../components/charts/BarChart';
|
|
3
|
+
export { LineChart } from '../components/charts/LineChart';
|
|
4
|
+
export { TimeSeriesChart } from '../components/charts/TimeSeriesChart';
|
|
5
|
+
export { ScatterChart, ScatterReferenceCurve, ScatterReferenceLine, scaleBubbleRadius, } from '../components/charts/ScatterChart';
|
|
6
|
+
export { CHARTS_KIT_SX_REGISTRY } from '../components/charts/kitSxRegistry';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { ChatWorkspace } from '../chat/ChatWorkspace';
|
|
2
|
+
export { ChatList } from '../chat/ChatList';
|
|
3
|
+
export { ChatThread } from '../chat/ChatThread';
|
|
4
|
+
export { ChatComposer } from '../chat/ChatComposer';
|
|
5
|
+
export { ModelPicker } from '../chat/ModelPicker';
|
|
6
|
+
export { useChatSocket } from '../chat/useChatSocket';
|
|
7
|
+
export { createChatApi, defaultChatApi } from '../chat/api';
|
|
8
|
+
export { CHAT_KIT_SX_REGISTRY } from '../chat/kitSxRegistry';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as MarkdownReply } from '../chat/MarkdownReply';
|
package/dist/index.js
CHANGED
|
@@ -43,11 +43,6 @@ export { default as StatTile } from './components/StatTile';
|
|
|
43
43
|
export { default as SoftChip } from './components/SoftChip';
|
|
44
44
|
export { default as EmptyState } from './components/EmptyState';
|
|
45
45
|
// --- 6. Charts ---
|
|
46
|
-
export { ChartFrame } from './components/charts/ChartFrame';
|
|
47
|
-
export { BarChart } from './components/charts/BarChart';
|
|
48
|
-
export { LineChart } from './components/charts/LineChart';
|
|
49
|
-
export { TimeSeriesChart } from './components/charts/TimeSeriesChart';
|
|
50
|
-
export { ScatterChart, ScatterReferenceCurve, ScatterReferenceLine, scaleBubbleRadius, } from './components/charts/ScatterChart';
|
|
51
46
|
export { getNeutralChartPalette, useNeutralChartPalette } from './components/charts/palette';
|
|
52
47
|
export { formatShortTime, formatShortDate, formatShortMonth, formatShortYear, } from './components/charts/chartLabels';
|
|
53
48
|
export { yearTickInterval } from './components/charts/yearTickInterval';
|
|
@@ -78,15 +73,6 @@ export { AttachmentList } from './messaging/AttachmentList';
|
|
|
78
73
|
export { ReactionBar } from './messaging/ReactionBar';
|
|
79
74
|
export { PollCard } from './messaging/PollCard';
|
|
80
75
|
export { MessagingScopeConfig } from './messaging/MessagingScopeConfig';
|
|
81
|
-
// --- Shared AI chat ---
|
|
82
|
-
export { ChatWorkspace } from './chat/ChatWorkspace';
|
|
83
|
-
export { ChatList } from './chat/ChatList';
|
|
84
|
-
export { ChatThread } from './chat/ChatThread';
|
|
85
|
-
export { ChatComposer } from './chat/ChatComposer';
|
|
86
|
-
export { ModelPicker } from './chat/ModelPicker';
|
|
87
|
-
export { default as MarkdownReply } from './chat/MarkdownReply';
|
|
88
|
-
export { useChatSocket } from './chat/useChatSocket';
|
|
89
|
-
export { createChatApi, defaultChatApi } from './chat/api';
|
|
90
76
|
// --- 9. Onboarding ---
|
|
91
77
|
export * from './onboarding/api';
|
|
92
78
|
export { selectActiveSteps } from './onboarding/stepSelection';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useId, useState } from 'react';
|
|
3
3
|
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
|
|
4
4
|
import { Box, ButtonBase, Drawer, List, ListItem, ListItemButton, ListItemText, Paper, Stack, Typography, } from '@mui/material';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import CloseIcon from '@mui/icons-material/Close';
|
|
3
3
|
import DownloadIcon from '@mui/icons-material/DownloadOutlined';
|
|
4
4
|
import InsertDriveFileOutlinedIcon from '@mui/icons-material/InsertDriveFileOutlined';
|
|
@@ -49,7 +49,7 @@ export function AttachmentList({ attachments = [] }) {
|
|
|
49
49
|
setPreviews((current) => (Object.assign(Object.assign({}, current), { [attachment.id]: url })));
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
|
-
catch (
|
|
52
|
+
catch (_a) { /* The image remains available through the download action. */ }
|
|
53
53
|
});
|
|
54
54
|
return () => { live = false; urls.forEach((url) => URL.revokeObjectURL(url)); };
|
|
55
55
|
}, [attachments, getAttachmentThumbnail]);
|
|
@@ -110,7 +110,8 @@ export function Composer({ conversationId, conversation, replyTarget = null, onR
|
|
|
110
110
|
};
|
|
111
111
|
const removeFile = (index) => setFiles((current) => current.filter((_, fileIndex) => fileIndex !== index));
|
|
112
112
|
const insertEmoji = (emoji) => {
|
|
113
|
-
var _a, _b
|
|
113
|
+
var _a, _b;
|
|
114
|
+
var _c, _d;
|
|
114
115
|
const input = ((_b = (_a = messageInputRef.current) === null || _a === void 0 ? void 0 : _a.querySelector) === null || _b === void 0 ? void 0 : _b.call(_a, 'textarea')) || messageInputRef.current;
|
|
115
116
|
const start = (_c = input === null || input === void 0 ? void 0 : input.selectionStart) !== null && _c !== void 0 ? _c : body.length;
|
|
116
117
|
const end = (_d = input === null || input === void 0 ? void 0 : input.selectionEnd) !== null && _d !== void 0 ? _d : start;
|
|
@@ -32,8 +32,5 @@ export function ConversationLaunchers({ groupLaunchers = [], broadcastLauncher,
|
|
|
32
32
|
autoOpened.current = true;
|
|
33
33
|
open('broadcast', (_a = broadcastLauncher.payload) !== null && _a !== void 0 ? _a : broadcastLauncher);
|
|
34
34
|
}, [autoOpenBroadcast, broadcastLauncher]); // one intentional auto-open per mounted launcher
|
|
35
|
-
return (_jsxs(Stack, { spacing: 1, children: [broadcastLauncher && !autoOpenBroadcast && (_jsx(Button, { variant: "outlined", onClick: () => { var _a; return open('broadcast', (_a = broadcastLauncher.payload) !== null && _a !== void 0 ? _a : broadcastLauncher); }, children: broadcastLauncher.label || t('MessagingLaunchers.OPEN_BROADCAST') })), groupLaunchers.map((launcher) => {
|
|
36
|
-
var _a;
|
|
37
|
-
return (_jsx(Button, { variant: "outlined", onClick: () => { var _a; return open('group', (_a = launcher.payload) !== null && _a !== void 0 ? _a : launcher); }, children: launcher.label || t('MessagingLaunchers.OPEN_GROUP') }, (_a = launcher.id) !== null && _a !== void 0 ? _a : launcher.label));
|
|
38
|
-
}), error && _jsx(Alert, { severity: "error", children: error })] }));
|
|
35
|
+
return (_jsxs(Stack, { spacing: 1, children: [broadcastLauncher && !autoOpenBroadcast && (_jsx(Button, { variant: "outlined", onClick: () => { var _a; return open('broadcast', (_a = broadcastLauncher.payload) !== null && _a !== void 0 ? _a : broadcastLauncher); }, children: broadcastLauncher.label || t('MessagingLaunchers.OPEN_BROADCAST') })), groupLaunchers.map((launcher) => { var _a; return (_jsx(Button, { variant: "outlined", onClick: () => { var _a; return open('group', (_a = launcher.payload) !== null && _a !== void 0 ? _a : launcher); }, children: launcher.label || t('MessagingLaunchers.OPEN_GROUP') }, (_a = launcher.id) !== null && _a !== void 0 ? _a : launcher.label)); }), error && _jsx(Alert, { severity: "error", children: error })] }));
|
|
39
36
|
}
|
|
@@ -64,7 +64,7 @@ export function ConversationList({ onOpen, groupLaunchers, broadcastLauncher, au
|
|
|
64
64
|
const [loadingMore, setLoadingMore] = useState(false);
|
|
65
65
|
const [error, setError] = useState(null);
|
|
66
66
|
const conversations = useMemo(() => ordered(Object.values(cache.conversations).filter((item) => includeArchived || !item.archived_at && !item.archived)), [cache.conversations, includeArchived]);
|
|
67
|
-
const unreadFor = (conversation) => { var _a
|
|
67
|
+
const unreadFor = (conversation) => { var _a; var _b, _c; return (_c = (_b = conversation.unread_count) !== null && _b !== void 0 ? _b : (_a = cache.unread.by_conversation) === null || _a === void 0 ? void 0 : _a[conversation.id]) !== null && _c !== void 0 ? _c : 0; };
|
|
68
68
|
// Once opened, the broadcast conversation becomes a normal, recency-sorted
|
|
69
69
|
// row with real unread/preview state — hide the static launcher so it isn't
|
|
70
70
|
// shown twice (button + list row) with the button's stale, unread-less copy.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useId, useMemo, useState } from 'react';
|
|
3
3
|
import { Alert, Autocomplete, Button, CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle, TextField, Typography, useMediaQuery, } from '@mui/material';
|
|
4
4
|
import { useTheme } from '@mui/material/styles';
|
|
Binary file
|
|
@@ -24,7 +24,8 @@ export const POLL_CARD_CHECKBOX_SX = { pt: 0.25 };
|
|
|
24
24
|
* rejected vote.
|
|
25
25
|
*/
|
|
26
26
|
export function PollCard({ message, canClose: canCloseProp }) {
|
|
27
|
-
var _a, _b
|
|
27
|
+
var _a, _b;
|
|
28
|
+
var _c, _d, _e, _f, _g, _h;
|
|
28
29
|
const { t } = useTranslation();
|
|
29
30
|
const { castPollVote, closeConversationPoll, currentUser } = useMessaging();
|
|
30
31
|
const poll = message === null || message === void 0 ? void 0 : message.poll;
|
|
@@ -47,8 +48,8 @@ export function PollCard({ message, canClose: canCloseProp }) {
|
|
|
47
48
|
if (!poll)
|
|
48
49
|
return null;
|
|
49
50
|
const closed = Boolean(poll.closed_at);
|
|
50
|
-
const creatorId = (
|
|
51
|
-
const canClose = (_g = (
|
|
51
|
+
const creatorId = (_d = (_c = poll.created_by_id) !== null && _c !== void 0 ? _c : (_a = poll.created_by) === null || _a === void 0 ? void 0 : _a.id) !== null && _d !== void 0 ? _d : poll.created_by;
|
|
52
|
+
const canClose = (_g = (_f = (_e = canCloseProp !== null && canCloseProp !== void 0 ? canCloseProp : poll.can_close) !== null && _e !== void 0 ? _e : message === null || message === void 0 ? void 0 : message.can_close) !== null && _f !== void 0 ? _f : (_b = message === null || message === void 0 ? void 0 : message.permissions) === null || _b === void 0 ? void 0 : _b.can_close) !== null && _g !== void 0 ? _g : (creatorId != null && creatorId === (currentUser === null || currentUser === void 0 ? void 0 : currentUser.id));
|
|
52
53
|
// Percentage denominator (MSG-6i): the number of distinct people who
|
|
53
54
|
// answered this poll, not sum(vote_count) across options. For a
|
|
54
55
|
// multi-select poll one person can vote for several options, so summing
|
|
@@ -109,11 +110,12 @@ export function PollCard({ message, canClose: canCloseProp }) {
|
|
|
109
110
|
}
|
|
110
111
|
};
|
|
111
112
|
const optionLabel = (option) => {
|
|
112
|
-
var _a
|
|
113
|
+
var _a;
|
|
114
|
+
var _b, _c;
|
|
113
115
|
// dcm's poll projection gives voter user ids only, never names — there
|
|
114
116
|
// is no user-directory endpoint (same structural limit already
|
|
115
117
|
// established for the DM candidate list).
|
|
116
|
-
const voteCount = (_c = (
|
|
118
|
+
const voteCount = (_c = (_b = option.vote_count) !== null && _b !== void 0 ? _b : (_a = option.voters) === null || _a === void 0 ? void 0 : _a.length) !== null && _c !== void 0 ? _c : 0;
|
|
117
119
|
const percent = respondentCount > 0 ? Math.round((voteCount / respondentCount) * 100) : 0;
|
|
118
120
|
const votedByMe = selected.includes(option.id);
|
|
119
121
|
const resultText = t('MessagingPoll.OPTION_RESULT', { count: voteCount, percent });
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import DoneAllOutlinedIcon from '@mui/icons-material/DoneAllOutlined';
|
|
3
3
|
import DoneOutlinedIcon from '@mui/icons-material/DoneOutlined';
|
|
4
4
|
import { ButtonBase, List, ListItem, Popover, Tooltip, Typography } from '@mui/material';
|
|
@@ -41,7 +41,7 @@ export function ReadTicks({ messageId, conversation }) {
|
|
|
41
41
|
}, [getMessageReadStatus, messageId]);
|
|
42
42
|
if (!status)
|
|
43
43
|
return null;
|
|
44
|
-
const recipientDetail = ((_a = status.recipient_detail) === null || _a === void 0 ? void 0 : _a.map((recipient) => { var _a
|
|
44
|
+
const recipientDetail = ((_a = status.recipient_detail) === null || _a === void 0 ? void 0 : _a.map((recipient) => { var _a; var _b; return (Object.assign(Object.assign({}, recipient), { last_read_at: (_b = (_a = cache.receipts[`${conversation === null || conversation === void 0 ? void 0 : conversation.id}:${recipient.user_id}`]) === null || _a === void 0 ? void 0 : _a.last_read_at) !== null && _b !== void 0 ? _b : recipient.last_read_at })); })) || status.recipient_detail;
|
|
45
45
|
const directReceipt = (conversation === null || conversation === void 0 ? void 0 : conversation.kind) === 'direct' && (conversation === null || conversation === void 0 ? void 0 : conversation.other_user_id) != null
|
|
46
46
|
? cache.receipts[`${conversation.id}:${conversation.other_user_id}`]
|
|
47
47
|
: null;
|
package/dist/messaging/Thread.js
CHANGED
|
@@ -15,7 +15,8 @@ function replyToId(message) { var _a; return (_a = message.reply_to_id) !== null
|
|
|
15
15
|
// MessagingProvider.jsx's applyFrame merge-trap handling). A null receipt with
|
|
16
16
|
// at least one reply counts as unread; no replies means no marker at all.
|
|
17
17
|
function hasUnreadReplies(message, receipts, userId) {
|
|
18
|
-
var _a
|
|
18
|
+
var _a;
|
|
19
|
+
var _b;
|
|
19
20
|
if (!message.reply_count)
|
|
20
21
|
return false;
|
|
21
22
|
const lastReadAt = (_b = (_a = receipts[`thread:${message.id}:${userId}`]) === null || _a === void 0 ? void 0 : _a.last_read_at) !== null && _b !== void 0 ? _b : message.thread_last_read_at;
|
|
@@ -77,10 +78,11 @@ export function Thread({ conversationId, onReplyTargetChange, canModerateMessage
|
|
|
77
78
|
if (conversationId == null)
|
|
78
79
|
return undefined;
|
|
79
80
|
return subscribe(MESSAGING_ENVELOPE, (frame) => {
|
|
80
|
-
var _a
|
|
81
|
+
var _a;
|
|
82
|
+
var _b;
|
|
81
83
|
if (frame.type !== 'message')
|
|
82
84
|
return;
|
|
83
|
-
const frameConversationId = (
|
|
85
|
+
const frameConversationId = (_b = frame.conversation_id) !== null && _b !== void 0 ? _b : (_a = frame.message) === null || _a === void 0 ? void 0 : _a.conversation_id;
|
|
84
86
|
if (String(frameConversationId) !== String(conversationId))
|
|
85
87
|
return;
|
|
86
88
|
if (document.visibilityState === 'hidden')
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState } from 'react';
|
|
3
3
|
import NotificationsIcon from '@mui/icons-material/Notifications';
|
|
4
4
|
import { Badge, Box, Button, IconButton, List, ListItemButton, ListItemText, Menu, Typography, } from '@mui/material';
|
|
@@ -20,10 +20,7 @@ export function NotificationBell({ resolveLink }) {
|
|
|
20
20
|
if (resolveLink && ((_a = notification.content) === null || _a === void 0 ? void 0 : _a.link))
|
|
21
21
|
resolveLink(notification.content.link);
|
|
22
22
|
};
|
|
23
|
-
return (_jsxs(_Fragment, { children: [_jsx(IconButton, { "aria-label": t('NotificationBell.TITLE'), color: "inherit", onClick: (event) => setAnchorEl(event.currentTarget), children: _jsx(Badge, { badgeContent: unreadCount, color: "error", max: 99, children: _jsx(NotificationsIcon, {}) }) }), _jsx(Menu, { anchorEl: anchorEl, anchorOrigin: { horizontal: 'right', vertical: 'bottom' }, onClose: () => setAnchorEl(null), open: open, transformOrigin: { horizontal: 'right', vertical: 'top' }, children: _jsxs(Box, { sx: { minWidth: 320 }, children: [_jsxs(Box, { sx: { alignItems: 'center', display: 'flex', justifyContent: 'space-between', px: 2, py: 1 }, children: [_jsx(Typography, { variant: "subtitle1", children: t('NotificationBell.TITLE') }), unreadIds.length > 0 && (_jsx(Button, { onClick: () => markSeen(unreadIds), size: "small", children: t('NotificationBell.MARK_ALL') }))] }), notifications.length === 0 ? (_jsx(Typography, { sx: { px: 2, py: 2 }, variant: "body2", children: t('NotificationBell.EMPTY') })) : (_jsx(List, { dense: true, disablePadding: true, children: notifications.map((notification) => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
? t(notification.content.body_key, notification.content.params || {})
|
|
27
|
-
: undefined, slotProps: { primary: { fontWeight: notification.seen || notification.dismissed ? 'regular' : 'bold' } } }) }, (_d = notification.id) !== null && _d !== void 0 ? _d : notification.notification_id));
|
|
28
|
-
}) }))] }) })] }));
|
|
23
|
+
return (_jsxs(_Fragment, { children: [_jsx(IconButton, { "aria-label": t('NotificationBell.TITLE'), color: "inherit", onClick: (event) => setAnchorEl(event.currentTarget), children: _jsx(Badge, { badgeContent: unreadCount, color: "error", max: 99, children: _jsx(NotificationsIcon, {}) }) }), _jsx(Menu, { anchorEl: anchorEl, anchorOrigin: { horizontal: 'right', vertical: 'bottom' }, onClose: () => setAnchorEl(null), open: open, transformOrigin: { horizontal: 'right', vertical: 'top' }, children: _jsxs(Box, { sx: { minWidth: 320 }, children: [_jsxs(Box, { sx: { alignItems: 'center', display: 'flex', justifyContent: 'space-between', px: 2, py: 1 }, children: [_jsx(Typography, { variant: "subtitle1", children: t('NotificationBell.TITLE') }), unreadIds.length > 0 && (_jsx(Button, { onClick: () => markSeen(unreadIds), size: "small", children: t('NotificationBell.MARK_ALL') }))] }), notifications.length === 0 ? (_jsx(Typography, { sx: { px: 2, py: 2 }, variant: "body2", children: t('NotificationBell.EMPTY') })) : (_jsx(List, { dense: true, disablePadding: true, children: notifications.map((notification) => { var _a, _b, _c; var _d; return (_jsx(ListItemButton, { onClick: () => handleItemClick(notification), children: _jsx(ListItemText, { primary: t((_a = notification.content) === null || _a === void 0 ? void 0 : _a.title_key, ((_b = notification.content) === null || _b === void 0 ? void 0 : _b.params) || {}), secondary: ((_c = notification.content) === null || _c === void 0 ? void 0 : _c.body_key)
|
|
24
|
+
? t(notification.content.body_key, notification.content.params || {})
|
|
25
|
+
: undefined, slotProps: { primary: { fontWeight: notification.seen || notification.dismissed ? 'regular' : 'bold' } } }) }, (_d = notification.id) !== null && _d !== void 0 ? _d : notification.notification_id)); }) }))] }) })] }));
|
|
29
26
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React, { useEffect, useState } from 'react';
|
|
3
3
|
import { useTranslation } from 'react-i18next';
|
|
4
4
|
import Alert from '@mui/material/Alert';
|
|
@@ -57,12 +57,9 @@ export const UNIVERSAL_STEP_DESCRIPTORS = [
|
|
|
57
57
|
// verified their PWA manifest/icons are actually installable must not
|
|
58
58
|
// pass pwaInstallEnabled, or this would show an iOS "Add to Home Screen"
|
|
59
59
|
// hint for an app that isn't really installable.
|
|
60
|
-
condition: (ctx) => {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
&& !((_a = ctx.pwaInstall) === null || _a === void 0 ? void 0 : _a.isStandalone)
|
|
64
|
-
&& (Boolean((_b = ctx.pwaInstall) === null || _b === void 0 ? void 0 : _b.deferredPrompt) || Boolean((_c = ctx.pwaInstall) === null || _c === void 0 ? void 0 : _c.isIos)));
|
|
65
|
-
},
|
|
60
|
+
condition: (ctx) => { var _a, _b, _c; return Boolean(ctx.pwaInstallEnabled
|
|
61
|
+
&& !((_a = ctx.pwaInstall) === null || _a === void 0 ? void 0 : _a.isStandalone)
|
|
62
|
+
&& (Boolean((_b = ctx.pwaInstall) === null || _b === void 0 ? void 0 : _b.deferredPrompt) || Boolean((_c = ctx.pwaInstall) === null || _c === void 0 ? void 0 : _c.isIos))); },
|
|
66
63
|
blocking: false,
|
|
67
64
|
skipable: true,
|
|
68
65
|
persistDismissed: true,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React, { useContext, useEffect, useMemo, useState } from 'react';
|
|
3
|
-
import { Helmet } from 'react-helmet';
|
|
4
3
|
import { useSearchParams } from 'react-router-dom';
|
|
5
4
|
import { Box, Typography, Alert, CircularProgress, Paper, Stack, useMediaQuery, } from '@mui/material';
|
|
6
5
|
import { useTheme } from '@mui/material/styles';
|
|
@@ -174,5 +173,5 @@ export function AccountPage({ userListExtraColumns = [], userListExtraRowActions
|
|
|
174
173
|
const activeExtraTab = builtInTabValues.has(safeTab)
|
|
175
174
|
? null
|
|
176
175
|
: extraTabs.find((tab) => tab.value === safeTab);
|
|
177
|
-
return (_jsxs(WidePage, { title: t('Account.TITLE', 'Account & Administration'), children: [_jsx(
|
|
176
|
+
return (_jsxs(WidePage, { title: t('Account.TITLE', 'Account & Administration'), children: [_jsx("title", { children: `${t('Account.PAGE_TITLE', 'Account')} – ${user.email}` }), _jsxs(SectionNav, { mode: isMobile ? 'mobile' : 'desktop', groups: groups, activeKey: safeTab, onSelect: (key) => handleTabChange(null, key), children: [safeTab === 'profile' && (_jsx(Box, { sx: { mt: 2 }, children: _jsx(ProfileComponent, { onSubmit: handleProfileSubmit, showName: true, showPrivacy: true, showCookies: true, showStatements: showProfileStatements }) })), safeTab === 'security' && (_jsx(Box, { sx: { mt: 2 }, children: _jsx(SecurityComponent, { fromRecovery: fromRecovery, fromWeakLogin: fromWeakLogin }) })), safeTab === 'users' && (_jsx(Box, { sx: { mt: 2 }, children: _jsx(UserListComponent, { roles: activeRoles, currentUser: user, extraColumns: userListExtraColumns, extraRowActions: userListExtraRowActions, extraContext: userListExtraContext, refreshTrigger: userListRefreshTrigger, canEditUser: userListCanEditUser, showNewColumn: userListShowNewColumn, showSuccessfulLoginColumn: userListShowSuccessfulLoginColumn, showRoleColumn: userListShowRoleColumn, onChangeRole: userListOnChangeRole, showDeleteAction: userListShowDeleteAction, canDeleteUser: userListCanDeleteUser, onDeleteUser: userListOnDeleteUser }) })), safeTab === 'invite' && (_jsx(Box, { sx: { mt: 2 }, children: _jsxs(Stack, { spacing: 2.5, children: [canViewAuthPolicy && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(AuthFactorRequirementCard, { canEdit: canWriteAuthPolicy, policy: authPolicy }) })), canViewAuthPolicy && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(RegistrationMethodsManager, { policy: authPolicy, error: authPolicyError, onPolicyChange: setAuthPolicy, canEdit: canWriteAuthPolicy }) })), canSendInvites && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_admin_invite) && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(UserInviteComponent, {}) })), canManageAccessCodes && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_access_code) && (_jsxs(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: [_jsx(Typography, { variant: "h6", gutterBottom: true, children: t('Auth.ACCESS_CODE_MANAGER_TITLE', 'Access Codes') }), _jsx(Typography, { variant: "body2", sx: { mb: 2, color: 'text.secondary' }, children: t('Account.ACCESS_CODES_HINT', 'Manage access codes for self-registration.') }), _jsx(AccessCodeManager, {})] })), canManageAccessCodes && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_access_code) && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(AccessCodeSingleUseToggle, { canEdit: canWriteAuthPolicy, policy: authPolicy, onPolicyChange: setAuthPolicy }) })), canSendInvites && showBulkInviteCsvTab && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_admin_invite) && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(BulkInviteCsvTab, Object.assign({}, bulkInviteCsvProps)) })), canViewAuthPolicy && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_email_domain) && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(AllowedEmailDomainsManager, { enabled: Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_email_domain), domains: (authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allowed_email_domains) || [], onPolicyChange: setAuthPolicy, canEdit: canWriteAuthPolicy }) })), canViewAuthPolicy && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_qr) && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(QrSignupValidityManager, { enabled: Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_qr), expiryDays: authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.signup_qr_expiry_days, onPolicyChange: setAuthPolicy, canEdit: canWriteAuthPolicy }) })), canManageSignupQr && Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_qr) && (_jsx(Paper, { variant: "outlined", sx: ACCOUNT_PAGE_SECTION_PAPER_SX, children: _jsx(QrSignupManager, { enabled: Boolean(authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.allow_self_signup_qr), expiryDays: authPolicy === null || authPolicy === void 0 ? void 0 : authPolicy.signup_qr_expiry_days }) }))] }) })), safeTab === 'support' && (_jsx(Box, { sx: { mt: 2 }, children: _jsx(SupportRecoveryRequestsTab, {}) })), activeExtraTab && (_jsx(Box, { sx: { mt: 2 }, children: (_a = activeExtraTab.render) === null || _a === void 0 ? void 0 : _a.call(activeExtraTab, { user, perms, isSuperUser, t }) }))] })] }));
|
|
178
177
|
}
|
package/dist/pages/LoginPage.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React, { useState, useContext, useEffect } from 'react';
|
|
3
3
|
import { useNavigate, useLocation } from 'react-router-dom';
|
|
4
|
-
import { Helmet } from 'react-helmet';
|
|
5
4
|
import { Box, Alert } from '@mui/material';
|
|
6
5
|
import { useTranslation } from 'react-i18next';
|
|
7
6
|
// Layout & Context
|
|
@@ -246,7 +245,7 @@ export function LoginPage() {
|
|
|
246
245
|
const twoFactorRequired = Boolean(authMethods === null || authMethods === void 0 ? void 0 : authMethods.two_factor_required)
|
|
247
246
|
|| Number((authMethods === null || authMethods === void 0 ? void 0 : authMethods.required_auth_factor_count) || 1) >= 2;
|
|
248
247
|
// --- Render ---
|
|
249
|
-
return (_jsxs(NarrowPage, { title: t('Auth.PAGE_LOGIN_TITLE'), subtitle: t('Auth.PAGE_LOGIN_SUBTITLE'), children: [_jsx(
|
|
248
|
+
return (_jsxs(NarrowPage, { title: t('Auth.PAGE_LOGIN_TITLE'), subtitle: t('Auth.PAGE_LOGIN_SUBTITLE'), children: [_jsx("title", { children: `${t('App.NAME')} – ${t('Auth.PAGE_LOGIN_TITLE')}` }), errorKey && (_jsx(Alert, { severity: "error", sx: LOGIN_PAGE_ALERT_SX, children: errorKey })), recoveryFetching && !errorKey && (_jsx(Alert, { severity: "info", sx: LOGIN_PAGE_ALERT_SX, children: t('Auth.RECOVERY_LINK_VALIDATING', 'Validating recovery link…') })), recoveryToken && !errorKey && (_jsx(Alert, { severity: "info", sx: LOGIN_PAGE_ALERT_SX, children: t('Auth.RECOVERY_LOGIN_WARNING', 'Recovery link validated. Please enter your password.') })), twoFactorRequired && !recoveryToken && !recoveryFetching && (_jsx(Alert, { severity: "info", sx: LOGIN_PAGE_ALERT_SX, children: t('Auth.TWO_FACTOR_REQUIRED_HINT', 'This app requires two authentication factors for full access.') })), step === 'credentials' && (_jsx(LoginForm, { onSubmit: passwordLoginEnabled ? handleSubmitCredentials : null, onForgotPassword: passwordResetEnabled ? () => navigate('/reset-request-password') : null, onSocialLogin: socialLoginEnabled ? (provider) => startSocialLogin(provider) : null, socialProviders: socialProviders, onPasskeyLogin: passkeyLoginEnabled ? handlePasskeyLoginInitial : null, onSignUp: signupEnabled ? () => navigate('/signup') : null,
|
|
250
249
|
// Block submit while the handoff is in flight so the user does not
|
|
251
250
|
// race the recovery-token fetch with a normal password POST.
|
|
252
251
|
disabled: submitting || recoveryFetching, initialIdentifier: recoveryEmail })), step === 'mfa' && mfaState && (_jsx(Box, { children: _jsx(MfaLoginComponent, { availableTypes: mfaState.availableTypes, identifier: mfaState.identifier, onSuccess: handleMfaSuccess, onCancel: handleMfaCancel }) }))] }));
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// src/auth/pages/PasswordChangePage.jsx
|
|
3
3
|
import React, { useState } from 'react';
|
|
4
|
-
import { Helmet } from 'react-helmet';
|
|
5
4
|
import { Typography } from '@mui/material';
|
|
6
5
|
import { useTranslation } from 'react-i18next';
|
|
7
6
|
import { NarrowPage } from '../layout/PageLayout';
|
|
@@ -28,5 +27,5 @@ export function PasswordChangePage() {
|
|
|
28
27
|
setSubmitting(false);
|
|
29
28
|
}
|
|
30
29
|
};
|
|
31
|
-
return (_jsxs(NarrowPage, { title: t('Auth.CHANGE_PASSWORD_BUTTON'), subtitle: t('Auth.PAGE_CHANGE_PASSWORD_SUBTITLE'), children: [_jsx(
|
|
30
|
+
return (_jsxs(NarrowPage, { title: t('Auth.CHANGE_PASSWORD_BUTTON'), subtitle: t('Auth.PAGE_CHANGE_PASSWORD_SUBTITLE'), children: [_jsx("title", { children: `${t('App.NAME')} – ${t('Auth.CHANGE_PASSWORD_BUTTON')}` }), successKey && (_jsx(Typography, { color: "primary", gutterBottom: true, children: t(successKey) })), errorKey && (_jsx(Typography, { color: "error", gutterBottom: true, children: errorKey })), _jsx(PasswordChangeForm, { onSubmit: handleSubmit, submitting: submitting })] }));
|
|
32
31
|
}
|