@plumile/backoffice-react 0.1.188 → 0.1.190
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/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/PasskeyLoginForm.js.map +1 -1
- package/lib/esm/auth/login/loginPage.css.js +2 -0
- 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/LazyBackofficeEntityActionFormDialog.js.map +1 -1
- package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js.map +1 -1
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeLifecycleTimelineSection.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js.map +1 -1
- package/lib/esm/components/backoffice/detail/backofficeDetailRelationLink.css.js +1 -0
- package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js +0 -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/filters/backofficeFilterAction.css.js +0 -1
- package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +0 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.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/resolveBackofficeLink.js.map +1 -1
- package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js.map +1 -1
- package/lib/esm/components/backoffice/list/RowFlagsCell.js.map +1 -1
- package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeLazyEntityCount.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
- package/lib/esm/components/backoffice/routing/BackofficeContentBoundary.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +368 -281
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +2 -2
- package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js.map +1 -1
- package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js +1 -1
- package/lib/esm/components/backoffice/technical/TechnicalIdentifierValue.js.map +1 -1
- package/lib/esm/filters/filterHelpers.js +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/useBackofficeListUrlState.js.map +1 -1
- package/lib/esm/hooks/useBackofficeSessionAuth.js.map +1 -1
- package/lib/esm/hooks/useConditionalSubscription.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/locales/en/backofficeReact.js +409 -405
- package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
- package/lib/esm/i18n/locales/fr/backofficeReact.js +412 -407
- package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
- package/lib/esm/i18n/mergeResourceLanguages.js.map +1 -1
- package/lib/esm/i18n/resources.js +1 -1
- package/lib/esm/i18n/resources.js.map +1 -1
- package/lib/esm/i18n/useBackofficeFormats.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/uploads.js +17 -17
- package/lib/esm/modules/uploads.js.map +1 -1
- package/lib/esm/modules/webauthn.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/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/unsupportedIterableToArray.js.map +1 -1
- package/lib/esm/node_modules/@vanilla-extract/recipes/dist/createRuntimeFn-62c9670f.esm.js +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/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/pages/BackofficeDashboardPage.js.map +1 -1
- package/lib/esm/pages/BackofficeDashboardWidgetContent.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListDataPage.js +77 -70
- package/lib/esm/pages/BackofficeEntityListDataPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListPage.helpers.js +5 -5
- package/lib/esm/pages/BackofficeEntityListPage.helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListPage.js +89 -85
- package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListRouteContext.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/BackofficePasswordResetRequestPage.js.map +1 -1
- package/lib/esm/pages/BackofficeVerifyEmailPage.js.map +1 -1
- package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js.map +1 -1
- package/lib/esm/pages/detail/pageResolution.js.map +1 -1
- package/lib/esm/provider/BackofficeListUiStateContext.js +88 -0
- package/lib/esm/provider/BackofficeListUiStateContext.js.map +1 -0
- package/lib/esm/provider/BackofficeProvider.js +80 -79
- package/lib/esm/provider/BackofficeProvider.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/relay/connectionUtils.js.map +1 -1
- package/lib/esm/relay/envHelpers.js.map +1 -1
- package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
- package/lib/esm/storybook/relay/RelayStory.js.map +1 -1
- package/lib/esm/storybook/relay/mockResolvers.js.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeLifecycleTimelineSection.d.ts.map +1 -1
- package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts +2 -0
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/backofficeEntityListScaffold.css.d.ts +2 -0
- package/lib/types/components/backoffice/scaffolds/backofficeEntityListScaffold.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/technical/TechnicalIdentifierValue.d.ts.map +1 -1
- package/lib/types/filters/filterHelpers.d.ts.map +1 -1
- package/lib/types/hooks/useAuth.d.ts.map +1 -1
- package/lib/types/i18n/resources.d.ts +7 -0
- package/lib/types/i18n/resources.d.ts.map +1 -1
- package/lib/types/modules/uploads.d.ts.map +1 -1
- package/lib/types/modules/webauthn.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListDataPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListRouteContext.d.ts +2 -0
- package/lib/types/pages/BackofficeEntityListRouteContext.d.ts.map +1 -1
- package/lib/types/pages/BackofficePasswordResetRequestPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeVerifyEmailPage.d.ts.map +1 -1
- package/lib/types/pages/detail/pageResolution.d.ts.map +1 -1
- package/lib/types/provider/BackofficeListUiStateContext.d.ts +21 -0
- package/lib/types/provider/BackofficeListUiStateContext.d.ts.map +1 -0
- package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
- package/lib/types/provider/types.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,eACM,
|
|
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,CAAC,CAAC,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":"BackofficeDashboardPage.js","names":[],"sources":["../../../src/pages/BackofficeDashboardPage.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { lazy, type JSX, Suspense, useMemo, useState } from 'react';\nimport type {\n BackofficeDashboardConfig,\n BackofficeDashboardContext,\n BackofficeDashboardWindowPreset,\n BackofficeDashboardWindowState,\n BackofficeDashboardWidget,\n BackofficeDashboardWidgetSpan,\n BackofficeDashboardWidgetTabletSpan,\n BackofficeDashboardWidgetSize,\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 { DashboardPanel } from '@plumile/ui/components/dashboard/dashboard_panel/DashboardPanel.js';\nimport { DashboardQuickActions } from '@plumile/ui/components/dashboard/dashboard_quick_actions/DashboardQuickActions.js';\nimport {\n DashboardGrid,\n DashboardGridItem,\n} from '@plumile/ui/components/dashboard/dashboard_grid/DashboardGrid.js';\nimport { useTranslation } from 'react-i18next';\n\nimport { BackofficeErrorBoundary } from '../components/backoffice/errors/BackofficeErrorBoundary.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 { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildDashboardBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n getWidgetLabel,\n resolveLabel,\n} from './BackofficeDashboardPage.helpers.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst LazyBackofficeDashboardWidgetContent = lazy(async () => {\n const module = await import('./BackofficeDashboardWidgetContent.js');\n return {\n default: module.BackofficeDashboardWidgetContent,\n };\n});\n\nconst fallbackDashboardWindowPreset: BackofficeDashboardWindowPreset = {\n id: '24h',\n label: (t) => {\n return t('common.time.lastDay', '24 h');\n },\n durationMs: 24 * 60 * 60 * 1000,\n};\n\nconst defaultDashboardWindowPresets: readonly BackofficeDashboardWindowPreset[] =\n [\n {\n id: '1h',\n label: (t) => {\n return t('common.time.lastHour', '1 h');\n },\n durationMs: 60 * 60 * 1000,\n },\n fallbackDashboardWindowPreset,\n {\n id: '7d',\n label: (t) => {\n return t('common.time.lastSevenDays', '7 j');\n },\n durationMs: 7 * 24 * 60 * 60 * 1000,\n },\n {\n id: '30d',\n label: (t) => {\n return t('common.time.lastThirtyDays', '30 j');\n },\n durationMs: 30 * 24 * 60 * 60 * 1000,\n },\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\ntype DashboardContentProps = {\n config: BackofficeDashboardConfig;\n};\n\nconst resolveDashboardWindowPresets = (\n config: BackofficeDashboardConfig,\n): readonly BackofficeDashboardWindowPreset[] => {\n if (config.windowPresets != null && config.windowPresets.length > 0) {\n return config.windowPresets;\n }\n return defaultDashboardWindowPresets;\n};\n\nconst resolveDefaultDashboardWindowPresetId = (\n config: BackofficeDashboardConfig,\n presets: readonly BackofficeDashboardWindowPreset[],\n): string => {\n if (\n config.defaultWindowPresetId != null &&\n presets.some((preset) => {\n return preset.id === config.defaultWindowPresetId;\n })\n ) {\n return config.defaultWindowPresetId;\n }\n return presets[1]?.id ?? presets[0]?.id ?? '24h';\n};\n\nconst buildDashboardWindowState = (\n preset: BackofficeDashboardWindowPreset,\n nowMs: number,\n): BackofficeDashboardWindowState => {\n const to = new Date(nowMs);\n const from = new Date(nowMs - preset.durationMs);\n return {\n id: preset.id,\n label: preset.label,\n from: from.toISOString(),\n to: to.toISOString(),\n };\n};\n\nconst DashboardContent = ({ config }: DashboardContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const presets = useMemo(() => {\n return resolveDashboardWindowPresets(config);\n }, [config]);\n const [activeWindowPresetId, setActiveWindowPresetId] = useState(() => {\n return resolveDefaultDashboardWindowPresetId(config, presets);\n });\n const [windowNowMs, setWindowNowMs] = useState(() => {\n return Date.now();\n });\n\n const title = resolveLabel(config.title, tApp);\n const subtitle =\n config.subtitle != null ? resolveLabel(config.subtitle, tApp) : undefined;\n const activePreset =\n presets.find((preset) => {\n return preset.id === activeWindowPresetId;\n }) ??\n presets[0] ??\n fallbackDashboardWindowPreset;\n const dashboardContext: BackofficeDashboardContext = {\n window: buildDashboardWindowState(activePreset, windowNowMs),\n };\n const handleWindowPresetChange = (presetId: string): void => {\n setActiveWindowPresetId(presetId);\n setWindowNowMs(Date.now());\n };\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 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 <LazyBackofficeDashboardWidgetContent\n widget={widget}\n context={dashboardContext}\n windowPresets={presets}\n activeWindowPresetId={activeWindowPresetId}\n onWindowPresetChange={handleWindowPresetChange}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n </DashboardGridItem>\n );\n })}\n </DashboardGrid>\n </DetailPageTemplate>\n );\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 return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardContent config={dashboard} />\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 { lazy, type JSX, Suspense, useMemo, useState } from 'react';\nimport type {\n BackofficeDashboardConfig,\n BackofficeDashboardContext,\n BackofficeDashboardWindowPreset,\n BackofficeDashboardWindowState,\n BackofficeDashboardWidget,\n BackofficeDashboardWidgetSpan,\n BackofficeDashboardWidgetTabletSpan,\n BackofficeDashboardWidgetSize,\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 { DashboardPanel } from '@plumile/ui/components/dashboard/dashboard_panel/DashboardPanel.js';\nimport { DashboardQuickActions } from '@plumile/ui/components/dashboard/dashboard_quick_actions/DashboardQuickActions.js';\nimport {\n DashboardGrid,\n DashboardGridItem,\n} from '@plumile/ui/components/dashboard/dashboard_grid/DashboardGrid.js';\nimport { useTranslation } from 'react-i18next';\n\nimport { BackofficeErrorBoundary } from '../components/backoffice/errors/BackofficeErrorBoundary.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 { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildDashboardBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n getWidgetLabel,\n resolveLabel,\n} from './BackofficeDashboardPage.helpers.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst LazyBackofficeDashboardWidgetContent = lazy(async () => {\n const module = await import('./BackofficeDashboardWidgetContent.js');\n return {\n default: module.BackofficeDashboardWidgetContent,\n };\n});\n\nconst fallbackDashboardWindowPreset: BackofficeDashboardWindowPreset = {\n id: '24h',\n label: (t) => {\n return t('common.time.lastDay', '24 h');\n },\n durationMs: 24 * 60 * 60 * 1000,\n};\n\nconst defaultDashboardWindowPresets: readonly BackofficeDashboardWindowPreset[] =\n [\n {\n id: '1h',\n label: (t) => {\n return t('common.time.lastHour', '1 h');\n },\n durationMs: 60 * 60 * 1000,\n },\n fallbackDashboardWindowPreset,\n {\n id: '7d',\n label: (t) => {\n return t('common.time.lastSevenDays', '7 j');\n },\n durationMs: 7 * 24 * 60 * 60 * 1000,\n },\n {\n id: '30d',\n label: (t) => {\n return t('common.time.lastThirtyDays', '30 j');\n },\n durationMs: 30 * 24 * 60 * 60 * 1000,\n },\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\ntype DashboardContentProps = {\n config: BackofficeDashboardConfig;\n};\n\nconst resolveDashboardWindowPresets = (\n config: BackofficeDashboardConfig,\n): readonly BackofficeDashboardWindowPreset[] => {\n if (config.windowPresets != null && config.windowPresets.length > 0) {\n return config.windowPresets;\n }\n return defaultDashboardWindowPresets;\n};\n\nconst resolveDefaultDashboardWindowPresetId = (\n config: BackofficeDashboardConfig,\n presets: readonly BackofficeDashboardWindowPreset[],\n): string => {\n if (\n config.defaultWindowPresetId != null &&\n presets.some((preset) => {\n return preset.id === config.defaultWindowPresetId;\n })\n ) {\n return config.defaultWindowPresetId;\n }\n return presets[1]?.id ?? presets[0]?.id ?? '24h';\n};\n\nconst buildDashboardWindowState = (\n preset: BackofficeDashboardWindowPreset,\n nowMs: number,\n): BackofficeDashboardWindowState => {\n const to = new Date(nowMs);\n const from = new Date(nowMs - preset.durationMs);\n return {\n id: preset.id,\n label: preset.label,\n from: from.toISOString(),\n to: to.toISOString(),\n };\n};\n\nconst DashboardContent = ({ config }: DashboardContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const presets = useMemo(() => {\n return resolveDashboardWindowPresets(config);\n }, [config]);\n const [activeWindowPresetId, setActiveWindowPresetId] = useState(() => {\n return resolveDefaultDashboardWindowPresetId(config, presets);\n });\n const [windowNowMs, setWindowNowMs] = useState(() => {\n return Date.now();\n });\n\n const title = resolveLabel(config.title, tApp);\n const subtitle =\n config.subtitle != null ? resolveLabel(config.subtitle, tApp) : undefined;\n const activePreset =\n presets.find((preset) => {\n return preset.id === activeWindowPresetId;\n }) ??\n presets[0] ??\n fallbackDashboardWindowPreset;\n const dashboardContext: BackofficeDashboardContext = {\n window: buildDashboardWindowState(activePreset, windowNowMs),\n };\n const handleWindowPresetChange = (presetId: string): void => {\n setActiveWindowPresetId(presetId);\n setWindowNowMs(Date.now());\n };\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 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 <LazyBackofficeDashboardWidgetContent\n widget={widget}\n context={dashboardContext}\n windowPresets={presets}\n activeWindowPresetId={activeWindowPresetId}\n onWindowPresetChange={handleWindowPresetChange}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n </DashboardGridItem>\n );\n })}\n </DashboardGrid>\n </DetailPageTemplate>\n );\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 return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DashboardContent config={dashboard} />\n </BackofficeRightPageLayout>\n );\n};\n\nexport default BackofficeDashboardPage;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeDashboardWidgetContent.js","names":[],"sources":["../../../src/pages/BackofficeDashboardWidgetContent.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { useEffect, useMemo, useState, type JSX } from 'react';\nimport type {\n BackofficeColumnSpec,\n BackofficeDashboardBreakdownListResult,\n BackofficeDashboardContext,\n BackofficeDashboardEntitySpotlightResult,\n BackofficeDashboardHealthMatrixResult,\n BackofficeDashboardLinkTarget,\n BackofficeDashboardRiskQueueResult,\n BackofficeDashboardSlaGaugeResult,\n BackofficeDashboardTimelineChartResult,\n BackofficeDashboardTrendMetricResult,\n BackofficeDashboardWidget,\n BackofficeDashboardWindowPreset,\n BackofficeDashboardWindowState,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport {\n buildBackofficeFallbackListHref,\n buildBackofficeListHref,\n} from '@plumile/backoffice-core/state/buildListHref.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.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 { DashboardBreakdownList } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardBreakdownList.js';\nimport { DashboardEntitySpotlight } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardEntitySpotlight.js';\nimport { DashboardHealthMatrix } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardHealthMatrix.js';\nimport { DashboardRiskQueue } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardRiskQueue.js';\nimport { DashboardSlaGauge } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardSlaGauge.js';\nimport { DashboardTimelineChart } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardTimelineChart.js';\nimport { DashboardTrendMetric } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardTrendMetric.js';\nimport { DashboardWindowControl } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardWindowControl.js';\nimport { DataTable } from '@plumile/ui/components/data-table/DataTable.js';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport { BackofficeBillingUsageChart } from '../components/backoffice/billing/BackofficeBillingUsageChart.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { resolveLabel } from './BackofficeDashboardPage.helpers.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\nexport type BackofficeDashboardWidgetContentProps = {\n widget: BackofficeDashboardWidget;\n context?: BackofficeDashboardContext;\n windowPresets?: readonly BackofficeDashboardWindowPreset[];\n activeWindowPresetId?: string;\n onWindowPresetChange?: (presetId: string) => void;\n};\n\ntype WidgetContentBodyProps = BackofficeDashboardWidgetContentProps & {\n data?: OperationType['response'];\n};\n\ntype BackofficeDashboardQueryWidget = Extract<\n BackofficeDashboardWidget,\n { dataSource: 'query' }\n>;\n\nconst fallbackWindowLabel: I18nLabel = (t) => {\n return t('common.time.lastDay', '24 h');\n};\n\nconst fallbackDashboardWindowState: BackofficeDashboardWindowState = {\n id: '24h',\n label: fallbackWindowLabel,\n from: new Date(0).toISOString(),\n to: new Date(0).toISOString(),\n};\n\nconst fallbackDashboardContext: BackofficeDashboardContext = {\n window: fallbackDashboardWindowState,\n};\n\nconst resolveWidgetVariables = (\n widget: BackofficeDashboardQueryWidget,\n context: BackofficeDashboardContext,\n): OperationType['variables'] => {\n if (typeof widget.variables === 'function') {\n return widget.variables(context);\n }\n\n return widget.variables;\n};\n\nconst DashboardUnavailableState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n};\n\nconst serializeDashboardTarget = (\n target: BackofficeDashboardLinkTarget | undefined,\n): string => {\n if (target == null) {\n return '';\n }\n if (target.kind === 'href') {\n return `href:${target.href}`;\n }\n return `entity-list:${target.entityId}:${JSON.stringify(\n target.state ?? null,\n )}`;\n};\n\nconst useDashboardTargetHrefResolver = (\n targets: readonly (BackofficeDashboardLinkTarget | undefined)[],\n): ((\n target: BackofficeDashboardLinkTarget | undefined,\n fallbackHref: string | undefined,\n) => string | undefined) => {\n const { entities, entityRegistry } = useBackofficeConfig();\n const [, setVersion] = useState(0);\n const targetKey = targets.map(serializeDashboardTarget).join('|');\n\n useEffect(() => {\n const entityIds = new Set<string>();\n for (const target of targets) {\n if (\n target?.kind === 'entity-list' &&\n entities[target.entityId] != null &&\n entityRegistry.getLoadedListEntity(target.entityId) == null\n ) {\n entityIds.add(target.entityId);\n }\n }\n\n if (entityIds.size === 0) {\n return undefined;\n }\n\n let cancelled = false;\n Promise.all(\n Array.from(entityIds).map(async (entityId) => {\n try {\n await entityRegistry.loadListEntity(entityId);\n } catch {\n return null;\n }\n return entityId;\n }),\n ).then(\n () => {\n if (cancelled) {\n return;\n }\n setVersion((current) => {\n return current + 1;\n });\n },\n () => {\n return undefined;\n },\n );\n\n return () => {\n cancelled = true;\n };\n }, [entities, entityRegistry, targetKey, targets]);\n\n return useMemo(() => {\n return (\n target: BackofficeDashboardLinkTarget | undefined,\n fallbackHref: string | undefined,\n ): string | undefined => {\n if (target == null) {\n return fallbackHref;\n }\n if (target.kind === 'href') {\n return target.href;\n }\n\n const entity = entities[target.entityId];\n if (entity == null) {\n return fallbackHref;\n }\n\n const loadedEntity = entityRegistry.getLoadedListEntity(target.entityId);\n if (loadedEntity != null) {\n return buildBackofficeListHref(loadedEntity.config, {\n where: target.state?.where,\n sort: target.state?.sort,\n });\n }\n\n return buildBackofficeFallbackListHref(\n entity.routes.list,\n target.state?.where ?? null,\n target.state?.filters,\n );\n };\n }, [entities, entityRegistry]);\n};\n\ntype DashboardMetricResult = {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n meta?: I18nLabel;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardMetricGroupContent = ({\n metrics,\n}: {\n metrics: readonly DashboardMetricResult[];\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n metrics.map((metric) => {\n return metric.target;\n }),\n );\n\n return (\n <DashboardMetricGroup\n emptyState={<DashboardUnavailableState />}\n metrics={metrics.map((metric) => {\n return {\n id: metric.id,\n href: resolveHref(metric.target, 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\ntype DashboardStatusResult = {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardStatusSummaryContent = ({\n items,\n}: {\n items: readonly DashboardStatusResult[];\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n items.map((item) => {\n return item.target;\n }),\n );\n\n return (\n <DashboardStatusList\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n href: resolveHref(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\ntype DashboardQuickActionResult = {\n id: string;\n label: I18nLabel | string;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardQuickActionsContent = ({\n actions,\n layout,\n}: {\n actions: readonly DashboardQuickActionResult[];\n layout?: 'grid' | 'stack';\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n actions.map((action) => {\n return action.target;\n }),\n );\n\n return (\n <DashboardQuickActions\n layout={layout}\n emptyState={<DashboardUnavailableState />}\n actions={actions.map((action) => {\n let label: string;\n if (typeof action.label === 'string') {\n label = action.label;\n } else {\n label = resolveLabel(action.label, tApp);\n }\n\n return {\n id: action.id,\n href: resolveHref(action.target, action.href) ?? '#',\n label,\n };\n })}\n />\n );\n};\n\nconst collectTargets = (\n values: readonly {\n target?: BackofficeDashboardLinkTarget;\n }[],\n): readonly (BackofficeDashboardLinkTarget | undefined)[] => {\n return values.map((value) => {\n return value.target;\n });\n};\n\nconst DashboardTrendMetricContent = ({\n metric,\n}: {\n metric: BackofficeDashboardTrendMetricResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver([metric.target]);\n\n return (\n <DashboardTrendMetric\n label={resolveLabel(metric.label, tApp)}\n value={metric.value ?? t('common.notAvailable')}\n unit={metric.unit}\n href={resolveHref(metric.target, metric.href)}\n tone={metric.tone}\n delta={\n metric.delta != null\n ? {\n ...metric.delta,\n label:\n metric.delta.label != null\n ? resolveLabel(metric.delta.label, tApp)\n : undefined,\n }\n : undefined\n }\n sparkline={metric.sparkline}\n sparklineLabel={resolveLabel(metric.label, tApp)}\n />\n );\n};\n\nconst DashboardSlaGaugeContent = ({\n gauge,\n}: {\n gauge: BackofficeDashboardSlaGaugeResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver([gauge.target]);\n\n if (gauge.value == null) {\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n }\n\n return (\n <DashboardSlaGauge\n label={resolveLabel(gauge.label, tApp)}\n value={gauge.value}\n max={gauge.max}\n threshold={gauge.threshold}\n unit={gauge.unit}\n tone={gauge.tone}\n href={resolveHref(gauge.target, gauge.href)}\n />\n );\n};\n\nconst DashboardBreakdownListContent = ({\n items,\n}: {\n items: BackofficeDashboardBreakdownListResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(collectTargets(items));\n\n return (\n <DashboardBreakdownList\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n href: resolveHref(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n meta: item.meta != null ? resolveLabel(item.meta, tApp) : undefined,\n tone: item.tone,\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\nconst DashboardTimelineChartContent = ({\n ariaLabel,\n chart,\n result,\n}: {\n ariaLabel: I18nLabel;\n chart?: 'line' | 'bar';\n result: BackofficeDashboardTimelineChartResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n\n return (\n <DashboardTimelineChart\n ariaLabel={resolveLabel(ariaLabel, tApp)}\n chart={chart}\n emptyMessage={\n result.emptyLabel != null ? resolveLabel(result.emptyLabel, tApp) : ''\n }\n series={result.series.map((serie) => {\n return {\n ...serie,\n label: resolveLabel(serie.label, tApp),\n };\n })}\n />\n );\n};\n\nconst DashboardRiskQueueContent = ({\n items,\n}: {\n items: BackofficeDashboardRiskQueueResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(collectTargets(items));\n\n return (\n <DashboardRiskQueue\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n href: resolveHref(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n meta: item.meta != null ? resolveLabel(item.meta, tApp) : undefined,\n severity: item.severity,\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\nconst DashboardEntitySpotlightContent = ({\n item,\n}: {\n item: BackofficeDashboardEntitySpotlightResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const resolveHref = useDashboardTargetHrefResolver([item?.target]);\n\n if (item == null) {\n return <DashboardUnavailableState />;\n }\n\n return (\n <DashboardEntitySpotlight\n href={resolveHref(item.target, item.href)}\n label={resolveLabel(item.label, tApp)}\n title={resolveLabel(item.title, tApp)}\n tone={item.tone}\n meta={item.meta?.map((meta) => {\n return {\n id: meta.id,\n label: resolveLabel(meta.label, tApp),\n value: meta.value,\n };\n })}\n />\n );\n};\n\nconst DashboardHealthMatrixContent = ({\n rows,\n}: {\n rows: BackofficeDashboardHealthMatrixResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n rows.flatMap((row) => {\n return row.cells.map((cell) => {\n return cell.target;\n });\n }),\n );\n\n return (\n <DashboardHealthMatrix\n emptyState={<DashboardUnavailableState />}\n rows={rows.map((row) => {\n return {\n id: row.id,\n label: resolveLabel(row.label, tApp),\n cells: row.cells.map((cell) => {\n return {\n id: cell.id,\n href: resolveHref(cell.target, cell.href),\n label: resolveLabel(cell.label, tApp),\n tone: cell.tone,\n value: cell.value ?? t('common.notAvailable'),\n };\n }),\n };\n })}\n />\n );\n};\n\nconst WidgetContentBody = ({\n activeWindowPresetId,\n context = fallbackDashboardContext,\n widget,\n data,\n onWindowPresetChange,\n windowPresets = [],\n}: WidgetContentBodyProps): 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 = (): unknown => {\n if (widget.dataSource === 'query' && data != null) {\n return widget.resolve(data, context);\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() as {\n columns: readonly BackofficeColumnSpec[];\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, {\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() as readonly DashboardMetricResult[] | null;\n if (resolved == null) {\n return <DashboardUnavailableState />;\n }\n return <DashboardMetricGroupContent metrics={resolved} />;\n }\n\n if (widget.kind === 'trendMetric') {\n const resolved =\n resolveData() as BackofficeDashboardTrendMetricResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardTrendMetricContent metric={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'slaGauge') {\n const resolved = resolveData() as BackofficeDashboardSlaGaugeResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardSlaGaugeContent gauge={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'breakdownList') {\n const resolved =\n resolveData() as BackofficeDashboardBreakdownListResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardBreakdownListContent items={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'timelineChart') {\n const resolved =\n resolveData() as BackofficeDashboardTimelineChartResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardTimelineChartContent\n ariaLabel={widget.ariaLabel}\n chart={widget.chart}\n result={resolved}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'riskQueue') {\n const resolved = resolveData() as BackofficeDashboardRiskQueueResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardRiskQueueContent items={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'entitySpotlight') {\n const resolved =\n resolveData() as BackofficeDashboardEntitySpotlightResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardEntitySpotlightContent item={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'healthMatrix') {\n const resolved =\n resolveData() as BackofficeDashboardHealthMatrixResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardHealthMatrixContent rows={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'billingUsageChart') {\n const resolved = resolveData() 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 <DashboardQuickActionsContent\n layout={widget.layout?.zone === 'aside' ? 'stack' : 'grid'}\n actions={widget.actions}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'windowControl') {\n return (\n <DashboardPanel\n title={resolveLabel(widget.title, tApp)}\n subtitle={description}\n >\n <DashboardWindowControl\n activePresetId={activeWindowPresetId ?? context.window.id}\n onChange={(presetId) => {\n onWindowPresetChange?.(presetId);\n }}\n presets={windowPresets.map((preset) => {\n return {\n id: preset.id,\n label: resolveLabel(preset.label, tApp),\n };\n })}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'statusSummary') {\n const resolved = resolveData() as readonly DashboardStatusResult[] | 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 <DashboardStatusSummaryContent items={resolved} />\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() as {\n count: number | null;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n } | 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 <DashboardQuickActionsContent\n actions={[\n {\n id: entityManifest.id,\n href: resolved?.href ?? entityManifest.routes.list,\n target: resolved?.target,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n );\n};\n\nconst WidgetWithQuery = ({\n activeWindowPresetId,\n context = fallbackDashboardContext,\n onWindowPresetChange,\n widget,\n windowPresets,\n}: BackofficeDashboardWidgetContentProps & {\n widget: BackofficeDashboardQueryWidget;\n}): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n widget.query,\n resolveWidgetVariables(widget, context),\n {\n fetchPolicy: 'store-or-network',\n },\n );\n\n return (\n <WidgetContentBody\n activeWindowPresetId={activeWindowPresetId}\n context={context}\n data={data}\n onWindowPresetChange={onWindowPresetChange}\n widget={widget}\n windowPresets={windowPresets}\n />\n );\n};\n\nexport const BackofficeDashboardWidgetContent = (\n props: BackofficeDashboardWidgetContentProps,\n): JSX.Element | null => {\n const { widget } = props;\n if (widget.dataSource === 'query') {\n return <WidgetWithQuery {...props} widget={widget} />;\n }\n\n return <WidgetContentBody {...props} />;\n};\n\nexport default BackofficeDashboardWidgetContent;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackofficeDashboardWidgetContent.js","names":[],"sources":["../../../src/pages/BackofficeDashboardWidgetContent.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { useEffect, useMemo, useState, type JSX } from 'react';\nimport type {\n BackofficeColumnSpec,\n BackofficeDashboardBreakdownListResult,\n BackofficeDashboardContext,\n BackofficeDashboardEntitySpotlightResult,\n BackofficeDashboardHealthMatrixResult,\n BackofficeDashboardLinkTarget,\n BackofficeDashboardRiskQueueResult,\n BackofficeDashboardSlaGaugeResult,\n BackofficeDashboardTimelineChartResult,\n BackofficeDashboardTrendMetricResult,\n BackofficeDashboardWidget,\n BackofficeDashboardWindowPreset,\n BackofficeDashboardWindowState,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport {\n buildBackofficeFallbackListHref,\n buildBackofficeListHref,\n} from '@plumile/backoffice-core/state/buildListHref.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.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 { DashboardBreakdownList } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardBreakdownList.js';\nimport { DashboardEntitySpotlight } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardEntitySpotlight.js';\nimport { DashboardHealthMatrix } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardHealthMatrix.js';\nimport { DashboardRiskQueue } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardRiskQueue.js';\nimport { DashboardSlaGauge } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardSlaGauge.js';\nimport { DashboardTimelineChart } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardTimelineChart.js';\nimport { DashboardTrendMetric } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardTrendMetric.js';\nimport { DashboardWindowControl } from '@plumile/ui/components/dashboard/dashboard_operational/DashboardWindowControl.js';\nimport { DataTable } from '@plumile/ui/components/data-table/DataTable.js';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport { BackofficeBillingUsageChart } from '../components/backoffice/billing/BackofficeBillingUsageChart.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { resolveLabel } from './BackofficeDashboardPage.helpers.js';\n\nimport * as styles from './backofficeDashboardPage.css.js';\n\nconst { useLazyLoadQuery } = ReactRelay;\n\nexport type BackofficeDashboardWidgetContentProps = {\n widget: BackofficeDashboardWidget;\n context?: BackofficeDashboardContext;\n windowPresets?: readonly BackofficeDashboardWindowPreset[];\n activeWindowPresetId?: string;\n onWindowPresetChange?: (presetId: string) => void;\n};\n\ntype WidgetContentBodyProps = BackofficeDashboardWidgetContentProps & {\n data?: OperationType['response'];\n};\n\ntype BackofficeDashboardQueryWidget = Extract<\n BackofficeDashboardWidget,\n { dataSource: 'query' }\n>;\n\nconst fallbackWindowLabel: I18nLabel = (t) => {\n return t('common.time.lastDay', '24 h');\n};\n\nconst fallbackDashboardWindowState: BackofficeDashboardWindowState = {\n id: '24h',\n label: fallbackWindowLabel,\n from: new Date(0).toISOString(),\n to: new Date(0).toISOString(),\n};\n\nconst fallbackDashboardContext: BackofficeDashboardContext = {\n window: fallbackDashboardWindowState,\n};\n\nconst resolveWidgetVariables = (\n widget: BackofficeDashboardQueryWidget,\n context: BackofficeDashboardContext,\n): OperationType['variables'] => {\n if (typeof widget.variables === 'function') {\n return widget.variables(context);\n }\n\n return widget.variables;\n};\n\nconst DashboardUnavailableState = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n};\n\nconst serializeDashboardTarget = (\n target: BackofficeDashboardLinkTarget | undefined,\n): string => {\n if (target == null) {\n return '';\n }\n if (target.kind === 'href') {\n return `href:${target.href}`;\n }\n return `entity-list:${target.entityId}:${JSON.stringify(\n target.state ?? null,\n )}`;\n};\n\nconst useDashboardTargetHrefResolver = (\n targets: readonly (BackofficeDashboardLinkTarget | undefined)[],\n): ((\n target: BackofficeDashboardLinkTarget | undefined,\n fallbackHref: string | undefined,\n) => string | undefined) => {\n const { entities, entityRegistry } = useBackofficeConfig();\n const [, setVersion] = useState(0);\n const targetKey = targets.map(serializeDashboardTarget).join('|');\n\n useEffect(() => {\n const entityIds = new Set<string>();\n for (const target of targets) {\n if (\n target?.kind === 'entity-list' &&\n entities[target.entityId] != null &&\n entityRegistry.getLoadedListEntity(target.entityId) == null\n ) {\n entityIds.add(target.entityId);\n }\n }\n\n if (entityIds.size === 0) {\n return undefined;\n }\n\n let cancelled = false;\n Promise.all(\n Array.from(entityIds).map(async (entityId) => {\n try {\n await entityRegistry.loadListEntity(entityId);\n } catch {\n return null;\n }\n return entityId;\n }),\n ).then(\n () => {\n if (cancelled) {\n return;\n }\n setVersion((current) => {\n return current + 1;\n });\n },\n () => {\n return undefined;\n },\n );\n\n return () => {\n cancelled = true;\n };\n }, [entities, entityRegistry, targetKey, targets]);\n\n return useMemo(() => {\n return (\n target: BackofficeDashboardLinkTarget | undefined,\n fallbackHref: string | undefined,\n ): string | undefined => {\n if (target == null) {\n return fallbackHref;\n }\n if (target.kind === 'href') {\n return target.href;\n }\n\n const entity = entities[target.entityId];\n if (entity == null) {\n return fallbackHref;\n }\n\n const loadedEntity = entityRegistry.getLoadedListEntity(target.entityId);\n if (loadedEntity != null) {\n return buildBackofficeListHref(loadedEntity.config, {\n where: target.state?.where,\n sort: target.state?.sort,\n });\n }\n\n return buildBackofficeFallbackListHref(\n entity.routes.list,\n target.state?.where ?? null,\n target.state?.filters,\n );\n };\n }, [entities, entityRegistry]);\n};\n\ntype DashboardMetricResult = {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n meta?: I18nLabel;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardMetricGroupContent = ({\n metrics,\n}: {\n metrics: readonly DashboardMetricResult[];\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n metrics.map((metric) => {\n return metric.target;\n }),\n );\n\n return (\n <DashboardMetricGroup\n emptyState={<DashboardUnavailableState />}\n metrics={metrics.map((metric) => {\n return {\n id: metric.id,\n href: resolveHref(metric.target, 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\ntype DashboardStatusResult = {\n id: string;\n label: I18nLabel;\n value: string | number | null;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardStatusSummaryContent = ({\n items,\n}: {\n items: readonly DashboardStatusResult[];\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n items.map((item) => {\n return item.target;\n }),\n );\n\n return (\n <DashboardStatusList\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n href: resolveHref(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\ntype DashboardQuickActionResult = {\n id: string;\n label: I18nLabel | string;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n};\n\nconst DashboardQuickActionsContent = ({\n actions,\n layout,\n}: {\n actions: readonly DashboardQuickActionResult[];\n layout?: 'grid' | 'stack';\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n actions.map((action) => {\n return action.target;\n }),\n );\n\n return (\n <DashboardQuickActions\n layout={layout}\n emptyState={<DashboardUnavailableState />}\n actions={actions.map((action) => {\n let label: string;\n if (typeof action.label === 'string') {\n label = action.label;\n } else {\n label = resolveLabel(action.label, tApp);\n }\n\n return {\n id: action.id,\n href: resolveHref(action.target, action.href) ?? '#',\n label,\n };\n })}\n />\n );\n};\n\nconst collectTargets = (\n values: readonly {\n target?: BackofficeDashboardLinkTarget;\n }[],\n): readonly (BackofficeDashboardLinkTarget | undefined)[] => {\n return values.map((value) => {\n return value.target;\n });\n};\n\nconst DashboardTrendMetricContent = ({\n metric,\n}: {\n metric: BackofficeDashboardTrendMetricResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver([metric.target]);\n\n return (\n <DashboardTrendMetric\n label={resolveLabel(metric.label, tApp)}\n value={metric.value ?? t('common.notAvailable')}\n unit={metric.unit}\n href={resolveHref(metric.target, metric.href)}\n tone={metric.tone}\n delta={\n metric.delta != null\n ? {\n ...metric.delta,\n label:\n metric.delta.label != null\n ? resolveLabel(metric.delta.label, tApp)\n : undefined,\n }\n : undefined\n }\n sparkline={metric.sparkline}\n sparklineLabel={resolveLabel(metric.label, tApp)}\n />\n );\n};\n\nconst DashboardSlaGaugeContent = ({\n gauge,\n}: {\n gauge: BackofficeDashboardSlaGaugeResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver([gauge.target]);\n\n if (gauge.value == null) {\n return <BackofficeEmptyState title={t('common.notAvailable')} />;\n }\n\n return (\n <DashboardSlaGauge\n label={resolveLabel(gauge.label, tApp)}\n value={gauge.value}\n max={gauge.max}\n threshold={gauge.threshold}\n unit={gauge.unit}\n tone={gauge.tone}\n href={resolveHref(gauge.target, gauge.href)}\n />\n );\n};\n\nconst DashboardBreakdownListContent = ({\n items,\n}: {\n items: BackofficeDashboardBreakdownListResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(collectTargets(items));\n\n return (\n <DashboardBreakdownList\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n href: resolveHref(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n meta: item.meta != null ? resolveLabel(item.meta, tApp) : undefined,\n tone: item.tone,\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\nconst DashboardTimelineChartContent = ({\n ariaLabel,\n chart,\n result,\n}: {\n ariaLabel: I18nLabel;\n chart?: 'line' | 'bar';\n result: BackofficeDashboardTimelineChartResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n\n return (\n <DashboardTimelineChart\n ariaLabel={resolveLabel(ariaLabel, tApp)}\n chart={chart}\n emptyMessage={\n result.emptyLabel != null ? resolveLabel(result.emptyLabel, tApp) : ''\n }\n series={result.series.map((serie) => {\n return {\n ...serie,\n label: resolveLabel(serie.label, tApp),\n };\n })}\n />\n );\n};\n\nconst DashboardRiskQueueContent = ({\n items,\n}: {\n items: BackofficeDashboardRiskQueueResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(collectTargets(items));\n\n return (\n <DashboardRiskQueue\n emptyState={<DashboardUnavailableState />}\n items={items.map((item) => {\n return {\n id: item.id,\n href: resolveHref(item.target, item.href),\n label: resolveLabel(item.label, tApp),\n meta: item.meta != null ? resolveLabel(item.meta, tApp) : undefined,\n severity: item.severity,\n value: item.value ?? t('common.notAvailable'),\n };\n })}\n />\n );\n};\n\nconst DashboardEntitySpotlightContent = ({\n item,\n}: {\n item: BackofficeDashboardEntitySpotlightResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const resolveHref = useDashboardTargetHrefResolver([item?.target]);\n\n if (item == null) {\n return <DashboardUnavailableState />;\n }\n\n return (\n <DashboardEntitySpotlight\n href={resolveHref(item.target, item.href)}\n label={resolveLabel(item.label, tApp)}\n title={resolveLabel(item.title, tApp)}\n tone={item.tone}\n meta={item.meta?.map((meta) => {\n return {\n id: meta.id,\n label: resolveLabel(meta.label, tApp),\n value: meta.value,\n };\n })}\n />\n );\n};\n\nconst DashboardHealthMatrixContent = ({\n rows,\n}: {\n rows: BackofficeDashboardHealthMatrixResult;\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const resolveHref = useDashboardTargetHrefResolver(\n rows.flatMap((row) => {\n return row.cells.map((cell) => {\n return cell.target;\n });\n }),\n );\n\n return (\n <DashboardHealthMatrix\n emptyState={<DashboardUnavailableState />}\n rows={rows.map((row) => {\n return {\n id: row.id,\n label: resolveLabel(row.label, tApp),\n cells: row.cells.map((cell) => {\n return {\n id: cell.id,\n href: resolveHref(cell.target, cell.href),\n label: resolveLabel(cell.label, tApp),\n tone: cell.tone,\n value: cell.value ?? t('common.notAvailable'),\n };\n }),\n };\n })}\n />\n );\n};\n\nconst WidgetContentBody = ({\n activeWindowPresetId,\n context = fallbackDashboardContext,\n widget,\n data,\n onWindowPresetChange,\n windowPresets = [],\n}: WidgetContentBodyProps): 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 = (): unknown => {\n if (widget.dataSource === 'query' && data != null) {\n return widget.resolve(data, context);\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() as {\n columns: readonly BackofficeColumnSpec[];\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, {\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() as readonly DashboardMetricResult[] | null;\n if (resolved == null) {\n return <DashboardUnavailableState />;\n }\n return <DashboardMetricGroupContent metrics={resolved} />;\n }\n\n if (widget.kind === 'trendMetric') {\n const resolved =\n resolveData() as BackofficeDashboardTrendMetricResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardTrendMetricContent metric={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'slaGauge') {\n const resolved = resolveData() as BackofficeDashboardSlaGaugeResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardSlaGaugeContent gauge={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'breakdownList') {\n const resolved =\n resolveData() as BackofficeDashboardBreakdownListResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardBreakdownListContent items={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'timelineChart') {\n const resolved =\n resolveData() as BackofficeDashboardTimelineChartResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardTimelineChartContent\n ariaLabel={widget.ariaLabel}\n chart={widget.chart}\n result={resolved}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'riskQueue') {\n const resolved = resolveData() as BackofficeDashboardRiskQueueResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardRiskQueueContent items={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'entitySpotlight') {\n const resolved =\n resolveData() as BackofficeDashboardEntitySpotlightResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardEntitySpotlightContent item={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'healthMatrix') {\n const resolved =\n resolveData() as BackofficeDashboardHealthMatrixResult | null;\n const title =\n widget.title != null ? resolveLabel(widget.title, tApp) : undefined;\n if (resolved == null) {\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardUnavailableState />\n </DashboardPanel>\n );\n }\n return (\n <DashboardPanel title={title} subtitle={description}>\n <DashboardHealthMatrixContent rows={resolved} />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'billingUsageChart') {\n const resolved = resolveData() 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 <DashboardQuickActionsContent\n layout={widget.layout?.zone === 'aside' ? 'stack' : 'grid'}\n actions={widget.actions}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'windowControl') {\n return (\n <DashboardPanel\n title={resolveLabel(widget.title, tApp)}\n subtitle={description}\n >\n <DashboardWindowControl\n activePresetId={activeWindowPresetId ?? context.window.id}\n onChange={(presetId) => {\n onWindowPresetChange?.(presetId);\n }}\n presets={windowPresets.map((preset) => {\n return {\n id: preset.id,\n label: resolveLabel(preset.label, tApp),\n };\n })}\n />\n </DashboardPanel>\n );\n }\n\n if (widget.kind === 'statusSummary') {\n const resolved = resolveData() as readonly DashboardStatusResult[] | 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 <DashboardStatusSummaryContent items={resolved} />\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() as {\n count: number | null;\n href?: string;\n target?: BackofficeDashboardLinkTarget;\n } | 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 <DashboardQuickActionsContent\n actions={[\n {\n id: entityManifest.id,\n href: resolved?.href ?? entityManifest.routes.list,\n target: resolved?.target,\n label: t('dashboard.actions.openList'),\n },\n ]}\n />\n </div>\n </DashboardPanel>\n );\n};\n\nconst WidgetWithQuery = ({\n activeWindowPresetId,\n context = fallbackDashboardContext,\n onWindowPresetChange,\n widget,\n windowPresets,\n}: BackofficeDashboardWidgetContentProps & {\n widget: BackofficeDashboardQueryWidget;\n}): JSX.Element => {\n const data = useLazyLoadQuery<OperationType>(\n widget.query,\n resolveWidgetVariables(widget, context),\n {\n fetchPolicy: 'store-or-network',\n },\n );\n\n return (\n <WidgetContentBody\n activeWindowPresetId={activeWindowPresetId}\n context={context}\n data={data}\n onWindowPresetChange={onWindowPresetChange}\n widget={widget}\n windowPresets={windowPresets}\n />\n );\n};\n\nexport const BackofficeDashboardWidgetContent = (\n props: BackofficeDashboardWidgetContentProps,\n): JSX.Element | null => {\n const { widget } = props;\n if (widget.dataSource === 'query') {\n return <WidgetWithQuery {...props} widget={widget} />;\n }\n\n return <WidgetContentBody {...props} />;\n};\n\nexport default BackofficeDashboardWidgetContent;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeEntityDetailLayoutPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailLayoutPage.tsx"],"sourcesContent":["import { Suspense, type JSX, type ReactNode, useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport Link from '@plumile/router/routing/Link.js';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\nimport useLocation from '@plumile/router/routing/useLocation.js';\n\nimport { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.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';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedDetailLayoutDataRoute,\n BackofficeResolvedDetailLayoutFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { FormattedDate } from '@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js';\nimport { Tabs } from '@plumile/ui/atomic/molecules/tabs/Tabs.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.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 {\n BackofficeRelationsMenu,\n type BackofficeRelationsMenuItem,\n} from '@plumile/ui/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport { BackofficeDetailBadgeRow } from '../components/backoffice/detail/BackofficeDetailBadgeRow.js';\nimport { BackofficeLazyEntityCount } from '../components/backoffice/refs/BackofficeLazyEntityCount.js';\nimport { BackofficeEntityDetailNotFound } from '../components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityDetailBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeFragment } from '../relay/typedRelayHooks.js';\nimport * as pageStyles from './backofficeEntityDetailPage.css.js';\nimport {\n resolveLabel,\n resolveRelationValue,\n} from './BackofficeEntityDetailPage.helpers.js';\nimport { resolveHeaderItems } from './BackofficeEntityDetailPage.view-helpers.js';\nimport { BackofficeEntityDetailLayoutContextProvider } from './detail/BackofficeEntityDetailLayoutContext.js';\nimport { buildTabsItems } from './detail/buildTabsItems.js';\nimport { resolveVisibleDetailPages } from './detail/pageResolution.js';\nimport { BackofficeRedirect } from './BackofficeRedirect.js';\n\nconst { usePreloadedQuery } = ReactRelay;\n\nconst normalizePath = (value: string): string => {\n return value.trim().replace(/^\\/+|\\/+$/g, '');\n};\n\nconst resolveActivePagePath = (\n pathname: string,\n id: string,\n config: BackofficeResolvedDetailLayoutFacetConfig,\n): string => {\n const pages = [config.pages.mainPage, ...(config.pages.subPages ?? [])];\n const activePage = pages.find((page) => {\n return pathname === config.routes.detailPage(id, page.id);\n });\n return activePage?.path ?? '';\n};\n\nconst RelationCountLoading = (): JSX.Element => {\n return (\n <span className={pageStyles.relationCountLoading}>\n <Spinner size={12} />\n </span>\n );\n};\n\nconst DetailPageContentLoading = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n return (\n <div role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <Spinner size={20} ariaLabel={t('common.loading')} />\n </div>\n );\n};\n\nexport type BackofficeEntityDetailLayoutPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutDataRoute;\n children?: ReactNode;\n};\n\ntype BackofficeEntityDetailLayoutPageContentProps = {\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutDataRoute;\n layoutNodeRef: unknown;\n children?: ReactNode;\n};\n\nconst BackofficeEntityDetailLayoutPageContent = ({\n config,\n prepared,\n layoutNodeRef,\n children,\n}: BackofficeEntityDetailLayoutPageContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities, entityRegistry } = useBackofficeConfig();\n const { pathname } = useLocation();\n const routing = useContext(RoutingContext);\n const layoutNode = useBackofficeFragment<unknown, unknown>(\n config.layoutPage.fragment,\n layoutNodeRef,\n );\n\n const layoutView = config.layoutPage.toView(layoutNode);\n const activePagePath = resolveActivePagePath(pathname, prepared.id, config);\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath,\n node: layoutView,\n });\n\n if (!resolvedPages.hasVisiblePages || resolvedPages.activePage == null) {\n return <BackofficeRedirect to={config.routes.list} />;\n }\n\n const { activePage } = resolvedPages;\n if (\n activePagePath !== '' &&\n normalizePath(activePage.path) !== normalizePath(activePagePath)\n ) {\n return (\n <BackofficeRedirect\n to={config.routes.detailPage(prepared.id, activePage.id)}\n />\n );\n }\n\n const tabsItems = buildTabsItems({\n pages: resolvedPages.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 header = resolveHeaderItems(config.header, layoutView, {\n tApp,\n t,\n resolveEntityHref,\n renderLink: (href, label) => {\n return (\n <Link to={href} preloadOnHover=\"code-and-data\">\n {label}\n </Link>\n );\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 relationMenuItems: BackofficeRelationsMenuItem[] = (\n config.relations ?? []\n ).flatMap((relation) => {\n const { filterId: configuredFilterId, path, target, whereKey } = relation;\n const value = resolveRelationValue(relation.value(layoutView));\n if (value == null) {\n return [];\n }\n\n const entityManifest = entities[target];\n if (entityManifest?.hasList !== true) {\n return [];\n }\n\n const where = setWhereValue(null, whereKey, value, path);\n if (where == null) {\n return [];\n }\n\n const loadedEntity = entityRegistry.getLoadedListEntity(target);\n let filterId = configuredFilterId;\n if (filterId == null) {\n filterId = whereKey;\n if (path != null) {\n filterId = `${whereKey}.${path.join('.')}`;\n }\n }\n\n let href: string;\n if (loadedEntity == null) {\n href = buildBackofficeFallbackListHref(\n entityManifest.routes.list,\n where,\n [\n {\n id: filterId,\n value,\n },\n ],\n );\n } else {\n href = buildBackofficeListHref(loadedEntity.config, { where });\n }\n\n return [\n {\n id: relation.id,\n label: resolveLabel(relation.label, tApp),\n count: (\n <BackofficeLazyEntityCount\n entity={target}\n loadingFallback={<RelationCountLoading />}\n where={where}\n />\n ),\n href,\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, { where });\n\n let search = '';\n if (next.search !== '') {\n search = `?${next.search}`;\n }\n\n routing.history.push({\n pathname: next.pathname,\n search,\n hash: '',\n });\n },\n },\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 let headerMetaNode: JSX.Element | undefined;\n if (header.status != null || header.badges != null) {\n headerMetaNode = (\n <div className={pageStyles.headerMeta}>\n {header.status}\n {header.badges}\n </div>\n );\n }\n let headerItemsNode: JSX.Element | null = null;\n if (header.items != null && header.items.length > 0) {\n headerItemsNode = (\n <div className={pageStyles.headerMetaList}>\n <BackofficeKeyValueList items={header.items} />\n </div>\n );\n }\n let headerActionsNode: JSX.Element | undefined;\n if (relationMenuItems.length > 0) {\n headerActionsNode = (\n <div className={pageStyles.headerRelationGroup}>\n <BackofficeRelationsMenu\n label={t('relations.menu.label')}\n items={relationMenuItems}\n />\n </div>\n );\n }\n\n const headerNode = (\n <div className={pageStyles.headerBlock}>\n <BackofficePageHeader\n title={header.title}\n subtitle={header.subtitle}\n meta={headerMetaNode}\n actions={headerActionsNode}\n />\n {headerItemsNode}\n </div>\n );\n let tabsNode: JSX.Element | null = null;\n if (resolvedPages.pages.length > 1) {\n tabsNode = (\n <Tabs items={tabsItems} activeId={activePage.id} variant=\"underline\" />\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutContextProvider\n value={{\n activePage,\n config,\n entityId: prepared.id,\n layoutView,\n tabsItems,\n visiblePages: resolvedPages.pages,\n }}\n >\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n headerNode={headerNode}\n tabsNode={tabsNode}\n headerDensity=\"compact\"\n >\n <Suspense fallback={<DetailPageContentLoading />}>\n {children}\n </Suspense>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n </BackofficeEntityDetailLayoutContextProvider>\n );\n};\n\nexport const BackofficeEntityDetailLayoutPage = ({\n config,\n prepared,\n children,\n}: BackofficeEntityDetailLayoutPageProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\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\n if (layoutNodeRef == null) {\n return (\n <BackofficeRightPageLayout\n breadcrumb={[\n {\n kind: 'link',\n target: {\n kind: 'entity-list',\n entityId: config.id,\n },\n label: config.label(tApp),\n },\n {\n kind: 'current',\n target: {\n kind: 'entity-detail',\n entityId: config.id,\n id: prepared.id,\n },\n label: t('detail.notFound'),\n },\n ]}\n >\n <BackofficeEntityDetailNotFound listHref={config.routes.list} />\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutPageContent\n config={config}\n prepared={prepared}\n layoutNodeRef={layoutNodeRef}\n >\n {children}\n </BackofficeEntityDetailLayoutPageContent>\n );\n};\n\nexport default BackofficeEntityDetailLayoutPage;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackofficeEntityDetailLayoutPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailLayoutPage.tsx"],"sourcesContent":["import { Suspense, type JSX, type ReactNode, useContext } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport Link from '@plumile/router/routing/Link.js';\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\nimport useLocation from '@plumile/router/routing/useLocation.js';\n\nimport { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.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';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedDetailLayoutDataRoute,\n BackofficeResolvedDetailLayoutFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { FormattedDate } from '@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js';\nimport { Tabs } from '@plumile/ui/atomic/molecules/tabs/Tabs.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.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 {\n BackofficeRelationsMenu,\n type BackofficeRelationsMenuItem,\n} from '@plumile/ui/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport { BackofficeDetailBadgeRow } from '../components/backoffice/detail/BackofficeDetailBadgeRow.js';\nimport { BackofficeLazyEntityCount } from '../components/backoffice/refs/BackofficeLazyEntityCount.js';\nimport { BackofficeEntityDetailNotFound } from '../components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityDetailBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useBackofficeFragment } from '../relay/typedRelayHooks.js';\nimport * as pageStyles from './backofficeEntityDetailPage.css.js';\nimport {\n resolveLabel,\n resolveRelationValue,\n} from './BackofficeEntityDetailPage.helpers.js';\nimport { resolveHeaderItems } from './BackofficeEntityDetailPage.view-helpers.js';\nimport { BackofficeEntityDetailLayoutContextProvider } from './detail/BackofficeEntityDetailLayoutContext.js';\nimport { buildTabsItems } from './detail/buildTabsItems.js';\nimport { resolveVisibleDetailPages } from './detail/pageResolution.js';\nimport { BackofficeRedirect } from './BackofficeRedirect.js';\n\nconst { usePreloadedQuery } = ReactRelay;\n\nconst normalizePath = (value: string): string => {\n return value.trim().replace(/^\\/+|\\/+$/g, '');\n};\n\nconst resolveActivePagePath = (\n pathname: string,\n id: string,\n config: BackofficeResolvedDetailLayoutFacetConfig,\n): string => {\n const pages = [config.pages.mainPage, ...(config.pages.subPages ?? [])];\n const activePage = pages.find((page) => {\n return pathname === config.routes.detailPage(id, page.id);\n });\n return activePage?.path ?? '';\n};\n\nconst RelationCountLoading = (): JSX.Element => {\n return (\n <span className={pageStyles.relationCountLoading}>\n <Spinner size={12} />\n </span>\n );\n};\n\nconst DetailPageContentLoading = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n return (\n <div role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <Spinner size={20} ariaLabel={t('common.loading')} />\n </div>\n );\n};\n\nexport type BackofficeEntityDetailLayoutPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutDataRoute;\n children?: ReactNode;\n};\n\ntype BackofficeEntityDetailLayoutPageContentProps = {\n config: BackofficeResolvedDetailLayoutFacetConfig;\n prepared: BackofficePreparedDetailLayoutDataRoute;\n layoutNodeRef: unknown;\n children?: ReactNode;\n};\n\nconst BackofficeEntityDetailLayoutPageContent = ({\n config,\n prepared,\n layoutNodeRef,\n children,\n}: BackofficeEntityDetailLayoutPageContentProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities, entityRegistry } = useBackofficeConfig();\n const { pathname } = useLocation();\n const routing = useContext(RoutingContext);\n const layoutNode = useBackofficeFragment<unknown, unknown>(\n config.layoutPage.fragment,\n layoutNodeRef,\n );\n\n const layoutView = config.layoutPage.toView(layoutNode);\n const activePagePath = resolveActivePagePath(pathname, prepared.id, config);\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath,\n node: layoutView,\n });\n\n if (!resolvedPages.hasVisiblePages || resolvedPages.activePage == null) {\n return <BackofficeRedirect to={config.routes.list} />;\n }\n\n const { activePage } = resolvedPages;\n if (\n activePagePath !== '' &&\n normalizePath(activePage.path) !== normalizePath(activePagePath)\n ) {\n return (\n <BackofficeRedirect\n to={config.routes.detailPage(prepared.id, activePage.id)}\n />\n );\n }\n\n const tabsItems = buildTabsItems({\n pages: resolvedPages.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 header = resolveHeaderItems(config.header, layoutView, {\n tApp,\n t,\n resolveEntityHref,\n renderLink: (href, label) => {\n return (\n <Link to={href} preloadOnHover=\"code-and-data\">\n {label}\n </Link>\n );\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 relationMenuItems: BackofficeRelationsMenuItem[] = (\n config.relations ?? []\n ).flatMap((relation) => {\n const { filterId: configuredFilterId, path, target, whereKey } = relation;\n const value = resolveRelationValue(relation.value(layoutView));\n if (value == null) {\n return [];\n }\n\n const entityManifest = entities[target];\n if (entityManifest?.hasList !== true) {\n return [];\n }\n\n const where = setWhereValue(null, whereKey, value, path);\n if (where == null) {\n return [];\n }\n\n const loadedEntity = entityRegistry.getLoadedListEntity(target);\n let filterId = configuredFilterId;\n if (filterId == null) {\n filterId = whereKey;\n if (path != null) {\n filterId = `${whereKey}.${path.join('.')}`;\n }\n }\n\n let href: string;\n if (loadedEntity == null) {\n href = buildBackofficeFallbackListHref(\n entityManifest.routes.list,\n where,\n [\n {\n id: filterId,\n value,\n },\n ],\n );\n } else {\n href = buildBackofficeListHref(loadedEntity.config, { where });\n }\n\n return [\n {\n id: relation.id,\n label: resolveLabel(relation.label, tApp),\n count: (\n <BackofficeLazyEntityCount\n entity={target}\n loadingFallback={<RelationCountLoading />}\n where={where}\n />\n ),\n href,\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, { where });\n\n let search = '';\n if (next.search !== '') {\n search = `?${next.search}`;\n }\n\n routing.history.push({\n pathname: next.pathname,\n search,\n hash: '',\n });\n },\n },\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 let headerMetaNode: JSX.Element | undefined;\n if (header.status != null || header.badges != null) {\n headerMetaNode = (\n <div className={pageStyles.headerMeta}>\n {header.status}\n {header.badges}\n </div>\n );\n }\n let headerItemsNode: JSX.Element | null = null;\n if (header.items != null && header.items.length > 0) {\n headerItemsNode = (\n <div className={pageStyles.headerMetaList}>\n <BackofficeKeyValueList items={header.items} />\n </div>\n );\n }\n let headerActionsNode: JSX.Element | undefined;\n if (relationMenuItems.length > 0) {\n headerActionsNode = (\n <div className={pageStyles.headerRelationGroup}>\n <BackofficeRelationsMenu\n label={t('relations.menu.label')}\n items={relationMenuItems}\n />\n </div>\n );\n }\n\n const headerNode = (\n <div className={pageStyles.headerBlock}>\n <BackofficePageHeader\n title={header.title}\n subtitle={header.subtitle}\n meta={headerMetaNode}\n actions={headerActionsNode}\n />\n {headerItemsNode}\n </div>\n );\n let tabsNode: JSX.Element | null = null;\n if (resolvedPages.pages.length > 1) {\n tabsNode = (\n <Tabs items={tabsItems} activeId={activePage.id} variant=\"underline\" />\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutContextProvider\n value={{\n activePage,\n config,\n entityId: prepared.id,\n layoutView,\n tabsItems,\n visiblePages: resolvedPages.pages,\n }}\n >\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n headerNode={headerNode}\n tabsNode={tabsNode}\n headerDensity=\"compact\"\n >\n <Suspense fallback={<DetailPageContentLoading />}>\n {children}\n </Suspense>\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n </BackofficeEntityDetailLayoutContextProvider>\n );\n};\n\nexport const BackofficeEntityDetailLayoutPage = ({\n config,\n prepared,\n children,\n}: BackofficeEntityDetailLayoutPageProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\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\n if (layoutNodeRef == null) {\n return (\n <BackofficeRightPageLayout\n breadcrumb={[\n {\n kind: 'link',\n target: {\n kind: 'entity-list',\n entityId: config.id,\n },\n label: config.label(tApp),\n },\n {\n kind: 'current',\n target: {\n kind: 'entity-detail',\n entityId: config.id,\n id: prepared.id,\n },\n label: t('detail.notFound'),\n },\n ]}\n >\n <BackofficeEntityDetailNotFound listHref={config.routes.list} />\n </BackofficeRightPageLayout>\n );\n }\n\n return (\n <BackofficeEntityDetailLayoutPageContent\n config={config}\n prepared={prepared}\n layoutNodeRef={layoutNodeRef}\n >\n {children}\n </BackofficeEntityDetailLayoutPageContent>\n );\n};\n\nexport default BackofficeEntityDetailLayoutPage;\n"],"mappings":"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"}
|