@plumile/backoffice-react 0.1.76 → 0.1.77
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/README.md +25 -0
- package/lib/esm/{AcceptInvitationScreen-CNLlSbdx.js → AcceptInvitationScreen-b2yaZeKV.js} +4 -4
- package/lib/esm/{AcceptInvitationScreen-CNLlSbdx.js.map → AcceptInvitationScreen-b2yaZeKV.js.map} +1 -1
- package/lib/esm/{AuthPanel-ttoH9YxE.js → AuthPanel-Co626p7A.js} +2 -2
- package/lib/esm/{AuthPanel-ttoH9YxE.js.map → AuthPanel-Co626p7A.js.map} +1 -1
- package/lib/esm/{BackofficeAcceptInvitationPage-DRxM1Z-U.js → BackofficeAcceptInvitationPage-BBHL6VvG.js} +7 -7
- package/lib/esm/{BackofficeAcceptInvitationPage-DRxM1Z-U.js.map → BackofficeAcceptInvitationPage-BBHL6VvG.js.map} +1 -1
- package/lib/esm/{sprinkles.css.ts.vanilla-n-NK_DwW.js → BackofficeConfigContext-R0t1owTI.js} +1 -1
- package/lib/esm/BackofficeConfigContext-R0t1owTI.js.map +1 -0
- package/lib/esm/{BackofficeDashboardPage-GKyT60qb.js → BackofficeDashboardPage-B5_YC1ZL.js} +5 -5
- package/lib/esm/BackofficeDashboardPage-B5_YC1ZL.js.map +1 -0
- package/lib/esm/{BackofficeDetailPayload-B-qs8Fai.js → BackofficeDetailPayload-CbsZKnw6.js} +10 -10
- package/lib/esm/BackofficeDetailPayload-CbsZKnw6.js.map +1 -0
- package/lib/esm/{BackofficeEntityActionFormDialog-FHlW0vys.js → BackofficeEntityActionFormDialog-BzKi1eyv.js} +19 -19
- package/lib/esm/BackofficeEntityActionFormDialog-BzKi1eyv.js.map +1 -0
- package/lib/esm/{BackofficeEntityDetailPage-CdrMXu5a.js → BackofficeEntityDetailPage-CE4tl5ZJ.js} +11 -11
- package/lib/esm/BackofficeEntityDetailPage-CE4tl5ZJ.js.map +1 -0
- package/lib/esm/{BackofficeEntityListPage-BxgqdFpL.js → BackofficeEntityListPage-CtLI15-L.js} +7 -7
- package/lib/esm/BackofficeEntityListPage-CtLI15-L.js.map +1 -0
- package/lib/esm/{BackofficeLayoutPage-k9OkLfXb.js → BackofficeLayoutPage-DpvTzwtK.js} +6 -6
- package/lib/esm/BackofficeLayoutPage-DpvTzwtK.js.map +1 -0
- package/lib/esm/{BackofficeLoginPage-C64BcxMw.js → BackofficeLoginPage-BeihjFO2.js} +8 -8
- package/lib/esm/{BackofficeLoginPage-C64BcxMw.js.map → BackofficeLoginPage-BeihjFO2.js.map} +1 -1
- package/lib/esm/{BackofficePasswordResetCompletePage-BA7kkUxN.js → BackofficePasswordResetCompletePage-CkaMaFNT.js} +6 -6
- package/lib/esm/{BackofficePasswordResetCompletePage-BA7kkUxN.js.map → BackofficePasswordResetCompletePage-CkaMaFNT.js.map} +1 -1
- package/lib/esm/{BackofficePasswordResetRequestPage-B9wSZcyn.js → BackofficePasswordResetRequestPage-Df8mcLkC.js} +6 -6
- package/lib/esm/{BackofficePasswordResetRequestPage-B9wSZcyn.js.map → BackofficePasswordResetRequestPage-Df8mcLkC.js.map} +1 -1
- package/lib/esm/{BackofficeRightPageLayout-ktdlvTZJ.js → BackofficeRightPageLayout-D7QRE8KZ.js} +3 -3
- package/lib/esm/BackofficeRightPageLayout-D7QRE8KZ.js.map +1 -0
- package/lib/esm/{BackofficeVerifyEmailPage-CAzMqo2K.js → BackofficeVerifyEmailPage-CE_6-wGN.js} +5 -5
- package/lib/esm/{BackofficeVerifyEmailPage-CAzMqo2K.js.map → BackofficeVerifyEmailPage-CE_6-wGN.js.map} +1 -1
- package/lib/esm/{EntityFilterValue-SC_jkj4O.js → EntityFilterValue-Bn9VGr2M.js} +2 -2
- package/lib/esm/{EntityFilterValue-SC_jkj4O.js.map → EntityFilterValue-Bn9VGr2M.js.map} +1 -1
- package/lib/esm/{EntityIdPickerDialog-FMC5Hx_I.js → EntityIdPickerDialog-D_qAlrU6.js} +4 -4
- package/lib/esm/EntityIdPickerDialog-D_qAlrU6.js.map +1 -0
- package/lib/esm/{LazyBackofficeEntityActionFormDialog-DOEgoIfT.js → LazyBackofficeEntityActionFormDialog-DndjG4kV.js} +5 -5
- package/lib/esm/LazyBackofficeEntityActionFormDialog-DndjG4kV.js.map +1 -0
- package/lib/esm/{PasswordResetCompleteScreen-C4GQdavL.js → PasswordResetCompleteScreen-CWxk9AWl.js} +3 -3
- package/lib/esm/{PasswordResetCompleteScreen-C4GQdavL.js.map → PasswordResetCompleteScreen-CWxk9AWl.js.map} +1 -1
- package/lib/esm/{PasswordResetRequestScreen-aUY_yDqM.js → PasswordResetRequestScreen-DBIHOmsl.js} +3 -3
- package/lib/esm/{PasswordResetRequestScreen-aUY_yDqM.js.map → PasswordResetRequestScreen-DBIHOmsl.js.map} +1 -1
- package/lib/esm/{VerifyEmailScreen-2DuHJgdY.js → VerifyEmailScreen-CUOEwmf1.js} +2 -2
- package/lib/esm/{VerifyEmailScreen-2DuHJgdY.js.map → VerifyEmailScreen-CUOEwmf1.js.map} +1 -1
- package/lib/esm/backoffice-react.js +21 -21
- package/lib/esm/backoffice-react.js.map +1 -1
- package/lib/esm/loginPage.css-4M4PrzUn.js +12 -0
- package/lib/esm/loginPage.css-4M4PrzUn.js.map +1 -0
- package/lib/esm/style.css +1 -1
- package/lib/esm/{synchronizeAuthStatusQuery-lLR0XFew.js → synchronizeAuthStatusQuery-Ba776lwa.js} +4 -4
- package/lib/esm/{synchronizeAuthStatusQuery-lLR0XFew.js.map → synchronizeAuthStatusQuery-Ba776lwa.js.map} +1 -1
- package/lib/esm/{useAuth-AczFS-oL.js → useAuth-DzWJXJ_9.js} +2 -2
- package/lib/esm/{useAuth-AczFS-oL.js.map → useAuth-DzWJXJ_9.js.map} +1 -1
- package/lib/esm/{useBackofficeAuth-BHteJQzA.js → useBackofficeAuth-L9k9i9BI.js} +3 -3
- package/lib/esm/{useBackofficeAuth-BHteJQzA.js.map → useBackofficeAuth-L9k9i9BI.js.map} +1 -1
- package/lib/esm/{useBackofficeLazyValue-B0-ckL6e.js → useBackofficeLazyValue-Dnii1_dE.js} +2 -2
- package/lib/esm/{useBackofficeLazyValue-B0-ckL6e.js.map → useBackofficeLazyValue-Dnii1_dE.js.map} +1 -1
- package/lib/types/auth/login/loginPage.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/backofficeDetailRelationLink.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/filters/backofficeFilterAction.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/backofficeSidebarActions.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/routing/backofficeRoutePendingBar.css.d.ts.map +1 -1
- package/package.json +5 -5
- package/lib/esm/BackofficeDashboardPage-GKyT60qb.js.map +0 -1
- package/lib/esm/BackofficeDetailPayload-B-qs8Fai.js.map +0 -1
- package/lib/esm/BackofficeEntityActionFormDialog-FHlW0vys.js.map +0 -1
- package/lib/esm/BackofficeEntityDetailPage-CdrMXu5a.js.map +0 -1
- package/lib/esm/BackofficeEntityListPage-BxgqdFpL.js.map +0 -1
- package/lib/esm/BackofficeLayoutPage-k9OkLfXb.js.map +0 -1
- package/lib/esm/BackofficeRightPageLayout-ktdlvTZJ.js.map +0 -1
- package/lib/esm/EntityIdPickerDialog-FMC5Hx_I.js.map +0 -1
- package/lib/esm/LazyBackofficeEntityActionFormDialog-DOEgoIfT.js.map +0 -1
- package/lib/esm/loginPage.css-BDQJNcSr.js +0 -12
- package/lib/esm/loginPage.css-BDQJNcSr.js.map +0 -1
- package/lib/esm/sprinkles.css.ts.vanilla-n-NK_DwW.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeLoginPage-
|
|
1
|
+
{"version":3,"file":"BackofficeLoginPage-BeihjFO2.js","names":[],"sources":["../../src/pages/BackofficeLoginPage.tsx"],"sourcesContent":["import { useCallback, useContext, useRef, type JSX } from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { PreloadedQuery } from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\nimport { RoutingContext } from '@plumile/router';\n\nimport type { OidcProviderKind } from '../modules/sharedSchemaTypes.js';\nimport { LoginFlow } from '../auth/login/LoginFlow.js';\nimport { synchronizeAuthStatusQuery } from '../auth/login/synchronizeAuthStatusQuery.js';\nimport { useBackofficeAuth } from '../hooks/useBackofficeAuth.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeAuthLoginConfig } from '../provider/useBackofficeLazyValue.js';\nimport { getBackofficePasswordResetPath } from '../router/backofficeAuthPaths.js';\n\nconst { usePreloadedQuery } = ReactRelay;\n\nexport type BackofficeLoginPageProps = {\n prepared: { query: PreloadedQuery<OperationType> };\n};\n\nexport const BackofficeLoginPage = ({\n prepared,\n}: BackofficeLoginPageProps): JSX.Element => {\n const routerContext = useContext(RoutingContext);\n const { auth: authConfig, basePath } = useBackofficeConfig();\n const auth = useBackofficeAuthLoginConfig();\n const authState = useBackofficeAuth();\n const relayEnvironment = useRelayEnvironment();\n const isPostLoginSyncInFlightRef = useRef(false);\n\n const data = usePreloadedQuery(auth.loginQuery, prepared.query);\n const oidcProviders =\n (data as { oidcProviders?: readonly OidcProviderKind[] }).oidcProviders ??\n [];\n\n const handleLoginSuccess = useCallback((): void => {\n if (isPostLoginSyncInFlightRef.current) {\n return;\n }\n\n isPostLoginSyncInFlightRef.current = true;\n const runPostLoginSync = async (): Promise<void> => {\n try {\n const sessionAuth = await authConfig.session.load();\n if (sessionAuth.authStatusQuery == null) {\n routerContext?.history.push({\n pathname: basePath,\n });\n return;\n }\n\n const isLoggedIn = await synchronizeAuthStatusQuery<OperationType>(\n relayEnvironment,\n sessionAuth.authStatusQuery,\n );\n if (!isLoggedIn) {\n return;\n }\n routerContext?.history.push({\n pathname: basePath,\n });\n } catch {\n // Keep user on login page if post-login auth sync fails.\n } finally {\n isPostLoginSyncInFlightRef.current = false;\n }\n };\n\n runPostLoginSync().catch(() => {});\n }, [authConfig.session, basePath, relayEnvironment, routerContext?.history]);\n\n const handleForgotPassword = useCallback(() => {\n routerContext?.history.push({\n pathname: getBackofficePasswordResetPath(basePath),\n });\n }, [basePath, routerContext?.history]);\n\n return (\n <LoginFlow\n auth={authState}\n oidcProviders={oidcProviders}\n onLoginSuccess={handleLoginSuccess}\n onForgotPassword={handleForgotPassword}\n />\n );\n};\n\nexport default BackofficeLoginPage;\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,IAAM,EAAE,mBAAA,MAAsB,GAMjB,KAAuB,EAClC,kBAC2C;CAC3C,IAAM,IAAgB,EAAW,EAAe,EAC1C,EAAE,MAAM,GAAY,gBAAa,GAAqB,EACtD,IAAO,GAA8B,EACrC,IAAY,GAAmB,EAC/B,IAAmB,GAAqB,EACxC,IAA6B,EAAO,GAAM;AAiDhD,QACE,kBAAC,GAAD;EACE,MAAM;EACS,eAlDN,EAAkB,EAAK,YAAY,EAAS,MAAM,CAEH,iBAC1D,EAAE;EAgDA,gBA9CuB,QAAwB;AAC7C,KAA2B,YAI/B,EAA2B,UAAU,KACZ,YAA2B;AAClD,QAAI;KACF,IAAM,IAAc,MAAM,EAAW,QAAQ,MAAM;AACnD,SAAI,EAAY,mBAAmB,MAAM;AACvC,SAAe,QAAQ,KAAK,EAC1B,UAAU,GACX,CAAC;AACF;;AAOF,SAAI,CAJe,MAAM,EACvB,GACA,EAAY,gBACb,CAEC;AAEF,QAAe,QAAQ,KAAK,EAC1B,UAAU,GACX,CAAC;YACI,WAEE;AACR,OAA2B,UAAU;;OAIvB,CAAC,YAAY,GAAG;KACjC;GAAC,EAAW;GAAS;GAAU;GAAkB,GAAe;GAAQ,CAAC;EAaxE,kBAXyB,QAAkB;AAC7C,MAAe,QAAQ,KAAK,EAC1B,UAAU,EAA+B,EAAS,EACnD,CAAC;KACD,CAAC,GAAU,GAAe,QAAQ,CAAC;EAQlC,CAAA"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { n as e } from "./
|
|
2
|
-
import { f as t } from "./loginPage.css-
|
|
3
|
-
import "./AuthPanel-
|
|
4
|
-
import { t as n } from "./PasswordResetCompleteScreen-
|
|
1
|
+
import { n as e } from "./BackofficeConfigContext-R0t1owTI.js";
|
|
2
|
+
import { f as t } from "./loginPage.css-4M4PrzUn.js";
|
|
3
|
+
import "./AuthPanel-Co626p7A.js";
|
|
4
|
+
import { t as n } from "./PasswordResetCompleteScreen-CWxk9AWl.js";
|
|
5
5
|
import { i as r, t as i } from "./mutationResult-CcQMY13J.js";
|
|
6
6
|
import { t as a } from "./backofficeAuthPaths-BiJvoI5Q.js";
|
|
7
|
-
import { n as o } from "./useBackofficeLazyValue-
|
|
7
|
+
import { n as o } from "./useBackofficeLazyValue-Dnii1_dE.js";
|
|
8
8
|
import { useCallback as s, useContext as c } from "react";
|
|
9
9
|
import { RoutingContext as l } from "@plumile/router";
|
|
10
10
|
import * as u from "react-relay";
|
|
@@ -57,4 +57,4 @@ var { useMutation: f } = u, p = () => {
|
|
|
57
57
|
//#endregion
|
|
58
58
|
export { p as BackofficePasswordResetCompletePage, p as default };
|
|
59
59
|
|
|
60
|
-
//# sourceMappingURL=BackofficePasswordResetCompletePage-
|
|
60
|
+
//# sourceMappingURL=BackofficePasswordResetCompletePage-CkaMaFNT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficePasswordResetCompletePage-
|
|
1
|
+
{"version":3,"file":"BackofficePasswordResetCompletePage-CkaMaFNT.js","names":[],"sources":["../../src/pages/BackofficePasswordResetCompletePage.tsx"],"sourcesContent":["import { useCallback, useContext, type JSX } from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { MutationParameters } from 'relay-runtime';\nimport { RoutingContext } from '@plumile/router';\n\nimport { PasswordResetCompleteScreen } from '../auth/pages/PasswordResetCompleteScreen.js';\nimport {\n type MutationPayloadBase,\n requireField,\n resolveMutationOutcome,\n} from '../relay/mutationResult.js';\nimport { useSharedTranslation } from '../i18n/useSharedTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeAuthPasswordResetCompleteConfig } from '../provider/useBackofficeLazyValue.js';\nimport { getBackofficeLoginPath } from '../router/backofficeAuthPaths.js';\n\nconst { useMutation } = ReactRelay;\n\ntype CompletePasswordResetErrorReason =\n | 'INVALID_TOKEN'\n | 'TOKEN_EXPIRED'\n | 'PASSWORD_POLICY_VIOLATION'\n | 'INTERNAL_ERROR';\n\ntype CompletePasswordResetMutationPayload =\n MutationPayloadBase<CompletePasswordResetErrorReason> & {\n success?: boolean | null;\n };\n\nexport const BackofficePasswordResetCompletePage = (): JSX.Element => {\n const routerContext = useContext(RoutingContext);\n const { basePath } = useBackofficeConfig();\n const auth = useBackofficeAuthPasswordResetCompleteConfig();\n const { t } = useSharedTranslation();\n type CompletePasswordResetMutation = MutationParameters & {\n response: {\n completePasswordReset?: CompletePasswordResetMutationPayload | null;\n };\n variables: { input: { newPassword: string; token: string } };\n };\n const [commitReset] = useMutation<CompletePasswordResetMutation>(\n auth.completePasswordResetMutation,\n );\n\n const handleBackToLogin = useCallback(() => {\n routerContext?.history.push({ pathname: getBackofficeLoginPath(basePath) });\n }, [basePath, routerContext?.history]);\n\n const handleCompleteReset = useCallback(\n async (input: { newPassword: string; token: string }): Promise<boolean> => {\n const invalidMessage = t('auth.passwordResetComplete.errors.invalid');\n const defaultErrorMessage = invalidMessage;\n\n return new Promise((resolve, reject) => {\n commitReset({\n variables: {\n input,\n },\n onCompleted: (response) => {\n const outcome = resolveMutationOutcome(\n response.completePasswordReset ?? null,\n {\n defaultErrorMessage,\n mapReason: (reason) => {\n switch (reason) {\n case 'INVALID_TOKEN':\n return invalidMessage;\n case 'TOKEN_EXPIRED':\n return t('auth.passwordResetComplete.errors.expired');\n case 'PASSWORD_POLICY_VIOLATION':\n return t(\n 'auth.passwordResetComplete.errors.policyViolation',\n );\n case 'INTERNAL_ERROR':\n return invalidMessage;\n default:\n return null;\n }\n },\n },\n );\n if (!outcome.ok) {\n reject(new Error(outcome.message));\n return;\n }\n\n const successResult = requireField(\n outcome.payload.success ?? null,\n defaultErrorMessage,\n );\n if (!successResult.ok) {\n reject(new Error(successResult.message));\n return;\n }\n resolve(successResult.value);\n },\n onError: (mutationError) => {\n let error = new Error(defaultErrorMessage);\n if (mutationError instanceof Error) {\n error = mutationError;\n }\n reject(error);\n },\n });\n });\n },\n [commitReset, t],\n );\n\n return (\n <PasswordResetCompleteScreen\n onBackToLogin={handleBackToLogin}\n onCompletePasswordReset={handleCompleteReset}\n />\n );\n};\n\nexport default BackofficePasswordResetCompletePage;\n"],"mappings":";;;;;;;;;;;;AAgBA,IAAM,EAAE,mBAAgB,GAaX,UAAyD;CACpE,IAAM,IAAgB,EAAW,EAAe,EAC1C,EAAE,gBAAa,GAAqB,EACpC,IAAO,GAA8C,EACrD,EAAE,SAAM,GAAsB,EAO9B,CAAC,KAAe,EACpB,EAAK,8BACN;AAmED,QACE,kBAAC,GAAD;EACE,eAnEsB,QAAkB;AAC1C,MAAe,QAAQ,KAAK,EAAE,UAAU,EAAuB,EAAS,EAAE,CAAC;KAC1E,CAAC,GAAU,GAAe,QAAQ,CAAC;EAkElC,yBAhEwB,EAC1B,OAAO,MAAoE;GACzE,IAAM,IAAiB,EAAE,4CAA4C,EAC/D,IAAsB;AAE5B,UAAO,IAAI,SAAS,GAAS,MAAW;AACtC,MAAY;KACV,WAAW,EACT,UACD;KACD,cAAc,MAAa;MACzB,IAAM,IAAU,EACd,EAAS,yBAAyB,MAClC;OACE;OACA,YAAY,MAAW;AACrB,gBAAQ,GAAR;SACE,KAAK,gBACH,QAAO;SACT,KAAK,gBACH,QAAO,EAAE,4CAA4C;SACvD,KAAK,4BACH,QAAO,EACL,oDACD;SACH,KAAK,iBACH,QAAO;SACT,QACE,QAAO;;;OAGd,CACF;AACD,UAAI,CAAC,EAAQ,IAAI;AACf,SAAW,MAAM,EAAQ,QAAQ,CAAC;AAClC;;MAGF,IAAM,IAAgB,EACpB,EAAQ,QAAQ,WAAW,MAC3B,EACD;AACD,UAAI,CAAC,EAAc,IAAI;AACrB,SAAW,MAAM,EAAc,QAAQ,CAAC;AACxC;;AAEF,QAAQ,EAAc,MAAM;;KAE9B,UAAU,MAAkB;MAC1B,IAAI,IAAY,MAAM,EAAoB;AAI1C,MAHI,aAAyB,UAC3B,IAAQ,IAEV,EAAO,EAAM;;KAEhB,CAAC;KACF;KAEJ,CAAC,GAAa,EAAE,CACjB;EAMG,CAAA"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import "./
|
|
2
|
-
import { f as e } from "./loginPage.css-
|
|
3
|
-
import "./AuthPanel-
|
|
4
|
-
import { t } from "./PasswordResetRequestScreen-
|
|
1
|
+
import "./BackofficeConfigContext-R0t1owTI.js";
|
|
2
|
+
import { f as e } from "./loginPage.css-4M4PrzUn.js";
|
|
3
|
+
import "./AuthPanel-Co626p7A.js";
|
|
4
|
+
import { t } from "./PasswordResetRequestScreen-DBIHOmsl.js";
|
|
5
5
|
import { i as n, t as r } from "./mutationResult-CcQMY13J.js";
|
|
6
|
-
import { r as i } from "./useBackofficeLazyValue-
|
|
6
|
+
import { r as i } from "./useBackofficeLazyValue-Dnii1_dE.js";
|
|
7
7
|
import { useCallback as a } from "react";
|
|
8
8
|
import * as o from "react-relay";
|
|
9
9
|
import { jsx as s } from "react/jsx-runtime";
|
|
@@ -53,4 +53,4 @@ var { useMutation: c } = o, l = () => {
|
|
|
53
53
|
//#endregion
|
|
54
54
|
export { l as BackofficePasswordResetRequestPage, l as default };
|
|
55
55
|
|
|
56
|
-
//# sourceMappingURL=BackofficePasswordResetRequestPage-
|
|
56
|
+
//# sourceMappingURL=BackofficePasswordResetRequestPage-Df8mcLkC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficePasswordResetRequestPage-
|
|
1
|
+
{"version":3,"file":"BackofficePasswordResetRequestPage-Df8mcLkC.js","names":[],"sources":["../../src/pages/BackofficePasswordResetRequestPage.tsx"],"sourcesContent":["import { useCallback, type JSX } from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { MutationParameters } from 'relay-runtime';\n\nimport { PasswordResetRequestScreen } from '../auth/pages/PasswordResetRequestScreen.js';\nimport {\n type MutationPayloadBase,\n requireField,\n resolveMutationOutcome,\n} from '../relay/mutationResult.js';\nimport { useSharedTranslation } from '../i18n/useSharedTranslation.js';\nimport { useBackofficeAuthPasswordResetRequestConfig } from '../provider/useBackofficeLazyValue.js';\n\nconst { useMutation } = ReactRelay;\n\ntype StartPasswordResetErrorReason =\n | 'INVALID_EMAIL'\n | 'RATE_LIMITED'\n | 'INTERNAL_ERROR';\n\ntype StartPasswordResetMutationPayload =\n MutationPayloadBase<StartPasswordResetErrorReason> & {\n payload?: { success?: boolean | null } | null;\n };\n\nexport const BackofficePasswordResetRequestPage = (): JSX.Element => {\n const auth = useBackofficeAuthPasswordResetRequestConfig();\n const { t } = useSharedTranslation();\n type StartPasswordResetMutation = MutationParameters & {\n response: { startPasswordReset?: StartPasswordResetMutationPayload | null };\n variables: { input: { email: string; locale?: string } };\n };\n const [commitReset] = useMutation<StartPasswordResetMutation>(\n auth.startPasswordResetMutation,\n );\n\n const mapStartResetReason = useCallback(\n (reason: StartPasswordResetErrorReason): string | null => {\n switch (reason) {\n case 'INVALID_EMAIL':\n return t('auth.passwordResetRequest.errors.invalidEmail');\n case 'RATE_LIMITED':\n return t('auth.passwordResetRequest.errors.rateLimited');\n case 'INTERNAL_ERROR':\n return t('auth.passwordResetRequest.errors.startFailed');\n default:\n return null;\n }\n },\n [t],\n );\n\n const handleStartReset = useCallback(\n async (input: { email: string; locale?: string }): Promise<boolean> => {\n const defaultErrorMessage = t(\n 'auth.passwordResetRequest.errors.startFailed',\n );\n\n return new Promise((resolve, reject) => {\n commitReset({\n variables: {\n input,\n },\n onCompleted: (response) => {\n const outcome = resolveMutationOutcome(\n response.startPasswordReset ?? null,\n {\n defaultErrorMessage,\n mapReason: mapStartResetReason,\n },\n );\n if (!outcome.ok) {\n reject(new Error(outcome.message));\n return;\n }\n\n const successResult = requireField(\n outcome.payload.payload?.success ?? null,\n defaultErrorMessage,\n );\n if (!successResult.ok) {\n reject(new Error(successResult.message));\n return;\n }\n resolve(successResult.value);\n },\n onError: (mutationError) => {\n let error = new Error(defaultErrorMessage);\n if (mutationError instanceof Error) {\n error = mutationError;\n }\n reject(error);\n },\n });\n });\n },\n [commitReset, mapStartResetReason, t],\n );\n\n return <PasswordResetRequestScreen onStartPasswordReset={handleStartReset} />;\n};\n\nexport default BackofficePasswordResetRequestPage;\n"],"mappings":";;;;;;;;;;AAaA,IAAM,EAAE,mBAAgB,GAYX,UAAwD;CACnE,IAAM,IAAO,GAA6C,EACpD,EAAE,SAAM,GAAsB,EAK9B,CAAC,KAAe,EACpB,EAAK,2BACN,EAEK,IAAsB,GACzB,MAAyD;AACxD,UAAQ,GAAR;GACE,KAAK,gBACH,QAAO,EAAE,gDAAgD;GAC3D,KAAK,eACH,QAAO,EAAE,+CAA+C;GAC1D,KAAK,iBACH,QAAO,EAAE,+CAA+C;GAC1D,QACE,QAAO;;IAGb,CAAC,EAAE,CACJ;AAiDD,QAAO,kBAAC,GAAD,EAA4B,sBA/CV,EACvB,OAAO,MAAgE;EACrE,IAAM,IAAsB,EAC1B,+CACD;AAED,SAAO,IAAI,SAAS,GAAS,MAAW;AACtC,KAAY;IACV,WAAW,EACT,UACD;IACD,cAAc,MAAa;KACzB,IAAM,IAAU,EACd,EAAS,sBAAsB,MAC/B;MACE;MACA,WAAW;MACZ,CACF;AACD,SAAI,CAAC,EAAQ,IAAI;AACf,QAAW,MAAM,EAAQ,QAAQ,CAAC;AAClC;;KAGF,IAAM,IAAgB,EACpB,EAAQ,QAAQ,SAAS,WAAW,MACpC,EACD;AACD,SAAI,CAAC,EAAc,IAAI;AACrB,QAAW,MAAM,EAAc,QAAQ,CAAC;AACxC;;AAEF,OAAQ,EAAc,MAAM;;IAE9B,UAAU,MAAkB;KAC1B,IAAI,IAAY,MAAM,EAAoB;AAI1C,KAHI,aAAyB,UAC3B,IAAQ,IAEV,EAAO,EAAM;;IAEhB,CAAC;IACF;IAEJ;EAAC;EAAa;EAAqB;EAAE,CACtC,EAE4E,CAAA"}
|
package/lib/esm/{BackofficeRightPageLayout-ktdlvTZJ.js → BackofficeRightPageLayout-D7QRE8KZ.js}
RENAMED
|
@@ -71,7 +71,7 @@ var f = (e, t) => t == null ? /* @__PURE__ */ Error(`Invalid breadcrumb contract
|
|
|
71
71
|
let { target: n } = e();
|
|
72
72
|
if (n == null) throw Error("Backoffice topbar target is missing. Ensure BackofficeLayoutPage provides a topbar breadcrumb mount target before rendering right-side pages.");
|
|
73
73
|
return c(t, n);
|
|
74
|
-
}, h = "
|
|
74
|
+
}, h = "txvbqb9jf txvbqbco", g = "_80s44h0 txvbqb9jf txvbqbco txvbqbao6", _ = "txvbqb9jf txvbqbco txvbqbao6", v = "_80s44h1 txvbqbv8r txvbqb8x txvbqbfa6", y = "txvbqbv8p txvbqb8x txvbqbfa6 txvbqbamo", b = ({ items: e }) => /* @__PURE__ */ a("nav", {
|
|
75
75
|
className: h,
|
|
76
76
|
"aria-label": "Breadcrumb",
|
|
77
77
|
children: /* @__PURE__ */ a("ol", {
|
|
@@ -93,7 +93,7 @@ var f = (e, t) => t == null ? /* @__PURE__ */ Error(`Invalid breadcrumb contract
|
|
|
93
93
|
return /* @__PURE__ */ o("li", {
|
|
94
94
|
className: _,
|
|
95
95
|
children: [!r && /* @__PURE__ */ a("span", {
|
|
96
|
-
className: "
|
|
96
|
+
className: "txvbqbv8r txvbqb8x txvbqbfa6",
|
|
97
97
|
"aria-hidden": "true",
|
|
98
98
|
children: "/"
|
|
99
99
|
}), l]
|
|
@@ -104,4 +104,4 @@ var f = (e, t) => t == null ? /* @__PURE__ */ Error(`Invalid breadcrumb contract
|
|
|
104
104
|
//#endregion
|
|
105
105
|
export { d as n, x as t };
|
|
106
106
|
|
|
107
|
-
//# sourceMappingURL=BackofficeRightPageLayout-
|
|
107
|
+
//# sourceMappingURL=BackofficeRightPageLayout-D7QRE8KZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackofficeRightPageLayout-D7QRE8KZ.js","names":[],"sources":["../../src/components/backoffice/columns/buildDataTableColumns.tsx","../../src/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.ts","../../src/components/backoffice/layout/breadcrumb/BackofficeTopbarPortal.tsx","../../src/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.ts","../../src/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.tsx","../../src/components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.tsx"],"sourcesContent":["import { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeColumnSpec,\n BackofficeFieldSize,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { TFunction } from 'i18next';\nimport { Link } from '@plumile/router';\nimport { FormattedDate, Tag, type DataTableColumn } from '@plumile/ui';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst resolveTextValue = (\n value: string | number | null,\n fallback: string,\n): string => {\n if (value == null) {\n return fallback;\n }\n if (typeof value === 'string' && value.trim() === '') {\n return fallback;\n }\n return String(value);\n};\n\nexport type BuildDataTableColumnsOptions = {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n};\n\nexport type BackofficeSizedDataTableColumn<Row> = DataTableColumn<Row> & {\n size: BackofficeFieldSize;\n};\n\n/**\n *\n */\nexport function buildDataTableColumns<Row>(\n columns: readonly BackofficeColumnSpec<Row>[],\n options: BuildDataTableColumnsOptions,\n): readonly BackofficeSizedDataTableColumn<Row>[] {\n const { tApp, t, resolveEntityHref } = options;\n const fallback = t('common.notAvailable');\n const filteredColumns = columns.filter((column) => {\n return column.key !== 'id';\n });\n\n return filteredColumns.map((column) => {\n return {\n id: column.key,\n header: resolveLabel(column.header, tApp),\n size: column.size,\n cell: (row) => {\n const { cell } = column;\n switch (cell.type) {\n case 'text': {\n return resolveTextValue(cell.value(row), fallback);\n }\n case 'link': {\n const value = cell.value(row);\n if (\n value == null ||\n (typeof value === 'string' && value.trim() === '')\n ) {\n return fallback;\n }\n return <Link to={cell.to(row)}>{value}</Link>;\n }\n case 'badge': {\n const value = cell.value(row);\n if (value == null || value.trim() === '') {\n return fallback;\n }\n let { tone } = cell;\n if (typeof tone === 'function') {\n tone = tone(row);\n }\n return <Tag tone={tone}>{value}</Tag>;\n }\n case 'dateTime': {\n const value = cell.value(row);\n return (\n <FormattedDate\n value={value}\n fallback={fallback}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n />\n );\n }\n case 'entityRef': {\n const id = cell.value(row);\n if (id.trim() === '') {\n return fallback;\n }\n const href = resolveEntityHref?.(cell.entity, id) ?? null;\n if (href != null) {\n return <Link to={href}>{t('actions.view')}</Link>;\n }\n return fallback;\n }\n case 'custom': {\n const rendered = cell.render(row);\n if (rendered == null || rendered === '') {\n return fallback;\n }\n return <>{rendered}</>;\n }\n default: {\n return fallback;\n }\n }\n },\n };\n });\n}\n","import type {\n BackofficeTopbarBreadcrumbItem,\n BreadcrumbContractErrorCode,\n} from './types.js';\n\nconst formatContractError = (\n code: BreadcrumbContractErrorCode,\n details?: string,\n): Error => {\n if (details == null) {\n return new Error(`Invalid breadcrumb contract: ${code}`);\n }\n return new Error(`Invalid breadcrumb contract: ${code} (${details})`);\n};\n\nexport const assertValidBreadcrumb = (\n items: readonly BackofficeTopbarBreadcrumbItem[] | null | undefined,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n if (items == null) {\n throw formatContractError('MISSING_BREADCRUMB');\n }\n if (items.length === 0) {\n throw formatContractError('EMPTY_BREADCRUMB');\n }\n\n const seen = new Set<string>();\n items.forEach((item, index) => {\n if (typeof item.id !== 'string' || item.id.trim() === '') {\n throw formatContractError('INVALID_SEGMENT_ID', `index=${index}`);\n }\n\n if (seen.has(item.id)) {\n throw formatContractError(\n 'INVALID_SEGMENT_ID',\n `duplicate id=\"${item.id}\"`,\n );\n }\n seen.add(item.id);\n });\n\n const last = items[items.length - 1];\n if (last?.isCurrent !== true) {\n throw formatContractError('MISSING_CURRENT_SEGMENT');\n }\n\n return items;\n};\n","import { type JSX, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { useBackofficeTopbarPortalContext } from './BackofficeTopbarPortalContext.js';\n\nexport type BackofficeTopbarPortalProps = {\n children: ReactNode;\n};\n\nexport const BackofficeTopbarPortal = ({\n children,\n}: BackofficeTopbarPortalProps): JSX.Element | null => {\n const { target } = useBackofficeTopbarPortalContext();\n if (target == null) {\n throw new Error(\n 'Backoffice topbar target is missing. Ensure BackofficeLayoutPage provides a topbar breadcrumb mount target before rendering right-side pages.',\n );\n }\n return createPortal(children, target);\n};\n\nexport default BackofficeTopbarPortal;\n","import { sprinkles } from '@plumile/ui';\nimport { style } from '@vanilla-extract/css';\n\nconst INLINE_FLEX = 'inline-flex' as const;\n\nexport const nav = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n});\n\nexport const list = style([\n sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n gap: 2,\n }),\n {\n margin: 0,\n padding: 0,\n listStyle: 'none',\n },\n]);\n\nexport const item = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n gap: 2,\n});\n\nexport const separator = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 'normal',\n});\n\nexport const link = style([\n sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 'normal',\n }),\n {\n textDecoration: 'none',\n selectors: {\n '&:hover': {\n textDecoration: 'underline',\n },\n },\n },\n]);\n\nexport const current = sprinkles({\n color: 'text',\n fontSize: 'sm',\n lineHeight: 'normal',\n fontWeight: 'semibold',\n});\n","import { type JSX } from 'react';\nimport { Link } from '@plumile/router';\n\nimport type { BackofficeTopbarBreadcrumbItem } from './types.js';\nimport * as styles from './backofficeTopbarBreadcrumb.css.js';\n\nexport type BackofficeTopbarBreadcrumbProps = {\n items: readonly BackofficeTopbarBreadcrumbItem[];\n};\n\nexport const BackofficeTopbarBreadcrumb = ({\n items,\n}: BackofficeTopbarBreadcrumbProps): JSX.Element => {\n return (\n <nav className={styles.nav} aria-label=\"Breadcrumb\">\n <ol className={styles.list}>\n {items.map((item, index) => {\n const isFirst = index === 0;\n const isCurrent = item.isCurrent === true;\n const key = `${item.id}-${index}`;\n const shouldRenderLink = item.to != null && !isCurrent;\n let content: JSX.Element;\n\n if (shouldRenderLink) {\n content = (\n <Link to={item.to} className={styles.link}>\n {item.label}\n </Link>\n );\n } else {\n let className = styles.link;\n if (isCurrent) {\n className = styles.current;\n }\n content = <span className={className}>{item.label}</span>;\n }\n\n return (\n <li key={key} className={styles.item}>\n {!isFirst && (\n <span className={styles.separator} aria-hidden=\"true\">\n /\n </span>\n )}\n {content}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n};\n\nexport default BackofficeTopbarBreadcrumb;\n","import { type JSX, type ReactNode } from 'react';\n\nimport { assertValidBreadcrumb } from './assertValidBreadcrumb.js';\nimport { BackofficeTopbarPortal } from './BackofficeTopbarPortal.js';\nimport { BackofficeTopbarBreadcrumb } from './BackofficeTopbarBreadcrumb.js';\nimport type { BackofficeTopbarBreadcrumbItem } from './types.js';\n\nexport type BackofficeRightPageLayoutProps = {\n breadcrumb: readonly BackofficeTopbarBreadcrumbItem[];\n children: ReactNode;\n};\n\nexport const BackofficeRightPageLayout = ({\n breadcrumb,\n children,\n}: BackofficeRightPageLayoutProps): JSX.Element => {\n const items = assertValidBreadcrumb(breadcrumb);\n\n return (\n <>\n <BackofficeTopbarPortal>\n <BackofficeTopbarBreadcrumb items={items} />\n </BackofficeTopbarPortal>\n <>{children}</>\n </>\n );\n};\n\nexport default BackofficeRightPageLayout;\n"],"mappings":"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"}
|
package/lib/esm/{BackofficeVerifyEmailPage-CAzMqo2K.js → BackofficeVerifyEmailPage-CE_6-wGN.js}
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { n as e } from "./
|
|
2
|
-
import { f as t } from "./loginPage.css-
|
|
3
|
-
import { t as n } from "./VerifyEmailScreen-
|
|
1
|
+
import { n as e } from "./BackofficeConfigContext-R0t1owTI.js";
|
|
2
|
+
import { f as t } from "./loginPage.css-4M4PrzUn.js";
|
|
3
|
+
import { t as n } from "./VerifyEmailScreen-CUOEwmf1.js";
|
|
4
4
|
import { i as r, t as i } from "./mutationResult-CcQMY13J.js";
|
|
5
5
|
import { t as a } from "./backofficeAuthPaths-BiJvoI5Q.js";
|
|
6
|
-
import { i as o } from "./useBackofficeLazyValue-
|
|
6
|
+
import { i as o } from "./useBackofficeLazyValue-Dnii1_dE.js";
|
|
7
7
|
import { useCallback as s, useContext as c } from "react";
|
|
8
8
|
import { RoutingContext as l } from "@plumile/router";
|
|
9
9
|
import * as u from "react-relay";
|
|
@@ -56,4 +56,4 @@ var { useMutation: f } = u, p = () => {
|
|
|
56
56
|
//#endregion
|
|
57
57
|
export { p as BackofficeVerifyEmailPage, p as default };
|
|
58
58
|
|
|
59
|
-
//# sourceMappingURL=BackofficeVerifyEmailPage-
|
|
59
|
+
//# sourceMappingURL=BackofficeVerifyEmailPage-CE_6-wGN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeVerifyEmailPage-
|
|
1
|
+
{"version":3,"file":"BackofficeVerifyEmailPage-CE_6-wGN.js","names":[],"sources":["../../src/pages/BackofficeVerifyEmailPage.tsx"],"sourcesContent":["import { useCallback, useContext, type JSX } from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { MutationParameters } from 'relay-runtime';\nimport { RoutingContext } from '@plumile/router';\n\nimport { VerifyEmailScreen } from '../auth/pages/VerifyEmailScreen.js';\nimport {\n type MutationPayloadBase,\n requireField,\n resolveMutationOutcome,\n} from '../relay/mutationResult.js';\nimport { useSharedTranslation } from '../i18n/useSharedTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeAuthVerifyEmailConfig } from '../provider/useBackofficeLazyValue.js';\nimport { getBackofficeLoginPath } from '../router/backofficeAuthPaths.js';\n\nconst { useMutation } = ReactRelay;\n\ntype VerifyEmailErrorReason =\n | 'INVALID_TOKEN'\n | 'TOKEN_EXPIRED'\n | 'ALREADY_VERIFIED'\n | 'INTERNAL_ERROR';\n\ntype VerifyEmailMutationPayload =\n MutationPayloadBase<VerifyEmailErrorReason> & {\n success?: boolean | null;\n };\n\nexport const BackofficeVerifyEmailPage = (): JSX.Element => {\n const routerContext = useContext(RoutingContext);\n const { basePath } = useBackofficeConfig();\n const auth = useBackofficeAuthVerifyEmailConfig();\n const { t } = useSharedTranslation();\n type VerifyEmailMutation = MutationParameters & {\n response: { verifyEmail?: VerifyEmailMutationPayload | null };\n variables: { input: { token: string } };\n };\n const [commitVerify] = useMutation<VerifyEmailMutation>(\n auth.verifyEmailMutation,\n );\n\n const handleBackToLogin = useCallback(() => {\n routerContext?.history.push({ pathname: getBackofficeLoginPath(basePath) });\n }, [basePath, routerContext?.history]);\n\n const handleVerifyEmail = useCallback(\n async (input: { token: string }): Promise<boolean> => {\n const invalidMessage = t('auth.verifyEmail.errors.invalid');\n const defaultErrorMessage = invalidMessage;\n\n return new Promise((resolve, reject) => {\n commitVerify({\n variables: {\n input,\n },\n onCompleted: (response) => {\n const outcome = resolveMutationOutcome(\n response.verifyEmail ?? null,\n {\n defaultErrorMessage,\n mapReason: (reason) => {\n switch (reason) {\n case 'INVALID_TOKEN':\n return invalidMessage;\n case 'TOKEN_EXPIRED':\n return t('auth.verifyEmail.errors.expired');\n case 'ALREADY_VERIFIED':\n return t('auth.verifyEmail.errors.alreadyVerified');\n case 'INTERNAL_ERROR':\n return invalidMessage;\n default:\n return null;\n }\n },\n },\n );\n if (!outcome.ok) {\n reject(new Error(outcome.message));\n return;\n }\n\n const successResult = requireField(\n outcome.payload.success ?? null,\n defaultErrorMessage,\n );\n if (!successResult.ok) {\n reject(new Error(successResult.message));\n return;\n }\n resolve(successResult.value);\n },\n onError: (mutationError) => {\n let error = new Error(defaultErrorMessage);\n if (mutationError instanceof Error) {\n error = mutationError;\n }\n reject(error);\n },\n });\n });\n },\n [commitVerify, t],\n );\n\n return (\n <VerifyEmailScreen\n onBackToLogin={handleBackToLogin}\n onVerifyEmail={handleVerifyEmail}\n />\n );\n};\n\nexport default BackofficeVerifyEmailPage;\n"],"mappings":";;;;;;;;;;;AAgBA,IAAM,EAAE,mBAAgB,GAaX,UAA+C;CAC1D,IAAM,IAAgB,EAAW,EAAe,EAC1C,EAAE,gBAAa,GAAqB,EACpC,IAAO,GAAoC,EAC3C,EAAE,SAAM,GAAsB,EAK9B,CAAC,KAAgB,EACrB,EAAK,oBACN;AAiED,QACE,kBAAC,GAAD;EACE,eAjEsB,QAAkB;AAC1C,MAAe,QAAQ,KAAK,EAAE,UAAU,EAAuB,EAAS,EAAE,CAAC;KAC1E,CAAC,GAAU,GAAe,QAAQ,CAAC;EAgElC,eA9DsB,EACxB,OAAO,MAA+C;GACpD,IAAM,IAAiB,EAAE,kCAAkC,EACrD,IAAsB;AAE5B,UAAO,IAAI,SAAS,GAAS,MAAW;AACtC,MAAa;KACX,WAAW,EACT,UACD;KACD,cAAc,MAAa;MACzB,IAAM,IAAU,EACd,EAAS,eAAe,MACxB;OACE;OACA,YAAY,MAAW;AACrB,gBAAQ,GAAR;SACE,KAAK,gBACH,QAAO;SACT,KAAK,gBACH,QAAO,EAAE,kCAAkC;SAC7C,KAAK,mBACH,QAAO,EAAE,0CAA0C;SACrD,KAAK,iBACH,QAAO;SACT,QACE,QAAO;;;OAGd,CACF;AACD,UAAI,CAAC,EAAQ,IAAI;AACf,SAAW,MAAM,EAAQ,QAAQ,CAAC;AAClC;;MAGF,IAAM,IAAgB,EACpB,EAAQ,QAAQ,WAAW,MAC3B,EACD;AACD,UAAI,CAAC,EAAc,IAAI;AACrB,SAAW,MAAM,EAAc,QAAQ,CAAC;AACxC;;AAEF,QAAQ,EAAc,MAAM;;KAE9B,UAAU,MAAkB;MAC1B,IAAI,IAAY,MAAM,EAAoB;AAI1C,MAHI,aAAyB,UAC3B,IAAQ,IAEV,EAAO,EAAM;;KAEhB,CAAC;KACF;KAEJ,CAAC,GAAc,EAAE,CAClB;EAMG,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as e, t } from "./useBackofficeReactTranslation-WfXU8kCf.js";
|
|
2
|
-
import { r as n } from "./EntityIdPickerDialog-
|
|
2
|
+
import { r as n } from "./EntityIdPickerDialog-D_qAlrU6.js";
|
|
3
3
|
import { Suspense as r, createContext as i, useCallback as a, useContext as o, useMemo as s } from "react";
|
|
4
4
|
import * as c from "react-relay";
|
|
5
5
|
import { jsx as l } from "react/jsx-runtime";
|
|
@@ -74,4 +74,4 @@ var f = i(null), p = (e) => {
|
|
|
74
74
|
//#endregion
|
|
75
75
|
export { m as i, v as n, p as r, y as t };
|
|
76
76
|
|
|
77
|
-
//# sourceMappingURL=EntityFilterValue-
|
|
77
|
+
//# sourceMappingURL=EntityFilterValue-Bn9VGr2M.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityFilterValue-
|
|
1
|
+
{"version":3,"file":"EntityFilterValue-Bn9VGr2M.js","names":[],"sources":["../../src/components/backoffice/scaffolds/BackofficeListFilterContext.tsx","../../src/components/backoffice/filters/EntityFilterValue.tsx"],"sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n type JSX,\n type ReactNode,\n} from 'react';\n\nimport type {\n BackofficeListState,\n BackofficeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { buildBackofficeListLink } from '@plumile/backoffice-core/state/buildListHref.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\n\nexport type BackofficeListFilterContextValue = {\n config: BackofficeResolvedListFacetConfig;\n state: BackofficeListState<Record<string, unknown>, string>;\n pushState: (\n next: BackofficeListState<Record<string, unknown>, string>,\n ) => void;\n applyFilter: (\n whereKey: string,\n value: unknown,\n path?: readonly string[],\n ) => void;\n buildFilterLink: (\n whereKey: string,\n value: unknown,\n path?: readonly string[],\n ) => { pathname: string; search: string };\n};\n\nconst BackofficeListFilterContext =\n createContext<BackofficeListFilterContextValue | null>(null);\n\ntype ProviderProps<\n Where extends Record<string, unknown>,\n Sort extends string,\n> = {\n config: BackofficeResolvedListFacetConfig<Where, Sort>;\n state: BackofficeListState<Where, Sort>;\n pushState: (next: BackofficeListState<Where, Sort>) => void;\n children: ReactNode;\n};\n\nexport const BackofficeListFilterProvider = <\n Where extends Record<string, unknown>,\n Sort extends string,\n>(\n props: ProviderProps<Where, Sort>,\n): JSX.Element => {\n const { config, state, pushState, children } = props;\n\n const applyFilter = useCallback(\n (whereKey: string, value: unknown, path?: readonly string[]) => {\n const nextWhere = setWhereValue(\n state.where,\n whereKey as keyof Where,\n value,\n path,\n );\n pushState({ ...state, where: nextWhere });\n },\n [pushState, state],\n );\n\n const buildFilterLink = useCallback(\n (whereKey: string, value: unknown, path?: readonly string[]) => {\n const nextWhere = setWhereValue(\n state.where,\n whereKey as keyof Where,\n value,\n path,\n );\n return buildBackofficeListLink(config, { ...state, where: nextWhere });\n },\n [config, state],\n );\n\n const contextValue = useMemo<BackofficeListFilterContextValue>(() => {\n return {\n config: config as BackofficeResolvedListFacetConfig,\n state: state as unknown as BackofficeListState<\n Record<string, unknown>,\n string\n >,\n pushState: pushState as BackofficeListFilterContextValue['pushState'],\n applyFilter,\n buildFilterLink,\n };\n }, [applyFilter, buildFilterLink, config, pushState, state]);\n\n return (\n <BackofficeListFilterContext.Provider value={contextValue}>\n {children}\n </BackofficeListFilterContext.Provider>\n );\n};\n\nexport const useBackofficeListFilterContext =\n (): BackofficeListFilterContextValue | null => {\n return useContext(BackofficeListFilterContext);\n };\n\nexport default BackofficeListFilterContext;\n","import { Suspense, type JSX } from 'react';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport type { BackofficePickerValueConfig } from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePickerEntityLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\ntype EntityFilterValueContentProps<RowRef, RowView> = {\n valueConfig: BackofficePickerValueConfig<RowRef, RowView>;\n id: string;\n children: (label: string | null) => JSX.Element;\n};\n\nconst resolveTitle = (value: unknown): string | null => {\n if (value == null || typeof value !== 'object') {\n return null;\n }\n const { title } = value as { title?: unknown };\n if (typeof title !== 'string') {\n return null;\n }\n const trimmed = title.trim();\n if (trimmed === '') {\n return null;\n }\n return trimmed;\n};\n\nconst EntityFilterValueContent = <RowRef, RowView>({\n valueConfig,\n id,\n children,\n}: EntityFilterValueContentProps<RowRef, RowView>): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(valueConfig.query, { id });\n const rowRef = valueConfig.resolveRow(data);\n let row: RowView | null = null;\n if (rowRef != null) {\n row = valueConfig.toRow(rowRef);\n }\n const title = resolveTitle(row);\n\n return children(title);\n};\n\nexport type EntityFilterValueTextProps = {\n entityId: string;\n id: string;\n children: (label: string | null) => JSX.Element;\n};\n\nexport const EntityFilterValueText = ({\n entityId,\n id,\n children,\n}: EntityFilterValueTextProps): JSX.Element => {\n const resolvedId = id.trim();\n const pickerEntityState = useBackofficePickerEntityLoader(entityId, {\n enabled: resolvedId !== '',\n });\n let valueConfig: BackofficePickerValueConfig<unknown, unknown> | null = null;\n if (pickerEntityState.status === 'loaded') {\n valueConfig = pickerEntityState.module.config.picker.value ?? null;\n }\n\n const fallback = children(null);\n if (valueConfig == null) {\n return fallback;\n }\n\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return fallback;\n }}\n >\n <Suspense fallback={fallback}>\n <EntityFilterValueContent valueConfig={valueConfig} id={id}>\n {children}\n </EntityFilterValueContent>\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport type EntityFilterValueProps = {\n entityId: string;\n id: string;\n};\n\nexport const EntityFilterValue = ({\n entityId,\n id,\n}: EntityFilterValueProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const resolvedId = id.trim();\n\n return (\n <EntityFilterValueText entityId={entityId} id={id}>\n {(label) => {\n let fallbackLabel = resolvedId;\n if (resolvedId === '') {\n fallbackLabel = t('filters.placeholders.unresolved');\n }\n return <span>{label ?? fallbackLabel}</span>;\n }}\n </EntityFilterValueText>\n );\n};\n\nexport default EntityFilterValue;\n"],"mappings":";;;;;;;;AAkCA,IAAM,IACJ,EAAuD,KAAK,EAYjD,KAIX,MACgB;CAChB,IAAM,EAAE,WAAQ,UAAO,cAAW,gBAAa,GAEzC,IAAc,GACjB,GAAkB,GAAgB,MAA6B;EAC9D,IAAM,IAAY,EAChB,EAAM,OACN,GACA,GACA,EACD;AACD,IAAU;GAAE,GAAG;GAAO,OAAO;GAAW,CAAC;IAE3C,CAAC,GAAW,EAAM,CACnB,EAEK,IAAkB,GACrB,GAAkB,GAAgB,MAA6B;EAC9D,IAAM,IAAY,EAChB,EAAM,OACN,GACA,GACA,EACD;AACD,SAAO,EAAwB,GAAQ;GAAE,GAAG;GAAO,OAAO;GAAW,CAAC;IAExE,CAAC,GAAQ,EAAM,CAChB,EAEK,IAAe,SACZ;EACG;EACD;EAII;EACX;EACA;EACD,GACA;EAAC;EAAa;EAAiB;EAAQ;EAAW;EAAM,CAAC;AAE5D,QACE,kBAAC,EAA4B,UAA7B;EAAsC,OAAO;EAC1C;EACoC,CAAA;GAI9B,UAEF,EAAW,EAA4B,EC7F5C,EAAE,wBAAqB,GAQvB,KAAgB,MAAkC;AACtD,KAAqB,OAAO,KAAU,aAAlC,EACF,QAAO;CAET,IAAM,EAAE,aAAU;AAClB,KAAI,OAAO,KAAU,SACnB,QAAO;CAET,IAAM,IAAU,EAAM,MAAM;AAI5B,QAHI,MAAY,KACP,OAEF;GAGH,KAA6C,EACjD,gBACA,OACA,kBACiE;CACjE,IAAM,IAAO,EAAgC,EAAY,OAAO,EAAE,OAAI,CAAC,EACjE,IAAS,EAAY,WAAW,EAAK,EACvC,IAAsB;AAM1B,QALI,KAAU,SACZ,IAAM,EAAY,MAAM,EAAO,GAI1B,EAFO,EAAa,EAAI,CAET;GASX,KAAyB,EACpC,aACA,OACA,kBAC6C;CAE7C,IAAM,IAAoB,EAAgC,GAAU,EAClE,SAFiB,EAAG,MAAM,KAEF,IACzB,CAAC,EACE,IAAoE;AACxE,CAAI,EAAkB,WAAW,aAC/B,IAAc,EAAkB,OAAO,OAAO,OAAO,SAAS;CAGhE,IAAM,IAAW,EAAS,KAAK;AAK/B,QAJI,KAAe,OACV,IAIP,kBAAC,GAAD;EACE,gBACS;YAGT,kBAAC,GAAD;GAAoB;aAClB,kBAAC,GAAD;IAAuC;IAAiB;IACrD;IACwB,CAAA;GAClB,CAAA;EACa,CAAA;GASjB,KAAqB,EAChC,aACA,YACyC;CACzC,IAAM,EAAE,SAAM,GAA+B,EACvC,IAAa,EAAG,MAAM;AAE5B,QACE,kBAAC,GAAD;EAAiC;EAAc;aAC3C,MAAU;GACV,IAAI,IAAgB;AAIpB,UAHI,MAAe,OACjB,IAAgB,EAAE,kCAAkC,GAE/C,kBAAC,QAAD,EAAA,UAAO,KAAS,GAAqB,CAAA;;EAExB,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as e } from "./
|
|
1
|
+
import { n as e } from "./BackofficeConfigContext-R0t1owTI.js";
|
|
2
2
|
import { n as t, t as n } from "./useBackofficeReactTranslation-WfXU8kCf.js";
|
|
3
3
|
import { Suspense as r, useCallback as i, useEffect as a, useMemo as o, useState as s } from "react";
|
|
4
4
|
import { useTranslation as c } from "react-i18next";
|
|
@@ -6,7 +6,7 @@ import { BackofficeEmptyState as l, Button as u, Input as d, Modal as f, Spinner
|
|
|
6
6
|
import * as m from "react-relay";
|
|
7
7
|
import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
8
8
|
//#region src/components/backoffice/filters/entityIdFilterField.css.ts
|
|
9
|
-
var v = "
|
|
9
|
+
var v = "txvbqb9io txvbqbco txvbqbao6 txvbqbu3f txvbqbjdo", y = "txvbqb9mx txvbqbk4x txvbqb9io txvbqbco txvbqbl6f", b = "txvbqb9i6 txvbqbl6f txvbqbt6f txvbqbuw6", x = "txvbqbv8t", S = "txvbqb9io txvbqbco txvbqbanx", C = (e) => {
|
|
10
10
|
let { label: t, value: r, displayValue: i, placeholder: a, onPick: o, onClear: s } = e, { t: c } = n(), l = r?.trim() ?? "", d = i?.trim() ?? "", f = l !== "", p = d !== "", m = a ?? c("filters.placeholders.search", { label: t }), h = c("filters.placeholders.unresolved"), C;
|
|
11
11
|
C = p ? /* @__PURE__ */ g("span", {
|
|
12
12
|
className: b,
|
|
@@ -170,7 +170,7 @@ var v = "oa1uye0 vncd899io vncd89co vncd89ao6 vncd89u3f vncd89jdo", y = "oa1uye1
|
|
|
170
170
|
n,
|
|
171
171
|
r
|
|
172
172
|
]), c;
|
|
173
|
-
}, I = "
|
|
173
|
+
}, I = "txvbqb9io txvbqbai6 txvbqbaof", L = "txvbqbnuf txvbqboho txvbqbp5o txvbqblxf txvbqbv8r txvbqb8x txvbqbt5x", R = "txvbqb9io txvbqbao6 txvbqbco", z = "txvbqb9mx txvbqbk4x txvbqb9io txvbqbai6 txvbqbt5o", B = "txvbqbv8p txvbqbamf txvbqb96 txvbqbf3x", V = "txvbqbv8r txvbqb8x txvbqbf3x", H = ({ search: e, onSearchChange: t, searchPlaceholder: r, searchEnabled: i = !0, children: a }) => {
|
|
174
174
|
let { t: o } = n(), s = r ?? o("picker.searchPlaceholder.default"), c = null;
|
|
175
175
|
return i && (c = /* @__PURE__ */ g(d, {
|
|
176
176
|
value: e,
|
|
@@ -305,4 +305,4 @@ var v = "oa1uye0 vncd899io vncd89co vncd89ao6 vncd89u3f vncd89jdo", y = "oa1uye1
|
|
|
305
305
|
//#endregion
|
|
306
306
|
export { C as i, F as n, P as r, Q as t };
|
|
307
307
|
|
|
308
|
-
//# sourceMappingURL=EntityIdPickerDialog-
|
|
308
|
+
//# sourceMappingURL=EntityIdPickerDialog-D_qAlrU6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityIdPickerDialog-D_qAlrU6.js","names":[],"sources":["../../src/components/backoffice/filters/entityIdFilterField.css.ts","../../src/components/backoffice/filters/EntityIdFilterField.tsx","../../src/provider/useBackofficeEntityLoader.ts","../../src/components/backoffice/pickers/entityIdPickerDialog.css.ts","../../src/components/backoffice/pickers/shared/EntityPickerShell.tsx","../../src/components/backoffice/pickers/shared/EntityPickerRowBase.tsx","../../src/components/backoffice/pickers/shared/EntityPickerList.tsx","../../src/components/backoffice/pickers/EntityIdPickerDialog.tsx"],"sourcesContent":["import { sprinkles } from '@plumile/ui';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n width: 72,\n maxWidth: 'full',\n});\n\nexport const valueBox = sprinkles({\n flex: 1,\n minWidth: 0,\n display: 'flex',\n alignItems: 'center',\n overflow: 'hidden',\n});\n\nexport const valueText = sprinkles({\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const placeholder = sprinkles({\n color: 'textMuted',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n});\n","import { type JSX } from 'react';\n\nimport { Button } from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './entityIdFilterField.css.js';\n\nexport type EntityIdFilterFieldProps = {\n label: string;\n value: string | null;\n displayValue?: string | null;\n placeholder?: string;\n onPick?: () => void;\n onClear?: () => void;\n};\n\nexport const EntityIdFilterField = (\n props: EntityIdFilterFieldProps,\n): JSX.Element => {\n const { label, value, displayValue, placeholder, onPick, onClear } = props;\n const { t } = useBackofficeReactTranslation();\n const normalizedValue = value?.trim() ?? '';\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n const hasValue = normalizedValue !== '';\n const hasDisplayValue = normalizedDisplayValue !== '';\n\n const resolvedPlaceholder =\n placeholder ?? t('filters.placeholders.search', { label });\n const unresolvedPlaceholder = t('filters.placeholders.unresolved');\n\n let displayNode: JSX.Element;\n if (hasDisplayValue) {\n displayNode = (\n <span className={styles.valueText}>{normalizedDisplayValue}</span>\n );\n } else if (hasValue) {\n displayNode = (\n <span className={styles.placeholder}>{unresolvedPlaceholder}</span>\n );\n } else {\n displayNode = (\n <span className={styles.placeholder}>{resolvedPlaceholder}</span>\n );\n }\n\n let pickLabel = t('common.actions.pick');\n if (hasValue) {\n pickLabel = t('common.actions.change');\n }\n\n let clearNode: JSX.Element | null = null;\n if (hasValue && onClear != null) {\n clearNode = (\n <Button\n type=\"button\"\n variant=\"text\"\n size=\"small\"\n aria-label={t('common.actions.clear')}\n onClick={onClear}\n >\n {t('common.actions.clear')}\n </Button>\n );\n }\n\n let pickerNode: JSX.Element | null = null;\n if (onPick != null) {\n pickerNode = (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n aria-label={t('common.actions.pick')}\n onClick={onPick}\n >\n {pickLabel}\n </Button>\n );\n }\n\n return (\n <div className={styles.container}>\n <div className={styles.valueBox}>{displayNode}</div>\n <div className={styles.actions}>\n {pickerNode}\n {clearNode}\n </div>\n </div>\n );\n};\n\nexport default EntityIdFilterField;\n","import { useEffect, useMemo, useState } from 'react';\n\nimport type {\n BackofficeResolvedListFacetModule,\n BackofficeResolvedPickerFacetModule,\n BackofficeResolvedToolFacetModule,\n} from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeConfig } from './BackofficeConfigContext.js';\n\ntype LoadState<TModule> =\n | {\n status: 'loading';\n module: null;\n error: null;\n }\n | {\n status: 'loaded';\n module: TModule;\n error: null;\n }\n | {\n status: 'error';\n module: null;\n error: Error;\n };\n\ntype MultiLoadState<TModule> =\n | {\n status: 'loading';\n modules: Record<string, TModule>;\n error: null;\n }\n | {\n status: 'loaded';\n modules: Record<string, TModule>;\n error: null;\n }\n | {\n status: 'error';\n modules: Record<string, TModule>;\n error: Error;\n };\n\nconst toError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error;\n }\n return new Error(String(error));\n};\n\nconst buildSortedEntityIds = (\n entityIds: readonly string[],\n): readonly string[] => {\n return [...new Set(entityIds)].sort();\n};\n\nconst createMultiLoadState = <TModule>(\n status: 'loading' | 'loaded',\n modules: Record<string, TModule>,\n): MultiLoadState<TModule> => {\n return {\n status,\n modules,\n error: null,\n };\n};\n\nconst areErrorsEqual = (left: Error | null, right: Error | null): boolean => {\n if (left === right) {\n return true;\n }\n if (left == null || right == null) {\n return false;\n }\n return left.name === right.name && left.message === right.message;\n};\n\nconst areModuleMapsEqual = <TModule>(\n left: Record<string, TModule>,\n right: Record<string, TModule>,\n): boolean => {\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n\n for (const key of leftKeys) {\n if (!(key in right) || left[key] !== right[key]) {\n return false;\n }\n }\n\n return true;\n};\n\nconst areLoadStatesEqual = <TModule>(\n left: LoadState<TModule>,\n right: LoadState<TModule>,\n): boolean => {\n if (left.status !== right.status) {\n return false;\n }\n\n if (left.module !== right.module) {\n return false;\n }\n\n return areErrorsEqual(left.error, right.error);\n};\n\nconst areMultiLoadStatesEqual = <TModule>(\n left: MultiLoadState<TModule>,\n right: MultiLoadState<TModule>,\n): boolean => {\n if (left.status !== right.status) {\n return false;\n }\n\n if (!areModuleMapsEqual(left.modules, right.modules)) {\n return false;\n }\n\n return areErrorsEqual(left.error, right.error);\n};\n\nconst selectLoadState = <TModule>(\n currentState: LoadState<TModule>,\n nextState: LoadState<TModule>,\n): LoadState<TModule> => {\n if (areLoadStatesEqual(currentState, nextState)) {\n return currentState;\n }\n return nextState;\n};\n\nconst selectMultiLoadState = <TModule>(\n currentState: MultiLoadState<TModule>,\n nextState: MultiLoadState<TModule>,\n): MultiLoadState<TModule> => {\n if (areMultiLoadStatesEqual(currentState, nextState)) {\n return currentState;\n }\n return nextState;\n};\n\nconst useFacetLoader = <TModule>(\n entityId: string,\n getLoaded: (entityId: string) => TModule | null,\n load: (entityId: string) => Promise<TModule>,\n enabled = true,\n): LoadState<TModule> => {\n const initialModule = getLoaded(entityId);\n const [state, setState] = useState<LoadState<TModule>>(() => {\n if (initialModule != null) {\n return {\n status: 'loaded',\n module: initialModule,\n error: null,\n };\n }\n return {\n status: 'loading',\n module: null,\n error: null,\n };\n });\n\n useEffect(() => {\n if (!enabled) {\n const loadedModule = getLoaded(entityId);\n setState((currentState) => {\n let nextState: LoadState<TModule>;\n\n if (loadedModule != null) {\n nextState = {\n status: 'loaded',\n module: loadedModule,\n error: null,\n };\n } else {\n nextState = {\n status: 'loading',\n module: null,\n error: null,\n };\n }\n\n return selectLoadState(currentState, nextState);\n });\n return undefined;\n }\n\n const loadedModule = getLoaded(entityId);\n if (loadedModule != null) {\n setState((currentState) => {\n const nextState: LoadState<TModule> = {\n status: 'loaded',\n module: loadedModule,\n error: null,\n };\n return selectLoadState(currentState, nextState);\n });\n return undefined;\n }\n\n let cancelled = false;\n setState((currentState) => {\n const nextState: LoadState<TModule> = {\n status: 'loading',\n module: null,\n error: null,\n };\n return selectLoadState(currentState, nextState);\n });\n\n load(entityId)\n .then((module) => {\n if (cancelled) {\n return;\n }\n setState((currentState) => {\n const nextState: LoadState<TModule> = {\n status: 'loaded',\n module,\n error: null,\n };\n return selectLoadState(currentState, nextState);\n });\n })\n .catch((error: unknown) => {\n if (cancelled) {\n return;\n }\n const nextError = toError(error);\n setState((currentState) => {\n const nextState: LoadState<TModule> = {\n status: 'error',\n module: null,\n error: nextError,\n };\n return selectLoadState(currentState, nextState);\n });\n });\n\n return () => {\n cancelled = true;\n };\n }, [enabled, entityId, getLoaded, load]);\n\n return state;\n};\n\nexport const useBackofficeListEntityLoader = (\n entityId: string,\n options?: { enabled?: boolean },\n): LoadState<BackofficeResolvedListFacetModule> => {\n const { entityRegistry } = useBackofficeConfig();\n return useFacetLoader(\n entityId,\n entityRegistry.getLoadedListEntity,\n entityRegistry.loadListEntity,\n options?.enabled,\n );\n};\n\nexport const useBackofficePickerEntityLoader = (\n entityId: string,\n options?: { enabled?: boolean },\n): LoadState<BackofficeResolvedPickerFacetModule> => {\n const { entityRegistry } = useBackofficeConfig();\n return useFacetLoader(\n entityId,\n entityRegistry.getLoadedPickerEntity,\n entityRegistry.loadPickerEntity,\n options?.enabled,\n );\n};\n\nexport const useBackofficeToolEntityLoader = (\n entityId: string,\n options?: { enabled?: boolean },\n): LoadState<BackofficeResolvedToolFacetModule> => {\n const { entityRegistry } = useBackofficeConfig();\n return useFacetLoader(\n entityId,\n entityRegistry.getLoadedToolEntity,\n entityRegistry.loadToolEntity,\n options?.enabled,\n );\n};\n\nexport const useBackofficeListEntitiesLoader = (\n entityIds: readonly string[],\n): MultiLoadState<BackofficeResolvedListFacetModule> => {\n const { entityRegistry } = useBackofficeConfig();\n const normalizedEntityIds = useMemo(() => {\n return buildSortedEntityIds(entityIds);\n }, [entityIds]);\n const entityIdsKey = normalizedEntityIds.join('|');\n const [state, setState] = useState<\n MultiLoadState<BackofficeResolvedListFacetModule>\n >(() => {\n const modules: Record<string, BackofficeResolvedListFacetModule> = {};\n let isComplete = true;\n\n for (const entityId of normalizedEntityIds) {\n const module = entityRegistry.getLoadedListEntity(entityId);\n if (module == null) {\n isComplete = false;\n } else {\n modules[entityId] = module;\n }\n }\n\n if (isComplete) {\n return createMultiLoadState('loaded', modules);\n }\n return createMultiLoadState('loading', modules);\n });\n\n useEffect(() => {\n const modules: Record<string, BackofficeResolvedListFacetModule> = {};\n let isComplete = true;\n\n for (const entityId of normalizedEntityIds) {\n const module = entityRegistry.getLoadedListEntity(entityId);\n if (module == null) {\n isComplete = false;\n } else {\n modules[entityId] = module;\n }\n }\n\n if (isComplete) {\n const nextState = createMultiLoadState('loaded', modules);\n setState((currentState) => {\n return selectMultiLoadState(currentState, nextState);\n });\n return undefined;\n }\n\n let cancelled = false;\n setState((currentState) => {\n const nextState: MultiLoadState<BackofficeResolvedListFacetModule> = {\n status: 'loading',\n modules,\n error: null,\n };\n return selectMultiLoadState(currentState, nextState);\n });\n\n Promise.all(\n normalizedEntityIds.map(async (entityId) => {\n const module = await entityRegistry.loadListEntity(entityId);\n return [entityId, module] as const;\n }),\n )\n .then((entries) => {\n if (cancelled) {\n return;\n }\n setState((currentState) => {\n const nextState: MultiLoadState<BackofficeResolvedListFacetModule> = {\n status: 'loaded',\n modules: Object.fromEntries(entries),\n error: null,\n };\n return selectMultiLoadState(currentState, nextState);\n });\n })\n .catch((error: unknown) => {\n if (cancelled) {\n return;\n }\n const nextError = toError(error);\n setState((currentState) => {\n const nextState: MultiLoadState<BackofficeResolvedListFacetModule> = {\n status: 'error',\n modules,\n error: nextError,\n };\n return selectMultiLoadState(currentState, nextState);\n });\n });\n\n return () => {\n cancelled = true;\n };\n }, [entityIdsKey, entityRegistry, normalizedEntityIds]);\n\n return state;\n};\n","import { sprinkles } from '@plumile/ui';\n\nexport const layout = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const searchRequiredMessage = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n textAlign: 'center',\n paddingY: 3,\n paddingX: 0,\n});\n\nexport const row = sprinkles({\n display: 'flex',\n gap: 2,\n alignItems: 'center',\n});\n\nexport const rowText = sprinkles({\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n textAlign: 'left',\n});\n\nexport const rowTitle = sprinkles({\n color: 'text',\n fontWeight: 'medium',\n fontSize: 'base',\n lineHeight: 1.2,\n});\n\nexport const rowSubtitle = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 1.2,\n});\n\nexport const rowMeta = sprinkles({\n color: 'textMuted',\n fontSize: 'xs',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Input } from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from '../entityIdPickerDialog.css.js';\n\nexport type EntityPickerShellProps = {\n search: string;\n onSearchChange: (next: string) => void;\n searchPlaceholder?: string;\n searchEnabled?: boolean;\n children: ReactNode;\n};\n\nexport const EntityPickerShell = ({\n search,\n onSearchChange,\n searchPlaceholder,\n searchEnabled = true,\n children,\n}: EntityPickerShellProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const resolvedPlaceholder =\n searchPlaceholder ?? t('picker.searchPlaceholder.default');\n let searchNode: JSX.Element | null = null;\n if (searchEnabled) {\n searchNode = (\n <Input\n value={search}\n onChange={(event) => {\n onSearchChange(event.target.value);\n }}\n placeholder={resolvedPlaceholder}\n size=\"small\"\n fullWidth\n />\n );\n }\n\n return (\n <div className={styles.layout}>\n {searchNode}\n {children}\n </div>\n );\n};\n\nexport default EntityPickerShell;\n","import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from '../entityIdPickerDialog.css.js';\n\nexport type EntityPickerRowBaseProps = {\n title: ReactNode;\n subtitle?: ReactNode;\n};\n\nexport const EntityPickerRowBase = ({\n title,\n subtitle,\n}: EntityPickerRowBaseProps): JSX.Element => {\n let subtitleNode: ReactNode | null = null;\n if (subtitle != null) {\n subtitleNode = <div className={styles.rowSubtitle}>{subtitle}</div>;\n }\n\n return (\n <div className={styles.row}>\n <div className={styles.rowText}>\n <div className={styles.rowTitle}>{title}</div>\n {subtitleNode}\n </div>\n </div>\n );\n};\n\nexport default EntityPickerRowBase;\n","import { type JSX } from 'react';\n\nimport { BackofficeEmptyState, Button } from '@plumile/ui';\n\nimport { EntityPickerRowBase } from './EntityPickerRowBase.js';\nimport type { EntityPickerRowViewModel } from '../types.js';\n\nexport type EntityPickerListProps = {\n items: readonly EntityPickerRowViewModel[];\n onSelectId: (id: string) => void;\n emptyState?: JSX.Element;\n};\n\nexport const EntityPickerList = ({\n items,\n onSelectId,\n emptyState,\n}: EntityPickerListProps): JSX.Element => {\n if (items.length === 0) {\n return (\n emptyState ?? (\n <BackofficeEmptyState\n title=\"No result\"\n description=\"Try another search term.\"\n />\n )\n );\n }\n\n return (\n <div>\n {items.map((item) => {\n return (\n <Button\n key={item.id}\n type=\"button\"\n variant=\"text\"\n onClick={() => {\n onSelectId(item.id);\n }}\n width=\"full\"\n >\n <EntityPickerRowBase title={item.title} subtitle={item.subtitle} />\n </Button>\n );\n })}\n </div>\n );\n};\n\nexport default EntityPickerList;\n","import {\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type JSX,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\n\nimport { Button, Modal, Spinner } from '@plumile/ui';\nimport type {\n BackofficeEntityPickerConfig,\n BackofficePickerScope,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePickerEntityLoader } from '../../../provider/useBackofficeEntityLoader.js';\n\nimport { EntityPickerShell } from './shared/EntityPickerShell.js';\nimport { EntityPickerList } from './shared/EntityPickerList.js';\nimport type { EntityPickerRowViewModel } from './types.js';\nimport * as styles from './entityIdPickerDialog.css.js';\n\nconst { useFragment, useLazyLoadQuery } = ReactRelay;\n\nexport type EntityIdPickerDialogProps = {\n isOpen: boolean;\n entity: string;\n title: string;\n scope?: BackofficePickerScope;\n onClose: () => void;\n onSelectId: (id: string) => void;\n};\n\nconst PICKER_FETCH_POLICY = 'store-and-network' as const;\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\ntype PickerBodyProps<RowRef, RowView extends EntityPickerRowViewModel> = {\n config: BackofficeEntityPickerConfig<RowRef, RowView>;\n search: string;\n scope?: BackofficePickerScope;\n fetchKey: number;\n onSelectId: (id: string) => void;\n};\n\nconst PickerBody = <RowRef, RowView extends EntityPickerRowViewModel>({\n config,\n search,\n scope,\n fetchKey,\n onSelectId,\n}: PickerBodyProps<RowRef, RowView>): JSX.Element => {\n const variables = useMemo(() => {\n const trimmed = search.trim();\n if (config.buildVariables != null) {\n return config.buildVariables({ search: trimmed, scope });\n }\n let searchValue: string | null = trimmed;\n if (trimmed === '') {\n searchValue = null;\n }\n return {\n search: searchValue,\n scope,\n } as Record<string, unknown>;\n }, [config, scope, search]);\n\n const queryData = useLazyLoadQuery(config.query, variables, {\n fetchPolicy: PICKER_FETCH_POLICY,\n fetchKey,\n });\n\n const fragmentData = useFragment(\n config.fragment,\n queryData as never,\n ) as unknown;\n\n const connection = config.getConnection(fragmentData as never);\n\n const items = useMemo<readonly EntityPickerRowViewModel[]>(() => {\n return connection.edges.map((edge) => {\n const row = config.toRow(edge.node);\n const id = config.getRowId(row);\n return {\n id,\n title: row.title,\n subtitle: row.subtitle,\n };\n });\n }, [config, connection.edges]);\n\n return <EntityPickerList items={items} onSelectId={onSelectId} />;\n};\n\nconst buildFooter = (onClose: () => void, closeLabel: string): JSX.Element => {\n return (\n <>\n <Button type=\"button\" variant=\"secondary\" onClick={onClose}>\n {closeLabel}\n </Button>\n </>\n );\n};\n\nconst PickerUnavailable = ({ message }: { message: string }) => {\n return <div>{message}</div>;\n};\n\nexport const EntityIdPickerDialog = ({\n isOpen,\n entity,\n title,\n scope,\n onClose,\n onSelectId,\n}: EntityIdPickerDialogProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [search, setSearch] = useState('');\n const [fetchKey, setFetchKey] = useState(0);\n const entityState = useBackofficePickerEntityLoader(entity, {\n enabled: isOpen,\n });\n\n let pickerConfig:\n | BackofficeEntityPickerConfig<unknown, EntityPickerRowViewModel>\n | undefined;\n if (entityState.status === 'loaded') {\n pickerConfig = entityState.module.config.picker as\n | BackofficeEntityPickerConfig<unknown, EntityPickerRowViewModel>\n | undefined;\n }\n\n useEffect(() => {\n if (isOpen) {\n setSearch('');\n setFetchKey((value) => {\n return value + 1;\n });\n }\n }, [isOpen]);\n\n const footer = useMemo(() => {\n return buildFooter(onClose, t('common.actions.close'));\n }, [onClose, t]);\n\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next);\n setFetchKey((value) => {\n return value + 1;\n });\n }, []);\n\n const handleSelectId = useCallback(\n (id: string) => {\n onSelectId(id);\n onClose();\n },\n [onClose, onSelectId],\n );\n\n if (!isOpen) {\n return null;\n }\n\n let resolvedSearchPlaceholder: string | undefined;\n if (pickerConfig?.searchPlaceholder != null) {\n resolvedSearchPlaceholder = resolveLabel(\n pickerConfig.searchPlaceholder,\n tApp,\n );\n }\n\n const trimmedSearch = search.trim();\n const isSearchRequired = pickerConfig?.searchRequired === true;\n\n let pickerNode: JSX.Element;\n if (entityState.status === 'loading') {\n pickerNode = <Spinner />;\n } else if (pickerConfig != null) {\n if (isSearchRequired && trimmedSearch === '') {\n pickerNode = (\n <div className={styles.searchRequiredMessage}>\n {t('picker.searchRequired')}\n </div>\n );\n } else {\n pickerNode = (\n <PickerBody\n config={pickerConfig}\n search={search}\n scope={scope}\n fetchKey={fetchKey}\n onSelectId={handleSelectId}\n />\n );\n }\n } else {\n pickerNode = (\n <PickerUnavailable message={t('picker.unavailable', { entity })} />\n );\n }\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} title={title} footer={footer}>\n <EntityPickerShell\n search={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={resolvedSearchPlaceholder}\n searchEnabled={pickerConfig?.searchEnabled ?? true}\n >\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n return (\n <div>\n <div>{t('picker.errors.loadFailed')}</div>\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n reset();\n setFetchKey((value) => {\n return value + 1;\n });\n }}\n >\n {t('common.actions.retry')}\n </Button>\n </div>\n );\n }}\n >\n <Suspense fallback={<Spinner />}>{pickerNode}</Suspense>\n </BackofficeErrorBoundary>\n </EntityPickerShell>\n </Modal>\n );\n};\n\nexport type { BackofficePickerScope } from '@plumile/backoffice-core/types.js';\n\nexport default EntityIdPickerDialog;\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { n as e, t } from "./useBackofficeReactTranslation-WfXU8kCf.js";
|
|
2
|
-
import { n, r, t as i } from "./EntityFilterValue-
|
|
3
|
-
import { i as a, t as o } from "./EntityIdPickerDialog-
|
|
2
|
+
import { n, r, t as i } from "./EntityFilterValue-Bn9VGr2M.js";
|
|
3
|
+
import { i as a, t as o } from "./EntityIdPickerDialog-D_qAlrU6.js";
|
|
4
4
|
import { Suspense as s, lazy as c, startTransition as l, useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
|
|
5
5
|
import { useTranslation as ee } from "react-i18next";
|
|
6
6
|
import { BackofficeEmptyState as h, BackofficeFilterDrawer as te, BackofficeFilterField as ne, BackofficeLoadMore as re, BackofficePageHeader as ie, BackofficeTableSkeleton as ae, BackofficeTableToolbar as oe, BackofficeVirtualizedConnectionTable as se, Button as g, FilterChipRow as ce, GlobalSearchInput as le, InlineBanner as ue, ListPageTemplate as de, SimpleSelect as _, denseTableClass as fe } from "@plumile/ui";
|
|
@@ -57,7 +57,7 @@ function pe({ refetch: e, variables: t, defaults: n, fetchPolicy: r, buildVariab
|
|
|
57
57
|
}
|
|
58
58
|
//#endregion
|
|
59
59
|
//#region src/components/backoffice/scaffolds/backofficeEntityListScaffold.css.ts
|
|
60
|
-
var me = "
|
|
60
|
+
var me = "txvbqb9io txvbqbajx txvbqbco txvbqbao6", he = "txvbqbu3f txvbqbjdo", ge = "txvbqb9io txvbqbai6 txvbqbaof", _e = "txvbqb96 txvbqbamo txvbqbv8p", T = (e, t) => e(t), E = (e, t) => e.fromGraphQL != null && t != null ? e.fromGraphQL(t) : x(t, e.whereKey ?? e.id, e.path), ve = (e, t, n) => {
|
|
61
61
|
if (t == null) return null;
|
|
62
62
|
if (Array.isArray(t)) {
|
|
63
63
|
let e = t.map((e) => {
|
|
@@ -476,11 +476,11 @@ var me = "_8gc5760 vncd899io vncd89ajx vncd89co vncd89ao6", he = "_8gc5761 vncd8
|
|
|
476
476
|
tableFooterNode: $
|
|
477
477
|
})
|
|
478
478
|
});
|
|
479
|
-
}, O = c(async () => ({ default: (await import("./BackofficeEntityActionFormDialog-
|
|
479
|
+
}, O = c(async () => ({ default: (await import("./BackofficeEntityActionFormDialog-BzKi1eyv.js")).BackofficeEntityActionFormDialog })), k = (e) => /* @__PURE__ */ y(s, {
|
|
480
480
|
fallback: null,
|
|
481
481
|
children: /* @__PURE__ */ y(O, { ...e })
|
|
482
482
|
});
|
|
483
483
|
//#endregion
|
|
484
484
|
export { w as i, D as n, pe as r, k as t };
|
|
485
485
|
|
|
486
|
-
//# sourceMappingURL=LazyBackofficeEntityActionFormDialog-
|
|
486
|
+
//# sourceMappingURL=LazyBackofficeEntityActionFormDialog-DndjG4kV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LazyBackofficeEntityActionFormDialog-DndjG4kV.js","names":[],"sources":["../../src/hooks/useBackofficeLoadMore.ts","../../src/hooks/useBackofficeListRefetch.ts","../../src/components/backoffice/scaffolds/backofficeEntityListScaffold.css.ts","../../src/components/backoffice/scaffolds/BackofficeEntityListScaffold.tsx","../../src/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.tsx"],"sourcesContent":["import { startTransition, useCallback } from 'react';\n\ntype Params = {\n hasNext: boolean;\n isLoadingNext: boolean;\n loadNext: (count: number) => void;\n count: number;\n};\n\n/**\n * Wraps Relay `loadNext()` with consistent guards and `startTransition()`.\n */\nexport function useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count,\n}: Params): () => void {\n return useCallback(() => {\n if (!hasNext || isLoadingNext) {\n return;\n }\n\n startTransition(() => {\n loadNext(count);\n });\n }, [count, hasNext, isLoadingNext, loadNext]);\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport type { FetchPolicy } from 'relay-runtime';\n\nimport { stableListVariablesKey } from '@plumile/backoffice-core/state/stableKey.js';\nimport type { BackofficeListVariables } from '@plumile/backoffice-core/types.js';\n\ntype RefetchFn<TVariables> = (\n vars: TVariables,\n opts: { fetchPolicy: FetchPolicy },\n) => void;\n\ntype Params<Where, Sort extends string, Variables> = {\n refetch: RefetchFn<Variables>;\n variables: BackofficeListVariables<Where, Sort>;\n defaults: BackofficeListVariables<Where, Sort>;\n fetchPolicy: FetchPolicy;\n buildVariables?: (input: BackofficeListVariables<Where, Sort>) => Variables;\n};\n\n/**\n * Standardizes refetch behavior for backoffice list components:\n * - Refetches when list URL state changes (where/sort/count), gated by a stable key.\n * - Exposes a manual refresh callback using the same variables.\n *\n * This hook must not call Relay hooks (`useFragment`, `usePaginationFragment`, ...).\n */\nexport function useBackofficeListRefetch<\n Where,\n Sort extends string,\n Variables extends Record<string, unknown>,\n>({\n refetch,\n variables,\n defaults,\n fetchPolicy,\n buildVariables,\n}: Params<Where, Sort, Variables>): { onRefresh: () => void } {\n const lastRefetchKeyRef = useRef<string | null>(\n stableListVariablesKey({\n where: defaults.where,\n sort: defaults.sort,\n count: defaults.count,\n }),\n );\n\n const resolveVariables = useCallback(\n (input: BackofficeListVariables<Where, Sort>) => {\n if (buildVariables != null) {\n return buildVariables(input);\n }\n return input as unknown as Variables;\n },\n [buildVariables],\n );\n\n useEffect(() => {\n const key = stableListVariablesKey({\n where: variables.where,\n sort: variables.sort,\n count: variables.count,\n });\n if (lastRefetchKeyRef.current === key) {\n return;\n }\n lastRefetchKeyRef.current = key;\n\n const nextVariables = resolveVariables({ ...variables, cursor: null });\n refetch(nextVariables, { fetchPolicy });\n }, [fetchPolicy, refetch, resolveVariables, variables]);\n\n const onRefresh = useCallback(() => {\n const nextVariables = resolveVariables({ ...variables, cursor: null });\n refetch(nextVariables, { fetchPolicy });\n }, [fetchPolicy, refetch, resolveVariables, variables]);\n\n return { onRefresh };\n}\n","import { sprinkles } from '@plumile/ui';\n\nexport const controlsRow = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const filterInput = sprinkles({\n width: 72,\n maxWidth: 'full',\n});\n\nexport const embeddedContainer = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const embeddedHeader = sprinkles({\n fontSize: 'base',\n fontWeight: 'semibold',\n color: 'text',\n});\n","/* eslint-disable no-ternary */\nimport {\n type JSX,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport {\n BackofficeEmptyState,\n BackofficeFilterDrawer,\n BackofficeFilterField,\n BackofficeLoadMore,\n BackofficePageHeader,\n BackofficeTableSkeleton,\n BackofficeTableToolbar,\n BackofficeVirtualizedConnectionTable,\n Button,\n FilterChipRow,\n GlobalSearchInput,\n InlineBanner,\n ListPageTemplate,\n SimpleSelect,\n type FilterChip,\n type DataTableColumn,\n type GetRowId,\n denseTableClass,\n} from '@plumile/ui';\n\nimport {\n readWhereValue,\n setWhereValue,\n} from '@plumile/backoffice-core/filters/where.js';\nimport type {\n BackofficeFilterSpec,\n BackofficeListState,\n BackofficePickerScope,\n BackofficeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport {\n EntityFilterValue,\n EntityFilterValueText,\n} from '../filters/EntityFilterValue.js';\nimport { EntityIdPickerDialog } from '../pickers/EntityIdPickerDialog.js';\nimport { EntityIdFilterField } from '../filters/EntityIdFilterField.js';\nimport { BackofficeListFilterProvider } from './BackofficeListFilterContext.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './backofficeEntityListScaffold.css.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst getFilterValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n where: Where | null,\n): unknown => {\n if (filter.fromGraphQL != null && where != null) {\n return filter.fromGraphQL(where);\n }\n\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n return readWhereValue(where, key, filter.path);\n};\n\nconst getFilterDisplayValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n raw: unknown,\n options: {\n enumLabel: (value: string) => string;\n booleanLabel: (value: boolean) => string;\n fallbackBooleanLabels: { yes: string; no: string };\n },\n): ReactNode | null => {\n if (raw == null) {\n return null;\n }\n\n if (Array.isArray(raw)) {\n const normalized = raw\n .map((entry) => {\n if (entry == null) {\n return null;\n }\n if (\n typeof entry !== 'string' &&\n typeof entry !== 'number' &&\n typeof entry !== 'boolean'\n ) {\n return null;\n }\n const value = String(entry).trim();\n if (value === '') {\n return null;\n }\n return value;\n })\n .filter((entry): entry is string => {\n return entry != null;\n });\n\n if (normalized.length === 0) {\n return null;\n }\n return normalized.join(', ');\n }\n\n if (typeof raw === 'boolean') {\n if (filter.kind === 'boolean') {\n return options.booleanLabel(raw);\n }\n if (raw) {\n return options.fallbackBooleanLabels.yes;\n }\n return options.fallbackBooleanLabels.no;\n }\n\n if (typeof raw !== 'string' && typeof raw !== 'number') {\n return null;\n }\n\n const rawString = String(raw).trim();\n if (rawString === '') {\n return null;\n }\n\n if (filter.kind === 'entityId') {\n return <EntityFilterValue entityId={filter.entity} id={rawString} />;\n }\n\n if (filter.kind === 'enum') {\n return options.enumLabel(rawString);\n }\n\n return rawString;\n};\n\ntype Props<\n RowView,\n Where extends Record<string, unknown>,\n Sort extends string,\n> = {\n config: BackofficeResolvedListFacetConfig<Where, Sort>;\n state: BackofficeListState<Where, Sort>;\n pushState: (next: BackofficeListState<Where, Sort>) => void;\n header?: {\n title?: string;\n subtitle?: string;\n };\n headerActions?: ReactNode;\n rows: readonly RowView[];\n getRowId: GetRowId<RowView>;\n columns: readonly DataTableColumn<RowView>[];\n gridTemplateColumns?: string;\n hasNextPage: boolean;\n isLoadingMore: boolean;\n onLoadMore: () => void;\n onRefresh?: () => void;\n totalCount?: number | null;\n emptyState?: JSX.Element;\n isLoadingInitial?: boolean;\n virtualize?: boolean;\n variant?: 'page' | 'embedded';\n showFilters?: boolean;\n};\n\nexport const BackofficeEntityListScaffold = <\n RowView,\n Where extends Record<string, unknown>,\n Sort extends string,\n>(\n props: Props<RowView, Where, Sort>,\n): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const {\n config,\n state,\n pushState,\n rows,\n getRowId,\n columns,\n gridTemplateColumns,\n hasNextPage,\n isLoadingMore,\n onLoadMore,\n onRefresh,\n totalCount,\n emptyState,\n header,\n headerActions,\n isLoadingInitial = false,\n virtualize = true,\n variant = 'page',\n showFilters = true,\n } = props;\n const listConfig = config.list;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n\n const columnsWithPrimary = useMemo(() => {\n const hasPrimary = columns.some((col) => {\n return col.isPrimary === true;\n });\n if (hasPrimary || columns.length === 0) {\n return columns;\n }\n return columns.map((col, index) => {\n const { header } = col;\n if (index === 0) {\n return { ...col, isPrimary: true, header };\n }\n return { ...col, header };\n });\n }, [columns]);\n\n const chips = useMemo<readonly FilterChip[]>(() => {\n const out: FilterChip[] = [];\n for (const filter of listConfig.filters) {\n const raw = getFilterValue(filter, state.where);\n const displayValue = getFilterDisplayValue(filter, raw, {\n enumLabel: (value) => {\n if (filter.kind !== 'enum') {\n return value;\n }\n const match = filter.options.find((option) => {\n return option.value === value;\n });\n if (match != null) {\n return resolveLabel(match.label, tApp);\n }\n return value;\n },\n booleanLabel: (value) => {\n if (filter.kind === 'boolean') {\n if (value && filter.trueLabel != null) {\n return resolveLabel(filter.trueLabel, tApp);\n }\n if (!value && filter.falseLabel != null) {\n return resolveLabel(filter.falseLabel, tApp);\n }\n }\n if (value) {\n return t('filters.boolean.yes');\n }\n return t('filters.boolean.no');\n },\n fallbackBooleanLabels: {\n yes: t('filters.boolean.yes'),\n no: t('filters.boolean.no'),\n },\n });\n\n if (displayValue != null) {\n let idValue = String(raw);\n if (Array.isArray(raw)) {\n idValue = raw.join(',');\n }\n const label = (\n <span>\n {resolveLabel(filter.label, tApp)}: {displayValue}\n </span>\n );\n out.push({\n id: `${filter.id}:${idValue}`,\n label,\n onRemove: () => {\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n },\n });\n }\n }\n return out;\n }, [listConfig.filters, pushState, state, t, tApp]);\n\n const handleClearAll = useCallback(() => {\n pushState({\n ...listDefaults,\n });\n }, [listDefaults, pushState]);\n const [isFilterDrawerOpen, setIsFilterDrawerOpen] = useState(false);\n const [filterSearch, setFilterSearch] = useState('');\n\n const [pickerDialog, setPickerDialog] = useState<{\n entity: string;\n whereKey: keyof Where;\n label: string;\n path?: readonly string[];\n scope?: BackofficePickerScope;\n } | null>(null);\n\n const renderFilterControl = useCallback(\n (filter: BackofficeFilterSpec<Where>): JSX.Element => {\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n const candidate = getFilterValue(filter, state.where);\n let value = '';\n if (typeof candidate === 'string') {\n value = candidate;\n }\n\n const filterLabelText = resolveLabel(filter.label, tApp);\n\n if (filter.kind === 'text') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <GlobalSearchInput\n value={value}\n onChange={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n if (filter.kind === 'enum') {\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n ...filter.options.map((option) => {\n return {\n id: option.value,\n value: option.value,\n label: resolveLabel(option.label, tApp),\n };\n }),\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={value}\n onChange={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n if (filter.kind === 'boolean') {\n let current: boolean | null = null;\n if (typeof candidate === 'boolean') {\n current = candidate;\n }\n\n let selectValue = '';\n if (current === true) {\n selectValue = 'true';\n }\n if (current === false) {\n selectValue = 'false';\n }\n\n const trueLabel =\n filter.trueLabel != null\n ? resolveLabel(filter.trueLabel, tApp)\n : t('filters.boolean.yes');\n const falseLabel =\n filter.falseLabel != null\n ? resolveLabel(filter.falseLabel, tApp)\n : t('filters.boolean.no');\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n {\n id: 'true',\n value: 'true',\n label: trueLabel,\n },\n {\n id: 'false',\n value: 'false',\n label: falseLabel,\n },\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={selectValue}\n onChange={(next) => {\n let parsed: boolean | null = null;\n if (next === 'true') {\n parsed = true;\n }\n if (next === 'false') {\n parsed = false;\n }\n const nextWhere = setWhereValue(\n state.where,\n key,\n parsed,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n const pickerScope = (() => {\n if (filter.pickerScope == null) {\n return undefined;\n }\n if (typeof filter.pickerScope === 'function') {\n return filter.pickerScope(state.where);\n }\n return filter.pickerScope;\n })();\n let currentId: string | null = null;\n if (typeof candidate === 'string') {\n currentId = candidate;\n }\n\n const renderField = (displayValue: string | null = null) => {\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n return (\n <EntityIdFilterField\n label={filterLabelText}\n value={currentId}\n displayValue={normalizedDisplayValue}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n };\n\n if (currentId == null || currentId.trim() === '') {\n return renderField();\n }\n\n return (\n <EntityFilterValueText entityId={filter.entity} id={currentId}>\n {(label) => {\n return renderField(label);\n }}\n </EntityFilterValueText>\n );\n },\n [pushState, state, t, tApp],\n );\n\n const hasPlacementConfig = useMemo(() => {\n return listConfig.filters.some((filter) => {\n return filter.placement != null;\n });\n }, [listConfig.filters]);\n\n const quickFilters = useMemo(() => {\n if (listConfig.filters.length === 0) {\n return [];\n }\n if (hasPlacementConfig) {\n return listConfig.filters.filter((filter) => {\n return filter.placement === 'quick' || filter.placement === 'both';\n });\n }\n return listConfig.filters.slice(0, 3);\n }, [listConfig.filters, hasPlacementConfig]);\n\n const drawerFilters = useMemo(() => {\n return listConfig.filters.filter((filter) => {\n if (filter.placement == null) {\n return true;\n }\n return filter.placement === 'drawer' || filter.placement === 'both';\n });\n }, [listConfig.filters]);\n\n const searchFilter = useMemo(() => {\n return quickFilters.find((filter) => {\n return filter.kind === 'text';\n });\n }, [quickFilters]);\n\n const quickFiltersNode = useMemo(() => {\n const visibleQuickFilters = quickFilters.filter((filter) => {\n return filter !== searchFilter;\n });\n\n if (visibleQuickFilters.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.controlsRow}>\n {visibleQuickFilters.map((filter) => {\n return <span key={filter.id}>{renderFilterControl(filter)}</span>;\n })}\n </div>\n );\n }, [quickFilters, renderFilterControl, searchFilter]);\n\n const searchNode = useMemo(() => {\n if (searchFilter == null) {\n return null;\n }\n return renderFilterControl(searchFilter);\n }, [renderFilterControl, searchFilter]);\n\n const sortNode = useMemo(() => {\n if (listConfig.sorts.length === 0) {\n return null;\n }\n const firstSort = listConfig.sorts[0];\n if (firstSort == null) {\n return null;\n }\n const options = listConfig.sorts.map((s) => {\n return { id: s.id, value: s.id, label: resolveLabel(s.label, tApp) };\n });\n return (\n <SimpleSelect\n options={options}\n value={state.sort ?? firstSort.id}\n onChange={(next) => {\n pushState({\n ...state,\n sort: next as Sort,\n });\n }}\n />\n );\n }, [listConfig.sorts, pushState, state, tApp]);\n\n const chipsNode = useMemo(() => {\n return <FilterChipRow chips={chips} onClearAll={handleClearAll} />;\n }, [chips, handleClearAll]);\n\n const drawerSections = useMemo(() => {\n if (drawerFilters.length === 0) {\n return [];\n }\n\n const normalizedQuery = filterSearch.trim().toLowerCase();\n const items: { id: string; node: JSX.Element }[] = [];\n\n for (const filter of drawerFilters) {\n const resolvedLabel = resolveLabel(filter.label, tApp);\n const matchesQuery =\n normalizedQuery === '' ||\n resolvedLabel.toLowerCase().includes(normalizedQuery);\n\n if (matchesQuery) {\n items.push({\n id: filter.id,\n node: (\n <BackofficeFilterField label={resolvedLabel}>\n {renderFilterControl(filter)}\n </BackofficeFilterField>\n ),\n });\n }\n }\n\n if (items.length === 0) {\n return [];\n }\n\n return [\n {\n id: 'backoffice.filters.sections.default',\n title: t('filters.sections.default'),\n items,\n },\n ];\n }, [drawerFilters, filterSearch, renderFilterControl, t, tApp]);\n\n const allFiltersNode = useMemo(() => {\n if (drawerFilters.length === 0) {\n return null;\n }\n const activeCount = chips.length;\n let label = t('filters.allFilters');\n if (activeCount > 0) {\n label = t('filters.allFiltersWithCount', {\n count: activeCount,\n });\n }\n return (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n setIsFilterDrawerOpen(true);\n }}\n >\n {label}\n </Button>\n );\n }, [chips.length, drawerFilters.length, t]);\n\n const filterDrawerNode = (\n <BackofficeFilterDrawer\n isOpen={isFilterDrawerOpen}\n onClose={() => {\n setIsFilterDrawerOpen(false);\n setFilterSearch('');\n }}\n sections={drawerSections}\n searchValue={filterSearch}\n onSearchChange={(next) => {\n setFilterSearch(next);\n }}\n onReset={handleClearAll}\n />\n );\n\n const resolvedEmptyState = useMemo((): JSX.Element => {\n if (emptyState != null) {\n return emptyState;\n }\n\n if (isLoadingInitial) {\n return <BackofficeTableSkeleton />;\n }\n\n if (chips.length > 0) {\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmptyFiltered.description')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleClearAll}\n >\n {t('emptyState.listEmptyFiltered.actions.reset')}\n </Button>\n }\n />\n );\n }\n\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmpty.description')}\n />\n );\n }, [chips.length, emptyState, handleClearAll, isLoadingInitial, t]);\n\n const tableFooterMeta = useMemo(() => {\n if (typeof totalCount !== 'number') {\n return null;\n }\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }, [rows.length, t, totalCount]);\n\n const headerTitle = header?.title ?? resolveLabel(listConfig.title, tApp);\n const headerSubtitle = header?.subtitle;\n\n const virtualizationConfig = useMemo(() => {\n if (!virtualize) {\n return { enabled: false, rowHeightPx: 0, overscan: 0 };\n }\n\n return { enabled: true, rowHeightPx: 52, overscan: 10 };\n }, [virtualize]);\n\n const tableInnerNode = (\n <BackofficeVirtualizedConnectionTable\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n virtualization={virtualizationConfig}\n infiniteScroll={{\n enabled: true,\n thresholdPx: 800,\n autoLoad: true,\n }}\n hasNextPage={hasNextPage}\n isLoadingMore={isLoadingMore}\n onLoadMore={onLoadMore}\n />\n );\n\n const tableNodeWithErrorBoundary = (\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n\n const retry = (): void => {\n reset();\n if (onRefresh != null) {\n onRefresh();\n }\n };\n\n return (\n <InlineBanner\n tone=\"danger\"\n title={t('list.errors.title')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={retry}\n >\n {t('list.actions.retry')}\n </Button>\n }\n >\n {t('list.errors.tableFailed')}\n </InlineBanner>\n );\n }}\n >\n {tableInnerNode}\n </BackofficeErrorBoundary>\n );\n\n const filtersBarNode = showFilters ? (\n <>\n <BackofficeTableToolbar\n searchSlot={searchNode}\n filtersSlot={\n <>\n {quickFiltersNode}\n {allFiltersNode}\n </>\n }\n sortSlot={sortNode}\n refreshSlot={\n <Button\n type=\"button\"\n variant=\"text\"\n size=\"small\"\n disabled={onRefresh == null}\n onClick={() => {\n if (onRefresh != null) {\n onRefresh();\n }\n }}\n >\n {t('list.actions.refresh')}\n </Button>\n }\n chipsSlot={chipsNode}\n />\n {filterDrawerNode}\n </>\n ) : null;\n\n const tableNode = (\n <div>\n {tableNodeWithErrorBoundary}\n <EntityIdPickerDialog\n isOpen={pickerDialog != null}\n entity={pickerDialog?.entity ?? config.id}\n title={pickerDialog?.label ?? t('picker.title')}\n scope={pickerDialog?.scope}\n onClose={() => {\n setPickerDialog(null);\n }}\n onSelectId={(id) => {\n if (pickerDialog == null) {\n return;\n }\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n id,\n pickerDialog.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n </div>\n );\n\n const tableFooterNode = (\n <BackofficeLoadMore\n hasNextPage={hasNextPage}\n isLoading={isLoadingMore}\n meta={tableFooterMeta}\n loadMoreLabel={t('list.loadMore.more')}\n endLabel={t('list.loadMore.end')}\n loadingLabel={t('list.loadMore.loading')}\n />\n );\n\n if (variant === 'embedded') {\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <div className={styles.embeddedContainer}>\n <div className={styles.embeddedHeader}>{headerTitle}</div>\n {filtersBarNode}\n {tableNode}\n {tableFooterNode}\n </div>\n </BackofficeListFilterProvider>\n );\n }\n\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <ListPageTemplate\n headerNode={\n <BackofficePageHeader\n title={headerTitle}\n subtitle={headerSubtitle}\n actions={headerActions}\n />\n }\n toolbarNode={filtersBarNode}\n tableNode={tableNode}\n tableFooterNode={tableFooterNode}\n />\n </BackofficeListFilterProvider>\n );\n};\n\nexport default BackofficeEntityListScaffold;\n","import { Suspense, lazy, type JSX } from 'react';\n\nimport type { BackofficeEntityActionFormDialogProps } from './BackofficeEntityActionFormDialog.js';\n\nconst BackofficeEntityActionFormDialog = lazy(async () => {\n const module = await import('./BackofficeEntityActionFormDialog.js');\n return { default: module.BackofficeEntityActionFormDialog };\n});\n\nexport const LazyBackofficeEntityActionFormDialog = <Node,>(\n props: BackofficeEntityActionFormDialogProps<Node>,\n): JSX.Element => {\n const Dialog = BackofficeEntityActionFormDialog as <TNode>(\n dialogProps: BackofficeEntityActionFormDialogProps<TNode>,\n ) => JSX.Element;\n\n return (\n <Suspense fallback={null}>\n <Dialog {...props} />\n </Suspense>\n );\n};\n\nexport default LazyBackofficeEntityActionFormDialog;\n"],"mappings":"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"}
|
package/lib/esm/{PasswordResetCompleteScreen-C4GQdavL.js → PasswordResetCompleteScreen-CWxk9AWl.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as e, f as t, r as n, s as r } from "./loginPage.css-
|
|
2
|
-
import { t as i } from "./AuthPanel-
|
|
1
|
+
import { a as e, f as t, r as n, s as r } from "./loginPage.css-4M4PrzUn.js";
|
|
2
|
+
import { t as i } from "./AuthPanel-Co626p7A.js";
|
|
3
3
|
import { useCallback as a, useMemo as o, useState as s } from "react";
|
|
4
4
|
import { AuthLayout as c, Button as l, FormError as u, FormField as d } from "@plumile/ui";
|
|
5
5
|
import { jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
@@ -98,4 +98,4 @@ var m = 8, h = ({ onBackToLogin: h, onCompletePasswordReset: g, token: _ }) => {
|
|
|
98
98
|
//#endregion
|
|
99
99
|
export { h as t };
|
|
100
100
|
|
|
101
|
-
//# sourceMappingURL=PasswordResetCompleteScreen-
|
|
101
|
+
//# sourceMappingURL=PasswordResetCompleteScreen-CWxk9AWl.js.map
|