@plumile/backoffice-react 0.1.198 → 0.1.200

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/README.md +5 -0
  2. package/lib/esm/auth/backofficeAuthHeaders.js +18 -0
  3. package/lib/esm/auth/backofficeAuthHeaders.js.map +1 -0
  4. package/lib/esm/index.js +76 -75
  5. package/lib/esm/pages/BackofficeAcceptInvitationPage.js +7 -7
  6. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +6 -4
  7. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  8. package/lib/esm/pages/BackofficeLayoutPage.js +41 -41
  9. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  10. package/lib/esm/pages/BackofficeLoginPage.js +11 -11
  11. package/lib/esm/pages/BackofficePasswordResetCompletePage.js +14 -14
  12. package/lib/esm/pages/BackofficeVerifyEmailPage.js +14 -14
  13. package/lib/esm/provider/BackofficeProvider.js +78 -77
  14. package/lib/esm/provider/BackofficeProvider.js.map +1 -1
  15. package/lib/esm/provider/useBackofficeAuthRouteGate.js +39 -0
  16. package/lib/esm/provider/useBackofficeAuthRouteGate.js.map +1 -0
  17. package/lib/esm/router/backofficeAuthPaths.js +11 -2
  18. package/lib/esm/router/backofficeAuthPaths.js.map +1 -1
  19. package/lib/esm/router/createBackofficeRoutes.js +4 -4
  20. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  21. package/lib/types/auth/backofficeAuthHeaders.d.ts +5 -0
  22. package/lib/types/auth/backofficeAuthHeaders.d.ts.map +1 -0
  23. package/lib/types/index.d.ts +1 -0
  24. package/lib/types/index.d.ts.map +1 -1
  25. package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
  26. package/lib/types/provider/useBackofficeAuthRouteGate.d.ts +2 -0
  27. package/lib/types/provider/useBackofficeAuthRouteGate.d.ts.map +1 -0
  28. package/lib/types/router/backofficeAuthPaths.d.ts +1 -0
  29. package/lib/types/router/backofficeAuthPaths.d.ts.map +1 -1
  30. package/package.json +16 -16
package/README.md CHANGED
@@ -37,6 +37,11 @@ It does not try to become:
37
37
  npm install @plumile/backoffice-react
38
38
  ```
39
39
 
40
+ Use `createBackofficeAuthHeaders({ basePath })` as the Relay
41
+ `getAuthHeaders` callback. It permits anonymous GraphQL requests only from the
42
+ backoffice authentication routes and rejects protected requests before the
43
+ network when the short-lived session has expired.
44
+
40
45
  Peer dependencies:
41
46
 
42
47
  ```bash
@@ -0,0 +1,18 @@
1
+ import { isBackofficeAuthPath as e } from "../router/backofficeAuthPaths.js";
2
+ import { getShortAccessToken as t } from "@plumile/auth/shortAccessToken.js";
3
+ //#region src/auth/backofficeAuthHeaders.ts
4
+ var n = (n = {}) => {
5
+ let r = n.basePath ?? "/";
6
+ return async () => {
7
+ try {
8
+ return { Authorization: `Bearer ${await t()}` };
9
+ } catch (t) {
10
+ if (typeof window < "u" && e(r, window.location.pathname)) return {};
11
+ throw t;
12
+ }
13
+ };
14
+ };
15
+ //#endregion
16
+ export { n as createBackofficeAuthHeaders };
17
+
18
+ //# sourceMappingURL=backofficeAuthHeaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backofficeAuthHeaders.js","names":[],"sources":["../../../src/auth/backofficeAuthHeaders.ts"],"sourcesContent":["import { getShortAccessToken } from '@plumile/auth/shortAccessToken.js';\n\nimport { isBackofficeAuthPath } from '../router/backofficeAuthPaths.js';\n\nexport type BackofficeAuthHeadersOptions = {\n basePath?: string;\n};\n\n/**\n * Builds the auth-header provider used by a backoffice Relay environment.\n *\n * Authentication failures are allowed to become anonymous requests only on\n * the explicit authentication routes. Protected operations reject before the\n * network request is sent, so an expired session cannot reach a private\n * GraphQL subgraph as an anonymous request.\n */\nexport const createBackofficeAuthHeaders = (\n options: BackofficeAuthHeadersOptions = {},\n): (() => Promise<Record<string, string>>) => {\n const basePath = options.basePath ?? '/';\n return async () => {\n try {\n const token = await getShortAccessToken();\n return { Authorization: `Bearer ${token}` };\n } catch (error: unknown) {\n if (\n typeof window !== 'undefined' &&\n isBackofficeAuthPath(basePath, window.location.pathname)\n ) {\n const anonymousHeaders: Record<string, string> = {};\n return anonymousHeaders;\n }\n throw error;\n }\n };\n};\n"],"mappings":";;;AAgBA,IAAa,KACX,IAAwC,CAAC,MACG;CAC5C,IAAM,IAAW,EAAQ,YAAY;CACrC,OAAO,YAAY;EACjB,IAAI;GAEF,OAAO,EAAE,eAAe,UAAU,MADd,EAAoB,IACE;EAC5C,SAAS,GAAgB;GACvB,IACE,OAAO,SAAW,OAClB,EAAqB,GAAU,OAAO,SAAS,QAAQ,GAGvD,OAAO,CAAA;GAET,MAAM;EACR;CACF;AACF"}
package/lib/esm/index.js CHANGED
@@ -1,77 +1,78 @@
1
1
  import { AuthRefreshNotice as e, useAuthRefreshStateSnapshot as t } from "./auth/AuthRefreshNotice.js";
2
2
  import { TotpQrCode as n, buildTotpOtpAuthUri as r } from "./auth/TotpQrCode.js";
3
- import { LoginFlow as i } from "./auth/login/LoginFlow.js";
4
- import { synchronizeAuthStatusQuery as a } from "./auth/login/synchronizeAuthStatusQuery.js";
5
- import { AcceptInvitationScreen as o } from "./auth/pages/AcceptInvitationScreen.js";
6
- import { PasswordResetCompleteScreen as s } from "./auth/pages/PasswordResetCompleteScreen.js";
7
- import { PasswordResetRequestScreen as c } from "./auth/pages/PasswordResetRequestScreen.js";
8
- import { VerifyEmailScreen as l } from "./auth/pages/VerifyEmailScreen.js";
9
- import { requireField as u, requireLinkedRecordId as d, resolveAgentStartOutcome as f, resolveMutationOutcome as p } from "./relay/mutationResult.js";
10
- import { useBackofficeConfig as m } from "./provider/BackofficeConfigContext.js";
11
- import { EntityIdFilterField as h } from "./components/backoffice/filters/EntityIdFilterField.js";
12
- import { BackofficeErrorBoundary as g } from "./components/backoffice/errors/BackofficeErrorBoundary.js";
13
- import { EntityIdPickerDialog as _ } from "./components/backoffice/pickers/EntityIdPickerDialog.js";
14
- import { BackofficeBillingUsageChart as v } from "./components/backoffice/billing/BackofficeBillingUsageChart.js";
15
- import { resolveBackofficeTargetIcon as y } from "./components/backoffice/links/resolveBackofficeTargetIcon.js";
16
- import { resolveBackofficeLink as b } from "./components/backoffice/links/resolveBackofficeLink.js";
17
- import { useBackofficeLink as x } from "./components/backoffice/links/useBackofficeLink.js";
18
- import { BackofficeInlineLink as S } from "./components/backoffice/links/BackofficeInlineLink.js";
19
- import { buildDataTableColumns as C } from "./components/backoffice/columns/buildDataTableColumns.js";
20
- import { BackofficeDetailBadgeRow as w } from "./components/backoffice/detail/BackofficeDetailBadgeRow.js";
21
- import { BackofficeStatusMetaBadge as T } from "./components/backoffice/detail/BackofficeStatusMetaBadge.js";
22
- import { BackofficeEntitySummaryHeader as E } from "./components/backoffice/detail/BackofficeEntitySummaryHeader.js";
23
- import { BackofficeEnumLabel as D } from "./components/backoffice/detail/BackofficeEnumLabel.js";
24
- import { BackofficeLifecycleTimelineSection as O } from "./components/backoffice/detail/BackofficeLifecycleTimelineSection.js";
25
- import { BackofficeReferenceValue as k } from "./components/backoffice/detail/BackofficeReferenceValue.js";
26
- import { BackofficeRelationsSummaryGrid as A } from "./components/backoffice/detail/BackofficeRelationsSummaryGrid.js";
27
- import { BackofficeStatusGroup as j } from "./components/backoffice/detail/BackofficeStatusGroup.js";
28
- import { BackofficeTokenUsageBreakdown as M } from "./components/backoffice/detail/BackofficeTokenUsageBreakdown.js";
29
- import { BackofficeUsageCostBreakdown as N } from "./components/backoffice/detail/BackofficeUsageCostBreakdown.js";
30
- import { createBackofficeEntityLinkProps as P } from "./components/backoffice/detail/createBackofficeEntityLinkProps.js";
31
- import { formatListAsMarkdown as F } from "./components/backoffice/detail/detailPayloadUtils.js";
32
- import { BackofficeFilterAction as I } from "./components/backoffice/filters/BackofficeFilterAction.js";
33
- import { EntityFilterValue as L, EntityFilterValueText as R } from "./components/backoffice/filters/EntityFilterValue.js";
34
- import { BackofficeHubTemplate as z } from "./components/backoffice/hub/BackofficeHubTemplate.js";
35
- import { BackofficeLink as B } from "./components/backoffice/links/BackofficeLink.js";
36
- import { BackofficeLinkLabel as V } from "./components/backoffice/links/BackofficeLinkLabel.js";
37
- import { BackofficeRightPageLayout as H } from "./components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js";
38
- import { BackofficeOverviewLayout as U } from "./components/backoffice/overview/BackofficeOverviewLayout.js";
39
- import { BackofficeFilterableCell as W } from "./components/backoffice/shared/BackofficeFilterableCell.js";
40
- import { BackofficeEntityLink as G } from "./components/backoffice/refs/BackofficeEntityLink.js";
41
- import { BackofficeLazyEntityCount as K } from "./components/backoffice/refs/BackofficeLazyEntityCount.js";
42
- import { BackofficeRelatedCountLink as q } from "./components/backoffice/refs/BackofficeRelatedCountLink.js";
43
- import { BackofficeTabbedDetailShell as J } from "./components/backoffice/scaffolds/BackofficeTabbedDetailShell.js";
44
- import { BackofficeFormattedCurrency as Y } from "./components/backoffice/shared/BackofficeFormattedCurrency.js";
45
- import { BackofficeFormattedNumber as ee } from "./components/backoffice/shared/BackofficeFormattedNumber.js";
46
- import { BackofficeInlineFilterRow as X } from "./components/backoffice/shared/BackofficeInlineFilterRow.js";
47
- import { BackofficeToolsDocPanel as Z } from "./components/backoffice/tools/BackofficeToolsDocPanel.js";
48
- import { BackofficeToolsErrorFallback as Q } from "./components/backoffice/tools/BackofficeToolsErrorFallback.js";
49
- import { BackofficeToolsJsonForm as $ } from "./components/backoffice/tools/BackofficeToolsJsonForm.js";
50
- import { BackofficeToolsQueryBoundary as te } from "./components/backoffice/tools/BackofficeToolsQueryBoundary.js";
51
- import { parseToolJson as ne } from "./components/backoffice/tools/parseToolJson.js";
52
- import { configureRelayEnvironment as re, getEnvironment as ie, getNetwork as ae, getRelayOperationActivitySnapshot as oe, getRelayTransportSnapshot as se, reconnectRelayWebSocket as ce, refreshRelayWebSocketAuthentication as le, resetRelayStore as ue, subscribeRelayOperationActivity as de, subscribeRelayTransport as fe } from "./relay/environment.js";
53
- import { base64UrlToBuffer as pe, bufferToBase64Url as me, mapWebAuthnRegistrationError as he, parseSignCount as ge } from "./modules/webauthn.js";
54
- import { createUseAuth as _e } from "./hooks/useAuth.js";
55
- import { useBackofficeListUrlState as ve } from "./hooks/useBackofficeListUrlState.js";
56
- import { useConditionalSubscription as ye } from "./hooks/useConditionalSubscription.js";
57
- import be from "./hooks/useCopyToClipboard.js";
58
- import xe from "./hooks/useInfiniteConnection.js";
59
- import { useRefetchNeededReload as Se } from "./hooks/useRefetchNeededReload.js";
60
- import { createI18nInstance as Ce } from "./i18n/createI18nInstance.js";
61
- import { backofficeReactI18nResources as we, withBackofficeReactI18nResources as Te } from "./i18n/resources.js";
62
- import { useReviewStatusLabel as Ee } from "./i18n/useReviewStatusLabel.js";
63
- import { BackofficeProvider as De } from "./provider/BackofficeProvider.js";
64
- import { createBackofficeLazyValue as Oe } from "./provider/lazyValue.js";
65
- import { decodeBase64ToUtf8 as ke, encodeUtf8ToBase64 as Ae } from "./modules/base64.js";
66
- import { formatFileSize as je } from "./modules/formatFileSize.js";
67
- import { uploadFilesSequentially as Me } from "./modules/uploads.js";
68
- import { resolveVisibleDetailPages as Ne } from "./pages/detail/pageResolution.js";
69
- import { createInlineDataReader as Pe } from "./relay/createInlineReader.js";
70
- import { appendNodeToConnections as Fe } from "./relay/connectionUtils.js";
71
- import { RelayProvider as Ie } from "./relay/RelayProvider.js";
72
- import { useRelayOperationActivity as Le } from "./relay/useRelayOperationActivity.js";
73
- import { configureBackofficeShortAccessTokenRelayEnvironment as Re, configureShortAccessTokenRelayEnvironment as ze } from "./relay/shortAccessTokenEnvironment.js";
74
- import { useMutationAction as Be } from "./relay/useMutationAction.js";
75
- import { identityView as Ve } from "./relay/identityView.js";
76
- import { useCursorResumableSubscription as He } from "./subscriptions/useCursorResumableSubscription.js";
77
- export { o as AcceptInvitationScreen, e as AuthRefreshNotice, v as BackofficeBillingUsageChart, w as BackofficeDetailBadgeRow, G as BackofficeEntityLink, E as BackofficeEntitySummaryHeader, D as BackofficeEnumLabel, g as BackofficeErrorBoundary, I as BackofficeFilterAction, W as BackofficeFilterableCell, Y as BackofficeFormattedCurrency, ee as BackofficeFormattedNumber, z as BackofficeHubTemplate, X as BackofficeInlineFilterRow, S as BackofficeInlineLink, K as BackofficeLazyEntityCount, O as BackofficeLifecycleTimelineSection, B as BackofficeLink, V as BackofficeLinkLabel, U as BackofficeOverviewLayout, De as BackofficeProvider, k as BackofficeReferenceValue, q as BackofficeRelatedCountLink, A as BackofficeRelationGrid, A as BackofficeRelationsSummaryGrid, H as BackofficeRightPageLayout, j as BackofficeStatusGroup, T as BackofficeStatusMetaBadge, J as BackofficeTabbedDetailShell, M as BackofficeTokenUsageBreakdown, Z as BackofficeToolsDocPanel, Q as BackofficeToolsErrorFallback, $ as BackofficeToolsJsonForm, te as BackofficeToolsQueryBoundary, N as BackofficeUsageCostBreakdown, L as EntityFilterValue, R as EntityFilterValueText, h as EntityIdFilterField, _ as EntityIdPickerDialog, i as LoginFlow, s as PasswordResetCompleteScreen, c as PasswordResetRequestScreen, Ie as RelayProvider, n as TotpQrCode, l as VerifyEmailScreen, Fe as appendNodeToConnections, we as backofficeReactI18nResources, pe as base64UrlToBuffer, me as bufferToBase64Url, C as buildDataTableColumns, r as buildTotpOtpAuthUri, Re as configureBackofficeShortAccessTokenRelayEnvironment, re as configureRelayEnvironment, ze as configureShortAccessTokenRelayEnvironment, P as createBackofficeEntityLinkProps, Oe as createBackofficeLazyValue, Ce as createI18nInstance, Pe as createInlineDataReader, _e as createUseAuth, ke as decodeBase64ToUtf8, Ae as encodeUtf8ToBase64, je as formatFileSize, F as formatListAsMarkdown, ie as getEnvironment, ae as getNetwork, oe as getRelayOperationActivitySnapshot, se as getRelayTransportSnapshot, Ve as identityView, he as mapWebAuthnRegistrationError, ge as parseSignCount, ne as parseToolJson, ce as reconnectRelayWebSocket, le as refreshRelayWebSocketAuthentication, u as requireField, d as requireLinkedRecordId, ue as resetRelayStore, f as resolveAgentStartOutcome, b as resolveBackofficeLink, y as resolveBackofficeTargetIcon, p as resolveMutationOutcome, Ne as resolveVisibleDetailPages, de as subscribeRelayOperationActivity, fe as subscribeRelayTransport, a as synchronizeAuthStatusQuery, Me as uploadFilesSequentially, t as useAuthRefreshStateSnapshot, m as useBackofficeConfig, x as useBackofficeLink, ve as useBackofficeListUrlState, ye as useConditionalSubscription, be as useCopyToClipboard, He as useCursorResumableSubscription, xe as useInfiniteConnection, Be as useMutationAction, Se as useRefetchNeededReload, Le as useRelayOperationActivity, Ee as useReviewStatusLabel, Te as withBackofficeReactI18nResources };
3
+ import { createBackofficeAuthHeaders as i } from "./auth/backofficeAuthHeaders.js";
4
+ import { LoginFlow as a } from "./auth/login/LoginFlow.js";
5
+ import { synchronizeAuthStatusQuery as o } from "./auth/login/synchronizeAuthStatusQuery.js";
6
+ import { AcceptInvitationScreen as s } from "./auth/pages/AcceptInvitationScreen.js";
7
+ import { PasswordResetCompleteScreen as c } from "./auth/pages/PasswordResetCompleteScreen.js";
8
+ import { PasswordResetRequestScreen as l } from "./auth/pages/PasswordResetRequestScreen.js";
9
+ import { VerifyEmailScreen as u } from "./auth/pages/VerifyEmailScreen.js";
10
+ import { requireField as d, requireLinkedRecordId as f, resolveAgentStartOutcome as p, resolveMutationOutcome as m } from "./relay/mutationResult.js";
11
+ import { useBackofficeConfig as h } from "./provider/BackofficeConfigContext.js";
12
+ import { EntityIdFilterField as g } from "./components/backoffice/filters/EntityIdFilterField.js";
13
+ import { BackofficeErrorBoundary as _ } from "./components/backoffice/errors/BackofficeErrorBoundary.js";
14
+ import { EntityIdPickerDialog as v } from "./components/backoffice/pickers/EntityIdPickerDialog.js";
15
+ import { BackofficeBillingUsageChart as y } from "./components/backoffice/billing/BackofficeBillingUsageChart.js";
16
+ import { resolveBackofficeTargetIcon as b } from "./components/backoffice/links/resolveBackofficeTargetIcon.js";
17
+ import { resolveBackofficeLink as x } from "./components/backoffice/links/resolveBackofficeLink.js";
18
+ import { useBackofficeLink as S } from "./components/backoffice/links/useBackofficeLink.js";
19
+ import { BackofficeInlineLink as C } from "./components/backoffice/links/BackofficeInlineLink.js";
20
+ import { buildDataTableColumns as w } from "./components/backoffice/columns/buildDataTableColumns.js";
21
+ import { BackofficeDetailBadgeRow as T } from "./components/backoffice/detail/BackofficeDetailBadgeRow.js";
22
+ import { BackofficeStatusMetaBadge as E } from "./components/backoffice/detail/BackofficeStatusMetaBadge.js";
23
+ import { BackofficeEntitySummaryHeader as D } from "./components/backoffice/detail/BackofficeEntitySummaryHeader.js";
24
+ import { BackofficeEnumLabel as O } from "./components/backoffice/detail/BackofficeEnumLabel.js";
25
+ import { BackofficeLifecycleTimelineSection as k } from "./components/backoffice/detail/BackofficeLifecycleTimelineSection.js";
26
+ import { BackofficeReferenceValue as A } from "./components/backoffice/detail/BackofficeReferenceValue.js";
27
+ import { BackofficeRelationsSummaryGrid as j } from "./components/backoffice/detail/BackofficeRelationsSummaryGrid.js";
28
+ import { BackofficeStatusGroup as M } from "./components/backoffice/detail/BackofficeStatusGroup.js";
29
+ import { BackofficeTokenUsageBreakdown as N } from "./components/backoffice/detail/BackofficeTokenUsageBreakdown.js";
30
+ import { BackofficeUsageCostBreakdown as P } from "./components/backoffice/detail/BackofficeUsageCostBreakdown.js";
31
+ import { createBackofficeEntityLinkProps as F } from "./components/backoffice/detail/createBackofficeEntityLinkProps.js";
32
+ import { formatListAsMarkdown as I } from "./components/backoffice/detail/detailPayloadUtils.js";
33
+ import { BackofficeFilterAction as L } from "./components/backoffice/filters/BackofficeFilterAction.js";
34
+ import { EntityFilterValue as R, EntityFilterValueText as z } from "./components/backoffice/filters/EntityFilterValue.js";
35
+ import { BackofficeHubTemplate as B } from "./components/backoffice/hub/BackofficeHubTemplate.js";
36
+ import { BackofficeLink as V } from "./components/backoffice/links/BackofficeLink.js";
37
+ import { BackofficeLinkLabel as H } from "./components/backoffice/links/BackofficeLinkLabel.js";
38
+ import { BackofficeRightPageLayout as U } from "./components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js";
39
+ import { BackofficeOverviewLayout as W } from "./components/backoffice/overview/BackofficeOverviewLayout.js";
40
+ import { BackofficeFilterableCell as G } from "./components/backoffice/shared/BackofficeFilterableCell.js";
41
+ import { BackofficeEntityLink as K } from "./components/backoffice/refs/BackofficeEntityLink.js";
42
+ import { BackofficeLazyEntityCount as q } from "./components/backoffice/refs/BackofficeLazyEntityCount.js";
43
+ import { BackofficeRelatedCountLink as J } from "./components/backoffice/refs/BackofficeRelatedCountLink.js";
44
+ import { BackofficeTabbedDetailShell as Y } from "./components/backoffice/scaffolds/BackofficeTabbedDetailShell.js";
45
+ import { BackofficeFormattedCurrency as X } from "./components/backoffice/shared/BackofficeFormattedCurrency.js";
46
+ import { BackofficeFormattedNumber as Z } from "./components/backoffice/shared/BackofficeFormattedNumber.js";
47
+ import { BackofficeInlineFilterRow as Q } from "./components/backoffice/shared/BackofficeInlineFilterRow.js";
48
+ import { BackofficeToolsDocPanel as $ } from "./components/backoffice/tools/BackofficeToolsDocPanel.js";
49
+ import { BackofficeToolsErrorFallback as ee } from "./components/backoffice/tools/BackofficeToolsErrorFallback.js";
50
+ import { BackofficeToolsJsonForm as te } from "./components/backoffice/tools/BackofficeToolsJsonForm.js";
51
+ import { BackofficeToolsQueryBoundary as ne } from "./components/backoffice/tools/BackofficeToolsQueryBoundary.js";
52
+ import { parseToolJson as re } from "./components/backoffice/tools/parseToolJson.js";
53
+ import { configureRelayEnvironment as ie, getEnvironment as ae, getNetwork as oe, getRelayOperationActivitySnapshot as se, getRelayTransportSnapshot as ce, reconnectRelayWebSocket as le, refreshRelayWebSocketAuthentication as ue, resetRelayStore as de, subscribeRelayOperationActivity as fe, subscribeRelayTransport as pe } from "./relay/environment.js";
54
+ import { base64UrlToBuffer as me, bufferToBase64Url as he, mapWebAuthnRegistrationError as ge, parseSignCount as _e } from "./modules/webauthn.js";
55
+ import { createUseAuth as ve } from "./hooks/useAuth.js";
56
+ import { useBackofficeListUrlState as ye } from "./hooks/useBackofficeListUrlState.js";
57
+ import { useConditionalSubscription as be } from "./hooks/useConditionalSubscription.js";
58
+ import xe from "./hooks/useCopyToClipboard.js";
59
+ import Se from "./hooks/useInfiniteConnection.js";
60
+ import { useRefetchNeededReload as Ce } from "./hooks/useRefetchNeededReload.js";
61
+ import { createI18nInstance as we } from "./i18n/createI18nInstance.js";
62
+ import { backofficeReactI18nResources as Te, withBackofficeReactI18nResources as Ee } from "./i18n/resources.js";
63
+ import { useReviewStatusLabel as De } from "./i18n/useReviewStatusLabel.js";
64
+ import { BackofficeProvider as Oe } from "./provider/BackofficeProvider.js";
65
+ import { createBackofficeLazyValue as ke } from "./provider/lazyValue.js";
66
+ import { decodeBase64ToUtf8 as Ae, encodeUtf8ToBase64 as je } from "./modules/base64.js";
67
+ import { formatFileSize as Me } from "./modules/formatFileSize.js";
68
+ import { uploadFilesSequentially as Ne } from "./modules/uploads.js";
69
+ import { resolveVisibleDetailPages as Pe } from "./pages/detail/pageResolution.js";
70
+ import { createInlineDataReader as Fe } from "./relay/createInlineReader.js";
71
+ import { appendNodeToConnections as Ie } from "./relay/connectionUtils.js";
72
+ import { RelayProvider as Le } from "./relay/RelayProvider.js";
73
+ import { useRelayOperationActivity as Re } from "./relay/useRelayOperationActivity.js";
74
+ import { configureBackofficeShortAccessTokenRelayEnvironment as ze, configureShortAccessTokenRelayEnvironment as Be } from "./relay/shortAccessTokenEnvironment.js";
75
+ import { useMutationAction as Ve } from "./relay/useMutationAction.js";
76
+ import { identityView as He } from "./relay/identityView.js";
77
+ import { useCursorResumableSubscription as Ue } from "./subscriptions/useCursorResumableSubscription.js";
78
+ export { s as AcceptInvitationScreen, e as AuthRefreshNotice, y as BackofficeBillingUsageChart, T as BackofficeDetailBadgeRow, K as BackofficeEntityLink, D as BackofficeEntitySummaryHeader, O as BackofficeEnumLabel, _ as BackofficeErrorBoundary, L as BackofficeFilterAction, G as BackofficeFilterableCell, X as BackofficeFormattedCurrency, Z as BackofficeFormattedNumber, B as BackofficeHubTemplate, Q as BackofficeInlineFilterRow, C as BackofficeInlineLink, q as BackofficeLazyEntityCount, k as BackofficeLifecycleTimelineSection, V as BackofficeLink, H as BackofficeLinkLabel, W as BackofficeOverviewLayout, Oe as BackofficeProvider, A as BackofficeReferenceValue, J as BackofficeRelatedCountLink, j as BackofficeRelationGrid, j as BackofficeRelationsSummaryGrid, U as BackofficeRightPageLayout, M as BackofficeStatusGroup, E as BackofficeStatusMetaBadge, Y as BackofficeTabbedDetailShell, N as BackofficeTokenUsageBreakdown, $ as BackofficeToolsDocPanel, ee as BackofficeToolsErrorFallback, te as BackofficeToolsJsonForm, ne as BackofficeToolsQueryBoundary, P as BackofficeUsageCostBreakdown, R as EntityFilterValue, z as EntityFilterValueText, g as EntityIdFilterField, v as EntityIdPickerDialog, a as LoginFlow, c as PasswordResetCompleteScreen, l as PasswordResetRequestScreen, Le as RelayProvider, n as TotpQrCode, u as VerifyEmailScreen, Ie as appendNodeToConnections, Te as backofficeReactI18nResources, me as base64UrlToBuffer, he as bufferToBase64Url, w as buildDataTableColumns, r as buildTotpOtpAuthUri, ze as configureBackofficeShortAccessTokenRelayEnvironment, ie as configureRelayEnvironment, Be as configureShortAccessTokenRelayEnvironment, i as createBackofficeAuthHeaders, F as createBackofficeEntityLinkProps, ke as createBackofficeLazyValue, we as createI18nInstance, Fe as createInlineDataReader, ve as createUseAuth, Ae as decodeBase64ToUtf8, je as encodeUtf8ToBase64, Me as formatFileSize, I as formatListAsMarkdown, ae as getEnvironment, oe as getNetwork, se as getRelayOperationActivitySnapshot, ce as getRelayTransportSnapshot, He as identityView, ge as mapWebAuthnRegistrationError, _e as parseSignCount, re as parseToolJson, le as reconnectRelayWebSocket, ue as refreshRelayWebSocketAuthentication, d as requireField, f as requireLinkedRecordId, de as resetRelayStore, p as resolveAgentStartOutcome, x as resolveBackofficeLink, b as resolveBackofficeTargetIcon, m as resolveMutationOutcome, Pe as resolveVisibleDetailPages, fe as subscribeRelayOperationActivity, pe as subscribeRelayTransport, o as synchronizeAuthStatusQuery, Ne as uploadFilesSequentially, t as useAuthRefreshStateSnapshot, h as useBackofficeConfig, S as useBackofficeLink, ye as useBackofficeListUrlState, be as useConditionalSubscription, xe as useCopyToClipboard, Ue as useCursorResumableSubscription, Se as useInfiniteConnection, Ve as useMutationAction, Ce as useRefetchNeededReload, Re as useRelayOperationActivity, De as useReviewStatusLabel, Ee as withBackofficeReactI18nResources };
@@ -1,18 +1,18 @@
1
- import { AcceptInvitationScreen as e } from "../auth/pages/AcceptInvitationScreen.js";
2
- import { useBackofficeConfig as t } from "../provider/BackofficeConfigContext.js";
3
- import { useBackofficeAuth as n } from "../hooks/useBackofficeAuth.js";
4
- import { getBackofficeLoginPath as r } from "../router/backofficeAuthPaths.js";
1
+ import { getBackofficeLoginPath as e } from "../router/backofficeAuthPaths.js";
2
+ import { AcceptInvitationScreen as t } from "../auth/pages/AcceptInvitationScreen.js";
3
+ import { useBackofficeConfig as n } from "../provider/BackofficeConfigContext.js";
4
+ import { useBackofficeAuth as r } from "../hooks/useBackofficeAuth.js";
5
5
  import { useCallback as i, useContext as a } from "react";
6
6
  import { jsx as o } from "react/jsx-runtime";
7
7
  import s from "@plumile/router/routing/RoutingContext.js";
8
8
  //#region src/pages/BackofficeAcceptInvitationPage.tsx
9
9
  var c = () => {
10
- let c = a(s), { basePath: l } = t(), u = n(), d = i(() => {
10
+ let c = a(s), { basePath: l } = n(), u = r(), d = i(() => {
11
11
  c?.history.push({ pathname: l });
12
12
  }, [l, c?.history]), f = i(() => {
13
- c?.history.push({ pathname: r(l) });
13
+ c?.history.push({ pathname: e(l) });
14
14
  }, [l, c?.history]);
15
- return /* @__PURE__ */ o(e, {
15
+ return /* @__PURE__ */ o(t, {
16
16
  auth: u,
17
17
  onSuccessRedirect: d,
18
18
  onBackToLogin: f
@@ -194,10 +194,12 @@ var c = (e, t, n) => {
194
194
  break;
195
195
  case "number": {
196
196
  let e = t.value(o), n = null;
197
- if (e != null) if (t.format === "currency") {
198
- let t = h(e);
199
- n = s("span", { title: g?.(e) ?? void 0 }, t);
200
- } else n = t.format === "percent" ? _(e) : m(e);
197
+ if (e != null) {
198
+ if (t.format === "currency") {
199
+ let t = h(e);
200
+ n = s("span", { title: g?.(e) ?? void 0 }, t);
201
+ } else n = t.format === "percent" ? _(e) : m(e);
202
+ }
201
203
  T.push({
202
204
  id: O,
203
205
  label: i(t.label, d),
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityDetailPage.view-helpers.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailPage.view-helpers.ts"],"sourcesContent":["/* eslint-disable no-ternary */\nimport type {\n BackofficeBadgeItem,\n BackofficeColumnSpec,\n BackofficeDetailBlockSpec,\n BackofficeDetailFieldSpec,\n BackofficeDetailHeaderConfig,\n BackofficeDetailHeaderMetaSpec,\n BackofficeDetailHeaderStatusSpec,\n BackofficeFieldSize,\n BackofficeFlagVariant,\n BackofficeInlineValueSpec,\n BackofficePayloadFormat,\n BackofficeTone,\n BackofficeValueLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { DataTableColumn } from '@plumile/ui/components/data-table/DataTable.js';\nimport type { TFunction } from 'i18next';\nimport { Fragment, createElement, type ReactNode } from 'react';\n\nimport {\n isEmptyText,\n resolveLabel,\n resolveBadgeTone,\n resolveValueLabel,\n} from './BackofficeEntityDetailPage.helpers.js';\nimport {\n normalizeTechnicalIdentifier,\n TechnicalIdentifierValue,\n type TechnicalIdentifierVariant,\n} from '../components/backoffice/technical/TechnicalIdentifierValue.js';\n\nexport type ResolvedFieldItem = {\n id: string;\n label: string;\n size: BackofficeFieldSize;\n value: ReactNode;\n copyValue?: string;\n fullWidth?: boolean;\n};\n\nexport type ResolvedHeaderItem = {\n id: string;\n label: string;\n value: ReactNode;\n};\n\nexport type FlagIconName =\n | 'shield-lock'\n | 'shield-off'\n | 'settings-check'\n | 'settings-x'\n | 'x-badge'\n | 'chat-check'\n | 'key'\n | 'key-off'\n | 'lock'\n | 'lock-open'\n | 'robot-check'\n | 'robot-x'\n | 'rocket'\n | 'rocket-off';\n\nexport type ResolvedFlagTag = {\n tone: 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n label: string;\n iconName?: FlagIconName;\n};\n\nexport const resolveFlagTag = (\n variant: BackofficeFlagVariant,\n value: boolean,\n t: TFunction,\n): ResolvedFlagTag => {\n switch (variant) {\n case 'yesNo':\n return value\n ? { tone: 'success', label: t('common.boolean.yes') }\n : { tone: 'neutral', label: t('common.boolean.no') };\n case 'capability':\n return value\n ? {\n tone: 'success',\n label: t('flags.capability.allowed'),\n iconName: 'shield-lock',\n }\n : {\n tone: 'neutral',\n label: t('flags.capability.denied'),\n iconName: 'shield-off',\n };\n case 'enabled':\n return value\n ? {\n tone: 'success',\n label: t('flags.enabled.enabled'),\n iconName: 'settings-check',\n }\n : {\n tone: 'neutral',\n label: t('flags.enabled.disabled'),\n iconName: 'settings-x',\n };\n case 'failure':\n return value\n ? {\n tone: 'danger',\n label: t('flags.failure.failed'),\n iconName: 'x-badge',\n }\n : {\n tone: 'success',\n label: t('flags.failure.ok'),\n iconName: 'chat-check',\n };\n case 'encrypted':\n return value\n ? {\n tone: 'info',\n label: t('flags.encrypted.encrypted'),\n iconName: 'key',\n }\n : {\n tone: 'neutral',\n label: t('flags.encrypted.notEncrypted'),\n iconName: 'key-off',\n };\n case 'locked':\n return value\n ? {\n tone: 'warning',\n label: t('flags.locked.locked'),\n iconName: 'lock',\n }\n : {\n tone: 'success',\n label: t('flags.locked.unlocked'),\n iconName: 'lock-open',\n };\n case 'default':\n return value\n ? { tone: 'info', label: t('flags.default.default') }\n : { tone: 'neutral', label: t('flags.default.notDefault') };\n case 'agentManaged':\n return value\n ? {\n tone: 'info',\n label: t('flags.agentManaged.agentManaged'),\n iconName: 'robot-check',\n }\n : {\n tone: 'neutral',\n label: t('flags.agentManaged.userManaged'),\n iconName: 'robot-x',\n };\n case 'deployedProduction':\n return value\n ? {\n tone: 'success',\n label: t('flags.deployedProduction.deployed'),\n iconName: 'rocket',\n }\n : {\n tone: 'neutral',\n label: t('flags.deployedProduction.notDeployed'),\n iconName: 'rocket-off',\n };\n case 'forced':\n return value\n ? { tone: 'warning', label: t('flags.forced.forced') }\n : { tone: 'neutral', label: t('flags.forced.normal') };\n default:\n throw new Error(`Unsupported flag variant: ${String(variant)}`);\n }\n};\n\nexport const resolveInlineValue = (\n value: BackofficeInlineValueSpec,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n },\n): ReactNode => {\n const { tApp, t, resolveEntityHref, renderLink } = options;\n const fallback = t('common.notAvailable');\n\n if (value.type === 'text') {\n const resolved = resolveValueLabel(value.value, tApp);\n return isEmptyText(resolved) ? fallback : resolved;\n }\n\n if (value.type === 'entityRef') {\n const { id } = value;\n if (id == null || id.trim() === '') {\n return fallback;\n }\n const resolvedLabel = resolveValueLabel(value.label, tApp);\n const label =\n resolvedLabel != null && String(resolvedLabel).trim() !== ''\n ? resolvedLabel\n : null;\n if (label == null) {\n return fallback;\n }\n const href = resolveEntityHref?.(value.entity, id) ?? null;\n return href != null ? renderLink(href, label) : label;\n }\n\n const { href } = value;\n if (href == null || href.trim() === '') {\n return fallback;\n }\n const label = resolveValueLabel(value.label, tApp);\n if (isEmptyText(label)) {\n return fallback;\n }\n return renderLink(href, label);\n};\n\nexport const resolveHeaderMeta = <Node>(\n meta: BackofficeDetailHeaderMetaSpec<Node>,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n },\n): ReactNode => {\n const { tApp, t, resolveEntityHref, renderDate, renderLink } = options;\n const fallback = t('common.notAvailable');\n\n if (meta.type === 'dateTime') {\n return renderDate(meta.value(node), fallback);\n }\n\n if (meta.type === 'entityRef') {\n const idValue = meta.id(node);\n if (idValue == null || idValue.trim() === '') {\n return fallback;\n }\n const labelValue = resolveValueLabel(meta.value?.(node), tApp);\n const label =\n labelValue != null && String(labelValue).trim() !== ''\n ? labelValue\n : null;\n if (label == null) {\n return fallback;\n }\n const href = resolveEntityHref?.(meta.entity, idValue) ?? null;\n return href != null ? renderLink(href, label) : label;\n }\n\n if (meta.type === 'link') {\n const href = meta.href(node);\n const labelValue = resolveValueLabel(meta.value(node), tApp);\n if (href == null || href.trim() === '' || isEmptyText(labelValue)) {\n return fallback;\n }\n return renderLink(href, labelValue);\n }\n\n const value = resolveValueLabel(meta.value(node), tApp);\n return isEmptyText(value) ? fallback : value;\n};\n\nexport const resolveHeaderStatus = <Node>(\n status: BackofficeDetailHeaderStatusSpec<Node>,\n node: Node,\n tApp: TFunction,\n renderers: {\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n },\n): ReactNode | undefined => {\n if (status.type === 'badgeRow') {\n const items = status.items(node).map((item) => {\n const resolvedLabel = resolveValueLabel(item.label, tApp);\n const label = resolvedLabel == null ? '' : String(resolvedLabel);\n return { ...item, label };\n });\n if (items.length === 0) {\n return undefined;\n }\n return renderers.renderBadgeRow(items);\n }\n\n const value = resolveValueLabel(status.value(node), tApp);\n const label = value == null ? '' : String(value);\n if (label.trim() === '') {\n return undefined;\n }\n const tone = resolveBadgeTone(status.tone, node);\n return renderers.renderTag(tone, label);\n};\n\nexport const buildFieldItems = <Node>(\n fields: readonly BackofficeDetailFieldSpec<Node>[],\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n formatNumber: (value: number | null | undefined) => string;\n formatCurrency: (value: number | null | undefined) => string;\n formatCurrencyTitle?: (value: number | null | undefined) => string | null;\n formatPercent: (value: number | null | undefined) => string;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderFlagTag: (tag: ResolvedFlagTag) => ReactNode;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n renderTaggedValue: (\n tag: {\n label: string;\n tone?: ReturnType<typeof resolveBadgeTone<Node>>;\n } | null,\n value: ReactNode,\n ) => ReactNode;\n wrapCustomNode: (id: string, node: ReactNode) => ReactNode;\n },\n): {\n items: ResolvedFieldItem[];\n customNodes: ReactNode[];\n} => {\n const {\n tApp,\n t,\n resolveEntityHref,\n formatNumber,\n formatCurrency,\n formatCurrencyTitle,\n formatPercent,\n renderTag,\n renderBadgeRow,\n renderDate,\n renderFlagTag,\n renderLink,\n renderTaggedValue,\n wrapCustomNode,\n } = options;\n const items: ResolvedFieldItem[] = [];\n const customNodes: ReactNode[] = [];\n const fallback = t('common.notAvailable');\n\n fields.forEach((field, index) => {\n const id = `${field.type}-${index}`;\n\n switch (field.type) {\n case 'text': {\n const value = resolveValueLabel(field.value(node), tApp);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value,\n copyValue: field.copyValue?.(node) ?? undefined,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'badge': {\n const value = resolveValueLabel(field.value(node), tApp);\n const label = value != null ? String(value) : '';\n const tone = resolveBadgeTone(field.tone, node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: label.trim() !== '' ? renderTag(tone, label) : null,\n });\n break;\n }\n case 'badgeRow': {\n const badgeItems = field.items(node).map((item) => {\n const resolvedLabel = resolveValueLabel(item.label, tApp);\n const label = resolvedLabel == null ? '' : String(resolvedLabel);\n return { ...item, label };\n });\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: badgeItems.length > 0 ? renderBadgeRow(badgeItems) : null,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'dateTime': {\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: renderDate(field.value(node), fallback),\n });\n break;\n }\n case 'number': {\n const value = field.value(node);\n let formatted: ReactNode | null = null;\n if (value != null) {\n if (field.format === 'currency') {\n const label = formatCurrency(value);\n formatted = createElement(\n 'span',\n { title: formatCurrencyTitle?.(value) ?? undefined },\n label,\n );\n } else if (field.format === 'percent') {\n formatted = formatPercent(value);\n } else {\n formatted = formatNumber(value);\n }\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: formatted,\n });\n break;\n }\n case 'flag': {\n const value = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n value != null\n ? renderFlagTag(resolveFlagTag(field.variant, value, t))\n : null,\n });\n break;\n }\n case 'entityRef': {\n const idValue = field.id(node);\n let value: ReactNode | null = null;\n if (idValue != null && idValue.trim() !== '') {\n const labelValue = field.value?.(node);\n const label =\n labelValue != null && labelValue.trim() !== '' ? labelValue : null;\n const href = resolveEntityHref?.(field.entity, idValue) ?? null;\n if (label != null) {\n value = href != null ? renderLink(href, label) : label;\n }\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: value ?? fallback,\n });\n break;\n }\n case 'technicalIdentifier': {\n const value = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n value == null\n ? null\n : createElement(TechnicalIdentifierValue, {\n value,\n copyValue: field.copyValue?.(node) ?? undefined,\n variant: field.variant,\n copyLabel: t('common.actions.copy'),\n }),\n copyValue: field.copyValue?.(node) ?? undefined,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'link': {\n const href = field.href(node);\n const labelValue = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n href != null && href.trim() !== '' && !isEmptyText(labelValue)\n ? renderLink(href, labelValue)\n : null,\n });\n break;\n }\n case 'taggedValue': {\n const tag = field.tag(node);\n const valueNode = resolveInlineValue(field.value(node), {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n });\n const resolvedTag =\n tag == null\n ? null\n : {\n ...tag,\n label: (() => {\n const labelValue = resolveValueLabel(tag.label, tApp);\n return labelValue == null ? '' : String(labelValue);\n })(),\n };\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n resolvedTag != null || valueNode != null\n ? renderTaggedValue(resolvedTag, valueNode)\n : null,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'custom': {\n const custom = field.render(node) as ReactNode;\n if (custom == null) {\n break;\n }\n if (field.label != null) {\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: custom,\n fullWidth: field.fullWidth,\n });\n break;\n }\n customNodes.push(wrapCustomNode(id, custom));\n break;\n }\n default:\n break;\n }\n });\n\n return { items, customNodes };\n};\n\nexport const resolveHeaderItems = <Node>(\n header: BackofficeDetailHeaderConfig<Node>,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n },\n): {\n title: string;\n subtitle?: ReactNode;\n badges?: ReactNode;\n status?: ReactNode;\n items?: readonly ResolvedHeaderItem[];\n} => {\n const {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n renderDate,\n renderTag,\n renderBadgeRow,\n } = options;\n const resolvedTitle =\n header.titleValue?.(node, tApp) ?? resolveLabel(header.title, tApp);\n const rawNodeId =\n node != null &&\n typeof node === 'object' &&\n 'id' in node &&\n typeof node.id === 'string'\n ? node.id.trim()\n : null;\n const title =\n resolvedTitle.trim() === '' ||\n (rawNodeId != null && resolvedTitle.trim() === rawNodeId)\n ? resolveLabel(header.title, tApp)\n : resolvedTitle;\n\n let subtitleNode: ReactNode | undefined;\n if (header.subtitleItems != null && header.subtitleItems.length > 0) {\n const { subtitleItems } = header;\n const separator = header.subtitleSeparator ?? ' / ';\n const parts: ReactNode[] = [];\n subtitleItems.forEach((item, index) => {\n parts.push(\n createElement(\n 'span',\n { key: item.id },\n resolveInlineValue(item.value(node), {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n }),\n ),\n );\n if (index < subtitleItems.length - 1) {\n parts.push(createElement('span', { key: `${item.id}-sep` }, separator));\n }\n });\n subtitleNode = createElement('span', null, ...parts);\n } else {\n const subtitleValue =\n header.subtitleValue?.(node, tApp) ??\n (header.subtitle != null ? resolveLabel(header.subtitle, tApp) : null);\n subtitleNode =\n subtitleValue != null && subtitleValue.trim() !== ''\n ? subtitleValue\n : undefined;\n }\n\n const badgeNodes: ReactNode[] = [];\n header.badges?.forEach((badge, index) => {\n const label = resolveLabel(badge.label, tApp);\n const resolvedValue = resolveValueLabel(badge.value(node), tApp);\n const value = resolvedValue == null ? '' : String(resolvedValue);\n if (value.trim() === '') {\n return;\n }\n badgeNodes.push(\n renderTag(resolveBadgeTone(badge.tone, node), `${label}: ${value}`),\n );\n if (typeof badgeNodes[badgeNodes.length - 1] === 'object') {\n badgeNodes[badgeNodes.length - 1] = createElement(\n Fragment,\n { key: `${label}-${index}` },\n badgeNodes[badgeNodes.length - 1],\n );\n }\n });\n\n const status =\n header.status != null\n ? resolveHeaderStatus(header.status, node, tApp, {\n renderBadgeRow,\n renderTag,\n })\n : undefined;\n\n const items = header.meta?.map((meta, index) => {\n const label = resolveLabel(meta.label, tApp);\n return {\n id: `${label}-${index}`,\n label,\n value: resolveHeaderMeta(meta, node, {\n tApp,\n t,\n resolveEntityHref,\n renderDate,\n renderLink,\n }),\n };\n });\n\n return {\n title,\n subtitle: subtitleNode,\n badges:\n badgeNodes.length > 0\n ? createElement(Fragment, null, ...badgeNodes)\n : undefined,\n status,\n items,\n };\n};\n\nconst renderTimelinePayload = (payload: unknown): ReactNode | undefined => {\n if (payload == null) {\n return undefined;\n }\n if (\n typeof payload === 'string' ||\n typeof payload === 'number' ||\n typeof payload === 'boolean'\n ) {\n return String(payload);\n }\n\n try {\n return createElement('pre', null, JSON.stringify(payload, null, 2));\n } catch {\n const fallback =\n payload instanceof Error ? payload.message : '[unserializable payload]';\n return createElement('pre', null, fallback);\n }\n};\n\nconst resolveTechnicalVariant = (\n refKind: 'id' | 'slug' | 'path' | 'url' | 'hash' | 'external' | 'text',\n): TechnicalIdentifierVariant | null => {\n if (refKind === 'id' || refKind === 'hash' || refKind === 'external') {\n return refKind;\n }\n return null;\n};\n\nconst renderReferenceValue = (args: {\n value: BackofficeValueLabel;\n href?: string | null;\n refKind: 'id' | 'slug' | 'path' | 'url' | 'hash' | 'external' | 'text';\n copyValue?: string | null;\n tApp: TFunction;\n t: TFunction;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n}): ReactNode => {\n const { value, href, refKind, copyValue, tApp, t, renderLink } = args;\n const resolvedValue = resolveValueLabel(value, tApp);\n const technicalVariant = resolveTechnicalVariant(refKind);\n if (technicalVariant != null) {\n const normalized = normalizeTechnicalIdentifier(resolvedValue);\n if (normalized == null) {\n return t('common.notAvailable');\n }\n return createElement(TechnicalIdentifierValue, {\n value: normalized,\n copyValue: copyValue ?? normalized,\n variant: technicalVariant,\n copyLabel: t('common.actions.copy'),\n });\n }\n if (href != null && href.trim() !== '' && !isEmptyText(resolvedValue)) {\n return renderLink(href, resolvedValue);\n }\n return resolvedValue ?? t('common.notAvailable');\n};\n\nexport const renderBlocks = <Node>(\n blocks: readonly BackofficeDetailBlockSpec<Node>[] | undefined,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref: (entityId: string, refId: string) => string | null;\n keyPrefix?: string;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n renderDate: (\n value: string | number | Date | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderTag: (tone: BackofficeTone, label: string) => ReactNode;\n renderMetricGroup: (args: {\n key: string;\n title: string;\n description?: string;\n density?: 'compact' | 'comfortable';\n items: readonly {\n id: string;\n label: string;\n value: ReactNode;\n hint?: ReactNode;\n tone?: BackofficeTone;\n copyValue?: string;\n }[];\n }) => ReactNode;\n renderTimeline: (args: {\n key: string;\n title: string;\n description?: string;\n events: readonly {\n id: string;\n label: string;\n timestamp?: ReactNode;\n description?: ReactNode;\n actor?: ReactNode;\n tone?: BackofficeTone;\n payload?: ReactNode;\n }[];\n }) => ReactNode;\n renderAuditTimeline: (args: {\n key: string;\n title: string;\n description?: string;\n events: readonly {\n id: string;\n title: ReactNode;\n time?: ReactNode;\n actor?: ReactNode;\n source?: ReactNode;\n }[];\n }) => ReactNode;\n renderRelations: (args: {\n key: string;\n title: string;\n description?: string;\n items: readonly {\n id: string;\n label: string;\n count?: ReactNode;\n href?: string;\n description?: ReactNode;\n tone?: BackofficeTone;\n }[];\n }) => ReactNode;\n renderContextStack: (args: {\n key: string;\n title: string;\n items: readonly {\n id: string;\n label: string;\n value: ReactNode | null | undefined;\n }[];\n }) => ReactNode;\n renderCustomSection: (\n key: string,\n title: string,\n child: ReactNode,\n ) => ReactNode;\n wrapCustomNode: (key: string, node: ReactNode) => ReactNode;\n resolveTableColumns: (\n columns: readonly BackofficeColumnSpec[],\n ) => readonly DataTableColumn<unknown>[];\n renderTable: (args: {\n key: string;\n title: string;\n description?: string;\n columns: readonly DataTableColumn<unknown>[];\n rows: readonly unknown[];\n }) => ReactNode;\n renderPayload: (args: {\n key: string;\n title: string;\n description?: string;\n content: unknown;\n format: BackofficePayloadFormat;\n }) => ReactNode;\n renderKeyValueListSection: (args: {\n key: string;\n title: string;\n description?: string;\n items: readonly { id: string; label: string; value: ReactNode }[];\n }) => ReactNode;\n },\n): ReactNode[] => {\n const { tApp, t, keyPrefix } = options;\n if (blocks == null || blocks.length === 0) {\n return [];\n }\n\n return blocks.map((block, index): ReactNode => {\n const key =\n keyPrefix != null\n ? `${keyPrefix}-${block.kind}-${index}`\n : `${block.kind}-${index}`;\n\n if (block.kind === 'custom') {\n const custom = block.render(node) as ReactNode;\n if (custom == null) {\n return null;\n }\n if (block.label != null) {\n return options.renderCustomSection(\n key,\n resolveLabel(block.label, tApp),\n custom,\n );\n }\n return options.wrapCustomNode(key, custom);\n }\n\n const title =\n 'title' in block\n ? resolveLabel(block.title, tApp)\n : resolveLabel(block.label, tApp);\n const description =\n block.description != null\n ? resolveLabel(block.description, tApp)\n : undefined;\n\n if (block.kind === 'summary') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.items.map((item) => {\n const value = resolveValueLabel(item.value(node), tApp);\n const href = item.href?.(node);\n const tone = item.tone?.(node);\n let valueNode: ReactNode = value ?? t('common.notAvailable');\n if (href != null && href.trim() !== '' && !isEmptyText(value)) {\n valueNode = options.renderLink(href, value);\n } else if (tone != null && !isEmptyText(value)) {\n valueNode = options.renderTag(tone, String(value));\n }\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n value: valueNode,\n };\n }),\n });\n }\n\n if (block.kind === 'metrics') {\n return options.renderMetricGroup({\n key,\n title,\n description,\n density: block.density,\n items: block.items.map((item) => {\n const formattedValue = item.formattedValue?.(node);\n const value = resolveValueLabel(item.value(node), tApp);\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n value: formattedValue ?? value ?? t('common.notAvailable'),\n hint: resolveValueLabel(item.hint?.(node), tApp),\n tone: item.tone?.(node),\n copyValue: item.copyValue?.(node) ?? undefined,\n };\n }),\n });\n }\n\n if (block.kind === 'states') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.states.map((state) => {\n const display = state.getDisplay(state.value(node), node);\n return {\n id: state.id,\n label: resolveLabel(state.label, tApp),\n value: options.renderTag(\n display.tone,\n String(\n resolveValueLabel(display.label, tApp) ??\n t('common.notAvailable'),\n ),\n ),\n };\n }),\n });\n }\n\n if (block.kind === 'context') {\n return options.renderContextStack({\n key,\n title,\n items: block.items.map((item) => {\n const value = resolveValueLabel(item.value(node), tApp);\n const href = item.href?.(node);\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n value:\n href != null && href.trim() !== '' && !isEmptyText(value)\n ? options.renderLink(href, value)\n : value,\n };\n }),\n });\n }\n\n if (block.kind === 'relationSummary') {\n return options.renderRelations({\n key,\n title,\n description,\n items: block.items.map((item) => {\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n count: item.count?.(node) ?? null,\n href: item.href?.(node) ?? undefined,\n description: resolveValueLabel(item.description?.(node), tApp),\n tone: item.tone?.(node),\n };\n }),\n });\n }\n\n if (block.kind === 'timeline') {\n return options.renderTimeline({\n key,\n title,\n description,\n events: block.events.map((event) => {\n const state = event.state?.(node);\n const stateLabel =\n state == null ? null : resolveValueLabel(state.label, tApp);\n const stateText = stateLabel == null ? null : String(stateLabel);\n return {\n id: event.id,\n label:\n stateText == null || stateText.trim() === ''\n ? resolveLabel(event.label, tApp)\n : `${resolveLabel(event.label, tApp)}: ${stateText}`,\n timestamp:\n event.timestamp == null\n ? undefined\n : options.renderDate(\n event.timestamp(node),\n t('common.notAvailable'),\n ),\n description: resolveValueLabel(event.description?.(node), tApp),\n actor: resolveValueLabel(event.actor?.(node), tApp),\n tone: state?.tone,\n payload: renderTimelinePayload(event.payload?.(node)),\n };\n }),\n });\n }\n\n if (block.kind === 'audit') {\n return options.renderAuditTimeline({\n key,\n title,\n description,\n events: block.items.map((item) => {\n const actor = resolveValueLabel(item.actor?.(node), tApp);\n const source = resolveValueLabel(item.source?.(node), tApp);\n return {\n id: item.id,\n title: resolveLabel(item.label, tApp),\n time: options.renderDate(\n item.timestamp?.(node),\n t('common.notAvailable'),\n ),\n actor: isEmptyText(actor) ? undefined : actor,\n source: isEmptyText(source) ? undefined : source,\n };\n }),\n });\n }\n\n if (block.kind === 'references') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.references.map((reference) => {\n const href = reference.href?.(node);\n return {\n id: reference.id,\n label: resolveLabel(reference.label, tApp),\n value: renderReferenceValue({\n value: reference.value(node),\n href,\n refKind: reference.refKind ?? 'text',\n copyValue: reference.copyValue?.(node) ?? undefined,\n tApp,\n t,\n renderLink: options.renderLink,\n }),\n };\n }),\n });\n }\n\n if (block.kind === 'actionResult') {\n const items: { id: string; label: string; value: ReactNode }[] = [];\n const status = block.status?.(node);\n if (status != null) {\n items.push({\n id: `${block.id}-status`,\n label: t('detail.actionResult.status'),\n value: options.renderTag(\n status.tone,\n String(\n resolveValueLabel(status.label, tApp) ?? t('common.notAvailable'),\n ),\n ),\n });\n }\n const message = resolveValueLabel(block.message?.(node), tApp);\n if (!isEmptyText(message)) {\n items.push({\n id: `${block.id}-message`,\n label: t('detail.actionResult.message'),\n value: message,\n });\n }\n block.references?.forEach((reference) => {\n items.push({\n id: reference.id,\n label: resolveLabel(reference.label, tApp),\n value: renderReferenceValue({\n value: reference.value(node),\n href: reference.href?.(node),\n refKind: reference.refKind ?? 'text',\n copyValue: reference.copyValue?.(node) ?? undefined,\n tApp,\n t,\n renderLink: options.renderLink,\n }),\n });\n });\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items,\n });\n }\n\n if (block.kind === 'technicalFacts') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.facts.map((fact) => {\n const value = resolveValueLabel(fact.value(node), tApp);\n const href = fact.href?.(node);\n const copyValue = fact.copyValue?.(node) ?? undefined;\n return {\n id: fact.id,\n label: resolveLabel(fact.label, tApp),\n value:\n copyValue != null && copyValue.trim() !== ''\n ? createElement(TechnicalIdentifierValue, {\n value: value ?? copyValue,\n copyValue,\n variant: 'external',\n copyLabel: t('common.actions.copy'),\n })\n : href != null && href.trim() !== '' && !isEmptyText(value)\n ? options.renderLink(href, value)\n : (value ?? t('common.notAvailable')),\n };\n }),\n });\n }\n\n if (block.kind === 'table') {\n return options.renderTable({\n key,\n title,\n description,\n columns: options.resolveTableColumns(block.columns),\n rows: block.rows(node) as readonly unknown[],\n });\n }\n\n return options.renderPayload({\n key,\n title,\n description,\n content: block.value(node),\n format: block.format ?? 'json',\n });\n });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeEntityDetailPage.view-helpers.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailPage.view-helpers.ts"],"sourcesContent":["/* eslint-disable no-ternary */\nimport type {\n BackofficeBadgeItem,\n BackofficeColumnSpec,\n BackofficeDetailBlockSpec,\n BackofficeDetailFieldSpec,\n BackofficeDetailHeaderConfig,\n BackofficeDetailHeaderMetaSpec,\n BackofficeDetailHeaderStatusSpec,\n BackofficeFieldSize,\n BackofficeFlagVariant,\n BackofficeInlineValueSpec,\n BackofficePayloadFormat,\n BackofficeTone,\n BackofficeValueLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { DataTableColumn } from '@plumile/ui/components/data-table/DataTable.js';\nimport type { TFunction } from 'i18next';\nimport { Fragment, createElement, type ReactNode } from 'react';\n\nimport {\n isEmptyText,\n resolveLabel,\n resolveBadgeTone,\n resolveValueLabel,\n} from './BackofficeEntityDetailPage.helpers.js';\nimport {\n normalizeTechnicalIdentifier,\n TechnicalIdentifierValue,\n type TechnicalIdentifierVariant,\n} from '../components/backoffice/technical/TechnicalIdentifierValue.js';\n\nexport type ResolvedFieldItem = {\n id: string;\n label: string;\n size: BackofficeFieldSize;\n value: ReactNode;\n copyValue?: string;\n fullWidth?: boolean;\n};\n\nexport type ResolvedHeaderItem = {\n id: string;\n label: string;\n value: ReactNode;\n};\n\nexport type FlagIconName =\n | 'shield-lock'\n | 'shield-off'\n | 'settings-check'\n | 'settings-x'\n | 'x-badge'\n | 'chat-check'\n | 'key'\n | 'key-off'\n | 'lock'\n | 'lock-open'\n | 'robot-check'\n | 'robot-x'\n | 'rocket'\n | 'rocket-off';\n\nexport type ResolvedFlagTag = {\n tone: 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n label: string;\n iconName?: FlagIconName;\n};\n\nexport const resolveFlagTag = (\n variant: BackofficeFlagVariant,\n value: boolean,\n t: TFunction,\n): ResolvedFlagTag => {\n switch (variant) {\n case 'yesNo':\n return value\n ? { tone: 'success', label: t('common.boolean.yes') }\n : { tone: 'neutral', label: t('common.boolean.no') };\n case 'capability':\n return value\n ? {\n tone: 'success',\n label: t('flags.capability.allowed'),\n iconName: 'shield-lock',\n }\n : {\n tone: 'neutral',\n label: t('flags.capability.denied'),\n iconName: 'shield-off',\n };\n case 'enabled':\n return value\n ? {\n tone: 'success',\n label: t('flags.enabled.enabled'),\n iconName: 'settings-check',\n }\n : {\n tone: 'neutral',\n label: t('flags.enabled.disabled'),\n iconName: 'settings-x',\n };\n case 'failure':\n return value\n ? {\n tone: 'danger',\n label: t('flags.failure.failed'),\n iconName: 'x-badge',\n }\n : {\n tone: 'success',\n label: t('flags.failure.ok'),\n iconName: 'chat-check',\n };\n case 'encrypted':\n return value\n ? {\n tone: 'info',\n label: t('flags.encrypted.encrypted'),\n iconName: 'key',\n }\n : {\n tone: 'neutral',\n label: t('flags.encrypted.notEncrypted'),\n iconName: 'key-off',\n };\n case 'locked':\n return value\n ? {\n tone: 'warning',\n label: t('flags.locked.locked'),\n iconName: 'lock',\n }\n : {\n tone: 'success',\n label: t('flags.locked.unlocked'),\n iconName: 'lock-open',\n };\n case 'default':\n return value\n ? { tone: 'info', label: t('flags.default.default') }\n : { tone: 'neutral', label: t('flags.default.notDefault') };\n case 'agentManaged':\n return value\n ? {\n tone: 'info',\n label: t('flags.agentManaged.agentManaged'),\n iconName: 'robot-check',\n }\n : {\n tone: 'neutral',\n label: t('flags.agentManaged.userManaged'),\n iconName: 'robot-x',\n };\n case 'deployedProduction':\n return value\n ? {\n tone: 'success',\n label: t('flags.deployedProduction.deployed'),\n iconName: 'rocket',\n }\n : {\n tone: 'neutral',\n label: t('flags.deployedProduction.notDeployed'),\n iconName: 'rocket-off',\n };\n case 'forced':\n return value\n ? { tone: 'warning', label: t('flags.forced.forced') }\n : { tone: 'neutral', label: t('flags.forced.normal') };\n default:\n throw new Error(`Unsupported flag variant: ${String(variant)}`);\n }\n};\n\nexport const resolveInlineValue = (\n value: BackofficeInlineValueSpec,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n },\n): ReactNode => {\n const { tApp, t, resolveEntityHref, renderLink } = options;\n const fallback = t('common.notAvailable');\n\n if (value.type === 'text') {\n const resolved = resolveValueLabel(value.value, tApp);\n return isEmptyText(resolved) ? fallback : resolved;\n }\n\n if (value.type === 'entityRef') {\n const { id } = value;\n if (id == null || id.trim() === '') {\n return fallback;\n }\n const resolvedLabel = resolveValueLabel(value.label, tApp);\n const label =\n resolvedLabel != null && String(resolvedLabel).trim() !== ''\n ? resolvedLabel\n : null;\n if (label == null) {\n return fallback;\n }\n const href = resolveEntityHref?.(value.entity, id) ?? null;\n return href != null ? renderLink(href, label) : label;\n }\n\n const { href } = value;\n if (href == null || href.trim() === '') {\n return fallback;\n }\n const label = resolveValueLabel(value.label, tApp);\n if (isEmptyText(label)) {\n return fallback;\n }\n return renderLink(href, label);\n};\n\nexport const resolveHeaderMeta = <Node>(\n meta: BackofficeDetailHeaderMetaSpec<Node>,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n },\n): ReactNode => {\n const { tApp, t, resolveEntityHref, renderDate, renderLink } = options;\n const fallback = t('common.notAvailable');\n\n if (meta.type === 'dateTime') {\n return renderDate(meta.value(node), fallback);\n }\n\n if (meta.type === 'entityRef') {\n const idValue = meta.id(node);\n if (idValue == null || idValue.trim() === '') {\n return fallback;\n }\n const labelValue = resolveValueLabel(meta.value?.(node), tApp);\n const label =\n labelValue != null && String(labelValue).trim() !== ''\n ? labelValue\n : null;\n if (label == null) {\n return fallback;\n }\n const href = resolveEntityHref?.(meta.entity, idValue) ?? null;\n return href != null ? renderLink(href, label) : label;\n }\n\n if (meta.type === 'link') {\n const href = meta.href(node);\n const labelValue = resolveValueLabel(meta.value(node), tApp);\n if (href == null || href.trim() === '' || isEmptyText(labelValue)) {\n return fallback;\n }\n return renderLink(href, labelValue);\n }\n\n const value = resolveValueLabel(meta.value(node), tApp);\n return isEmptyText(value) ? fallback : value;\n};\n\nexport const resolveHeaderStatus = <Node>(\n status: BackofficeDetailHeaderStatusSpec<Node>,\n node: Node,\n tApp: TFunction,\n renderers: {\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n },\n): ReactNode | undefined => {\n if (status.type === 'badgeRow') {\n const items = status.items(node).map((item) => {\n const resolvedLabel = resolveValueLabel(item.label, tApp);\n const label = resolvedLabel == null ? '' : String(resolvedLabel);\n return { ...item, label };\n });\n if (items.length === 0) {\n return undefined;\n }\n return renderers.renderBadgeRow(items);\n }\n\n const value = resolveValueLabel(status.value(node), tApp);\n const label = value == null ? '' : String(value);\n if (label.trim() === '') {\n return undefined;\n }\n const tone = resolveBadgeTone(status.tone, node);\n return renderers.renderTag(tone, label);\n};\n\nexport const buildFieldItems = <Node>(\n fields: readonly BackofficeDetailFieldSpec<Node>[],\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n formatNumber: (value: number | null | undefined) => string;\n formatCurrency: (value: number | null | undefined) => string;\n formatCurrencyTitle?: (value: number | null | undefined) => string | null;\n formatPercent: (value: number | null | undefined) => string;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderFlagTag: (tag: ResolvedFlagTag) => ReactNode;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n renderTaggedValue: (\n tag: {\n label: string;\n tone?: ReturnType<typeof resolveBadgeTone<Node>>;\n } | null,\n value: ReactNode,\n ) => ReactNode;\n wrapCustomNode: (id: string, node: ReactNode) => ReactNode;\n },\n): {\n items: ResolvedFieldItem[];\n customNodes: ReactNode[];\n} => {\n const {\n tApp,\n t,\n resolveEntityHref,\n formatNumber,\n formatCurrency,\n formatCurrencyTitle,\n formatPercent,\n renderTag,\n renderBadgeRow,\n renderDate,\n renderFlagTag,\n renderLink,\n renderTaggedValue,\n wrapCustomNode,\n } = options;\n const items: ResolvedFieldItem[] = [];\n const customNodes: ReactNode[] = [];\n const fallback = t('common.notAvailable');\n\n fields.forEach((field, index) => {\n const id = `${field.type}-${index}`;\n\n switch (field.type) {\n case 'text': {\n const value = resolveValueLabel(field.value(node), tApp);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value,\n copyValue: field.copyValue?.(node) ?? undefined,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'badge': {\n const value = resolveValueLabel(field.value(node), tApp);\n const label = value != null ? String(value) : '';\n const tone = resolveBadgeTone(field.tone, node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: label.trim() !== '' ? renderTag(tone, label) : null,\n });\n break;\n }\n case 'badgeRow': {\n const badgeItems = field.items(node).map((item) => {\n const resolvedLabel = resolveValueLabel(item.label, tApp);\n const label = resolvedLabel == null ? '' : String(resolvedLabel);\n return { ...item, label };\n });\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: badgeItems.length > 0 ? renderBadgeRow(badgeItems) : null,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'dateTime': {\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: renderDate(field.value(node), fallback),\n });\n break;\n }\n case 'number': {\n const value = field.value(node);\n let formatted: ReactNode | null = null;\n if (value != null) {\n if (field.format === 'currency') {\n const label = formatCurrency(value);\n formatted = createElement(\n 'span',\n { title: formatCurrencyTitle?.(value) ?? undefined },\n label,\n );\n } else if (field.format === 'percent') {\n formatted = formatPercent(value);\n } else {\n formatted = formatNumber(value);\n }\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: formatted,\n });\n break;\n }\n case 'flag': {\n const value = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n value != null\n ? renderFlagTag(resolveFlagTag(field.variant, value, t))\n : null,\n });\n break;\n }\n case 'entityRef': {\n const idValue = field.id(node);\n let value: ReactNode | null = null;\n if (idValue != null && idValue.trim() !== '') {\n const labelValue = field.value?.(node);\n const label =\n labelValue != null && labelValue.trim() !== '' ? labelValue : null;\n const href = resolveEntityHref?.(field.entity, idValue) ?? null;\n if (label != null) {\n value = href != null ? renderLink(href, label) : label;\n }\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: value ?? fallback,\n });\n break;\n }\n case 'technicalIdentifier': {\n const value = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n value == null\n ? null\n : createElement(TechnicalIdentifierValue, {\n value,\n copyValue: field.copyValue?.(node) ?? undefined,\n variant: field.variant,\n copyLabel: t('common.actions.copy'),\n }),\n copyValue: field.copyValue?.(node) ?? undefined,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'link': {\n const href = field.href(node);\n const labelValue = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n href != null && href.trim() !== '' && !isEmptyText(labelValue)\n ? renderLink(href, labelValue)\n : null,\n });\n break;\n }\n case 'taggedValue': {\n const tag = field.tag(node);\n const valueNode = resolveInlineValue(field.value(node), {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n });\n const resolvedTag =\n tag == null\n ? null\n : {\n ...tag,\n label: (() => {\n const labelValue = resolveValueLabel(tag.label, tApp);\n return labelValue == null ? '' : String(labelValue);\n })(),\n };\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n resolvedTag != null || valueNode != null\n ? renderTaggedValue(resolvedTag, valueNode)\n : null,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'custom': {\n const custom = field.render(node) as ReactNode;\n if (custom == null) {\n break;\n }\n if (field.label != null) {\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: custom,\n fullWidth: field.fullWidth,\n });\n break;\n }\n customNodes.push(wrapCustomNode(id, custom));\n break;\n }\n default:\n break;\n }\n });\n\n return { items, customNodes };\n};\n\nexport const resolveHeaderItems = <Node>(\n header: BackofficeDetailHeaderConfig<Node>,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n },\n): {\n title: string;\n subtitle?: ReactNode;\n badges?: ReactNode;\n status?: ReactNode;\n items?: readonly ResolvedHeaderItem[];\n} => {\n const {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n renderDate,\n renderTag,\n renderBadgeRow,\n } = options;\n const resolvedTitle =\n header.titleValue?.(node, tApp) ?? resolveLabel(header.title, tApp);\n const rawNodeId =\n node != null &&\n typeof node === 'object' &&\n 'id' in node &&\n typeof node.id === 'string'\n ? node.id.trim()\n : null;\n const title =\n resolvedTitle.trim() === '' ||\n (rawNodeId != null && resolvedTitle.trim() === rawNodeId)\n ? resolveLabel(header.title, tApp)\n : resolvedTitle;\n\n let subtitleNode: ReactNode | undefined;\n if (header.subtitleItems != null && header.subtitleItems.length > 0) {\n const { subtitleItems } = header;\n const separator = header.subtitleSeparator ?? ' / ';\n const parts: ReactNode[] = [];\n subtitleItems.forEach((item, index) => {\n parts.push(\n createElement(\n 'span',\n { key: item.id },\n resolveInlineValue(item.value(node), {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n }),\n ),\n );\n if (index < subtitleItems.length - 1) {\n parts.push(createElement('span', { key: `${item.id}-sep` }, separator));\n }\n });\n subtitleNode = createElement('span', null, ...parts);\n } else {\n const subtitleValue =\n header.subtitleValue?.(node, tApp) ??\n (header.subtitle != null ? resolveLabel(header.subtitle, tApp) : null);\n subtitleNode =\n subtitleValue != null && subtitleValue.trim() !== ''\n ? subtitleValue\n : undefined;\n }\n\n const badgeNodes: ReactNode[] = [];\n header.badges?.forEach((badge, index) => {\n const label = resolveLabel(badge.label, tApp);\n const resolvedValue = resolveValueLabel(badge.value(node), tApp);\n const value = resolvedValue == null ? '' : String(resolvedValue);\n if (value.trim() === '') {\n return;\n }\n badgeNodes.push(\n renderTag(resolveBadgeTone(badge.tone, node), `${label}: ${value}`),\n );\n if (typeof badgeNodes[badgeNodes.length - 1] === 'object') {\n badgeNodes[badgeNodes.length - 1] = createElement(\n Fragment,\n { key: `${label}-${index}` },\n badgeNodes[badgeNodes.length - 1],\n );\n }\n });\n\n const status =\n header.status != null\n ? resolveHeaderStatus(header.status, node, tApp, {\n renderBadgeRow,\n renderTag,\n })\n : undefined;\n\n const items = header.meta?.map((meta, index) => {\n const label = resolveLabel(meta.label, tApp);\n return {\n id: `${label}-${index}`,\n label,\n value: resolveHeaderMeta(meta, node, {\n tApp,\n t,\n resolveEntityHref,\n renderDate,\n renderLink,\n }),\n };\n });\n\n return {\n title,\n subtitle: subtitleNode,\n badges:\n badgeNodes.length > 0\n ? createElement(Fragment, null, ...badgeNodes)\n : undefined,\n status,\n items,\n };\n};\n\nconst renderTimelinePayload = (payload: unknown): ReactNode | undefined => {\n if (payload == null) {\n return undefined;\n }\n if (\n typeof payload === 'string' ||\n typeof payload === 'number' ||\n typeof payload === 'boolean'\n ) {\n return String(payload);\n }\n\n try {\n return createElement('pre', null, JSON.stringify(payload, null, 2));\n } catch {\n const fallback =\n payload instanceof Error ? payload.message : '[unserializable payload]';\n return createElement('pre', null, fallback);\n }\n};\n\nconst resolveTechnicalVariant = (\n refKind: 'id' | 'slug' | 'path' | 'url' | 'hash' | 'external' | 'text',\n): TechnicalIdentifierVariant | null => {\n if (refKind === 'id' || refKind === 'hash' || refKind === 'external') {\n return refKind;\n }\n return null;\n};\n\nconst renderReferenceValue = (args: {\n value: BackofficeValueLabel;\n href?: string | null;\n refKind: 'id' | 'slug' | 'path' | 'url' | 'hash' | 'external' | 'text';\n copyValue?: string | null;\n tApp: TFunction;\n t: TFunction;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n}): ReactNode => {\n const { value, href, refKind, copyValue, tApp, t, renderLink } = args;\n const resolvedValue = resolveValueLabel(value, tApp);\n const technicalVariant = resolveTechnicalVariant(refKind);\n if (technicalVariant != null) {\n const normalized = normalizeTechnicalIdentifier(resolvedValue);\n if (normalized == null) {\n return t('common.notAvailable');\n }\n return createElement(TechnicalIdentifierValue, {\n value: normalized,\n copyValue: copyValue ?? normalized,\n variant: technicalVariant,\n copyLabel: t('common.actions.copy'),\n });\n }\n if (href != null && href.trim() !== '' && !isEmptyText(resolvedValue)) {\n return renderLink(href, resolvedValue);\n }\n return resolvedValue ?? t('common.notAvailable');\n};\n\nexport const renderBlocks = <Node>(\n blocks: readonly BackofficeDetailBlockSpec<Node>[] | undefined,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref: (entityId: string, refId: string) => string | null;\n keyPrefix?: string;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n renderDate: (\n value: string | number | Date | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderTag: (tone: BackofficeTone, label: string) => ReactNode;\n renderMetricGroup: (args: {\n key: string;\n title: string;\n description?: string;\n density?: 'compact' | 'comfortable';\n items: readonly {\n id: string;\n label: string;\n value: ReactNode;\n hint?: ReactNode;\n tone?: BackofficeTone;\n copyValue?: string;\n }[];\n }) => ReactNode;\n renderTimeline: (args: {\n key: string;\n title: string;\n description?: string;\n events: readonly {\n id: string;\n label: string;\n timestamp?: ReactNode;\n description?: ReactNode;\n actor?: ReactNode;\n tone?: BackofficeTone;\n payload?: ReactNode;\n }[];\n }) => ReactNode;\n renderAuditTimeline: (args: {\n key: string;\n title: string;\n description?: string;\n events: readonly {\n id: string;\n title: ReactNode;\n time?: ReactNode;\n actor?: ReactNode;\n source?: ReactNode;\n }[];\n }) => ReactNode;\n renderRelations: (args: {\n key: string;\n title: string;\n description?: string;\n items: readonly {\n id: string;\n label: string;\n count?: ReactNode;\n href?: string;\n description?: ReactNode;\n tone?: BackofficeTone;\n }[];\n }) => ReactNode;\n renderContextStack: (args: {\n key: string;\n title: string;\n items: readonly {\n id: string;\n label: string;\n value: ReactNode | null | undefined;\n }[];\n }) => ReactNode;\n renderCustomSection: (\n key: string,\n title: string,\n child: ReactNode,\n ) => ReactNode;\n wrapCustomNode: (key: string, node: ReactNode) => ReactNode;\n resolveTableColumns: (\n columns: readonly BackofficeColumnSpec[],\n ) => readonly DataTableColumn<unknown>[];\n renderTable: (args: {\n key: string;\n title: string;\n description?: string;\n columns: readonly DataTableColumn<unknown>[];\n rows: readonly unknown[];\n }) => ReactNode;\n renderPayload: (args: {\n key: string;\n title: string;\n description?: string;\n content: unknown;\n format: BackofficePayloadFormat;\n }) => ReactNode;\n renderKeyValueListSection: (args: {\n key: string;\n title: string;\n description?: string;\n items: readonly { id: string; label: string; value: ReactNode }[];\n }) => ReactNode;\n },\n): ReactNode[] => {\n const { tApp, t, keyPrefix } = options;\n if (blocks == null || blocks.length === 0) {\n return [];\n }\n\n return blocks.map((block, index): ReactNode => {\n const key =\n keyPrefix != null\n ? `${keyPrefix}-${block.kind}-${index}`\n : `${block.kind}-${index}`;\n\n if (block.kind === 'custom') {\n const custom = block.render(node) as ReactNode;\n if (custom == null) {\n return null;\n }\n if (block.label != null) {\n return options.renderCustomSection(\n key,\n resolveLabel(block.label, tApp),\n custom,\n );\n }\n return options.wrapCustomNode(key, custom);\n }\n\n const title =\n 'title' in block\n ? resolveLabel(block.title, tApp)\n : resolveLabel(block.label, tApp);\n const description =\n block.description != null\n ? resolveLabel(block.description, tApp)\n : undefined;\n\n if (block.kind === 'summary') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.items.map((item) => {\n const value = resolveValueLabel(item.value(node), tApp);\n const href = item.href?.(node);\n const tone = item.tone?.(node);\n let valueNode: ReactNode = value ?? t('common.notAvailable');\n if (href != null && href.trim() !== '' && !isEmptyText(value)) {\n valueNode = options.renderLink(href, value);\n } else if (tone != null && !isEmptyText(value)) {\n valueNode = options.renderTag(tone, String(value));\n }\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n value: valueNode,\n };\n }),\n });\n }\n\n if (block.kind === 'metrics') {\n return options.renderMetricGroup({\n key,\n title,\n description,\n density: block.density,\n items: block.items.map((item) => {\n const formattedValue = item.formattedValue?.(node);\n const value = resolveValueLabel(item.value(node), tApp);\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n value: formattedValue ?? value ?? t('common.notAvailable'),\n hint: resolveValueLabel(item.hint?.(node), tApp),\n tone: item.tone?.(node),\n copyValue: item.copyValue?.(node) ?? undefined,\n };\n }),\n });\n }\n\n if (block.kind === 'states') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.states.map((state) => {\n const display = state.getDisplay(state.value(node), node);\n return {\n id: state.id,\n label: resolveLabel(state.label, tApp),\n value: options.renderTag(\n display.tone,\n String(\n resolveValueLabel(display.label, tApp) ??\n t('common.notAvailable'),\n ),\n ),\n };\n }),\n });\n }\n\n if (block.kind === 'context') {\n return options.renderContextStack({\n key,\n title,\n items: block.items.map((item) => {\n const value = resolveValueLabel(item.value(node), tApp);\n const href = item.href?.(node);\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n value:\n href != null && href.trim() !== '' && !isEmptyText(value)\n ? options.renderLink(href, value)\n : value,\n };\n }),\n });\n }\n\n if (block.kind === 'relationSummary') {\n return options.renderRelations({\n key,\n title,\n description,\n items: block.items.map((item) => {\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n count: item.count?.(node) ?? null,\n href: item.href?.(node) ?? undefined,\n description: resolveValueLabel(item.description?.(node), tApp),\n tone: item.tone?.(node),\n };\n }),\n });\n }\n\n if (block.kind === 'timeline') {\n return options.renderTimeline({\n key,\n title,\n description,\n events: block.events.map((event) => {\n const state = event.state?.(node);\n const stateLabel =\n state == null ? null : resolveValueLabel(state.label, tApp);\n const stateText = stateLabel == null ? null : String(stateLabel);\n return {\n id: event.id,\n label:\n stateText == null || stateText.trim() === ''\n ? resolveLabel(event.label, tApp)\n : `${resolveLabel(event.label, tApp)}: ${stateText}`,\n timestamp:\n event.timestamp == null\n ? undefined\n : options.renderDate(\n event.timestamp(node),\n t('common.notAvailable'),\n ),\n description: resolveValueLabel(event.description?.(node), tApp),\n actor: resolveValueLabel(event.actor?.(node), tApp),\n tone: state?.tone,\n payload: renderTimelinePayload(event.payload?.(node)),\n };\n }),\n });\n }\n\n if (block.kind === 'audit') {\n return options.renderAuditTimeline({\n key,\n title,\n description,\n events: block.items.map((item) => {\n const actor = resolveValueLabel(item.actor?.(node), tApp);\n const source = resolveValueLabel(item.source?.(node), tApp);\n return {\n id: item.id,\n title: resolveLabel(item.label, tApp),\n time: options.renderDate(\n item.timestamp?.(node),\n t('common.notAvailable'),\n ),\n actor: isEmptyText(actor) ? undefined : actor,\n source: isEmptyText(source) ? undefined : source,\n };\n }),\n });\n }\n\n if (block.kind === 'references') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.references.map((reference) => {\n const href = reference.href?.(node);\n return {\n id: reference.id,\n label: resolveLabel(reference.label, tApp),\n value: renderReferenceValue({\n value: reference.value(node),\n href,\n refKind: reference.refKind ?? 'text',\n copyValue: reference.copyValue?.(node) ?? undefined,\n tApp,\n t,\n renderLink: options.renderLink,\n }),\n };\n }),\n });\n }\n\n if (block.kind === 'actionResult') {\n const items: { id: string; label: string; value: ReactNode }[] = [];\n const status = block.status?.(node);\n if (status != null) {\n items.push({\n id: `${block.id}-status`,\n label: t('detail.actionResult.status'),\n value: options.renderTag(\n status.tone,\n String(\n resolveValueLabel(status.label, tApp) ?? t('common.notAvailable'),\n ),\n ),\n });\n }\n const message = resolveValueLabel(block.message?.(node), tApp);\n if (!isEmptyText(message)) {\n items.push({\n id: `${block.id}-message`,\n label: t('detail.actionResult.message'),\n value: message,\n });\n }\n block.references?.forEach((reference) => {\n items.push({\n id: reference.id,\n label: resolveLabel(reference.label, tApp),\n value: renderReferenceValue({\n value: reference.value(node),\n href: reference.href?.(node),\n refKind: reference.refKind ?? 'text',\n copyValue: reference.copyValue?.(node) ?? undefined,\n tApp,\n t,\n renderLink: options.renderLink,\n }),\n });\n });\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items,\n });\n }\n\n if (block.kind === 'technicalFacts') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.facts.map((fact) => {\n const value = resolveValueLabel(fact.value(node), tApp);\n const href = fact.href?.(node);\n const copyValue = fact.copyValue?.(node) ?? undefined;\n return {\n id: fact.id,\n label: resolveLabel(fact.label, tApp),\n value:\n copyValue != null && copyValue.trim() !== ''\n ? createElement(TechnicalIdentifierValue, {\n value: value ?? copyValue,\n copyValue,\n variant: 'external',\n copyLabel: t('common.actions.copy'),\n })\n : href != null && href.trim() !== '' && !isEmptyText(value)\n ? options.renderLink(href, value)\n : (value ?? t('common.notAvailable')),\n };\n }),\n });\n }\n\n if (block.kind === 'table') {\n return options.renderTable({\n key,\n title,\n description,\n columns: options.resolveTableColumns(block.columns),\n rows: block.rows(node) as readonly unknown[],\n });\n }\n\n return options.renderPayload({\n key,\n title,\n description,\n content: block.value(node),\n format: block.format ?? 'json',\n });\n });\n};\n"],"mappings":"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"}