@plumile/backoffice-react 0.1.143 → 0.1.145

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 (230) hide show
  1. package/lib/esm/auth/AuthRefreshNotice.js.map +1 -1
  2. package/lib/esm/auth/TotpQrCode.js.map +1 -1
  3. package/lib/esm/auth/authRefreshNotice.css.js +1 -1
  4. package/lib/esm/auth/login/AuthPanel.js.map +1 -1
  5. package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
  6. package/lib/esm/auth/login/LoginFlow.js.map +1 -1
  7. package/lib/esm/auth/login/MethodChooser.js.map +1 -1
  8. package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
  9. package/lib/esm/auth/login/OidcButtons.js.map +1 -1
  10. package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
  11. package/lib/esm/auth/login/PasswordLoginPanel.js.map +1 -1
  12. package/lib/esm/auth/login/loginPage.css.js +1 -1
  13. package/lib/esm/auth/login/loginPage.css.js.map +1 -1
  14. package/lib/esm/auth/login/synchronizeAuthStatusQuery.js.map +1 -1
  15. package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
  16. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
  17. package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
  18. package/lib/esm/auth/pages/VerifyEmailScreen.js.map +1 -1
  19. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +14 -14
  20. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
  21. package/lib/esm/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js.map +1 -1
  22. package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js +1 -1
  23. package/lib/esm/components/backoffice/actions/toastViewAction.js.map +1 -1
  24. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js +1 -1
  25. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js.map +1 -1
  26. package/lib/esm/components/backoffice/billing/backofficeBillingUsageChart.css.js +1 -1
  27. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
  28. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js.map +1 -1
  29. package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js.map +1 -1
  30. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js.map +1 -1
  31. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js.map +1 -1
  32. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationList.js.map +1 -1
  33. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
  34. package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js.map +1 -1
  35. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +6 -6
  36. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js.map +1 -1
  37. package/lib/esm/components/backoffice/detail/BackofficeEnumLabel.js.map +1 -1
  38. package/lib/esm/components/backoffice/detail/BackofficeLifecycleTimelineSection.js.map +1 -1
  39. package/lib/esm/components/backoffice/detail/BackofficeReferenceValue.js.map +1 -1
  40. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +1 -1
  41. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -1
  42. package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js.map +1 -1
  43. package/lib/esm/components/backoffice/detail/BackofficeStatusMetaBadge.js.map +1 -1
  44. package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js.map +1 -1
  45. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js +13 -13
  46. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js.map +1 -1
  47. package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js +1 -1
  48. package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js +1 -1
  49. package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js +1 -1
  50. package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js +2 -1
  51. package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js +1 -1
  52. package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js +1 -1
  53. package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js +1 -1
  54. package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js +1 -1
  55. package/lib/esm/components/backoffice/detail/createBackofficeEntityLinkProps.js.map +1 -1
  56. package/lib/esm/components/backoffice/detail/detailPayloadUtils.js.map +1 -1
  57. package/lib/esm/components/backoffice/errors/BackofficeErrorBoundary.js.map +1 -1
  58. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js.map +1 -1
  59. package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js.map +1 -1
  60. package/lib/esm/components/backoffice/filters/EntityFilterValue.js.map +1 -1
  61. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js +1 -1
  62. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js.map +1 -1
  63. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js +1 -1
  64. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js.map +1 -1
  65. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +1 -1
  66. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js +1 -1
  67. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +5 -5
  68. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js.map +1 -1
  69. package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js +1 -1
  70. package/lib/esm/components/backoffice/layout/BackofficePermissionsContext.js.map +1 -1
  71. package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +1 -1
  72. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js.map +1 -1
  73. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +2 -2
  74. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
  75. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortal.js.map +1 -1
  76. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js.map +1 -1
  77. package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js.map +1 -1
  78. package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js +1 -2
  79. package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js.map +1 -1
  80. package/lib/esm/components/backoffice/layout/buildSidebarSections.js.map +1 -1
  81. package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js.map +1 -1
  82. package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
  83. package/lib/esm/components/backoffice/links/BackofficeInlineLink.js.map +1 -1
  84. package/lib/esm/components/backoffice/links/BackofficeLink.js.map +1 -1
  85. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +1 -1
  86. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js.map +1 -1
  87. package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js.map +1 -1
  88. package/lib/esm/components/backoffice/links/backofficeLink.css.js +1 -1
  89. package/lib/esm/components/backoffice/links/resolveBackofficeLink.js.map +1 -1
  90. package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js.map +1 -1
  91. package/lib/esm/components/backoffice/links/useBackofficeLink.js.map +1 -1
  92. package/lib/esm/components/backoffice/list/RowFlagsCell.css.js +1 -1
  93. package/lib/esm/components/backoffice/list/RowFlagsCell.js.map +1 -1
  94. package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js.map +1 -1
  95. package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js +1 -1
  96. package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js.map +1 -1
  97. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
  98. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js +1 -1
  99. package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js.map +1 -1
  100. package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js.map +1 -1
  101. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
  102. package/lib/esm/components/backoffice/refs/backofficeEntityIdRef.css.js +1 -1
  103. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js +1 -1
  104. package/lib/esm/components/backoffice/routing/BackofficeContentBoundary.js.map +1 -1
  105. package/lib/esm/components/backoffice/routing/BackofficeContentError.js.map +1 -1
  106. package/lib/esm/components/backoffice/routing/BackofficeContentFallback.js.map +1 -1
  107. package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js.map +1 -1
  108. package/lib/esm/components/backoffice/routing/BackofficeRoutePendingBar.js.map +1 -1
  109. package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js +1 -1
  110. package/lib/esm/components/backoffice/routing/backofficeContentError.css.js +1 -1
  111. package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js +1 -1
  112. package/lib/esm/components/backoffice/routing/backofficeRouteFallback.css.js +1 -1
  113. package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js +1 -1
  114. package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js.map +1 -1
  115. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js.map +1 -1
  116. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  117. package/lib/esm/components/backoffice/scaffolds/BackofficeListFilterContext.js.map +1 -1
  118. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +1 -1
  119. package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +1 -1
  120. package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js +1 -1
  121. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
  122. package/lib/esm/components/backoffice/shared/BackofficeFormattedCurrency.js.map +1 -1
  123. package/lib/esm/components/backoffice/shared/BackofficeFormattedNumber.js.map +1 -1
  124. package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js.map +1 -1
  125. package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js +5 -5
  126. package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js.map +1 -1
  127. package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js +1 -1
  128. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +1 -1
  129. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js.map +1 -1
  130. package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +1 -1
  131. package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js.map +1 -1
  132. package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js.map +1 -1
  133. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js +1 -1
  134. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js.map +1 -1
  135. package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js +1 -1
  136. package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js +1 -1
  137. package/lib/esm/components/backoffice/tools/parseToolJson.js.map +1 -1
  138. package/lib/esm/filters/filterHelpers.js.map +1 -1
  139. package/lib/esm/hooks/useAuth.js.map +1 -1
  140. package/lib/esm/hooks/useBackofficeAuth.js.map +1 -1
  141. package/lib/esm/hooks/useBackofficeInfiniteScrollSentinel.js.map +1 -1
  142. package/lib/esm/hooks/useBackofficeListRefetch.js.map +1 -1
  143. package/lib/esm/hooks/useBackofficeListUrlState.js.map +1 -1
  144. package/lib/esm/hooks/useBackofficeLoadMore.js.map +1 -1
  145. package/lib/esm/hooks/useBackofficeSessionAuth.js.map +1 -1
  146. package/lib/esm/hooks/useBackofficeSidebarPins.js.map +1 -1
  147. package/lib/esm/hooks/useConditionalSubscription.js.map +1 -1
  148. package/lib/esm/hooks/useCopyToClipboard.js.map +1 -1
  149. package/lib/esm/hooks/useInfiniteConnection.js.map +1 -1
  150. package/lib/esm/hooks/useRefetchNeededReload.js.map +1 -1
  151. package/lib/esm/hooks/useSidebarGroupCollapse.js.map +1 -1
  152. package/lib/esm/i18n/createI18nInstance.js.map +1 -1
  153. package/lib/esm/i18n/mergeResourceLanguages.js.map +1 -1
  154. package/lib/esm/i18n/resources.js.map +1 -1
  155. package/lib/esm/i18n/useBackofficeFormats.js.map +1 -1
  156. package/lib/esm/i18n/useBackofficeReactTranslation.js.map +1 -1
  157. package/lib/esm/i18n/useReviewStatusLabel.js.map +1 -1
  158. package/lib/esm/modules/base64.js.map +1 -1
  159. package/lib/esm/modules/formatFileSize.js.map +1 -1
  160. package/lib/esm/modules/webauthn.js.map +1 -1
  161. package/lib/esm/node_modules/@babel/runtime/helpers/arrayLikeToArray.js.map +1 -1
  162. package/lib/esm/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js.map +1 -1
  163. package/lib/esm/node_modules/@babel/runtime/helpers/defineProperty.js.map +1 -1
  164. package/lib/esm/node_modules/@babel/runtime/helpers/interopRequireDefault.js.map +1 -1
  165. package/lib/esm/node_modules/@babel/runtime/helpers/iterableToArray.js.map +1 -1
  166. package/lib/esm/node_modules/@babel/runtime/helpers/nonIterableSpread.js.map +1 -1
  167. package/lib/esm/node_modules/@babel/runtime/helpers/objectSpread2.js.map +1 -1
  168. package/lib/esm/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js.map +1 -1
  169. package/lib/esm/node_modules/@babel/runtime/helpers/toConsumableArray.js.map +1 -1
  170. package/lib/esm/node_modules/@babel/runtime/helpers/toPrimitive.js.map +1 -1
  171. package/lib/esm/node_modules/@babel/runtime/helpers/toPropertyKey.js.map +1 -1
  172. package/lib/esm/node_modules/@babel/runtime/helpers/typeof.js.map +1 -1
  173. package/lib/esm/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js.map +1 -1
  174. package/lib/esm/node_modules/@vanilla-extract/recipes/dist/createRuntimeFn-62c9670f.esm.js.map +1 -1
  175. package/lib/esm/node_modules/fbjs/lib/areEqual.js.map +1 -1
  176. package/lib/esm/node_modules/invariant/browser.js.map +1 -1
  177. package/lib/esm/node_modules/relay-test-utils/index.js.map +1 -1
  178. package/lib/esm/node_modules/relay-test-utils/lib/RelayMockPayloadGenerator.js.map +1 -1
  179. package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js.map +1 -1
  180. package/lib/esm/node_modules/relay-test-utils/lib/RelayResolverTestUtils.js.map +1 -1
  181. package/lib/esm/node_modules/relay-test-utils/lib/index.js.map +1 -1
  182. package/lib/esm/node_modules/relay-test-utils/lib/unwrapContainer.js.map +1 -1
  183. package/lib/esm/pages/BackofficeAcceptInvitationPage.js.map +1 -1
  184. package/lib/esm/pages/BackofficeDashboardPage.helpers.js.map +1 -1
  185. package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
  186. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
  187. package/lib/esm/pages/BackofficeEntityDetailPage.helpers.js.map +1 -1
  188. package/lib/esm/pages/BackofficeEntityDetailPage.js +2 -2
  189. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  190. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  191. package/lib/esm/pages/BackofficeEntityDetailUnknownPageRedirect.js.map +1 -1
  192. package/lib/esm/pages/BackofficeEntityListPage.helpers.js.map +1 -1
  193. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  194. package/lib/esm/pages/BackofficeHubPage.js.map +1 -1
  195. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  196. package/lib/esm/pages/BackofficeLoginPage.js.map +1 -1
  197. package/lib/esm/pages/BackofficePasswordResetCompletePage.js.map +1 -1
  198. package/lib/esm/pages/BackofficePasswordResetRequestPage.js.map +1 -1
  199. package/lib/esm/pages/BackofficeVerifyEmailPage.js.map +1 -1
  200. package/lib/esm/pages/backofficeDashboardPage.css.js +1 -1
  201. package/lib/esm/pages/backofficeEntityDetailPage.css.js +1 -1
  202. package/lib/esm/pages/backofficeEntityListPage.css.js +1 -1
  203. package/lib/esm/pages/detail/BackofficeEntityDetailLayoutContext.js.map +1 -1
  204. package/lib/esm/pages/detail/buildTabsItems.js.map +1 -1
  205. package/lib/esm/pages/detail/pageResolution.js.map +1 -1
  206. package/lib/esm/provider/BackofficeConfigContext.js.map +1 -1
  207. package/lib/esm/provider/BackofficeProvider.js.map +1 -1
  208. package/lib/esm/provider/dashboardRegistrations.js.map +1 -1
  209. package/lib/esm/provider/entityRegistry.js.map +1 -1
  210. package/lib/esm/provider/lazyValue.js.map +1 -1
  211. package/lib/esm/provider/useBackofficeEntityLoader.js.map +1 -1
  212. package/lib/esm/provider/useBackofficeLazyValue.js.map +1 -1
  213. package/lib/esm/relay/RelayProvider.js.map +1 -1
  214. package/lib/esm/relay/connectionUtils.js.map +1 -1
  215. package/lib/esm/relay/createInlineReader.js.map +1 -1
  216. package/lib/esm/relay/envHelpers.js.map +1 -1
  217. package/lib/esm/relay/environment.js.map +1 -1
  218. package/lib/esm/relay/mutationResult.js.map +1 -1
  219. package/lib/esm/router/backofficeAuthPaths.js.map +1 -1
  220. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  221. package/lib/esm/storybook/relay/RelayStory.css.js +1 -1
  222. package/lib/esm/storybook/relay/RelayStory.js.map +1 -1
  223. package/lib/esm/storybook/relay/mockResolvers.js.map +1 -1
  224. package/lib/esm/style.css +1 -1
  225. package/lib/esm/subscriptions/useCursorResumableSubscription.js.map +1 -1
  226. package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.stories.d.ts +1 -1
  227. package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.stories.d.ts.map +1 -1
  228. package/lib/types/components/backoffice/overview/backofficeOverviewLayout.css.d.ts.map +1 -1
  229. package/lib/types/components/backoffice/tools/backofficeToolsDocPanel.css.d.ts.map +1 -1
  230. package/package.json +16 -16
@@ -1 +1 @@
1
- {"version":3,"file":"RelayModernMockEnvironment.js","names":["request"],"sources":["../../../../../../../node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js"],"sourcesContent":["'use strict';\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\")[\"default\"];\nvar _objectSpread2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectSpread2\"));\nvar areEqual = require(\"fbjs/lib/areEqual\");\nvar invariant = require('invariant');\nvar _require = require('relay-runtime'),\n Environment = _require.Environment,\n Network = _require.Network,\n Observable = _require.Observable,\n QueryResponseCache = _require.QueryResponseCache,\n RecordSource = _require.RecordSource,\n Store = _require.Store,\n createOperationDescriptor = _require.createOperationDescriptor,\n getRequest = _require.getRequest;\nvar MAX_SIZE = 10;\nvar MAX_TTL = 5 * 60 * 1000;\nfunction mockInstanceMethod(object, key) {\n object[key] = jest.fn(object[key].bind(object));\n}\nfunction mockDisposableMethod(object, key) {\n var fn = object[key].bind(object);\n object[key] = jest.fn(function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var disposable = fn.apply(void 0, args);\n var dispose = jest.fn(function () {\n return disposable.dispose();\n });\n object[key].mock.dispose = dispose;\n return {\n dispose: dispose\n };\n });\n var mockClear = object[key].mockClear.bind(object[key]);\n object[key].mockClear = function () {\n mockClear();\n object[key].mock.dispose = null;\n };\n}\nfunction mockObservableMethod(object, key) {\n var fn = object[key].bind(object);\n var subscriptions = [];\n object[key] = jest.fn(function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n return fn.apply(void 0, args)[\"do\"]({\n start: function start(subscription) {\n subscriptions.push(subscription);\n }\n });\n });\n object[key].mock.subscriptions = subscriptions;\n var mockClear = object[key].mockClear.bind(object[key]);\n object[key].mockClear = function () {\n mockClear();\n object[key].mock.subscriptions = [];\n };\n}\nfunction createMockEnvironment(config) {\n var _config$store, _global, _global$process, _global$process$env;\n var store = (_config$store = config === null || config === void 0 ? void 0 : config.store) !== null && _config$store !== void 0 ? _config$store : new Store(new RecordSource());\n var cache = new QueryResponseCache({\n size: MAX_SIZE,\n ttl: MAX_TTL\n });\n var pendingRequests = [];\n var pendingOperations = [];\n var queuePendingOperation = function queuePendingOperation(query, variables) {\n var operationDescriptor = createOperationDescriptor(getRequest(query), variables);\n pendingOperations = pendingOperations.concat([operationDescriptor]);\n };\n var resolversQueue = [];\n var queueOperationResolver = function queueOperationResolver(resolver) {\n resolversQueue = resolversQueue.concat([resolver]);\n };\n var execute = function execute(request, variables, cacheConfig) {\n var id = request.id,\n text = request.text;\n var cacheID = id !== null && id !== void 0 ? id : text;\n var cachedPayload = null;\n if (((cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.force) == null || (cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.force) === false) && cacheID != null) {\n cachedPayload = cache.get(cacheID, variables);\n }\n if (cachedPayload !== null) {\n return Observable.from(cachedPayload);\n }\n var currentOperation = pendingOperations.find(function (op) {\n return op.request.node.params === request && areEqual(op.request.variables, variables);\n });\n if (currentOperation != null && resolversQueue.length > 0) {\n var currentResolver = resolversQueue[0];\n var result = currentResolver(currentOperation);\n if (result != null) {\n resolversQueue = resolversQueue.filter(function (res) {\n return res !== currentResolver;\n });\n pendingOperations = pendingOperations.filter(function (op) {\n return op !== currentOperation;\n });\n if (result instanceof Error) {\n return Observable.create(function (sink) {\n sink.error(result);\n });\n } else {\n return Observable.from(result);\n }\n }\n }\n return Observable.create(function (sink) {\n var nextRequest = {\n request: request,\n variables: variables,\n cacheConfig: cacheConfig,\n sink: sink\n };\n pendingRequests = pendingRequests.concat([nextRequest]);\n return function () {\n pendingRequests = pendingRequests.filter(function (pending) {\n return !areEqual(pending, nextRequest);\n });\n var currentOperation = pendingOperations.find(function (op) {\n return areEqual(op.request.node.params, request) && areEqual(op.request.variables, variables);\n });\n pendingOperations = pendingOperations.filter(function (op) {\n return op !== currentOperation;\n });\n };\n });\n };\n function getConcreteRequest(input) {\n if (input.kind === 'Request') {\n var request = input;\n return request;\n } else {\n var operationDescriptor = input;\n !pendingOperations.includes(operationDescriptor) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'RelayModernMockEnvironment: Operation \"%s\" was not found in the list of pending operations', operationDescriptor.request.node.operation.name) : invariant(false) : void 0;\n return operationDescriptor.request.node;\n }\n }\n function getRequests(input) {\n var concreteRequest;\n var operationDescriptor;\n if (input.kind === 'Request') {\n concreteRequest = input;\n } else {\n operationDescriptor = input;\n concreteRequest = operationDescriptor.request.node;\n }\n var foundRequests = pendingRequests.filter(function (pending) {\n if (!areEqual(pending.request, concreteRequest.params)) {\n return false;\n }\n if (operationDescriptor) {\n return areEqual(operationDescriptor.request.variables, pending.variables);\n } else {\n return true;\n }\n });\n !foundRequests.length ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'MockEnvironment: Cannot respond to request, it has not been requested yet.') : invariant(false) : void 0;\n foundRequests.forEach(function (foundRequest) {\n !foundRequest.sink ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'MockEnvironment: Cannot respond to `%s`, it has not been requested yet.', concreteRequest.params.name) : invariant(false) : void 0;\n });\n return foundRequests;\n }\n function ensureValidPayload(payload) {\n !(typeof payload === 'object' && payload !== null && payload.hasOwnProperty('data')) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'MockEnvironment(): Expected payload to be an object with a `data` key.') : invariant(false) : void 0;\n return payload;\n }\n var cachePayload = function cachePayload(request, variables, payload) {\n var _getConcreteRequest$p = getConcreteRequest(request).params,\n id = _getConcreteRequest$p.id,\n text = _getConcreteRequest$p.text;\n var cacheID = id !== null && id !== void 0 ? id : text;\n !(cacheID != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'CacheID should not be null') : invariant(false) : void 0;\n cache.set(cacheID, variables, payload);\n };\n var clearCache = function clearCache() {\n cache.clear();\n };\n var isLoading = function isLoading(request, variables, cacheConfig) {\n return pendingRequests.some(function (pending) {\n return areEqual(pending.request, getConcreteRequest(request).params) && areEqual(pending.variables, variables) && areEqual(pending.cacheConfig, cacheConfig !== null && cacheConfig !== void 0 ? cacheConfig : {});\n });\n };\n var reject = function reject(request, error) {\n var rejectError = typeof error === 'string' ? new Error(error) : error;\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n sink.error(rejectError);\n });\n };\n var nextValue = function nextValue(request, payload) {\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n sink.next(ensureValidPayload(payload));\n });\n };\n var complete = function complete(request) {\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n sink.complete();\n });\n };\n var resolve = function resolve(request, response) {\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n var payloads = Array.isArray(response) ? response : [response];\n payloads.forEach(function (payload) {\n sink.next(ensureValidPayload(payload));\n });\n sink.complete();\n });\n };\n var getMostRecentOperation = function getMostRecentOperation() {\n var mostRecentOperation = pendingOperations[pendingOperations.length - 1];\n !(mostRecentOperation != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'RelayModernMockEnvironment: There are no pending operations in the list') : invariant(false) : void 0;\n return mostRecentOperation;\n };\n var findOperation = function findOperation(findFn) {\n var pendingOperation = pendingOperations.find(findFn);\n !(pendingOperation != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'RelayModernMockEnvironment: Operation was not found in the list of pending operations') : invariant(false) : void 0;\n return pendingOperation;\n };\n var environment = new Environment((0, _objectSpread2[\"default\"])({\n configName: 'RelayModernMockEnvironment',\n network: Network.create(execute, execute),\n store: store\n }, config));\n var createExecuteProxy = function createExecuteProxy(env, fn) {\n return function () {\n for (var _len3 = arguments.length, argumentsList = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n argumentsList[_key3] = arguments[_key3];\n }\n var operation = argumentsList[0].operation;\n pendingOperations = pendingOperations.concat([operation]);\n return fn.apply(env, argumentsList);\n };\n };\n environment.execute = createExecuteProxy(environment, environment.execute);\n environment.executeSubscription = createExecuteProxy(environment, environment.executeSubscription);\n environment.executeWithSource = createExecuteProxy(environment, environment.executeWithSource);\n environment.executeMutation = createExecuteProxy(environment, environment.executeMutation);\n if (((_global = global) === null || _global === void 0 ? void 0 : (_global$process = _global.process) === null || _global$process === void 0 ? void 0 : (_global$process$env = _global$process.env) === null || _global$process$env === void 0 ? void 0 : _global$process$env.NODE_ENV) === 'test') {\n mockDisposableMethod(environment, 'applyUpdate');\n mockInstanceMethod(environment, 'commitPayload');\n mockInstanceMethod(environment, 'getStore');\n mockInstanceMethod(environment, 'lookup');\n mockInstanceMethod(environment, 'check');\n mockDisposableMethod(environment, 'subscribe');\n mockDisposableMethod(environment, 'retain');\n mockObservableMethod(environment, 'execute');\n mockObservableMethod(environment, 'executeSubscription');\n mockObservableMethod(environment, 'executeWithSource');\n mockObservableMethod(environment, 'executeMutation');\n mockInstanceMethod(store, 'getSource');\n mockInstanceMethod(store, 'lookup');\n mockInstanceMethod(store, 'notify');\n mockInstanceMethod(store, 'publish');\n mockDisposableMethod(store, 'retain');\n mockDisposableMethod(store, 'subscribe');\n }\n var mock = {\n cachePayload: cachePayload,\n clearCache: clearCache,\n isLoading: isLoading,\n reject: reject,\n resolve: resolve,\n nextValue: nextValue,\n complete: complete,\n getMostRecentOperation: getMostRecentOperation,\n resolveMostRecentOperation: function resolveMostRecentOperation(payload) {\n var operation = getMostRecentOperation();\n var data = typeof payload === 'function' ? payload(operation) : payload;\n return resolve(operation, data);\n },\n rejectMostRecentOperation: function rejectMostRecentOperation(error) {\n var operation = getMostRecentOperation();\n var rejector = typeof error === 'function' ? error(operation) : error;\n return reject(operation, rejector);\n },\n findOperation: findOperation,\n queuePendingOperation: queuePendingOperation,\n getAllOperations: function getAllOperations() {\n return pendingOperations;\n },\n queueOperationResolver: queueOperationResolver\n };\n environment.mock = mock;\n environment.mockClear = function () {\n var _store$getSource$clea, _store$getSource;\n environment.applyUpdate.mockClear();\n environment.commitPayload.mockClear();\n environment.getStore.mockClear();\n environment.lookup.mockClear();\n environment.check.mockClear();\n environment.subscribe.mockClear();\n environment.retain.mockClear();\n environment.execute.mockClear();\n environment.executeMutation.mockClear();\n environment.executeSubscription.mockClear();\n (_store$getSource$clea = (_store$getSource = store.getSource()).clear) === null || _store$getSource$clea === void 0 ? void 0 : _store$getSource$clea.call(_store$getSource);\n store.getSource.mockClear();\n store.lookup.mockClear();\n store.notify.mockClear();\n store.publish.mockClear();\n store.retain.mockClear();\n store.subscribe.mockClear();\n cache.clear();\n pendingOperations = [];\n pendingRequests = [];\n };\n return environment;\n}\nmodule.exports = {\n createMockEnvironment: createMockEnvironment\n};"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"RelayModernMockEnvironment.js","names":["request"],"sources":["../../../../../../../node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js"],"sourcesContent":["'use strict';\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\")[\"default\"];\nvar _objectSpread2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectSpread2\"));\nvar areEqual = require(\"fbjs/lib/areEqual\");\nvar invariant = require('invariant');\nvar _require = require('relay-runtime'),\n Environment = _require.Environment,\n Network = _require.Network,\n Observable = _require.Observable,\n QueryResponseCache = _require.QueryResponseCache,\n RecordSource = _require.RecordSource,\n Store = _require.Store,\n createOperationDescriptor = _require.createOperationDescriptor,\n getRequest = _require.getRequest;\nvar MAX_SIZE = 10;\nvar MAX_TTL = 5 * 60 * 1000;\nfunction mockInstanceMethod(object, key) {\n object[key] = jest.fn(object[key].bind(object));\n}\nfunction mockDisposableMethod(object, key) {\n var fn = object[key].bind(object);\n object[key] = jest.fn(function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var disposable = fn.apply(void 0, args);\n var dispose = jest.fn(function () {\n return disposable.dispose();\n });\n object[key].mock.dispose = dispose;\n return {\n dispose: dispose\n };\n });\n var mockClear = object[key].mockClear.bind(object[key]);\n object[key].mockClear = function () {\n mockClear();\n object[key].mock.dispose = null;\n };\n}\nfunction mockObservableMethod(object, key) {\n var fn = object[key].bind(object);\n var subscriptions = [];\n object[key] = jest.fn(function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n return fn.apply(void 0, args)[\"do\"]({\n start: function start(subscription) {\n subscriptions.push(subscription);\n }\n });\n });\n object[key].mock.subscriptions = subscriptions;\n var mockClear = object[key].mockClear.bind(object[key]);\n object[key].mockClear = function () {\n mockClear();\n object[key].mock.subscriptions = [];\n };\n}\nfunction createMockEnvironment(config) {\n var _config$store, _global, _global$process, _global$process$env;\n var store = (_config$store = config === null || config === void 0 ? void 0 : config.store) !== null && _config$store !== void 0 ? _config$store : new Store(new RecordSource());\n var cache = new QueryResponseCache({\n size: MAX_SIZE,\n ttl: MAX_TTL\n });\n var pendingRequests = [];\n var pendingOperations = [];\n var queuePendingOperation = function queuePendingOperation(query, variables) {\n var operationDescriptor = createOperationDescriptor(getRequest(query), variables);\n pendingOperations = pendingOperations.concat([operationDescriptor]);\n };\n var resolversQueue = [];\n var queueOperationResolver = function queueOperationResolver(resolver) {\n resolversQueue = resolversQueue.concat([resolver]);\n };\n var execute = function execute(request, variables, cacheConfig) {\n var id = request.id,\n text = request.text;\n var cacheID = id !== null && id !== void 0 ? id : text;\n var cachedPayload = null;\n if (((cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.force) == null || (cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.force) === false) && cacheID != null) {\n cachedPayload = cache.get(cacheID, variables);\n }\n if (cachedPayload !== null) {\n return Observable.from(cachedPayload);\n }\n var currentOperation = pendingOperations.find(function (op) {\n return op.request.node.params === request && areEqual(op.request.variables, variables);\n });\n if (currentOperation != null && resolversQueue.length > 0) {\n var currentResolver = resolversQueue[0];\n var result = currentResolver(currentOperation);\n if (result != null) {\n resolversQueue = resolversQueue.filter(function (res) {\n return res !== currentResolver;\n });\n pendingOperations = pendingOperations.filter(function (op) {\n return op !== currentOperation;\n });\n if (result instanceof Error) {\n return Observable.create(function (sink) {\n sink.error(result);\n });\n } else {\n return Observable.from(result);\n }\n }\n }\n return Observable.create(function (sink) {\n var nextRequest = {\n request: request,\n variables: variables,\n cacheConfig: cacheConfig,\n sink: sink\n };\n pendingRequests = pendingRequests.concat([nextRequest]);\n return function () {\n pendingRequests = pendingRequests.filter(function (pending) {\n return !areEqual(pending, nextRequest);\n });\n var currentOperation = pendingOperations.find(function (op) {\n return areEqual(op.request.node.params, request) && areEqual(op.request.variables, variables);\n });\n pendingOperations = pendingOperations.filter(function (op) {\n return op !== currentOperation;\n });\n };\n });\n };\n function getConcreteRequest(input) {\n if (input.kind === 'Request') {\n var request = input;\n return request;\n } else {\n var operationDescriptor = input;\n !pendingOperations.includes(operationDescriptor) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'RelayModernMockEnvironment: Operation \"%s\" was not found in the list of pending operations', operationDescriptor.request.node.operation.name) : invariant(false) : void 0;\n return operationDescriptor.request.node;\n }\n }\n function getRequests(input) {\n var concreteRequest;\n var operationDescriptor;\n if (input.kind === 'Request') {\n concreteRequest = input;\n } else {\n operationDescriptor = input;\n concreteRequest = operationDescriptor.request.node;\n }\n var foundRequests = pendingRequests.filter(function (pending) {\n if (!areEqual(pending.request, concreteRequest.params)) {\n return false;\n }\n if (operationDescriptor) {\n return areEqual(operationDescriptor.request.variables, pending.variables);\n } else {\n return true;\n }\n });\n !foundRequests.length ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'MockEnvironment: Cannot respond to request, it has not been requested yet.') : invariant(false) : void 0;\n foundRequests.forEach(function (foundRequest) {\n !foundRequest.sink ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'MockEnvironment: Cannot respond to `%s`, it has not been requested yet.', concreteRequest.params.name) : invariant(false) : void 0;\n });\n return foundRequests;\n }\n function ensureValidPayload(payload) {\n !(typeof payload === 'object' && payload !== null && payload.hasOwnProperty('data')) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'MockEnvironment(): Expected payload to be an object with a `data` key.') : invariant(false) : void 0;\n return payload;\n }\n var cachePayload = function cachePayload(request, variables, payload) {\n var _getConcreteRequest$p = getConcreteRequest(request).params,\n id = _getConcreteRequest$p.id,\n text = _getConcreteRequest$p.text;\n var cacheID = id !== null && id !== void 0 ? id : text;\n !(cacheID != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'CacheID should not be null') : invariant(false) : void 0;\n cache.set(cacheID, variables, payload);\n };\n var clearCache = function clearCache() {\n cache.clear();\n };\n var isLoading = function isLoading(request, variables, cacheConfig) {\n return pendingRequests.some(function (pending) {\n return areEqual(pending.request, getConcreteRequest(request).params) && areEqual(pending.variables, variables) && areEqual(pending.cacheConfig, cacheConfig !== null && cacheConfig !== void 0 ? cacheConfig : {});\n });\n };\n var reject = function reject(request, error) {\n var rejectError = typeof error === 'string' ? new Error(error) : error;\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n sink.error(rejectError);\n });\n };\n var nextValue = function nextValue(request, payload) {\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n sink.next(ensureValidPayload(payload));\n });\n };\n var complete = function complete(request) {\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n sink.complete();\n });\n };\n var resolve = function resolve(request, response) {\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n var payloads = Array.isArray(response) ? response : [response];\n payloads.forEach(function (payload) {\n sink.next(ensureValidPayload(payload));\n });\n sink.complete();\n });\n };\n var getMostRecentOperation = function getMostRecentOperation() {\n var mostRecentOperation = pendingOperations[pendingOperations.length - 1];\n !(mostRecentOperation != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'RelayModernMockEnvironment: There are no pending operations in the list') : invariant(false) : void 0;\n return mostRecentOperation;\n };\n var findOperation = function findOperation(findFn) {\n var pendingOperation = pendingOperations.find(findFn);\n !(pendingOperation != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'RelayModernMockEnvironment: Operation was not found in the list of pending operations') : invariant(false) : void 0;\n return pendingOperation;\n };\n var environment = new Environment((0, _objectSpread2[\"default\"])({\n configName: 'RelayModernMockEnvironment',\n network: Network.create(execute, execute),\n store: store\n }, config));\n var createExecuteProxy = function createExecuteProxy(env, fn) {\n return function () {\n for (var _len3 = arguments.length, argumentsList = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n argumentsList[_key3] = arguments[_key3];\n }\n var operation = argumentsList[0].operation;\n pendingOperations = pendingOperations.concat([operation]);\n return fn.apply(env, argumentsList);\n };\n };\n environment.execute = createExecuteProxy(environment, environment.execute);\n environment.executeSubscription = createExecuteProxy(environment, environment.executeSubscription);\n environment.executeWithSource = createExecuteProxy(environment, environment.executeWithSource);\n environment.executeMutation = createExecuteProxy(environment, environment.executeMutation);\n if (((_global = global) === null || _global === void 0 ? void 0 : (_global$process = _global.process) === null || _global$process === void 0 ? void 0 : (_global$process$env = _global$process.env) === null || _global$process$env === void 0 ? void 0 : _global$process$env.NODE_ENV) === 'test') {\n mockDisposableMethod(environment, 'applyUpdate');\n mockInstanceMethod(environment, 'commitPayload');\n mockInstanceMethod(environment, 'getStore');\n mockInstanceMethod(environment, 'lookup');\n mockInstanceMethod(environment, 'check');\n mockDisposableMethod(environment, 'subscribe');\n mockDisposableMethod(environment, 'retain');\n mockObservableMethod(environment, 'execute');\n mockObservableMethod(environment, 'executeSubscription');\n mockObservableMethod(environment, 'executeWithSource');\n mockObservableMethod(environment, 'executeMutation');\n mockInstanceMethod(store, 'getSource');\n mockInstanceMethod(store, 'lookup');\n mockInstanceMethod(store, 'notify');\n mockInstanceMethod(store, 'publish');\n mockDisposableMethod(store, 'retain');\n mockDisposableMethod(store, 'subscribe');\n }\n var mock = {\n cachePayload: cachePayload,\n clearCache: clearCache,\n isLoading: isLoading,\n reject: reject,\n resolve: resolve,\n nextValue: nextValue,\n complete: complete,\n getMostRecentOperation: getMostRecentOperation,\n resolveMostRecentOperation: function resolveMostRecentOperation(payload) {\n var operation = getMostRecentOperation();\n var data = typeof payload === 'function' ? payload(operation) : payload;\n return resolve(operation, data);\n },\n rejectMostRecentOperation: function rejectMostRecentOperation(error) {\n var operation = getMostRecentOperation();\n var rejector = typeof error === 'function' ? error(operation) : error;\n return reject(operation, rejector);\n },\n findOperation: findOperation,\n queuePendingOperation: queuePendingOperation,\n getAllOperations: function getAllOperations() {\n return pendingOperations;\n },\n queueOperationResolver: queueOperationResolver\n };\n environment.mock = mock;\n environment.mockClear = function () {\n var _store$getSource$clea, _store$getSource;\n environment.applyUpdate.mockClear();\n environment.commitPayload.mockClear();\n environment.getStore.mockClear();\n environment.lookup.mockClear();\n environment.check.mockClear();\n environment.subscribe.mockClear();\n environment.retain.mockClear();\n environment.execute.mockClear();\n environment.executeMutation.mockClear();\n environment.executeSubscription.mockClear();\n (_store$getSource$clea = (_store$getSource = store.getSource()).clear) === null || _store$getSource$clea === void 0 ? void 0 : _store$getSource$clea.call(_store$getSource);\n store.getSource.mockClear();\n store.lookup.mockClear();\n store.notify.mockClear();\n store.publish.mockClear();\n store.retain.mockClear();\n store.subscribe.mockClear();\n cache.clear();\n pendingOperations = [];\n pendingRequests = [];\n };\n return environment;\n}\nmodule.exports = {\n createMockEnvironment: createMockEnvironment\n};"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RelayResolverTestUtils.js","names":[],"sources":["../../../../../../../node_modules/relay-test-utils/lib/RelayResolverTestUtils.js"],"sourcesContent":["'use strict';\n\nvar _require = require('relay-runtime'),\n ResolverFragments = _require.__internal.ResolverFragments;\nfunction testResolver(resolver, fragmentData) {\n var readFragment = ResolverFragments.readFragment;\n ResolverFragments.readFragment = function () {\n return fragmentData;\n };\n var result = resolver(null);\n ResolverFragments.readFragment = readFragment;\n return result;\n}\nmodule.exports = {\n testResolver: testResolver\n};"],"x_google_ignoreList":[0],"mappings":";;;CAEA,IACE,IAAA,EADqB,gBACO,CAAC,WAAW;CAC1C,SAAS,EAAa,GAAU,GAAc;EAC5C,IAAI,IAAe,EAAkB;EACrC,EAAkB,eAAe,WAAY;GAC3C,OAAO;;EAET,IAAI,IAAS,EAAS,KAAK;EAE3B,OADA,EAAkB,eAAe,GAC1B;;CAET,EAAO,UAAU,EACD,iBACf"}
1
+ {"version":3,"file":"RelayResolverTestUtils.js","names":[],"sources":["../../../../../../../node_modules/relay-test-utils/lib/RelayResolverTestUtils.js"],"sourcesContent":["'use strict';\n\nvar _require = require('relay-runtime'),\n ResolverFragments = _require.__internal.ResolverFragments;\nfunction testResolver(resolver, fragmentData) {\n var readFragment = ResolverFragments.readFragment;\n ResolverFragments.readFragment = function () {\n return fragmentData;\n };\n var result = resolver(null);\n ResolverFragments.readFragment = readFragment;\n return result;\n}\nmodule.exports = {\n testResolver: testResolver\n};"],"x_google_ignoreList":[0],"mappings":";;;CAEA,IACE,IAAA,EADqB,eACM,EAAE,WAAW;CAC1C,SAAS,EAAa,GAAU,GAAc;EAC5C,IAAI,IAAe,EAAkB;EACrC,EAAkB,eAAe,WAAY;GAC3C,OAAO;EACT;EACA,IAAI,IAAS,EAAS,IAAI;EAE1B,OADA,EAAkB,eAAe,GAC1B;CACT;CACA,EAAO,UAAU,EACD,gBAChB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../../../../node_modules/relay-test-utils/lib/index.js"],"sourcesContent":["'use strict';\n\nvar RelayMockPayloadGenerator = require('./RelayMockPayloadGenerator');\nvar RelayModernMockEnvironment = require('./RelayModernMockEnvironment');\nvar testResolver = require('./RelayResolverTestUtils');\nvar unwrapContainer = require('./unwrapContainer');\nmodule.exports = {\n MockEnvironment: RelayModernMockEnvironment,\n MockPayloadGenerator: RelayMockPayloadGenerator,\n createMockEnvironment: RelayModernMockEnvironment.createMockEnvironment,\n unwrapContainer: unwrapContainer,\n testResolver: testResolver\n};"],"x_google_ignoreList":[0],"mappings":";;;;;;;CAEA,IAAI,IAAA,GAAA,EACA,IAAA,GAAA,EACA,IAAA,GAAA,EACA,IAAA,GAAA;CACJ,EAAO,UAAU;EACf,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB,EAA2B;EACjC;EACH;EACf"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../../../node_modules/relay-test-utils/lib/index.js"],"sourcesContent":["'use strict';\n\nvar RelayMockPayloadGenerator = require('./RelayMockPayloadGenerator');\nvar RelayModernMockEnvironment = require('./RelayModernMockEnvironment');\nvar testResolver = require('./RelayResolverTestUtils');\nvar unwrapContainer = require('./unwrapContainer');\nmodule.exports = {\n MockEnvironment: RelayModernMockEnvironment,\n MockPayloadGenerator: RelayMockPayloadGenerator,\n createMockEnvironment: RelayModernMockEnvironment.createMockEnvironment,\n unwrapContainer: unwrapContainer,\n testResolver: testResolver\n};"],"x_google_ignoreList":[0],"mappings":";;;;;;;CAEA,IAAI,IAAA,EAAA,GACA,IAAA,EAAA,GACA,IAAA,EAAA,GACA,IAAA,EAAA;CACJ,EAAO,UAAU;EACf,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB,EAA2B;EACjC;EACH;CAChB"}
@@ -1 +1 @@
1
- {"version":3,"file":"unwrapContainer.js","names":[],"sources":["../../../../../../../node_modules/relay-test-utils/lib/unwrapContainer.js"],"sourcesContent":["'use strict';\n\nvar invariant = require('invariant');\nfunction unwrapContainer(ComponentClass) {\n var unwrapped = ComponentClass.__ComponentClass;\n !(unwrapped != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Could not find component for %s, is it a Relay container?', ComponentClass.displayName || ComponentClass.name) : invariant(false) : void 0;\n return unwrapped;\n}\nmodule.exports = unwrapContainer;"],"x_google_ignoreList":[0],"mappings":";;;;CAEA,IAAI,IAAA,GAAA;CACJ,SAAS,EAAgB,GAAgB;EACvC,IAAI,IAAY,EAAe;EAE/B,OADE,MAAa,QAAA,IAAA,aAAiC,eAAkJ,EAAU,GAAM,GAAnJ,EAAU,IAAO,6DAA6D,EAAe,eAAe,EAAe,KAAK,GACxL;;CAET,EAAO,UAAU"}
1
+ {"version":3,"file":"unwrapContainer.js","names":[],"sources":["../../../../../../../node_modules/relay-test-utils/lib/unwrapContainer.js"],"sourcesContent":["'use strict';\n\nvar invariant = require('invariant');\nfunction unwrapContainer(ComponentClass) {\n var unwrapped = ComponentClass.__ComponentClass;\n !(unwrapped != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Could not find component for %s, is it a Relay container?', ComponentClass.displayName || ComponentClass.name) : invariant(false) : void 0;\n return unwrapped;\n}\nmodule.exports = unwrapContainer;"],"x_google_ignoreList":[0],"mappings":";;;;CAEA,IAAI,IAAA,EAAA;CACJ,SAAS,EAAgB,GAAgB;EACvC,IAAI,IAAY,EAAe;EAE/B,OADE,MAAa,QAAA,IAAA,aAAiC,eAAkJ,EAAU,EAAK,IAAlJ,EAAU,IAAO,6DAA6D,EAAe,eAAe,EAAe,IAAI,IACvL;CACT;CACA,EAAO,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeAcceptInvitationPage.js","names":[],"sources":["../../../src/pages/BackofficeAcceptInvitationPage.tsx"],"sourcesContent":["import { useCallback, useContext, type JSX } from 'react';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\n\nimport { AcceptInvitationScreen } from '../auth/pages/AcceptInvitationScreen.js';\nimport { useBackofficeAuth } from '../hooks/useBackofficeAuth.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { getBackofficeLoginPath } from '../router/backofficeAuthPaths.js';\n\nexport const BackofficeAcceptInvitationPage = (): JSX.Element => {\n const routerContext = useContext(RoutingContext);\n const { basePath } = useBackofficeConfig();\n const auth = useBackofficeAuth();\n\n const handleSuccessRedirect = useCallback(() => {\n routerContext?.history.push({ pathname: basePath });\n }, [basePath, routerContext?.history]);\n\n const handleBackToLogin = useCallback(() => {\n routerContext?.history.push({ pathname: getBackofficeLoginPath(basePath) });\n }, [basePath, routerContext?.history]);\n\n return (\n <AcceptInvitationScreen\n auth={auth}\n onSuccessRedirect={handleSuccessRedirect}\n onBackToLogin={handleBackToLogin}\n />\n );\n};\n\nexport default BackofficeAcceptInvitationPage;\n"],"mappings":";;;;;;;;AAQA,IAAa,UAAoD;CAC/D,IAAM,IAAgB,EAAW,EAAe,EAC1C,EAAE,gBAAa,GAAqB;CAW1C,OACE,kBAAC,GAAD;EACQ,MAZG,GAYH;EACN,mBAX0B,QAAkB;GAC9C,GAAe,QAAQ,KAAK,EAAE,UAAU,GAAU,CAAC;KAClD,CAAC,GAAU,GAAe,QAAQ,CASd;EACnB,eARsB,QAAkB;GAC1C,GAAe,QAAQ,KAAK,EAAE,UAAU,EAAuB,EAAS,EAAE,CAAC;KAC1E,CAAC,GAAU,GAAe,QAAQ,CAMlB;EACf,CAAA"}
1
+ {"version":3,"file":"BackofficeAcceptInvitationPage.js","names":[],"sources":["../../../src/pages/BackofficeAcceptInvitationPage.tsx"],"sourcesContent":["import { useCallback, useContext, type JSX } from 'react';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\n\nimport { AcceptInvitationScreen } from '../auth/pages/AcceptInvitationScreen.js';\nimport { useBackofficeAuth } from '../hooks/useBackofficeAuth.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { getBackofficeLoginPath } from '../router/backofficeAuthPaths.js';\n\nexport const BackofficeAcceptInvitationPage = (): JSX.Element => {\n const routerContext = useContext(RoutingContext);\n const { basePath } = useBackofficeConfig();\n const auth = useBackofficeAuth();\n\n const handleSuccessRedirect = useCallback(() => {\n routerContext?.history.push({ pathname: basePath });\n }, [basePath, routerContext?.history]);\n\n const handleBackToLogin = useCallback(() => {\n routerContext?.history.push({ pathname: getBackofficeLoginPath(basePath) });\n }, [basePath, routerContext?.history]);\n\n return (\n <AcceptInvitationScreen\n auth={auth}\n onSuccessRedirect={handleSuccessRedirect}\n onBackToLogin={handleBackToLogin}\n />\n );\n};\n\nexport default BackofficeAcceptInvitationPage;\n"],"mappings":";;;;;;;;AAQA,IAAa,UAAoD;CAC/D,IAAM,IAAgB,EAAW,CAAc,GACzC,EAAE,gBAAa,EAAoB;CAWzC,OACE,kBAAC,GAAD;EACQ,MAZG,EAYH;EACN,mBAX0B,QAAkB;GAC9C,GAAe,QAAQ,KAAK,EAAE,UAAU,EAAS,CAAC;EACpD,GAAG,CAAC,GAAU,GAAe,OAAO,CASb;EACnB,eARsB,QAAkB;GAC1C,GAAe,QAAQ,KAAK,EAAE,UAAU,EAAuB,CAAQ,EAAE,CAAC;EAC5E,GAAG,CAAC,GAAU,GAAe,OAAO,CAMjB;CAChB,CAAA;AAEL"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeDashboardPage.helpers.js","names":[],"sources":["../../../src/pages/BackofficeDashboardPage.helpers.ts"],"sourcesContent":["import type {\n BackofficeDashboardConfig,\n BackofficeDashboardWidget,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { TFunction } from 'i18next';\nimport type { GraphQLTaggedNode } from 'relay-runtime';\n\nexport const resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const getWidgetLabel = (\n widget: BackofficeDashboardWidget,\n config: BackofficeDashboardConfig,\n): I18nLabel => {\n switch (widget.kind) {\n case 'entityCount':\n case 'shortcut':\n return widget.label;\n case 'billingUsageChart':\n case 'tablePreview':\n case 'textBlock':\n return widget.title;\n case 'recentItems':\n case 'metricGroup':\n case 'quickActions':\n case 'statusSummary':\n if (widget.title != null) {\n return widget.title;\n }\n return config.title;\n default:\n return config.title;\n }\n};\n\nexport const hasWidgetQuery = (\n widget: BackofficeDashboardWidget,\n): widget is BackofficeDashboardWidget & { query: GraphQLTaggedNode } => {\n return 'query' in widget && widget.query != null;\n};\n"],"mappings":";AAQA,IAAa,KAAgB,GAAkB,MACtC,EAAM,EAAK,EAGP,KACX,GACA,MACc;CACd,QAAQ,EAAO,MAAf;EACE,KAAK;EACL,KAAK,YACH,OAAO,EAAO;EAChB,KAAK;EACL,KAAK;EACL,KAAK,aACH,OAAO,EAAO;EAChB,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,iBAIH,OAHI,EAAO,SAAS,OAGb,EAAO,QAFL,EAAO;EAGlB,SACE,OAAO,EAAO;;GAIP,KACX,MAEO,WAAW,KAAU,EAAO,SAAS"}
1
+ {"version":3,"file":"BackofficeDashboardPage.helpers.js","names":[],"sources":["../../../src/pages/BackofficeDashboardPage.helpers.ts"],"sourcesContent":["import type {\n BackofficeDashboardConfig,\n BackofficeDashboardWidget,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { TFunction } from 'i18next';\nimport type { GraphQLTaggedNode } from 'relay-runtime';\n\nexport const resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const getWidgetLabel = (\n widget: BackofficeDashboardWidget,\n config: BackofficeDashboardConfig,\n): I18nLabel => {\n switch (widget.kind) {\n case 'entityCount':\n case 'shortcut':\n return widget.label;\n case 'billingUsageChart':\n case 'tablePreview':\n case 'textBlock':\n return widget.title;\n case 'recentItems':\n case 'metricGroup':\n case 'quickActions':\n case 'statusSummary':\n if (widget.title != null) {\n return widget.title;\n }\n return config.title;\n default:\n return config.title;\n }\n};\n\nexport const hasWidgetQuery = (\n widget: BackofficeDashboardWidget,\n): widget is BackofficeDashboardWidget & { query: GraphQLTaggedNode } => {\n return 'query' in widget && widget.query != null;\n};\n"],"mappings":";AAQA,IAAa,KAAgB,GAAkB,MACtC,EAAM,CAAI,GAGN,KACX,GACA,MACc;CACd,QAAQ,EAAO,MAAf;EACE,KAAK;EACL,KAAK,YACH,OAAO,EAAO;EAChB,KAAK;EACL,KAAK;EACL,KAAK,aACH,OAAO,EAAO;EAChB,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,iBAIH,OAHI,EAAO,SAAS,OAGb,EAAO,QAFL,EAAO;EAGlB,SACE,OAAO,EAAO;CAClB;AACF,GAEa,KACX,MAEO,WAAW,KAAU,EAAO,SAAS"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeDashboardPage.js","names":[],"sources":["../../../src/pages/BackofficeDashboardPage.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX, Suspense } from 'react';\nimport type {\n BackofficeDashboardConfig,\n BackofficeDashboardWidget,\n BackofficeDashboardWidgetSpan,\n BackofficeDashboardWidgetTabletSpan,\n BackofficeDashboardWidgetSize,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\nimport { DashboardMetricGroup } from '@plumile/ui/components/dashboard/dashboard_metric_group/DashboardMetricGroup.js';\nimport { DashboardPanel } from '@plumile/ui/components/dashboard/dashboard_panel/DashboardPanel.js';\nimport { DashboardQuickActions } from '@plumile/ui/components/dashboard/dashboard_quick_actions/DashboardQuickActions.js';\nimport { DashboardStatusList } from '@plumile/ui/components/dashboard/dashboard_status_list/DashboardStatusList.js';\nimport {\n DashboardGrid,\n DashboardGridItem,\n} from '@plumile/ui/components/dashboard/dashboard_grid/DashboardGrid.js';\nimport { DataTable } from '@plumile/ui/components/data-table/DataTable.js';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { GraphQLTaggedNode, OperationType } from 'relay-runtime';\n\nimport { BackofficeErrorBoundary } from '../components/backoffice/errors/BackofficeErrorBoundary.js';\nimport { BackofficeBillingUsageChart } from '../components/backoffice/billing/BackofficeBillingUsageChart.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeDashboardConfig } from '../provider/useBackofficeLazyValue.js';\nimport type { BackofficePreparedDashboardRoute } from '../router/createBackofficeRoutes.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildDashboardBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n getWidgetLabel,\n hasWidgetQuery,\n resolveLabel,\n} from './BackofficeDashboardPage.helpers.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\ntype WidgetContentProps = {\n widget: BackofficeDashboardWidget;\n globalData: unknown;\n};\n\nconst DashboardUnavailableState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n};\n\nconst DashboardLoadingState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return (\n <div className={styles.loadingBody}>\n <Spinner ariaLabel={t('common.loading')} />\n <span>{t('common.loading')}</span>\n </div>\n );\n};\n\nconst resolveWidgetSize = (\n size: BackofficeDashboardWidgetSize | undefined,\n): BackofficeDashboardWidgetSize => {\n return size ?? 'm';\n};\n\nconst resolveWidgetSpan = (\n widget: BackofficeDashboardWidget,\n): BackofficeDashboardWidgetSpan => {\n if (widget.layout?.span != null) {\n return widget.layout.span;\n }\n\n const size = resolveWidgetSize(widget.size);\n if (size === 's') {\n return 3;\n }\n if (size === 'm') {\n return 4;\n }\n if (size === 'l') {\n return 6;\n }\n if (size === 'xl') {\n return 8;\n }\n return 12;\n};\n\nconst resolveWidgetTabletSpan = (\n widget: BackofficeDashboardWidget,\n): BackofficeDashboardWidgetTabletSpan | undefined => {\n return widget.layout?.tabletSpan;\n};\n\nconst WidgetContent = ({\n widget,\n globalData,\n}: WidgetContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const description =\n widget.description != null\n ? resolveLabel(widget.description, tApp)\n : undefined;\n\n const resolveData = (data: unknown): unknown => {\n if ('resolve' in widget && widget.resolve != null) {\n return widget.resolve(data);\n }\n return null;\n };\n\n if (widget.kind === 'textBlock') {\n const title = resolveLabel(widget.title, tApp);\n const body = resolveLabel(widget.body, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <div className={styles.tileBody}>{body}</div>\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'shortcut') {\n const entity = entities[widget.entityId];\n const title = resolveLabel(widget.label, tApp);\n if (entity == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n if (entity.kind === 'tool') {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n actions={[\n {\n id: entity.id,\n href: entity.routes.list,\n label: t('dashboard.actions.openTool'),\n },\n ]}\n />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n actions={[\n {\n id: entity.id,\n href: entity.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'tablePreview') {\n const resolved = resolveData(globalData) as {\n columns: readonly unknown[];\n rows: readonly unknown[];\n } | null;\n if (resolved == null) {\n return (\n <DashboardPanel\n title={resolveLabel(widget.title, tApp)}\n subtitle={description}\n >\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const columns = buildDataTableColumns(resolved.columns as never, {\n tApp,\n t,\n });\n const title = resolveLabel(widget.title, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DataTable\n columns={columns}\n rows={resolved.rows}\n getRowId={(row, index) => {\n if (row != null && typeof row === 'object') {\n const record = row as Record<string, unknown>;\n const { id } = record;\n if (typeof id === 'string' && id.trim() !== '') {\n return id;\n }\n }\n return String(index);\n }}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'metricGroup') {\n const resolved = resolveData(globalData) as\n | readonly {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n meta?: I18nLabel;\n href?: string;\n }[]\n | null;\n if (resolved == null) {\n return <DashboardUnavailableState />;\n }\n return (\n <DashboardMetricGroup\n emptyState={<DashboardUnavailableState />}\n metrics={resolved.map((metric) => {\n return {\n id: metric.id,\n href: metric.href,\n label: resolveLabel(metric.label, tApp),\n value: metric.value ?? t('common.notAvailable'),\n hint:\n metric.meta != null ? resolveLabel(metric.meta, tApp) : undefined,\n };\n })}\n />\n );\n }\n\n if (widget.kind === 'billingUsageChart') {\n const resolved = resolveData(globalData) as {\n currency: string;\n totalAmount: number;\n from: string | null;\n to: string | null;\n buckets: readonly {\n day: string;\n category: string;\n value: number;\n }[];\n } | null;\n const title = resolveLabel(widget.title, tApp);\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n\n return (\n <DashboardPanel title={title} subtitle={description}>\n <BackofficeBillingUsageChart\n ariaLabel={resolveLabel(widget.ariaLabel, tApp)}\n buckets={resolved.buckets}\n categories={widget.categories.map((category) => {\n return {\n id: category.id,\n label: resolveLabel(category.label, tApp),\n color: category.color,\n };\n })}\n currency={resolved.currency}\n emptyLabel={resolveLabel(widget.emptyLabel, tApp)}\n from={resolved.from}\n rangePrefix={resolveLabel(widget.rangePrefix, tApp)}\n to={resolved.to}\n totalAmount={resolved.totalAmount}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'quickActions') {\n const title =\n widget.title != null\n ? resolveLabel(widget.title, tApp)\n : t('dashboard.actions.openTool');\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n layout={widget.layout?.zone === 'aside' ? 'stack' : 'grid'}\n emptyState={<DashboardUnavailableState />}\n actions={widget.actions.map((action) => {\n return {\n id: action.id,\n href: action.href,\n label: resolveLabel(action.label, tApp),\n };\n })}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'statusSummary') {\n const resolved = resolveData(globalData) as\n | readonly {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n href?: string;\n }[]\n | null;\n if (resolved == null) {\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardStatusList\n emptyState={<DashboardUnavailableState />}\n items={resolved.map((item) => {\n return {\n id: item.id,\n href: item.href,\n label: resolveLabel(item.label, tApp),\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'recentItems') {\n const title =\n widget.title != null\n ? resolveLabel(widget.title, tApp)\n : t('dashboard.title');\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n\n const entityManifest = entities[widget.entityId];\n if (entityManifest?.kind !== 'list-detail') {\n return (\n <DashboardPanel\n title={resolveLabel(widget.label, tApp)}\n subtitle={description}\n >\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const resolved = resolveData(globalData) as { count: number | null } | null;\n let countLabel: number | string = t('common.notAvailable');\n if (typeof resolved?.count === 'number') {\n countLabel = resolved.count;\n }\n const title = resolveLabel(widget.label, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>{countLabel}</div>\n <DashboardQuickActions\n emptyState={<DashboardUnavailableState />}\n actions={[\n {\n id: entityManifest.id,\n href: entityManifest.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n );\n};\n\ntype WidgetWithQueryProps = {\n widget: BackofficeDashboardWidget & { query: GraphQLTaggedNode };\n};\n\nconst WidgetWithQuery = ({ widget }: WidgetWithQueryProps): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n widget.query,\n {},\n {\n fetchPolicy: 'store-or-network',\n },\n );\n\n return <WidgetContent widget={widget} globalData={data} />;\n};\n\ntype DashboardContentProps = {\n config: BackofficeDashboardConfig;\n globalData: unknown;\n};\n\nconst DashboardContent = ({\n config,\n globalData,\n}: DashboardContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n\n const title = resolveLabel(config.title, tApp);\n const subtitle =\n config.subtitle != null ? resolveLabel(config.subtitle, tApp) : undefined;\n\n return (\n <DetailPageTemplate\n header={{\n title,\n subtitle: subtitle ?? t('dashboard.subtitle'),\n }}\n >\n <DashboardGrid columns={12}>\n {config.widgets.map((widget) => {\n const widgetTitle = resolveLabel(\n getWidgetLabel(widget, config),\n tApp,\n );\n const content = hasWidgetQuery(widget) ? (\n <WidgetWithQuery widget={widget} />\n ) : (\n <WidgetContent widget={widget} globalData={globalData} />\n );\n\n return (\n <DashboardGridItem\n key={widget.id}\n minHeight={widget.minHeight ?? 'auto'}\n span={resolveWidgetSpan(widget)}\n tabletSpan={resolveWidgetTabletSpan(widget)}\n >\n <BackofficeErrorBoundary\n fallback={() => {\n return (\n <DashboardPanel title={widgetTitle}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }}\n >\n <Suspense\n fallback={\n <DashboardPanel title={widgetTitle}>\n <DashboardLoadingState />\n </DashboardPanel>\n }\n >\n {content}\n </Suspense>\n </BackofficeErrorBoundary>\n </DashboardGridItem>\n );\n })}\n </DashboardGrid>\n </DetailPageTemplate>\n );\n};\n\ntype DashboardWithQueryProps = {\n config: BackofficeDashboardConfig;\n};\n\nconst DashboardWithQuery = ({\n config,\n}: DashboardWithQueryProps): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n config.query as never,\n {},\n { fetchPolicy: 'store-or-network' },\n );\n\n return <DashboardContent config={config} globalData={data} />;\n};\n\nexport type BackofficeDashboardPageProps = {\n prepared?: BackofficePreparedDashboardRoute | null;\n};\n\nexport const BackofficeDashboardPage = ({\n prepared,\n}: BackofficeDashboardPageProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const rootDashboard = useBackofficeDashboardConfig();\n const dashboard = prepared?.config ?? rootDashboard;\n const breadcrumb = buildDashboardBreadcrumb(t);\n\n if (dashboard == null) {\n const items = Object.values(entities)\n .filter((config) => {\n return config.kind === 'list-detail' && config.hasList;\n })\n .map((config) => {\n return {\n config,\n label: resolveLabel(config.label, tApp),\n };\n })\n .sort((left, right) => {\n return left.label.localeCompare(right.label);\n });\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n header={{\n title: t('dashboard.title'),\n subtitle: t('dashboard.subtitle'),\n }}\n >\n <DashboardGrid columns={12}>\n {items.map(({ config, label }) => {\n return (\n <DashboardGridItem key={config.id} span={4}>\n <DashboardPanel title={label}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>\n {t('common.notAvailable')}\n </div>\n <DashboardQuickActions\n actions={[\n {\n id: config.id,\n href: config.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n </DashboardGridItem>\n );\n })}\n </DashboardGrid>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n );\n }\n\n if (dashboard.query != null) {\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardWithQuery config={dashboard} />\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardContent config={dashboard} globalData={null} />\n </BackofficeRightPageLayout>\n );\n};\n\nexport default BackofficeDashboardPage;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeDashboardPage.js","names":[],"sources":["../../../src/pages/BackofficeDashboardPage.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX, Suspense } from 'react';\nimport type {\n BackofficeDashboardConfig,\n BackofficeDashboardWidget,\n BackofficeDashboardWidgetSpan,\n BackofficeDashboardWidgetTabletSpan,\n BackofficeDashboardWidgetSize,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\nimport { DashboardMetricGroup } from '@plumile/ui/components/dashboard/dashboard_metric_group/DashboardMetricGroup.js';\nimport { DashboardPanel } from '@plumile/ui/components/dashboard/dashboard_panel/DashboardPanel.js';\nimport { DashboardQuickActions } from '@plumile/ui/components/dashboard/dashboard_quick_actions/DashboardQuickActions.js';\nimport { DashboardStatusList } from '@plumile/ui/components/dashboard/dashboard_status_list/DashboardStatusList.js';\nimport {\n DashboardGrid,\n DashboardGridItem,\n} from '@plumile/ui/components/dashboard/dashboard_grid/DashboardGrid.js';\nimport { DataTable } from '@plumile/ui/components/data-table/DataTable.js';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { GraphQLTaggedNode, OperationType } from 'relay-runtime';\n\nimport { BackofficeErrorBoundary } from '../components/backoffice/errors/BackofficeErrorBoundary.js';\nimport { BackofficeBillingUsageChart } from '../components/backoffice/billing/BackofficeBillingUsageChart.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeDashboardConfig } from '../provider/useBackofficeLazyValue.js';\nimport type { BackofficePreparedDashboardRoute } from '../router/createBackofficeRoutes.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildDashboardBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n getWidgetLabel,\n hasWidgetQuery,\n resolveLabel,\n} from './BackofficeDashboardPage.helpers.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\ntype WidgetContentProps = {\n widget: BackofficeDashboardWidget;\n globalData: unknown;\n};\n\nconst DashboardUnavailableState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n};\n\nconst DashboardLoadingState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return (\n <div className={styles.loadingBody}>\n <Spinner ariaLabel={t('common.loading')} />\n <span>{t('common.loading')}</span>\n </div>\n );\n};\n\nconst resolveWidgetSize = (\n size: BackofficeDashboardWidgetSize | undefined,\n): BackofficeDashboardWidgetSize => {\n return size ?? 'm';\n};\n\nconst resolveWidgetSpan = (\n widget: BackofficeDashboardWidget,\n): BackofficeDashboardWidgetSpan => {\n if (widget.layout?.span != null) {\n return widget.layout.span;\n }\n\n const size = resolveWidgetSize(widget.size);\n if (size === 's') {\n return 3;\n }\n if (size === 'm') {\n return 4;\n }\n if (size === 'l') {\n return 6;\n }\n if (size === 'xl') {\n return 8;\n }\n return 12;\n};\n\nconst resolveWidgetTabletSpan = (\n widget: BackofficeDashboardWidget,\n): BackofficeDashboardWidgetTabletSpan | undefined => {\n return widget.layout?.tabletSpan;\n};\n\nconst WidgetContent = ({\n widget,\n globalData,\n}: WidgetContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const description =\n widget.description != null\n ? resolveLabel(widget.description, tApp)\n : undefined;\n\n const resolveData = (data: unknown): unknown => {\n if ('resolve' in widget && widget.resolve != null) {\n return widget.resolve(data);\n }\n return null;\n };\n\n if (widget.kind === 'textBlock') {\n const title = resolveLabel(widget.title, tApp);\n const body = resolveLabel(widget.body, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <div className={styles.tileBody}>{body}</div>\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'shortcut') {\n const entity = entities[widget.entityId];\n const title = resolveLabel(widget.label, tApp);\n if (entity == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n if (entity.kind === 'tool') {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n actions={[\n {\n id: entity.id,\n href: entity.routes.list,\n label: t('dashboard.actions.openTool'),\n },\n ]}\n />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n actions={[\n {\n id: entity.id,\n href: entity.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'tablePreview') {\n const resolved = resolveData(globalData) as {\n columns: readonly unknown[];\n rows: readonly unknown[];\n } | null;\n if (resolved == null) {\n return (\n <DashboardPanel\n title={resolveLabel(widget.title, tApp)}\n subtitle={description}\n >\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const columns = buildDataTableColumns(resolved.columns as never, {\n tApp,\n t,\n });\n const title = resolveLabel(widget.title, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DataTable\n columns={columns}\n rows={resolved.rows}\n getRowId={(row, index) => {\n if (row != null && typeof row === 'object') {\n const record = row as Record<string, unknown>;\n const { id } = record;\n if (typeof id === 'string' && id.trim() !== '') {\n return id;\n }\n }\n return String(index);\n }}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'metricGroup') {\n const resolved = resolveData(globalData) as\n | readonly {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n meta?: I18nLabel;\n href?: string;\n }[]\n | null;\n if (resolved == null) {\n return <DashboardUnavailableState />;\n }\n return (\n <DashboardMetricGroup\n emptyState={<DashboardUnavailableState />}\n metrics={resolved.map((metric) => {\n return {\n id: metric.id,\n href: metric.href,\n label: resolveLabel(metric.label, tApp),\n value: metric.value ?? t('common.notAvailable'),\n hint:\n metric.meta != null ? resolveLabel(metric.meta, tApp) : undefined,\n };\n })}\n />\n );\n }\n\n if (widget.kind === 'billingUsageChart') {\n const resolved = resolveData(globalData) as {\n currency: string;\n totalAmount: number;\n from: string | null;\n to: string | null;\n buckets: readonly {\n day: string;\n category: string;\n value: number;\n }[];\n } | null;\n const title = resolveLabel(widget.title, tApp);\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n\n return (\n <DashboardPanel title={title} subtitle={description}>\n <BackofficeBillingUsageChart\n ariaLabel={resolveLabel(widget.ariaLabel, tApp)}\n buckets={resolved.buckets}\n categories={widget.categories.map((category) => {\n return {\n id: category.id,\n label: resolveLabel(category.label, tApp),\n color: category.color,\n };\n })}\n currency={resolved.currency}\n emptyLabel={resolveLabel(widget.emptyLabel, tApp)}\n from={resolved.from}\n rangePrefix={resolveLabel(widget.rangePrefix, tApp)}\n to={resolved.to}\n totalAmount={resolved.totalAmount}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'quickActions') {\n const title =\n widget.title != null\n ? resolveLabel(widget.title, tApp)\n : t('dashboard.actions.openTool');\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardQuickActions\n layout={widget.layout?.zone === 'aside' ? 'stack' : 'grid'}\n emptyState={<DashboardUnavailableState />}\n actions={widget.actions.map((action) => {\n return {\n id: action.id,\n href: action.href,\n label: resolveLabel(action.label, tApp),\n };\n })}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'statusSummary') {\n const resolved = resolveData(globalData) as\n | readonly {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n href?: string;\n }[]\n | null;\n if (resolved == null) {\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardStatusList\n emptyState={<DashboardUnavailableState />}\n items={resolved.map((item) => {\n return {\n id: item.id,\n href: item.href,\n label: resolveLabel(item.label, tApp),\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'recentItems') {\n const title =\n widget.title != null\n ? resolveLabel(widget.title, tApp)\n : t('dashboard.title');\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n\n const entityManifest = entities[widget.entityId];\n if (entityManifest?.kind !== 'list-detail') {\n return (\n <DashboardPanel\n title={resolveLabel(widget.label, tApp)}\n subtitle={description}\n >\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n const resolved = resolveData(globalData) as { count: number | null } | null;\n let countLabel: number | string = t('common.notAvailable');\n if (typeof resolved?.count === 'number') {\n countLabel = resolved.count;\n }\n const title = resolveLabel(widget.label, tApp);\n return (\n <DashboardPanel title={title} subtitle={description}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>{countLabel}</div>\n <DashboardQuickActions\n emptyState={<DashboardUnavailableState />}\n actions={[\n {\n id: entityManifest.id,\n href: entityManifest.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n );\n};\n\ntype WidgetWithQueryProps = {\n widget: BackofficeDashboardWidget & { query: GraphQLTaggedNode };\n};\n\nconst WidgetWithQuery = ({ widget }: WidgetWithQueryProps): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n widget.query,\n {},\n {\n fetchPolicy: 'store-or-network',\n },\n );\n\n return <WidgetContent widget={widget} globalData={data} />;\n};\n\ntype DashboardContentProps = {\n config: BackofficeDashboardConfig;\n globalData: unknown;\n};\n\nconst DashboardContent = ({\n config,\n globalData,\n}: DashboardContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n\n const title = resolveLabel(config.title, tApp);\n const subtitle =\n config.subtitle != null ? resolveLabel(config.subtitle, tApp) : undefined;\n\n return (\n <DetailPageTemplate\n header={{\n title,\n subtitle: subtitle ?? t('dashboard.subtitle'),\n }}\n >\n <DashboardGrid columns={12}>\n {config.widgets.map((widget) => {\n const widgetTitle = resolveLabel(\n getWidgetLabel(widget, config),\n tApp,\n );\n const content = hasWidgetQuery(widget) ? (\n <WidgetWithQuery widget={widget} />\n ) : (\n <WidgetContent widget={widget} globalData={globalData} />\n );\n\n return (\n <DashboardGridItem\n key={widget.id}\n minHeight={widget.minHeight ?? 'auto'}\n span={resolveWidgetSpan(widget)}\n tabletSpan={resolveWidgetTabletSpan(widget)}\n >\n <BackofficeErrorBoundary\n fallback={() => {\n return (\n <DashboardPanel title={widgetTitle}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }}\n >\n <Suspense\n fallback={\n <DashboardPanel title={widgetTitle}>\n <DashboardLoadingState />\n </DashboardPanel>\n }\n >\n {content}\n </Suspense>\n </BackofficeErrorBoundary>\n </DashboardGridItem>\n );\n })}\n </DashboardGrid>\n </DetailPageTemplate>\n );\n};\n\ntype DashboardWithQueryProps = {\n config: BackofficeDashboardConfig;\n};\n\nconst DashboardWithQuery = ({\n config,\n}: DashboardWithQueryProps): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n config.query as never,\n {},\n { fetchPolicy: 'store-or-network' },\n );\n\n return <DashboardContent config={config} globalData={data} />;\n};\n\nexport type BackofficeDashboardPageProps = {\n prepared?: BackofficePreparedDashboardRoute | null;\n};\n\nexport const BackofficeDashboardPage = ({\n prepared,\n}: BackofficeDashboardPageProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const rootDashboard = useBackofficeDashboardConfig();\n const dashboard = prepared?.config ?? rootDashboard;\n const breadcrumb = buildDashboardBreadcrumb(t);\n\n if (dashboard == null) {\n const items = Object.values(entities)\n .filter((config) => {\n return config.kind === 'list-detail' && config.hasList;\n })\n .map((config) => {\n return {\n config,\n label: resolveLabel(config.label, tApp),\n };\n })\n .sort((left, right) => {\n return left.label.localeCompare(right.label);\n });\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n header={{\n title: t('dashboard.title'),\n subtitle: t('dashboard.subtitle'),\n }}\n >\n <DashboardGrid columns={12}>\n {items.map(({ config, label }) => {\n return (\n <DashboardGridItem key={config.id} span={4}>\n <DashboardPanel title={label}>\n <div className={styles.tileBody}>\n <div className={styles.tileCount}>\n {t('common.notAvailable')}\n </div>\n <DashboardQuickActions\n actions={[\n {\n id: config.id,\n href: config.routes.list,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n </DashboardGridItem>\n );\n })}\n </DashboardGrid>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n );\n }\n\n if (dashboard.query != null) {\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardWithQuery config={dashboard} />\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardContent config={dashboard} globalData={null} />\n </BackofficeRightPageLayout>\n );\n};\n\nexport default BackofficeDashboardPage;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityDetailLayoutPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailLayoutPage.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport HttpRedirect from '@plumile/router/errors/HttpRedirect.js';\nimport * as ReactRelay from 'react-relay';\n\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedDetailLayoutRoute,\n BackofficeResolvedDetailLayoutFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeEntityDetailLayoutContextProvider } from './detail/BackofficeEntityDetailLayoutContext.js';\n\nconst { useFragment, usePreloadedQuery } = ReactRelay;\n\nexport type BackofficeEntityDetailLayoutPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutRoute;\n children?: ReactNode;\n};\n\nexport const BackofficeEntityDetailLayoutPage = ({\n config,\n prepared,\n children,\n}: BackofficeEntityDetailLayoutPageProps): JSX.Element => {\n const layoutQueryData = usePreloadedQuery(\n config.layoutPage.query,\n prepared.layoutQuery,\n );\n const layoutNodeRef = config.layoutPage.resolveNode(layoutQueryData, {\n id: prepared.id,\n });\n if (layoutNodeRef == null) {\n throw new HttpRedirect(config.routes.list);\n }\n\n const layoutNode = useFragment(\n config.layoutPage.fragment,\n layoutNodeRef as never,\n );\n\n const layoutView = config.layoutPage.toView(layoutNode);\n\n return (\n <BackofficeEntityDetailLayoutContextProvider\n value={{\n layoutView,\n }}\n >\n <>{children}</>\n </BackofficeEntityDetailLayoutContextProvider>\n );\n};\n\nexport default BackofficeEntityDetailLayoutPage;\n"],"mappings":";;;;;AAWA,IAAM,EAAE,aAAA,GAAa,mBAAA,MAAsB,GAS9B,KAAoC,EAC/C,WACA,aACA,kBACwD;CACxD,IAAM,IAAkB,EACtB,EAAO,WAAW,OAClB,EAAS,YACV,EACK,IAAgB,EAAO,WAAW,YAAY,GAAiB,EACnE,IAAI,EAAS,IACd,CAAC;CACF,IAAI,KAAiB,MACnB,MAAM,IAAI,EAAa,EAAO,OAAO,KAAK;CAG5C,IAAM,IAAa,EACjB,EAAO,WAAW,UAClB,EACD;CAID,OACE,kBAAC,GAAD;EACE,OAAO,EACL,YALa,EAAO,WAAW,OAAO,EAKtC,EACD;YAED,kBAAA,GAAA,EAAG,aAAY,CAAA;EAC6B,CAAA"}
1
+ {"version":3,"file":"BackofficeEntityDetailLayoutPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailLayoutPage.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport HttpRedirect from '@plumile/router/errors/HttpRedirect.js';\nimport * as ReactRelay from 'react-relay';\n\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedDetailLayoutRoute,\n BackofficeResolvedDetailLayoutFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeEntityDetailLayoutContextProvider } from './detail/BackofficeEntityDetailLayoutContext.js';\n\nconst { useFragment, usePreloadedQuery } = ReactRelay;\n\nexport type BackofficeEntityDetailLayoutPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutRoute;\n children?: ReactNode;\n};\n\nexport const BackofficeEntityDetailLayoutPage = ({\n config,\n prepared,\n children,\n}: BackofficeEntityDetailLayoutPageProps): JSX.Element => {\n const layoutQueryData = usePreloadedQuery(\n config.layoutPage.query,\n prepared.layoutQuery,\n );\n const layoutNodeRef = config.layoutPage.resolveNode(layoutQueryData, {\n id: prepared.id,\n });\n if (layoutNodeRef == null) {\n throw new HttpRedirect(config.routes.list);\n }\n\n const layoutNode = useFragment(\n config.layoutPage.fragment,\n layoutNodeRef as never,\n );\n\n const layoutView = config.layoutPage.toView(layoutNode);\n\n return (\n <BackofficeEntityDetailLayoutContextProvider\n value={{\n layoutView,\n }}\n >\n <>{children}</>\n </BackofficeEntityDetailLayoutContextProvider>\n );\n};\n\nexport default BackofficeEntityDetailLayoutPage;\n"],"mappings":";;;;;AAWA,IAAM,EAAE,aAAA,GAAa,mBAAA,MAAsB,GAS9B,KAAoC,EAC/C,WACA,aACA,kBACwD;CACxD,IAAM,IAAkB,EACtB,EAAO,WAAW,OAClB,EAAS,WACX,GACM,IAAgB,EAAO,WAAW,YAAY,GAAiB,EACnE,IAAI,EAAS,GACf,CAAC;CACD,IAAI,KAAiB,MACnB,MAAM,IAAI,EAAa,EAAO,OAAO,IAAI;CAG3C,IAAM,IAAa,EACjB,EAAO,WAAW,UAClB,CACF;CAIA,OACE,kBAAC,GAAD;EACE,OAAO,EACL,YALa,EAAO,WAAW,OAAO,CAKtC,EACF;YAEA,kBAAA,GAAA,EAAG,YAAW,CAAA;CAC6B,CAAA;AAEjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityDetailPage.helpers.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailPage.helpers.ts"],"sourcesContent":["import type {\n BackofficeBadgeTone,\n BackofficeEntityActionSpec,\n BackofficeEntityFormMutationActionSpec,\n BackofficeEntityMutationActionSpec,\n BackofficeEntityRouteActionSpec,\n BackofficeValueLabel,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { MutationPayloadBase } from '../relay/mutationResult.js';\nimport type { TFunction } from 'i18next';\n\nexport const resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const isPlainObject = (\n value: unknown,\n): value is Record<string, unknown> => {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n};\n\nexport const extractMutationPayload = (\n response: unknown,\n): MutationPayloadBase | null => {\n if (!isPlainObject(response)) {\n return null;\n }\n\n for (const value of Object.values(response)) {\n if (isPlainObject(value) && ('status' in value || 'result' in value)) {\n return value;\n }\n }\n\n return null;\n};\n\nexport const isRouteAction = <Node>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityRouteActionSpec<Node> => {\n return action.kind === 'route';\n};\n\nexport const isMutationAction = <Node>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityMutationActionSpec<Node> => {\n return action.kind === 'mutation';\n};\n\nexport const isFormMutationAction = <Node>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityFormMutationActionSpec<Node> => {\n return action.kind === 'formMutation';\n};\n\nexport const resolveValueLabel = (\n value: BackofficeValueLabel | null | undefined,\n tApp: TFunction,\n): string | number | null => {\n if (typeof value === 'function') {\n return value(tApp);\n }\n if (value == null) {\n return null;\n }\n return value;\n};\n\nexport const resolveRelationValue = (value: string | null): string | null => {\n if (value == null) {\n return null;\n }\n const trimmed = value.trim();\n if (trimmed === '') {\n return null;\n }\n return trimmed;\n};\n\nexport const isEmptyText = (\n value: string | number | null | undefined,\n): boolean => {\n if (value == null) {\n return true;\n }\n if (typeof value === 'string') {\n return value.trim() === '';\n }\n return false;\n};\n\nexport const resolveBadgeTone = <Node>(\n tone: BackofficeBadgeTone | ((node: Node) => BackofficeBadgeTone) | undefined,\n node: Node,\n): BackofficeBadgeTone | undefined => {\n if (typeof tone === 'function') {\n return tone(node);\n }\n return tone;\n};\n"],"mappings":";AAYA,IAAa,KAAgB,GAAkB,MACtC,EAAM,EAAK,EAGP,KACX,MAEO,OAAO,KAAU,cAAY,KAAiB,CAAC,MAAM,QAAQ,EAAM,EAG/D,KACX,MAC+B;CAC/B,IAAI,CAAC,EAAc,EAAS,EAC1B,OAAO;CAGT,KAAK,IAAM,KAAS,OAAO,OAAO,EAAS,EACzC,IAAI,EAAc,EAAM,KAAK,YAAY,KAAS,YAAY,IAC5D,OAAO;CAIX,OAAO;GAGI,KACX,MAEO,EAAO,SAAS,SAGZ,KACX,MAEO,EAAO,SAAS,YAGZ,KACX,MAEO,EAAO,SAAS,gBAGZ,KACX,GACA,MAEI,OAAO,KAAU,aACZ,EAAM,EAAK,GAEhB,KACK,MAKE,KAAwB,MAAwC;CAC3E,IAAI,KAAS,MACX,OAAO;CAET,IAAM,IAAU,EAAM,MAAM;CAI5B,OAHI,MAAY,KACP,OAEF;GAGI,KACX,MAEI,KAAS,OACJ,KAEL,OAAO,KAAU,WACZ,EAAM,MAAM,KAAK,KAEnB,IAGI,KACX,GACA,MAEI,OAAO,KAAS,aACX,EAAK,EAAK,GAEZ"}
1
+ {"version":3,"file":"BackofficeEntityDetailPage.helpers.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailPage.helpers.ts"],"sourcesContent":["import type {\n BackofficeBadgeTone,\n BackofficeEntityActionSpec,\n BackofficeEntityFormMutationActionSpec,\n BackofficeEntityMutationActionSpec,\n BackofficeEntityRouteActionSpec,\n BackofficeValueLabel,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { MutationPayloadBase } from '../relay/mutationResult.js';\nimport type { TFunction } from 'i18next';\n\nexport const resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const isPlainObject = (\n value: unknown,\n): value is Record<string, unknown> => {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n};\n\nexport const extractMutationPayload = (\n response: unknown,\n): MutationPayloadBase | null => {\n if (!isPlainObject(response)) {\n return null;\n }\n\n for (const value of Object.values(response)) {\n if (isPlainObject(value) && ('status' in value || 'result' in value)) {\n return value;\n }\n }\n\n return null;\n};\n\nexport const isRouteAction = <Node>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityRouteActionSpec<Node> => {\n return action.kind === 'route';\n};\n\nexport const isMutationAction = <Node>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityMutationActionSpec<Node> => {\n return action.kind === 'mutation';\n};\n\nexport const isFormMutationAction = <Node>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityFormMutationActionSpec<Node> => {\n return action.kind === 'formMutation';\n};\n\nexport const resolveValueLabel = (\n value: BackofficeValueLabel | null | undefined,\n tApp: TFunction,\n): string | number | null => {\n if (typeof value === 'function') {\n return value(tApp);\n }\n if (value == null) {\n return null;\n }\n return value;\n};\n\nexport const resolveRelationValue = (value: string | null): string | null => {\n if (value == null) {\n return null;\n }\n const trimmed = value.trim();\n if (trimmed === '') {\n return null;\n }\n return trimmed;\n};\n\nexport const isEmptyText = (\n value: string | number | null | undefined,\n): boolean => {\n if (value == null) {\n return true;\n }\n if (typeof value === 'string') {\n return value.trim() === '';\n }\n return false;\n};\n\nexport const resolveBadgeTone = <Node>(\n tone: BackofficeBadgeTone | ((node: Node) => BackofficeBadgeTone) | undefined,\n node: Node,\n): BackofficeBadgeTone | undefined => {\n if (typeof tone === 'function') {\n return tone(node);\n }\n return tone;\n};\n"],"mappings":";AAYA,IAAa,KAAgB,GAAkB,MACtC,EAAM,CAAI,GAGN,KACX,MAEO,OAAO,KAAU,cAAY,KAAiB,CAAC,MAAM,QAAQ,CAAK,GAG9D,KACX,MAC+B;CAC/B,IAAI,CAAC,EAAc,CAAQ,GACzB,OAAO;CAGT,KAAK,IAAM,KAAS,OAAO,OAAO,CAAQ,GACxC,IAAI,EAAc,CAAK,MAAM,YAAY,KAAS,YAAY,IAC5D,OAAO;CAIX,OAAO;AACT,GAEa,KACX,MAEO,EAAO,SAAS,SAGZ,KACX,MAEO,EAAO,SAAS,YAGZ,KACX,MAEO,EAAO,SAAS,gBAGZ,KACX,GACA,MAEI,OAAO,KAAU,aACZ,EAAM,CAAI,IAEf,KACK,MAKE,KAAwB,MAAwC;CAC3E,IAAI,KAAS,MACX,OAAO;CAET,IAAM,IAAU,EAAM,KAAK;CAI3B,OAHI,MAAY,KACP,OAEF;AACT,GAEa,KACX,MAEI,KAAS,OACJ,KAEL,OAAO,KAAU,WACZ,EAAM,KAAK,MAAM,KAEnB,IAGI,KACX,GACA,MAEI,OAAO,KAAS,aACX,EAAK,CAAI,IAEX"}
@@ -461,10 +461,10 @@ var Ne = (e) => {
461
461
  }) : null, N = b.length > 0 || D != null ? /* @__PURE__ */ C("div", {
462
462
  className: ae,
463
463
  children: [b.length > 0 && /* @__PURE__ */ S("div", {
464
- className: "txvbqbdr8 txvbqbey txvbqbju2 txvbqbff6 txvbqbf91",
464
+ className: "txvbqbfpn txvbqbey txvbqblsh txvbqbhdl txvbqbh7g",
465
465
  children: b
466
466
  }), D != null && /* @__PURE__ */ S("div", {
467
- className: "txvbqbdr8 txvbqbey txvbqbyoc txvbqb97n txvbqb9nq txvbqb2et txvbqb65i",
467
+ className: "txvbqbfpn txvbqbey txvbqb10mr txvbqbb49 txvbqbbkc txvbqb2sj txvbqb7tt",
468
468
  children: D
469
469
  })]
470
470
  }) : void 0, J = h.status != null || h.badges != null ? /* @__PURE__ */ C("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityDetailPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailPage.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX, type ReactNode, useContext, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n commitMutation,\n type PreloadedQuery,\n useFragment,\n usePreloadedQuery,\n} from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\nimport { resolveMutationOutcome } from '../relay/mutationResult.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport {\n buildBackofficeFallbackListHref,\n buildBackofficeListHref,\n buildBackofficeListLink,\n} from '@plumile/backoffice-core/state/buildListHref.js';\n\nimport { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeResolvedDetailLayoutFacetConfigBase,\n BackofficeResolvedDetailPageFacetConfig,\n BackofficeResolvedDetailPageFacetConfigBase,\n} from '@plumile/backoffice-core/types.js';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { LinkButton } from '@plumile/ui/atomic/atoms/button/LinkButton.js';\nimport { FormattedDate } from '@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js';\nimport { Tabs } from '@plumile/ui/atomic/molecules/tabs/Tabs.js';\nimport { useToast } from '@plumile/ui/atomic/molecules/toast/ToastProvider.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport { BackofficeKeyValueList } from '@plumile/ui/backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { BackofficePayloadViewer } from '@plumile/ui/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js';\nimport {\n BackofficeRelationsMenu,\n type BackofficeRelationsMenuItem,\n} from '@plumile/ui/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js';\nimport { BackofficeScopeStack } from '@plumile/ui/backoffice/molecules/backoffice_scope_stack/BackofficeScopeStack.js';\nimport { AuditTimeline } from '@plumile/ui/backoffice/organisms/audit_timeline/AuditTimeline.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\nimport { MetricCard } from '@plumile/ui/components/dashboard/metric_card/MetricCard.js';\nimport { MetricTileGroup } from '@plumile/ui/components/dashboard/metric_tile_group/MetricTileGroup.js';\nimport { DataTable } from '@plumile/ui/components/data-table/DataTable.js';\nimport { ChatCheckSvg } from '@plumile/ui/icons/ChatCheckSvg.js';\nimport { KeyOffSvg } from '@plumile/ui/icons/KeyOffSvg.js';\nimport { KeySvg } from '@plumile/ui/icons/KeySvg.js';\nimport { LockOpenSvg } from '@plumile/ui/icons/LockOpenSvg.js';\nimport { LockSvg } from '@plumile/ui/icons/LockSvg.js';\nimport { RobotCheckSvg } from '@plumile/ui/icons/RobotCheckSvg.js';\nimport { RobotXSvg } from '@plumile/ui/icons/RobotXSvg.js';\nimport { RocketOffSvg } from '@plumile/ui/icons/RocketOffSvg.js';\nimport { RocketSvg } from '@plumile/ui/icons/RocketSvg.js';\nimport { SettingsCheckSvg } from '@plumile/ui/icons/SettingsCheckSvg.js';\nimport { SettingsXSvg } from '@plumile/ui/icons/SettingsXSvg.js';\nimport { ShieldLockSvg } from '@plumile/ui/icons/ShieldLockSvg.js';\nimport { ShieldOffSvg } from '@plumile/ui/icons/ShieldOffSvg.js';\nimport { XBadgeSvg } from '@plumile/ui/icons/XBadgeSvg.js';\nimport HttpRedirect from '@plumile/router/errors/HttpRedirect.js';\nimport Link from '@plumile/router/routing/Link.js';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\n\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { BackofficeEntityDetailScaffold } from '../components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js';\nimport { BackofficeDetailBadgeRow } from '../components/backoffice/detail/BackofficeDetailBadgeRow.js';\nimport { BackofficeDetailFlagTag } from '../components/backoffice/detail/BackofficeDetailFlagTag.js';\nimport { BackofficeDetailTaggedValue } from '../components/backoffice/detail/BackofficeDetailTaggedValue.js';\nimport { BackofficeLifecycleTimelineSection } from '../components/backoffice/detail/BackofficeLifecycleTimelineSection.js';\nimport { BackofficeRelationsSummaryGrid } from '../components/backoffice/detail/BackofficeRelationsSummaryGrid.js';\nimport { LazyBackofficeEntityActionFormDialog } from '../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js';\nimport {\n resolveToastSpec,\n resolveToastViewActions,\n} from '../components/backoffice/actions/toastViewAction.js';\nimport * as pageStyles from './backofficeEntityDetailPage.css.js';\nimport { useBackofficeFormats } from '../i18n/useBackofficeFormats.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\nimport { useBackofficeEntityDetailLayoutContext } from './detail/BackofficeEntityDetailLayoutContext.js';\nimport { buildTabsItems } from './detail/buildTabsItems.js';\nimport { resolveVisibleDetailPages } from './detail/pageResolution.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityDetailBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n extractMutationPayload,\n isFormMutationAction,\n isMutationAction,\n isRouteAction,\n resolveLabel,\n} from './BackofficeEntityDetailPage.helpers.js';\nimport {\n buildFieldItems,\n renderBlocks,\n resolveHeaderItems,\n type FlagIconName,\n} from './BackofficeEntityDetailPage.view-helpers.js';\n\nexport type BackofficeEntityDetailPageProps = {\n config: BackofficeResolvedDetailLayoutFacetConfigBase;\n prepared: {\n id: string;\n detailId?: string;\n pageConfig: BackofficeResolvedDetailPageFacetConfigBase;\n pageQuery: PreloadedQuery<OperationType>;\n pageId: string;\n pagePath: string;\n };\n};\n\nconst renderFlagIcon = (iconName: FlagIconName): JSX.Element => {\n const iconSize = 14;\n switch (iconName) {\n case 'shield-lock':\n return (\n <ShieldLockSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'shield-off':\n return (\n <ShieldOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'settings-check':\n return (\n <SettingsCheckSvg\n width={iconSize}\n height={iconSize}\n aria-hidden=\"true\"\n />\n );\n case 'settings-x':\n return (\n <SettingsXSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'x-badge':\n return (\n <XBadgeSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'chat-check':\n return (\n <ChatCheckSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'key':\n return <KeySvg width={iconSize} height={iconSize} aria-hidden=\"true\" />;\n case 'key-off':\n return (\n <KeyOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'lock':\n return <LockSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />;\n case 'lock-open':\n return (\n <LockOpenSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'robot-check':\n return (\n <RobotCheckSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'robot-x':\n return (\n <RobotXSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'rocket':\n return (\n <RocketSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'rocket-off':\n return (\n <RocketOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n default:\n throw new Error(`Unsupported flag icon: ${String(iconName)}`);\n }\n};\n\nconst resolveDetailPlacement = (item: {\n placement?: 'primary' | 'secondary' | 'main' | 'side' | 'fullWidth';\n presentation?: {\n group?: string;\n desktop?: 'primary' | 'secondary' | 'fullWidth';\n };\n kind?: string;\n fields?: readonly {\n presentation?: {\n group?: string;\n desktop?: 'primary' | 'secondary' | 'fullWidth';\n };\n }[];\n}): 'primary' | 'secondary' => {\n if (item.presentation?.desktop === 'secondary') {\n return 'secondary';\n }\n if (\n item.presentation?.group === 'scope' ||\n item.presentation?.group === 'status'\n ) {\n return 'secondary';\n }\n const fieldGroups =\n item.fields?.map((field) => {\n return field.presentation?.group;\n }) ?? [];\n if (\n fieldGroups.length > 0 &&\n fieldGroups.every((group) => {\n return group === 'scope' || group === 'status';\n })\n ) {\n return 'secondary';\n }\n if (item.placement === 'side') {\n return 'secondary';\n }\n if (item.placement === 'secondary') {\n return 'secondary';\n }\n return 'primary';\n};\n\nconst BackofficeEntityDetailPageContent = ({\n config,\n prepared,\n}: {\n config: BackofficeResolvedDetailPageFacetConfig;\n prepared: {\n pageQuery: PreloadedQuery<OperationType>;\n id: string;\n detailId?: string;\n pageId: string;\n pagePath: string;\n };\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { formatNumber, formatCurrency, formatCurrencyTitle, formatPercent } =\n useBackofficeFormats();\n const { entities, entityRegistry } = useBackofficeConfig();\n const { layoutView } = useBackofficeEntityDetailLayoutContext();\n const routing = useContext(RoutingContext);\n const environment = useRelayEnvironment();\n const toast = useToast();\n const [actionState, setActionState] = useState<Record<string, boolean>>({});\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath: prepared.pagePath,\n node: layoutView as never,\n });\n const activePage = resolvedPages.activePage ?? config.pages.mainPage;\n const pages =\n resolvedPages.pages.length > 0\n ? resolvedPages.pages\n : [config.pages.mainPage];\n\n const setActionLoading = (actionId: string, isLoading: boolean) => {\n setActionState((prev) => {\n if (prev[actionId] === isLoading) {\n return prev;\n }\n return { ...prev, [actionId]: isLoading };\n });\n };\n\n const { page } = config;\n\n const pageQueryData = usePreloadedQuery(page.query, prepared.pageQuery);\n const pageNodeRef = page.resolveNode(pageQueryData, {\n id: prepared.id,\n detailId: prepared.detailId,\n });\n const hasPageNode = pageNodeRef != null;\n const resolvedNode = useFragment(page.fragment, pageNodeRef as never);\n const relationEntityListRoutes = useMemo(() => {\n return Object.fromEntries(\n page.content\n .flatMap((block) => {\n if (block.kind !== 'fieldSet') {\n return [];\n }\n\n return block.fields.flatMap((field) => {\n if (field.type !== 'relation') {\n return [];\n }\n return [field.relation.target];\n });\n })\n .flatMap((entityId) => {\n const entityManifest = entities[entityId];\n if (entityManifest?.hasList !== true) {\n return [];\n }\n return [[entityId, entityManifest.routes.list]];\n }),\n );\n }, [entities, page.content]);\n\n if (!hasPageNode) {\n throw new HttpRedirect(config.routes.list);\n }\n\n return (\n <BackofficeEntityDetailScaffold\n node={resolvedNode}\n render={(node) => {\n const view = page.toView(node);\n const tabsItems = buildTabsItems({\n pages,\n id: prepared.id,\n tApp,\n detailPageHref: config.routes.detailPage,\n });\n const resolveEntityHref = (entityId: string, refId: string) => {\n const entityConfig = entities[entityId];\n if (entityConfig == null) {\n return null;\n }\n return entityConfig.routes.detail(refId);\n };\n const resolveRelationItem = ({\n id,\n label,\n count,\n relation,\n listRoute,\n value,\n where,\n }: {\n id: string;\n label: string;\n count: number | null;\n relation: {\n target: string;\n filterId?: string;\n whereKey: string;\n path?: readonly string[];\n };\n listRoute: string;\n value: string;\n where: Record<string, unknown>;\n }): BackofficeRelationsMenuItem => {\n const { target, filterId, whereKey, path } = relation;\n const loadedEntity = entityRegistry.getLoadedListEntity(target);\n return {\n id,\n label,\n count,\n href:\n loadedEntity == null\n ? buildBackofficeFallbackListHref(listRoute, where, [\n {\n id:\n filterId ??\n (path == null\n ? whereKey\n : `${whereKey}.${path.join('.')}`),\n value,\n },\n ])\n : buildBackofficeListHref(loadedEntity.config, { where }),\n onClick: async (event) => {\n if (\n routing == null ||\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n\n event.preventDefault();\n\n const listEntity = await entityRegistry.loadListEntity(target);\n const next = buildBackofficeListLink(listEntity.config, {\n where,\n });\n\n routing.history.push({\n pathname: next.pathname,\n search: next.search === '' ? '' : `?${next.search}`,\n hash: '',\n });\n },\n };\n };\n\n const header = resolveHeaderItems(config.header, layoutView, {\n tApp,\n t,\n resolveEntityHref,\n renderLink: (href, label) => {\n return <Link to={href}>{label}</Link>;\n },\n renderDate: (value, fallback) => {\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n },\n renderTag: (tone, label) => {\n return <Tag tone={tone}>{label}</Tag>;\n },\n renderBadgeRow: (items) => {\n return <BackofficeDetailBadgeRow items={items} />;\n },\n });\n const breadcrumb = buildEntityDetailBreadcrumb({\n config,\n tApp,\n entityId: prepared.id,\n layoutView,\n pageLabel: activePage.label(tApp),\n pageId: activePage.id,\n });\n\n const actions = page.actions ?? [];\n let headerActionButtons: ReactNode[] = [];\n if (actions.length > 0) {\n const visibleActions = actions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(view);\n });\n\n if (visibleActions.length > 0) {\n headerActionButtons = visibleActions.map((action) => {\n const label = resolveLabel(action.label, tApp);\n const ariaLabel =\n action.ariaLabel != null\n ? resolveLabel(action.ariaLabel, tApp)\n : label;\n const variant = action.variant ?? 'secondary';\n const size = action.size ?? 'small';\n const isLoading = actionState[action.id] ?? false;\n const isDisabled =\n isLoading || action.isDisabled?.(view) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(view);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n isLoading={false}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n if (isMutationAction(action)) {\n const handleClick = () => {\n if (isLoading) {\n return;\n }\n const variables = action.getVariables(view);\n setActionLoading(action.id, true);\n commitMutation(environment, {\n mutation: action.mutation,\n variables,\n updater: (store) => {\n action.updater?.(store, view);\n },\n onCompleted: (response) => {\n setActionLoading(action.id, false);\n const mutationPayload = extractMutationPayload(response);\n if (mutationPayload != null) {\n let defaultErrorMessage = t(\n 'actions.form.errors.invalidPayload',\n );\n if (action.toasts?.error?.message != null) {\n defaultErrorMessage = resolveLabel(\n action.toasts.error.message,\n tApp,\n );\n } else if (action.toasts?.error?.title != null) {\n defaultErrorMessage = resolveLabel(\n action.toasts.error.title,\n tApp,\n );\n }\n\n const outcome = resolveMutationOutcome(\n mutationPayload,\n {\n defaultErrorMessage,\n mapReason: (reason) => {\n const mapped = action.mapErrorReason?.(\n reason,\n view,\n );\n if (mapped == null) {\n return null;\n }\n if (typeof mapped === 'function') {\n return resolveLabel(mapped, tApp);\n }\n return String(mapped);\n },\n },\n );\n if (!outcome.ok) {\n const error = new Error(outcome.message);\n action.onError?.(error, view);\n if (action.toasts?.error != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.error,\n tApp,\n );\n toast.error(toastSpec.title, toastSpec.message);\n }\n return;\n }\n }\n\n action.onCompleted?.(response, view);\n if (action.toasts?.success != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.success,\n tApp,\n );\n const toastActions = resolveToastViewActions({\n toast: action.toasts.success,\n response,\n node: view,\n tApp,\n entities,\n defaultLabel: t('actions.view'),\n navigateTo: (to) => {\n routing?.history.push({ pathname: to });\n },\n });\n toast.push({\n kind: 'info',\n title: toastSpec.title,\n message: toastSpec.message,\n actions: toastActions,\n });\n }\n },\n onError: (error) => {\n setActionLoading(action.id, false);\n action.onError?.(error, view);\n if (action.toasts?.error != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.error,\n tApp,\n );\n toast.error(toastSpec.title, toastSpec.message);\n }\n },\n });\n };\n\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n isLoading={isLoading}\n disabled={isDisabled}\n onClick={handleClick}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n });\n }\n }\n\n const activeFormAction = actions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n const { content } = page;\n\n const primaryNodes: ReactNode[] = [];\n const secondaryNodes: ReactNode[] = [];\n const relationMenuItems: BackofficeRelationsMenuItem[] = [];\n\n content.forEach((item, index) => {\n const placement = resolveDetailPlacement(item);\n const targetNodes =\n placement === 'secondary' ? secondaryNodes : primaryNodes;\n\n if (item.kind === 'fieldSet') {\n const sectionLabel = resolveLabel(item.title, tApp);\n const description =\n item.description != null\n ? resolveLabel(item.description, tApp)\n : undefined;\n const { items, relationItems, customNodes } = buildFieldItems(\n item.fields,\n view,\n {\n tApp,\n t,\n resolveEntityHref,\n formatNumber,\n formatCurrency,\n formatCurrencyTitle,\n formatPercent,\n relationEntityListRoutes,\n resolveRelationItem,\n setWhereValue,\n renderTag: (tone, label) => {\n return <Tag tone={tone}>{label}</Tag>;\n },\n renderBadgeRow: (items) => {\n return <BackofficeDetailBadgeRow items={items} />;\n },\n renderDate: (value, fallback) => {\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n },\n renderFlagTag: (tag) => {\n return (\n <BackofficeDetailFlagTag\n tone={tag.tone}\n icon={\n tag.iconName != null\n ? renderFlagIcon(tag.iconName)\n : undefined\n }\n label={tag.label}\n />\n );\n },\n renderLink: (href, label) => {\n return <Link to={href}>{label}</Link>;\n },\n renderTaggedValue: (tag, value) => {\n return (\n <BackofficeDetailTaggedValue\n tag={tag as never}\n value={value}\n />\n );\n },\n wrapCustomNode: (id, custom) => {\n return <div key={id}>{custom}</div>;\n },\n },\n );\n relationItems.forEach((relation) => {\n if (\n !relationMenuItems.some((entry) => {\n return entry.id === relation.id;\n })\n ) {\n relationMenuItems.push(relation);\n }\n });\n\n const hasContent = items.length > 0 || customNodes.length > 0;\n\n if (!hasContent) {\n return;\n }\n\n targetNodes.push(\n <BackofficeDetailSection\n key={`${sectionLabel}-${index}`}\n title={sectionLabel}\n description={description}\n items={items.length > 0 ? items : undefined}\n >\n {customNodes}\n </BackofficeDetailSection>,\n );\n return;\n }\n\n const rendered = renderBlocks([item], view, {\n tApp,\n t,\n resolveEntityHref,\n keyPrefix: String(index),\n renderLink: (href, label) => {\n return <Link to={href}>{label}</Link>;\n },\n renderDate: (value, fallback) => {\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n },\n renderTag: (tone, label) => {\n return <Tag tone={tone}>{label}</Tag>;\n },\n renderMetricGroup: ({\n key,\n title,\n description,\n density,\n items,\n }) => {\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n {items.length > 0 && (\n <MetricTileGroup\n density={density ?? 'comfortable'}\n minColumn=\"180\"\n >\n {items.map((metric) => {\n return (\n <MetricCard\n key={metric.id}\n label={metric.label}\n value={metric.value}\n hint={metric.hint}\n tone={metric.tone ?? 'neutral'}\n density={density ?? 'comfortable'}\n copyValue={metric.copyValue}\n copyLabel={t('common.actions.copy')}\n copiedLabel={t('common.actions.copied')}\n />\n );\n })}\n </MetricTileGroup>\n )}\n </BackofficeDetailSection>\n );\n },\n renderTimeline: ({ key, title, description, events }) => {\n return (\n <BackofficeLifecycleTimelineSection\n key={key}\n title={title}\n description={description}\n events={events}\n />\n );\n },\n renderAuditTimeline: ({ key, title, description, events }) => {\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <AuditTimeline events={events} />\n </BackofficeDetailSection>\n );\n },\n renderRelations: ({ key, title, items }) => {\n return (\n <BackofficeRelationsSummaryGrid\n key={key}\n title={title}\n items={items}\n />\n );\n },\n renderContextStack: ({ key, title, items }) => {\n return (\n <BackofficeScopeStack key={key} title={title} items={items} />\n );\n },\n renderCustomSection: (key, title, child) => {\n return (\n <BackofficeDetailSection key={key} title={title}>\n {child}\n </BackofficeDetailSection>\n );\n },\n wrapCustomNode: (key, custom) => {\n return <div key={key}>{custom}</div>;\n },\n resolveTableColumns: (columns) => {\n return buildDataTableColumns(columns as never, {\n tApp,\n t,\n });\n },\n renderTable: ({ key, title, description, columns, rows }) => {\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <DataTable\n columns={columns as never}\n rows={rows}\n getRowId={(row, rowIndex) => {\n if (row != null && typeof row === 'object') {\n const record = row as Record<string, unknown>;\n const maybeId = record.id;\n if (\n typeof maybeId === 'string' &&\n maybeId.trim() !== ''\n ) {\n return maybeId;\n }\n }\n return String(rowIndex);\n }}\n />\n </BackofficeDetailSection>\n );\n },\n renderPayload: ({ key, title, description, content, format }) => {\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <BackofficePayloadViewer\n content={content}\n format={format as never}\n emptyState={t('common.notAvailable')}\n />\n </BackofficeDetailSection>\n );\n },\n renderKeyValueListSection: ({ key, title, description, items }) => {\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <BackofficeKeyValueList items={items} />\n </BackofficeDetailSection>\n );\n },\n });\n const blockNode = rendered[0];\n if (blockNode != null) {\n targetNodes.push(blockNode);\n }\n });\n\n const relationsMenuNode =\n relationMenuItems.length > 0 ? (\n <BackofficeRelationsMenu\n label={t('relations.menu.label')}\n items={relationMenuItems}\n />\n ) : null;\n\n const headerActions =\n headerActionButtons.length > 0 || relationsMenuNode != null ? (\n <div className={pageStyles.headerActions}>\n {headerActionButtons.length > 0 && (\n <div className={pageStyles.headerActionGroup}>\n {headerActionButtons}\n </div>\n )}\n {relationsMenuNode != null && (\n <div className={pageStyles.headerRelationGroup}>\n {relationsMenuNode}\n </div>\n )}\n </div>\n ) : undefined;\n\n const headerMetaNode =\n header.status != null || header.badges != null ? (\n <div className={pageStyles.headerMeta}>\n {header.status}\n {header.badges}\n </div>\n ) : undefined;\n\n const headerItemsNode =\n header.items != null && header.items.length > 0 ? (\n <div className={pageStyles.headerMetaList}>\n <BackofficeKeyValueList items={header.items} />\n </div>\n ) : null;\n\n const hasAside = secondaryNodes.length > 0;\n let tabsNode: JSX.Element | null = null;\n if (pages.length > 1) {\n tabsNode = (\n <Tabs\n items={tabsItems}\n activeId={activePage.id}\n variant=\"underline\"\n />\n );\n }\n const headerNode = (\n <div className={pageStyles.headerBlock}>\n <BackofficePageHeader\n title={header.title}\n subtitle={header.subtitle}\n actions={headerActions}\n meta={headerMetaNode}\n />\n {headerItemsNode}\n </div>\n );\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n headerNode={headerNode}\n tabsNode={tabsNode}\n sidePanel={hasAside ? <>{secondaryNodes}</> : undefined}\n sidePanelVariant=\"plain\"\n headerDensity=\"compact\"\n >\n <>{primaryNodes}</>\n </DetailPageTemplate>\n {activeFormAction != null &&\n isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={view}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n />\n )}\n </BackofficeRightPageLayout>\n );\n }}\n />\n );\n};\n\nexport const BackofficeEntityDetailPage = ({\n config,\n prepared,\n}: BackofficeEntityDetailPageProps): JSX.Element => {\n const { layoutView } = useBackofficeEntityDetailLayoutContext();\n\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath: prepared.pagePath,\n node: layoutView as never,\n });\n\n if (!resolvedPages.hasVisiblePages || resolvedPages.activePage == null) {\n throw new HttpRedirect(config.routes.list);\n }\n\n if (resolvedPages.activePage.id !== prepared.pageId) {\n throw new HttpRedirect(\n config.routes.detailPage(prepared.id, resolvedPages.activePage.id),\n );\n }\n\n return (\n <BackofficeEntityDetailPageContent\n config={prepared.pageConfig}\n prepared={prepared}\n />\n );\n};\n\nexport default BackofficeEntityDetailPage;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeEntityDetailPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailPage.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX, type ReactNode, useContext, useMemo, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n commitMutation,\n type PreloadedQuery,\n useFragment,\n usePreloadedQuery,\n} from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\nimport { resolveMutationOutcome } from '../relay/mutationResult.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport {\n buildBackofficeFallbackListHref,\n buildBackofficeListHref,\n buildBackofficeListLink,\n} from '@plumile/backoffice-core/state/buildListHref.js';\n\nimport { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeResolvedDetailLayoutFacetConfigBase,\n BackofficeResolvedDetailPageFacetConfig,\n BackofficeResolvedDetailPageFacetConfigBase,\n} from '@plumile/backoffice-core/types.js';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { LinkButton } from '@plumile/ui/atomic/atoms/button/LinkButton.js';\nimport { FormattedDate } from '@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js';\nimport { Tabs } from '@plumile/ui/atomic/molecules/tabs/Tabs.js';\nimport { useToast } from '@plumile/ui/atomic/molecules/toast/ToastProvider.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport { BackofficeKeyValueList } from '@plumile/ui/backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { BackofficePayloadViewer } from '@plumile/ui/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js';\nimport {\n BackofficeRelationsMenu,\n type BackofficeRelationsMenuItem,\n} from '@plumile/ui/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js';\nimport { BackofficeScopeStack } from '@plumile/ui/backoffice/molecules/backoffice_scope_stack/BackofficeScopeStack.js';\nimport { AuditTimeline } from '@plumile/ui/backoffice/organisms/audit_timeline/AuditTimeline.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\nimport { MetricCard } from '@plumile/ui/components/dashboard/metric_card/MetricCard.js';\nimport { MetricTileGroup } from '@plumile/ui/components/dashboard/metric_tile_group/MetricTileGroup.js';\nimport { DataTable } from '@plumile/ui/components/data-table/DataTable.js';\nimport { ChatCheckSvg } from '@plumile/ui/icons/ChatCheckSvg.js';\nimport { KeyOffSvg } from '@plumile/ui/icons/KeyOffSvg.js';\nimport { KeySvg } from '@plumile/ui/icons/KeySvg.js';\nimport { LockOpenSvg } from '@plumile/ui/icons/LockOpenSvg.js';\nimport { LockSvg } from '@plumile/ui/icons/LockSvg.js';\nimport { RobotCheckSvg } from '@plumile/ui/icons/RobotCheckSvg.js';\nimport { RobotXSvg } from '@plumile/ui/icons/RobotXSvg.js';\nimport { RocketOffSvg } from '@plumile/ui/icons/RocketOffSvg.js';\nimport { RocketSvg } from '@plumile/ui/icons/RocketSvg.js';\nimport { SettingsCheckSvg } from '@plumile/ui/icons/SettingsCheckSvg.js';\nimport { SettingsXSvg } from '@plumile/ui/icons/SettingsXSvg.js';\nimport { ShieldLockSvg } from '@plumile/ui/icons/ShieldLockSvg.js';\nimport { ShieldOffSvg } from '@plumile/ui/icons/ShieldOffSvg.js';\nimport { XBadgeSvg } from '@plumile/ui/icons/XBadgeSvg.js';\nimport HttpRedirect from '@plumile/router/errors/HttpRedirect.js';\nimport Link from '@plumile/router/routing/Link.js';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\n\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { BackofficeEntityDetailScaffold } from '../components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js';\nimport { BackofficeDetailBadgeRow } from '../components/backoffice/detail/BackofficeDetailBadgeRow.js';\nimport { BackofficeDetailFlagTag } from '../components/backoffice/detail/BackofficeDetailFlagTag.js';\nimport { BackofficeDetailTaggedValue } from '../components/backoffice/detail/BackofficeDetailTaggedValue.js';\nimport { BackofficeLifecycleTimelineSection } from '../components/backoffice/detail/BackofficeLifecycleTimelineSection.js';\nimport { BackofficeRelationsSummaryGrid } from '../components/backoffice/detail/BackofficeRelationsSummaryGrid.js';\nimport { LazyBackofficeEntityActionFormDialog } from '../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js';\nimport {\n resolveToastSpec,\n resolveToastViewActions,\n} from '../components/backoffice/actions/toastViewAction.js';\nimport * as pageStyles from './backofficeEntityDetailPage.css.js';\nimport { useBackofficeFormats } from '../i18n/useBackofficeFormats.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\nimport { useBackofficeEntityDetailLayoutContext } from './detail/BackofficeEntityDetailLayoutContext.js';\nimport { buildTabsItems } from './detail/buildTabsItems.js';\nimport { resolveVisibleDetailPages } from './detail/pageResolution.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityDetailBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n extractMutationPayload,\n isFormMutationAction,\n isMutationAction,\n isRouteAction,\n resolveLabel,\n} from './BackofficeEntityDetailPage.helpers.js';\nimport {\n buildFieldItems,\n renderBlocks,\n resolveHeaderItems,\n type FlagIconName,\n} from './BackofficeEntityDetailPage.view-helpers.js';\n\nexport type BackofficeEntityDetailPageProps = {\n config: BackofficeResolvedDetailLayoutFacetConfigBase;\n prepared: {\n id: string;\n detailId?: string;\n pageConfig: BackofficeResolvedDetailPageFacetConfigBase;\n pageQuery: PreloadedQuery<OperationType>;\n pageId: string;\n pagePath: string;\n };\n};\n\nconst renderFlagIcon = (iconName: FlagIconName): JSX.Element => {\n const iconSize = 14;\n switch (iconName) {\n case 'shield-lock':\n return (\n <ShieldLockSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'shield-off':\n return (\n <ShieldOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'settings-check':\n return (\n <SettingsCheckSvg\n width={iconSize}\n height={iconSize}\n aria-hidden=\"true\"\n />\n );\n case 'settings-x':\n return (\n <SettingsXSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'x-badge':\n return (\n <XBadgeSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'chat-check':\n return (\n <ChatCheckSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'key':\n return <KeySvg width={iconSize} height={iconSize} aria-hidden=\"true\" />;\n case 'key-off':\n return (\n <KeyOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'lock':\n return <LockSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />;\n case 'lock-open':\n return (\n <LockOpenSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'robot-check':\n return (\n <RobotCheckSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'robot-x':\n return (\n <RobotXSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'rocket':\n return (\n <RocketSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n case 'rocket-off':\n return (\n <RocketOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n );\n default:\n throw new Error(`Unsupported flag icon: ${String(iconName)}`);\n }\n};\n\nconst resolveDetailPlacement = (item: {\n placement?: 'primary' | 'secondary' | 'main' | 'side' | 'fullWidth';\n presentation?: {\n group?: string;\n desktop?: 'primary' | 'secondary' | 'fullWidth';\n };\n kind?: string;\n fields?: readonly {\n presentation?: {\n group?: string;\n desktop?: 'primary' | 'secondary' | 'fullWidth';\n };\n }[];\n}): 'primary' | 'secondary' => {\n if (item.presentation?.desktop === 'secondary') {\n return 'secondary';\n }\n if (\n item.presentation?.group === 'scope' ||\n item.presentation?.group === 'status'\n ) {\n return 'secondary';\n }\n const fieldGroups =\n item.fields?.map((field) => {\n return field.presentation?.group;\n }) ?? [];\n if (\n fieldGroups.length > 0 &&\n fieldGroups.every((group) => {\n return group === 'scope' || group === 'status';\n })\n ) {\n return 'secondary';\n }\n if (item.placement === 'side') {\n return 'secondary';\n }\n if (item.placement === 'secondary') {\n return 'secondary';\n }\n return 'primary';\n};\n\nconst BackofficeEntityDetailPageContent = ({\n config,\n prepared,\n}: {\n config: BackofficeResolvedDetailPageFacetConfig;\n prepared: {\n pageQuery: PreloadedQuery<OperationType>;\n id: string;\n detailId?: string;\n pageId: string;\n pagePath: string;\n };\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { formatNumber, formatCurrency, formatCurrencyTitle, formatPercent } =\n useBackofficeFormats();\n const { entities, entityRegistry } = useBackofficeConfig();\n const { layoutView } = useBackofficeEntityDetailLayoutContext();\n const routing = useContext(RoutingContext);\n const environment = useRelayEnvironment();\n const toast = useToast();\n const [actionState, setActionState] = useState<Record<string, boolean>>({});\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath: prepared.pagePath,\n node: layoutView as never,\n });\n const activePage = resolvedPages.activePage ?? config.pages.mainPage;\n const pages =\n resolvedPages.pages.length > 0\n ? resolvedPages.pages\n : [config.pages.mainPage];\n\n const setActionLoading = (actionId: string, isLoading: boolean) => {\n setActionState((prev) => {\n if (prev[actionId] === isLoading) {\n return prev;\n }\n return { ...prev, [actionId]: isLoading };\n });\n };\n\n const { page } = config;\n\n const pageQueryData = usePreloadedQuery(page.query, prepared.pageQuery);\n const pageNodeRef = page.resolveNode(pageQueryData, {\n id: prepared.id,\n detailId: prepared.detailId,\n });\n const hasPageNode = pageNodeRef != null;\n const resolvedNode = useFragment(page.fragment, pageNodeRef as never);\n const relationEntityListRoutes = useMemo(() => {\n return Object.fromEntries(\n page.content\n .flatMap((block) => {\n if (block.kind !== 'fieldSet') {\n return [];\n }\n\n return block.fields.flatMap((field) => {\n if (field.type !== 'relation') {\n return [];\n }\n return [field.relation.target];\n });\n })\n .flatMap((entityId) => {\n const entityManifest = entities[entityId];\n if (entityManifest?.hasList !== true) {\n return [];\n }\n return [[entityId, entityManifest.routes.list]];\n }),\n );\n }, [entities, page.content]);\n\n if (!hasPageNode) {\n throw new HttpRedirect(config.routes.list);\n }\n\n return (\n <BackofficeEntityDetailScaffold\n node={resolvedNode}\n render={(node) => {\n const view = page.toView(node);\n const tabsItems = buildTabsItems({\n pages,\n id: prepared.id,\n tApp,\n detailPageHref: config.routes.detailPage,\n });\n const resolveEntityHref = (entityId: string, refId: string) => {\n const entityConfig = entities[entityId];\n if (entityConfig == null) {\n return null;\n }\n return entityConfig.routes.detail(refId);\n };\n const resolveRelationItem = ({\n id,\n label,\n count,\n relation,\n listRoute,\n value,\n where,\n }: {\n id: string;\n label: string;\n count: number | null;\n relation: {\n target: string;\n filterId?: string;\n whereKey: string;\n path?: readonly string[];\n };\n listRoute: string;\n value: string;\n where: Record<string, unknown>;\n }): BackofficeRelationsMenuItem => {\n const { target, filterId, whereKey, path } = relation;\n const loadedEntity = entityRegistry.getLoadedListEntity(target);\n return {\n id,\n label,\n count,\n href:\n loadedEntity == null\n ? buildBackofficeFallbackListHref(listRoute, where, [\n {\n id:\n filterId ??\n (path == null\n ? whereKey\n : `${whereKey}.${path.join('.')}`),\n value,\n },\n ])\n : buildBackofficeListHref(loadedEntity.config, { where }),\n onClick: async (event) => {\n if (\n routing == null ||\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n\n event.preventDefault();\n\n const listEntity = await entityRegistry.loadListEntity(target);\n const next = buildBackofficeListLink(listEntity.config, {\n where,\n });\n\n routing.history.push({\n pathname: next.pathname,\n search: next.search === '' ? '' : `?${next.search}`,\n hash: '',\n });\n },\n };\n };\n\n const header = resolveHeaderItems(config.header, layoutView, {\n tApp,\n t,\n resolveEntityHref,\n renderLink: (href, label) => {\n return <Link to={href}>{label}</Link>;\n },\n renderDate: (value, fallback) => {\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n },\n renderTag: (tone, label) => {\n return <Tag tone={tone}>{label}</Tag>;\n },\n renderBadgeRow: (items) => {\n return <BackofficeDetailBadgeRow items={items} />;\n },\n });\n const breadcrumb = buildEntityDetailBreadcrumb({\n config,\n tApp,\n entityId: prepared.id,\n layoutView,\n pageLabel: activePage.label(tApp),\n pageId: activePage.id,\n });\n\n const actions = page.actions ?? [];\n let headerActionButtons: ReactNode[] = [];\n if (actions.length > 0) {\n const visibleActions = actions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(view);\n });\n\n if (visibleActions.length > 0) {\n headerActionButtons = visibleActions.map((action) => {\n const label = resolveLabel(action.label, tApp);\n const ariaLabel =\n action.ariaLabel != null\n ? resolveLabel(action.ariaLabel, tApp)\n : label;\n const variant = action.variant ?? 'secondary';\n const size = action.size ?? 'small';\n const isLoading = actionState[action.id] ?? false;\n const isDisabled =\n isLoading || action.isDisabled?.(view) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(view);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n isLoading={false}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n if (isMutationAction(action)) {\n const handleClick = () => {\n if (isLoading) {\n return;\n }\n const variables = action.getVariables(view);\n setActionLoading(action.id, true);\n commitMutation(environment, {\n mutation: action.mutation,\n variables,\n updater: (store) => {\n action.updater?.(store, view);\n },\n onCompleted: (response) => {\n setActionLoading(action.id, false);\n const mutationPayload = extractMutationPayload(response);\n if (mutationPayload != null) {\n let defaultErrorMessage = t(\n 'actions.form.errors.invalidPayload',\n );\n if (action.toasts?.error?.message != null) {\n defaultErrorMessage = resolveLabel(\n action.toasts.error.message,\n tApp,\n );\n } else if (action.toasts?.error?.title != null) {\n defaultErrorMessage = resolveLabel(\n action.toasts.error.title,\n tApp,\n );\n }\n\n const outcome = resolveMutationOutcome(\n mutationPayload,\n {\n defaultErrorMessage,\n mapReason: (reason) => {\n const mapped = action.mapErrorReason?.(\n reason,\n view,\n );\n if (mapped == null) {\n return null;\n }\n if (typeof mapped === 'function') {\n return resolveLabel(mapped, tApp);\n }\n return String(mapped);\n },\n },\n );\n if (!outcome.ok) {\n const error = new Error(outcome.message);\n action.onError?.(error, view);\n if (action.toasts?.error != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.error,\n tApp,\n );\n toast.error(toastSpec.title, toastSpec.message);\n }\n return;\n }\n }\n\n action.onCompleted?.(response, view);\n if (action.toasts?.success != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.success,\n tApp,\n );\n const toastActions = resolveToastViewActions({\n toast: action.toasts.success,\n response,\n node: view,\n tApp,\n entities,\n defaultLabel: t('actions.view'),\n navigateTo: (to) => {\n routing?.history.push({ pathname: to });\n },\n });\n toast.push({\n kind: 'info',\n title: toastSpec.title,\n message: toastSpec.message,\n actions: toastActions,\n });\n }\n },\n onError: (error) => {\n setActionLoading(action.id, false);\n action.onError?.(error, view);\n if (action.toasts?.error != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.error,\n tApp,\n );\n toast.error(toastSpec.title, toastSpec.message);\n }\n },\n });\n };\n\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n isLoading={isLoading}\n disabled={isDisabled}\n onClick={handleClick}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n });\n }\n }\n\n const activeFormAction = actions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n const { content } = page;\n\n const primaryNodes: ReactNode[] = [];\n const secondaryNodes: ReactNode[] = [];\n const relationMenuItems: BackofficeRelationsMenuItem[] = [];\n\n content.forEach((item, index) => {\n const placement = resolveDetailPlacement(item);\n const targetNodes =\n placement === 'secondary' ? secondaryNodes : primaryNodes;\n\n if (item.kind === 'fieldSet') {\n const sectionLabel = resolveLabel(item.title, tApp);\n const description =\n item.description != null\n ? resolveLabel(item.description, tApp)\n : undefined;\n const { items, relationItems, customNodes } = buildFieldItems(\n item.fields,\n view,\n {\n tApp,\n t,\n resolveEntityHref,\n formatNumber,\n formatCurrency,\n formatCurrencyTitle,\n formatPercent,\n relationEntityListRoutes,\n resolveRelationItem,\n setWhereValue,\n renderTag: (tone, label) => {\n return <Tag tone={tone}>{label}</Tag>;\n },\n renderBadgeRow: (items) => {\n return <BackofficeDetailBadgeRow items={items} />;\n },\n renderDate: (value, fallback) => {\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n },\n renderFlagTag: (tag) => {\n return (\n <BackofficeDetailFlagTag\n tone={tag.tone}\n icon={\n tag.iconName != null\n ? renderFlagIcon(tag.iconName)\n : undefined\n }\n label={tag.label}\n />\n );\n },\n renderLink: (href, label) => {\n return <Link to={href}>{label}</Link>;\n },\n renderTaggedValue: (tag, value) => {\n return (\n <BackofficeDetailTaggedValue\n tag={tag as never}\n value={value}\n />\n );\n },\n wrapCustomNode: (id, custom) => {\n return <div key={id}>{custom}</div>;\n },\n },\n );\n relationItems.forEach((relation) => {\n if (\n !relationMenuItems.some((entry) => {\n return entry.id === relation.id;\n })\n ) {\n relationMenuItems.push(relation);\n }\n });\n\n const hasContent = items.length > 0 || customNodes.length > 0;\n\n if (!hasContent) {\n return;\n }\n\n targetNodes.push(\n <BackofficeDetailSection\n key={`${sectionLabel}-${index}`}\n title={sectionLabel}\n description={description}\n items={items.length > 0 ? items : undefined}\n >\n {customNodes}\n </BackofficeDetailSection>,\n );\n return;\n }\n\n const rendered = renderBlocks([item], view, {\n tApp,\n t,\n resolveEntityHref,\n keyPrefix: String(index),\n renderLink: (href, label) => {\n return <Link to={href}>{label}</Link>;\n },\n renderDate: (value, fallback) => {\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n },\n renderTag: (tone, label) => {\n return <Tag tone={tone}>{label}</Tag>;\n },\n renderMetricGroup: ({\n key,\n title,\n description,\n density,\n items,\n }) => {\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n {items.length > 0 && (\n <MetricTileGroup\n density={density ?? 'comfortable'}\n minColumn=\"180\"\n >\n {items.map((metric) => {\n return (\n <MetricCard\n key={metric.id}\n label={metric.label}\n value={metric.value}\n hint={metric.hint}\n tone={metric.tone ?? 'neutral'}\n density={density ?? 'comfortable'}\n copyValue={metric.copyValue}\n copyLabel={t('common.actions.copy')}\n copiedLabel={t('common.actions.copied')}\n />\n );\n })}\n </MetricTileGroup>\n )}\n </BackofficeDetailSection>\n );\n },\n renderTimeline: ({ key, title, description, events }) => {\n return (\n <BackofficeLifecycleTimelineSection\n key={key}\n title={title}\n description={description}\n events={events}\n />\n );\n },\n renderAuditTimeline: ({ key, title, description, events }) => {\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <AuditTimeline events={events} />\n </BackofficeDetailSection>\n );\n },\n renderRelations: ({ key, title, items }) => {\n return (\n <BackofficeRelationsSummaryGrid\n key={key}\n title={title}\n items={items}\n />\n );\n },\n renderContextStack: ({ key, title, items }) => {\n return (\n <BackofficeScopeStack key={key} title={title} items={items} />\n );\n },\n renderCustomSection: (key, title, child) => {\n return (\n <BackofficeDetailSection key={key} title={title}>\n {child}\n </BackofficeDetailSection>\n );\n },\n wrapCustomNode: (key, custom) => {\n return <div key={key}>{custom}</div>;\n },\n resolveTableColumns: (columns) => {\n return buildDataTableColumns(columns as never, {\n tApp,\n t,\n });\n },\n renderTable: ({ key, title, description, columns, rows }) => {\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <DataTable\n columns={columns as never}\n rows={rows}\n getRowId={(row, rowIndex) => {\n if (row != null && typeof row === 'object') {\n const record = row as Record<string, unknown>;\n const maybeId = record.id;\n if (\n typeof maybeId === 'string' &&\n maybeId.trim() !== ''\n ) {\n return maybeId;\n }\n }\n return String(rowIndex);\n }}\n />\n </BackofficeDetailSection>\n );\n },\n renderPayload: ({ key, title, description, content, format }) => {\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <BackofficePayloadViewer\n content={content}\n format={format as never}\n emptyState={t('common.notAvailable')}\n />\n </BackofficeDetailSection>\n );\n },\n renderKeyValueListSection: ({ key, title, description, items }) => {\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <BackofficeKeyValueList items={items} />\n </BackofficeDetailSection>\n );\n },\n });\n const blockNode = rendered[0];\n if (blockNode != null) {\n targetNodes.push(blockNode);\n }\n });\n\n const relationsMenuNode =\n relationMenuItems.length > 0 ? (\n <BackofficeRelationsMenu\n label={t('relations.menu.label')}\n items={relationMenuItems}\n />\n ) : null;\n\n const headerActions =\n headerActionButtons.length > 0 || relationsMenuNode != null ? (\n <div className={pageStyles.headerActions}>\n {headerActionButtons.length > 0 && (\n <div className={pageStyles.headerActionGroup}>\n {headerActionButtons}\n </div>\n )}\n {relationsMenuNode != null && (\n <div className={pageStyles.headerRelationGroup}>\n {relationsMenuNode}\n </div>\n )}\n </div>\n ) : undefined;\n\n const headerMetaNode =\n header.status != null || header.badges != null ? (\n <div className={pageStyles.headerMeta}>\n {header.status}\n {header.badges}\n </div>\n ) : undefined;\n\n const headerItemsNode =\n header.items != null && header.items.length > 0 ? (\n <div className={pageStyles.headerMetaList}>\n <BackofficeKeyValueList items={header.items} />\n </div>\n ) : null;\n\n const hasAside = secondaryNodes.length > 0;\n let tabsNode: JSX.Element | null = null;\n if (pages.length > 1) {\n tabsNode = (\n <Tabs\n items={tabsItems}\n activeId={activePage.id}\n variant=\"underline\"\n />\n );\n }\n const headerNode = (\n <div className={pageStyles.headerBlock}>\n <BackofficePageHeader\n title={header.title}\n subtitle={header.subtitle}\n actions={headerActions}\n meta={headerMetaNode}\n />\n {headerItemsNode}\n </div>\n );\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n headerNode={headerNode}\n tabsNode={tabsNode}\n sidePanel={hasAside ? <>{secondaryNodes}</> : undefined}\n sidePanelVariant=\"plain\"\n headerDensity=\"compact\"\n >\n <>{primaryNodes}</>\n </DetailPageTemplate>\n {activeFormAction != null &&\n isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={view}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n />\n )}\n </BackofficeRightPageLayout>\n );\n }}\n />\n );\n};\n\nexport const BackofficeEntityDetailPage = ({\n config,\n prepared,\n}: BackofficeEntityDetailPageProps): JSX.Element => {\n const { layoutView } = useBackofficeEntityDetailLayoutContext();\n\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath: prepared.pagePath,\n node: layoutView as never,\n });\n\n if (!resolvedPages.hasVisiblePages || resolvedPages.activePage == null) {\n throw new HttpRedirect(config.routes.list);\n }\n\n if (resolvedPages.activePage.id !== prepared.pageId) {\n throw new HttpRedirect(\n config.routes.detailPage(prepared.id, resolvedPages.activePage.id),\n );\n }\n\n return (\n <BackofficeEntityDetailPageContent\n config={prepared.pageConfig}\n prepared={prepared}\n />\n );\n};\n\nexport default BackofficeEntityDetailPage;\n"],"mappings":"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"}