@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.
- package/lib/esm/auth/AuthRefreshNotice.js.map +1 -1
- package/lib/esm/auth/TotpQrCode.js.map +1 -1
- package/lib/esm/auth/authRefreshNotice.css.js +1 -1
- package/lib/esm/auth/login/AuthPanel.js.map +1 -1
- package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
- package/lib/esm/auth/login/LoginFlow.js.map +1 -1
- package/lib/esm/auth/login/MethodChooser.js.map +1 -1
- package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
- package/lib/esm/auth/login/OidcButtons.js.map +1 -1
- package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
- package/lib/esm/auth/login/PasswordLoginPanel.js.map +1 -1
- package/lib/esm/auth/login/loginPage.css.js +1 -1
- package/lib/esm/auth/login/loginPage.css.js.map +1 -1
- package/lib/esm/auth/login/synchronizeAuthStatusQuery.js.map +1 -1
- package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
- package/lib/esm/auth/pages/VerifyEmailScreen.js.map +1 -1
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +14 -14
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
- package/lib/esm/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js.map +1 -1
- package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js +1 -1
- package/lib/esm/components/backoffice/actions/toastViewAction.js.map +1 -1
- package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js +1 -1
- package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js.map +1 -1
- package/lib/esm/components/backoffice/billing/backofficeBillingUsageChart.css.js +1 -1
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailRelationList.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +6 -6
- package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeEnumLabel.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeLifecycleTimelineSection.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeReferenceValue.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeStatusMetaBadge.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js +13 -13
- package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js.map +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js +2 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js +1 -1
- package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js +1 -1
- package/lib/esm/components/backoffice/detail/createBackofficeEntityLinkProps.js.map +1 -1
- package/lib/esm/components/backoffice/detail/detailPayloadUtils.js.map +1 -1
- package/lib/esm/components/backoffice/errors/BackofficeErrorBoundary.js.map +1 -1
- package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js.map +1 -1
- package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js.map +1 -1
- package/lib/esm/components/backoffice/filters/EntityFilterValue.js.map +1 -1
- package/lib/esm/components/backoffice/filters/EntityIdFilterField.js +1 -1
- package/lib/esm/components/backoffice/filters/EntityIdFilterField.js.map +1 -1
- package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js +1 -1
- package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js.map +1 -1
- package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +1 -1
- package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js +1 -1
- package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +5 -5
- package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js.map +1 -1
- package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js +1 -1
- package/lib/esm/components/backoffice/layout/BackofficePermissionsContext.js.map +1 -1
- package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +2 -2
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortal.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js +1 -2
- package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js.map +1 -1
- package/lib/esm/components/backoffice/layout/buildSidebarSections.js.map +1 -1
- package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js.map +1 -1
- package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeInlineLink.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeLink.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +1 -1
- package/lib/esm/components/backoffice/links/BackofficeLinkContent.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js.map +1 -1
- package/lib/esm/components/backoffice/links/backofficeLink.css.js +1 -1
- package/lib/esm/components/backoffice/links/resolveBackofficeLink.js.map +1 -1
- package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js.map +1 -1
- package/lib/esm/components/backoffice/links/useBackofficeLink.js.map +1 -1
- package/lib/esm/components/backoffice/list/RowFlagsCell.css.js +1 -1
- package/lib/esm/components/backoffice/list/RowFlagsCell.js.map +1 -1
- package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js.map +1 -1
- package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js +1 -1
- package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js.map +1 -1
- package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
- package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
- package/lib/esm/components/backoffice/refs/backofficeEntityIdRef.css.js +1 -1
- package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js +1 -1
- package/lib/esm/components/backoffice/routing/BackofficeContentBoundary.js.map +1 -1
- package/lib/esm/components/backoffice/routing/BackofficeContentError.js.map +1 -1
- package/lib/esm/components/backoffice/routing/BackofficeContentFallback.js.map +1 -1
- package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js.map +1 -1
- package/lib/esm/components/backoffice/routing/BackofficeRoutePendingBar.js.map +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentError.css.js +1 -1
- package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js +1 -1
- package/lib/esm/components/backoffice/routing/backofficeRouteFallback.css.js +1 -1
- package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js +1 -1
- package/lib/esm/components/backoffice/routing/backofficeRoutePendingBar.css.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeListFilterContext.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +1 -1
- package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeFormattedCurrency.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeFormattedNumber.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js.map +1 -1
- package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js +5 -5
- package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js.map +1 -1
- package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js.map +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js.map +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js.map +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js.map +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js +1 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js +1 -1
- package/lib/esm/components/backoffice/tools/parseToolJson.js.map +1 -1
- package/lib/esm/filters/filterHelpers.js.map +1 -1
- package/lib/esm/hooks/useAuth.js.map +1 -1
- package/lib/esm/hooks/useBackofficeAuth.js.map +1 -1
- package/lib/esm/hooks/useBackofficeInfiniteScrollSentinel.js.map +1 -1
- package/lib/esm/hooks/useBackofficeListRefetch.js.map +1 -1
- package/lib/esm/hooks/useBackofficeListUrlState.js.map +1 -1
- package/lib/esm/hooks/useBackofficeLoadMore.js.map +1 -1
- package/lib/esm/hooks/useBackofficeSessionAuth.js.map +1 -1
- package/lib/esm/hooks/useBackofficeSidebarPins.js.map +1 -1
- package/lib/esm/hooks/useConditionalSubscription.js.map +1 -1
- package/lib/esm/hooks/useCopyToClipboard.js.map +1 -1
- package/lib/esm/hooks/useInfiniteConnection.js.map +1 -1
- package/lib/esm/hooks/useRefetchNeededReload.js.map +1 -1
- package/lib/esm/hooks/useSidebarGroupCollapse.js.map +1 -1
- package/lib/esm/i18n/createI18nInstance.js.map +1 -1
- package/lib/esm/i18n/mergeResourceLanguages.js.map +1 -1
- package/lib/esm/i18n/resources.js.map +1 -1
- package/lib/esm/i18n/useBackofficeFormats.js.map +1 -1
- package/lib/esm/i18n/useBackofficeReactTranslation.js.map +1 -1
- package/lib/esm/i18n/useReviewStatusLabel.js.map +1 -1
- package/lib/esm/modules/base64.js.map +1 -1
- package/lib/esm/modules/formatFileSize.js.map +1 -1
- package/lib/esm/modules/webauthn.js.map +1 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/arrayLikeToArray.js.map +1 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js.map +1 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/defineProperty.js.map +1 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/interopRequireDefault.js.map +1 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/iterableToArray.js.map +1 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/nonIterableSpread.js.map +1 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/objectSpread2.js.map +1 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js.map +1 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/toConsumableArray.js.map +1 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/toPrimitive.js.map +1 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/toPropertyKey.js.map +1 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/typeof.js.map +1 -1
- package/lib/esm/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js.map +1 -1
- package/lib/esm/node_modules/@vanilla-extract/recipes/dist/createRuntimeFn-62c9670f.esm.js.map +1 -1
- package/lib/esm/node_modules/fbjs/lib/areEqual.js.map +1 -1
- package/lib/esm/node_modules/invariant/browser.js.map +1 -1
- package/lib/esm/node_modules/relay-test-utils/index.js.map +1 -1
- package/lib/esm/node_modules/relay-test-utils/lib/RelayMockPayloadGenerator.js.map +1 -1
- package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js.map +1 -1
- package/lib/esm/node_modules/relay-test-utils/lib/RelayResolverTestUtils.js.map +1 -1
- package/lib/esm/node_modules/relay-test-utils/lib/index.js.map +1 -1
- package/lib/esm/node_modules/relay-test-utils/lib/unwrapContainer.js.map +1 -1
- package/lib/esm/pages/BackofficeAcceptInvitationPage.js.map +1 -1
- package/lib/esm/pages/BackofficeDashboardPage.helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.js +2 -2
- package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailUnknownPageRedirect.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListPage.helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
- package/lib/esm/pages/BackofficeHubPage.js.map +1 -1
- package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
- package/lib/esm/pages/BackofficeLoginPage.js.map +1 -1
- package/lib/esm/pages/BackofficePasswordResetCompletePage.js.map +1 -1
- package/lib/esm/pages/BackofficePasswordResetRequestPage.js.map +1 -1
- package/lib/esm/pages/BackofficeVerifyEmailPage.js.map +1 -1
- package/lib/esm/pages/backofficeDashboardPage.css.js +1 -1
- package/lib/esm/pages/backofficeEntityDetailPage.css.js +1 -1
- package/lib/esm/pages/backofficeEntityListPage.css.js +1 -1
- package/lib/esm/pages/detail/BackofficeEntityDetailLayoutContext.js.map +1 -1
- package/lib/esm/pages/detail/buildTabsItems.js.map +1 -1
- package/lib/esm/pages/detail/pageResolution.js.map +1 -1
- package/lib/esm/provider/BackofficeConfigContext.js.map +1 -1
- package/lib/esm/provider/BackofficeProvider.js.map +1 -1
- package/lib/esm/provider/dashboardRegistrations.js.map +1 -1
- package/lib/esm/provider/entityRegistry.js.map +1 -1
- package/lib/esm/provider/lazyValue.js.map +1 -1
- package/lib/esm/provider/useBackofficeEntityLoader.js.map +1 -1
- package/lib/esm/provider/useBackofficeLazyValue.js.map +1 -1
- package/lib/esm/relay/RelayProvider.js.map +1 -1
- package/lib/esm/relay/connectionUtils.js.map +1 -1
- package/lib/esm/relay/createInlineReader.js.map +1 -1
- package/lib/esm/relay/envHelpers.js.map +1 -1
- package/lib/esm/relay/environment.js.map +1 -1
- package/lib/esm/relay/mutationResult.js.map +1 -1
- package/lib/esm/router/backofficeAuthPaths.js.map +1 -1
- package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
- package/lib/esm/storybook/relay/RelayStory.css.js +1 -1
- package/lib/esm/storybook/relay/RelayStory.js.map +1 -1
- package/lib/esm/storybook/relay/mockResolvers.js.map +1 -1
- package/lib/esm/style.css +1 -1
- package/lib/esm/subscriptions/useCursorResumableSubscription.js.map +1 -1
- package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.stories.d.ts +1 -1
- package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.stories.d.ts.map +1 -1
- package/lib/types/components/backoffice/overview/backofficeOverviewLayout.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/tools/backofficeToolsDocPanel.css.d.ts.map +1 -1
- 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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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: "
|
|
464
|
+
className: "txvbqbfpn txvbqbey txvbqblsh txvbqbhdl txvbqbh7g",
|
|
465
465
|
children: b
|
|
466
466
|
}), D != null && /* @__PURE__ */ S("div", {
|
|
467
|
-
className: "
|
|
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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"}
|