@plumile/backoffice-react 0.1.193 → 0.1.195
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/esm/auth/AuthRefreshNotice.js.map +1 -1
- package/lib/esm/auth/TotpQrCode.js +8 -5
- package/lib/esm/auth/TotpQrCode.js.map +1 -1
- package/lib/esm/auth/login/AuthPanel.js.map +1 -1
- package/lib/esm/auth/login/EmailCapturePanel.js +4 -4
- package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
- package/lib/esm/auth/login/LoginFlow.js.map +1 -1
- package/lib/esm/auth/login/MethodChooser.js.map +1 -1
- package/lib/esm/auth/login/MfaChallengeForm.js +4 -4
- package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
- package/lib/esm/auth/login/OidcButtons.js.map +1 -1
- package/lib/esm/auth/login/PasskeyLoginForm.js +4 -4
- package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
- package/lib/esm/auth/login/PasswordLoginPanel.js.map +1 -1
- package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
- package/lib/esm/auth/pages/VerifyEmailScreen.js.map +1 -1
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +0 -1
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
- package/lib/esm/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js.map +1 -1
- package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js.map +1 -1
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +16 -11
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeLifecycleTimelineSection.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js.map +1 -1
- package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js +2 -2
- package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js.map +1 -1
- package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js.map +1 -1
- package/lib/esm/components/backoffice/filters/EntityFilterValue.js.map +1 -1
- package/lib/esm/components/backoffice/filters/EntityIdFilterField.js.map +1 -1
- package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js +4 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
- package/lib/esm/components/backoffice/layout/buildSidebarSections.js.map +1 -1
- package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeInlineLink.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeLink.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeLinkContent.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js.map +1 -1
- package/lib/esm/components/backoffice/list/RowFlagsCell.js.map +1 -1
- package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js.map +1 -1
- package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +9 -9
- package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeLazyEntityCount.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js +4 -4
- 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/routing/BackofficeContentError.js.map +1 -1
- package/lib/esm/components/backoffice/routing/BackofficeContentFallback.js.map +1 -1
- package/lib/esm/components/backoffice/routing/BackofficeRoutePendingBar.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js +8 -5
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +306 -297
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeFormattedCurrency.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeFormattedNumber.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js.map +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js.map +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js.map +1 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js +11 -11
- package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js.map +1 -1
- package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js +1 -1
- package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js.map +1 -1
- package/lib/esm/pages/BackofficeAcceptInvitationPage.js +8 -8
- package/lib/esm/pages/BackofficeAcceptInvitationPage.js.map +1 -1
- package/lib/esm/pages/BackofficeDashboardPage.js +4 -4
- package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
- package/lib/esm/pages/BackofficeDashboardShellPage.js.map +1 -1
- package/lib/esm/pages/BackofficeDashboardWidgetContent.js +62 -43
- package/lib/esm/pages/BackofficeDashboardWidgetContent.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +4 -4
- package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.js +95 -89
- package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +2 -2
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPageConfigPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListDataPage.js +13 -11
- package/lib/esm/pages/BackofficeEntityListDataPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListPage.js +80 -76
- package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListShellPage.js.map +1 -1
- package/lib/esm/pages/BackofficeHubPage.js.map +1 -1
- package/lib/esm/pages/BackofficeLayoutPage.js +56 -53
- package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
- package/lib/esm/pages/BackofficeLoginPage.js +26 -26
- package/lib/esm/pages/BackofficeLoginPage.js.map +1 -1
- package/lib/esm/pages/BackofficePasswordResetCompletePage.js +36 -36
- package/lib/esm/pages/BackofficePasswordResetCompletePage.js.map +1 -1
- package/lib/esm/pages/BackofficePasswordResetRequestPage.js +3 -3
- package/lib/esm/pages/BackofficePasswordResetRequestPage.js.map +1 -1
- package/lib/esm/pages/BackofficeToolShellPage.js.map +1 -1
- package/lib/esm/pages/BackofficeVerifyEmailPage.js +36 -36
- package/lib/esm/pages/BackofficeVerifyEmailPage.js.map +1 -1
- package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js.map +1 -1
- package/lib/esm/provider/BackofficeProvider.js +3 -2
- package/lib/esm/provider/BackofficeProvider.js.map +1 -1
- package/lib/esm/relay/envHelpers.js.map +1 -1
- package/lib/esm/router/createBackofficeRoutes.js +2 -2
- package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
- package/lib/esm/storybook/relay/RelayStory.js +4 -1
- package/lib/esm/storybook/relay/RelayStory.js.map +1 -1
- package/lib/esm/subscriptions/useCursorResumableSubscription.js +4 -4
- package/lib/esm/subscriptions/useCursorResumableSubscription.js.map +1 -1
- package/package.json +20 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeEntityActionFormDialog.js","names":[],"sources":["../../../../../src/components/backoffice/actions/BackofficeEntityActionFormDialog.tsx"],"sourcesContent":["import {\n type FormEvent,\n type JSX,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport {\n type MutationPayloadBase,\n resolveMutationOutcome,\n} from '../../../relay/mutationResult.js';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { Input } from '@plumile/ui/atomic/atoms/input/Input.js';\nimport { Modal } from '@plumile/ui/atomic/atoms/modal/Modal.js';\nimport { Textarea } from '@plumile/ui/atomic/atoms/textarea/Textarea.js';\nimport { CheckboxField } from '@plumile/ui/atomic/molecules/checkbox_field/CheckboxField.js';\nimport { Form } from '@plumile/ui/atomic/molecules/form/Form.js';\nimport { FormError } from '@plumile/ui/atomic/molecules/form_error/FormError.js';\nimport { FormGrid } from '@plumile/ui/atomic/molecules/form_grid/FormGrid.js';\nimport { FormFieldLayout } from '@plumile/ui/atomic/molecules/form_field_layout/FormFieldLayout.js';\nimport { HighlightCode } from '@plumile/ui/atomic/molecules/highlight/HighlightCode.js';\nimport { useToast } from '@plumile/ui/atomic/molecules/toast/ToastProvider.js';\nimport { BackofficeFormSection } from '@plumile/ui/backoffice/molecules/backoffice_form_section/BackofficeFormSection.js';\nimport { SimpleSelect } from '@plumile/ui/components/select/SimpleSelect.js';\nimport type {\n BackofficeEntityActionFormFieldSpec,\n BackofficeEntityFormMutationActionSpec,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { EntityIdFilterField } from '../filters/EntityIdFilterField.js';\nimport { EntityIdPickerDialog } from '../pickers/EntityIdPickerDialog.js';\nimport {\n resolveToastSpec,\n resolveToastViewActions,\n} from './toastViewAction.js';\n\nconst { commitMutation, useRelayEnvironment } = ReactRelay;\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\n\nimport * as styles from './backofficeEntityActionFormDialog.css.js';\n\nexport type BackofficeEntityActionFormDialogProps<Node> = {\n isOpen: boolean;\n action: BackofficeEntityFormMutationActionSpec<Node, any, any, any>;\n node: Node;\n onClose: () => void;\n onSuccess?: () => void;\n};\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n};\n\nconst extractMutationPayload = (\n response: unknown,\n): MutationPayloadBase | null => {\n if (!isPlainObject(response)) {\n return null;\n }\n\n for (const value of Object.values(response)) {\n if (isPlainObject(value) && ('status' in value || 'result' in value)) {\n return value;\n }\n }\n\n return null;\n};\n\nconst buildDefaultValues = (\n fields: readonly BackofficeEntityActionFormFieldSpec[],\n): Record<string, unknown> => {\n const output: Record<string, unknown> = {};\n fields.forEach((field) => {\n if (field.kind === 'boolean') {\n output[field.id] = field.defaultValue ?? false;\n return;\n }\n if (field.kind === 'multiEnum') {\n output[field.id] = field.defaultValue ?? [];\n return;\n }\n if (field.defaultValue != null) {\n output[field.id] = field.defaultValue;\n return;\n }\n output[field.id] = '';\n });\n return output;\n};\n\nconst normalizeInitialValue = (\n field: BackofficeEntityActionFormFieldSpec,\n value: unknown,\n): unknown => {\n if (field.kind === 'number') {\n if (typeof value === 'number') {\n return String(value);\n }\n if (typeof value === 'string') {\n return value;\n }\n return '';\n }\n if (field.kind === 'multiEnum') {\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => {\n return typeof entry === 'string' && entry.trim() !== '';\n });\n }\n return [];\n }\n if (field.kind === 'boolean') {\n return value === true;\n }\n if (typeof value === 'string') {\n return value;\n }\n return value ?? '';\n};\n\nconst buildInitialValues = <Node,>(\n action: BackofficeEntityFormMutationActionSpec<Node, any, any, any>,\n node: Node,\n): Record<string, unknown> => {\n const defaults = buildDefaultValues(action.fields);\n if (action.getInitialValues == null) {\n return defaults;\n }\n const overrides: unknown = action.getInitialValues(node);\n if (!isPlainObject(overrides)) {\n return defaults;\n }\n const next: Record<string, unknown> = { ...defaults };\n action.fields.forEach((field) => {\n if (!(field.id in overrides)) {\n return;\n }\n next[field.id] = normalizeInitialValue(field, overrides[field.id]);\n });\n return next;\n};\n\nexport const BackofficeEntityActionFormDialog = <Node,>({\n isOpen,\n action,\n node,\n onClose,\n onSuccess,\n}: BackofficeEntityActionFormDialogProps<Node>): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const routing = useContext(RoutingContext);\n const environment = useRelayEnvironment();\n const toast = useToast();\n const formId = useId();\n\n const [values, setValues] = useState<Record<string, unknown>>({});\n const [formError, setFormError] = useState<string | null>(null);\n const [fieldErrors, setFieldErrors] = useState<Record<string, string>>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [resultValue, setResultValue] = useState<string | null>(null);\n const [resultResponse, setResultResponse] = useState<unknown>(null);\n const [activeEntityPicker, setActiveEntityPicker] = useState<{\n fieldId: string;\n entity: string;\n label: string;\n } | null>(null);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n setValues(buildInitialValues(action, node));\n setFormError(null);\n setFieldErrors({});\n setResultValue(null);\n setResultResponse(null);\n }, [action, isOpen, node]);\n\n const handleClose = useCallback(() => {\n if (isSubmitting) {\n return;\n }\n onClose();\n }, [isSubmitting, onClose]);\n\n const setFieldValue = useCallback((fieldId: string, value: unknown) => {\n setValues((current) => {\n return { ...current, [fieldId]: value };\n });\n setFieldErrors((current) => {\n if (current[fieldId] == null) {\n return current;\n }\n const { [fieldId]: removedValue, ...next } = current;\n return next;\n });\n }, []);\n\n const title = resolveLabel(action.label, tApp);\n\n const resolveRequiredError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.required', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const resolveInvalidNumberError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.invalidNumber', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const resolveInvalidJsonError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.invalidJson', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const resolveInvalidJsonObjectError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.invalidJsonObject', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const resolveInvalidJsonArrayError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.invalidJsonArray', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const buildPayload = useCallback(():\n | { values: Record<string, unknown> }\n | { error: string; fieldId?: string } => {\n const output: Record<string, unknown> = {};\n\n for (const field of action.fields) {\n const fieldLabel = resolveLabel(field.label, tApp);\n const rawValue = values[field.id];\n\n switch (field.kind) {\n case 'text': {\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue.trim();\n }\n if (value === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n output[field.id] = value;\n break;\n }\n case 'textarea': {\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue.trim();\n }\n if (value === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n output[field.id] = value;\n break;\n }\n case 'number': {\n let valueString = '';\n if (typeof rawValue === 'string') {\n valueString = rawValue.trim();\n } else if (\n typeof rawValue === 'number' &&\n Number.isFinite(rawValue)\n ) {\n valueString = String(rawValue);\n }\n if (valueString === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n const parsed = Number(valueString);\n if (!Number.isFinite(parsed)) {\n return {\n error: resolveInvalidNumberError(fieldLabel),\n fieldId: field.id,\n };\n }\n output[field.id] = parsed;\n break;\n }\n case 'json': {\n let valueString = '';\n if (typeof rawValue === 'string') {\n valueString = rawValue.trim();\n }\n if (valueString === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(valueString);\n } catch {\n return {\n error: resolveInvalidJsonError(fieldLabel),\n fieldId: field.id,\n };\n }\n\n const jsonType = field.jsonType ?? 'object';\n if (jsonType === 'object' && !isPlainObject(parsed)) {\n return {\n error: resolveInvalidJsonObjectError(fieldLabel),\n fieldId: field.id,\n };\n }\n if (jsonType === 'array' && !Array.isArray(parsed)) {\n return {\n error: resolveInvalidJsonArrayError(fieldLabel),\n fieldId: field.id,\n };\n }\n\n output[field.id] = parsed;\n break;\n }\n case 'enum': {\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue.trim();\n }\n if (value === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n output[field.id] = value;\n break;\n }\n case 'boolean': {\n output[field.id] = rawValue === true;\n break;\n }\n case 'entityId': {\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue.trim();\n }\n if (value === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n output[field.id] = value;\n break;\n }\n case 'multiEnum': {\n let list: string[] = [];\n if (Array.isArray(rawValue)) {\n list = rawValue.filter((entry): entry is string => {\n return typeof entry === 'string' && entry.trim() !== '';\n });\n }\n if (list.length === 0) {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n output[field.id] = list;\n break;\n }\n default: {\n break;\n }\n }\n }\n\n return { values: output };\n }, [\n action.fields,\n resolveInvalidJsonArrayError,\n resolveInvalidJsonError,\n resolveInvalidJsonObjectError,\n resolveInvalidNumberError,\n resolveRequiredError,\n tApp,\n values,\n ]);\n\n const handleSubmit = useCallback(() => {\n if (isSubmitting) {\n return;\n }\n\n setFormError(null);\n setFieldErrors({});\n\n const payload = buildPayload();\n if ('error' in payload) {\n setFormError(payload.error);\n if (payload.fieldId != null) {\n setFieldErrors({ [payload.fieldId]: payload.error });\n }\n return;\n }\n\n let variables: ReturnType<typeof action.getVariables>;\n try {\n variables = action.getVariables(node, payload.values);\n } catch {\n const message = t('actions.form.errors.invalidPayload');\n setFormError(message);\n return;\n }\n\n setIsSubmitting(true);\n commitMutation(environment, {\n mutation: action.mutation,\n variables,\n updater: (store) => {\n action.updater?.(store, node);\n },\n onCompleted: (response) => {\n setIsSubmitting(false);\n const mutationPayload = extractMutationPayload(response);\n if (mutationPayload != null) {\n let defaultErrorMessage = t('actions.form.errors.invalidPayload');\n if (action.toasts?.error?.message != null) {\n defaultErrorMessage = resolveLabel(\n action.toasts.error.message,\n tApp,\n );\n } else if (action.toasts?.error?.title != null) {\n defaultErrorMessage = resolveLabel(action.toasts.error.title, tApp);\n }\n\n const outcome = resolveMutationOutcome(mutationPayload, {\n defaultErrorMessage,\n mapReason: (reason) => {\n const mapped = action.mapErrorReason?.(reason, node);\n if (mapped == null) {\n return null;\n }\n if (typeof mapped === 'function') {\n return resolveLabel(mapped, tApp);\n }\n return String(mapped);\n },\n });\n if (!outcome.ok) {\n const error = new Error(outcome.message);\n setFormError(outcome.message);\n action.onError?.(error, node);\n if (action.toasts?.error != null) {\n const toastTitle = resolveLabel(action.toasts.error.title, tApp);\n let toastMessage: string | undefined;\n if (action.toasts.error.message != null) {\n toastMessage = resolveLabel(action.toasts.error.message, tApp);\n }\n toast.error(toastTitle, toastMessage);\n }\n return;\n }\n }\n\n action.onCompleted?.(response, node);\n\n let hasCustomResult = false;\n if (action.result?.render != null) {\n const renderedResult = action.result.render(response, node);\n if (renderedResult != null) {\n hasCustomResult = true;\n setResultResponse(response);\n }\n }\n if (action.toasts?.success != null) {\n const toastSpec = resolveToastSpec(action.toasts.success, tApp);\n const toastActions = resolveToastViewActions({\n toast: action.toasts.success,\n response,\n node,\n tApp,\n entities,\n defaultLabel: t('actions.view'),\n navigateTo: (to) => {\n routing?.history.push({ pathname: to });\n },\n });\n toast.push({\n kind: 'info',\n title: toastSpec.title,\n message: toastSpec.message,\n actions: toastActions,\n });\n }\n\n if (action.result != null) {\n const nextValue = action.result.getValue(response, node);\n if (typeof nextValue === 'string' && nextValue.trim() !== '') {\n setResultValue(nextValue);\n onSuccess?.();\n return;\n }\n }\n\n if (hasCustomResult) {\n onSuccess?.();\n return;\n }\n\n onSuccess?.();\n onClose();\n },\n onError: (error) => {\n setIsSubmitting(false);\n const message = t('actions.form.errors.submitFailed');\n setFormError(message);\n action.onError?.(error, node);\n if (action.toasts?.error != null) {\n const toastTitle = resolveLabel(action.toasts.error.title, tApp);\n let toastMessage: string | undefined;\n if (action.toasts.error.message != null) {\n toastMessage = resolveLabel(action.toasts.error.message, tApp);\n }\n toast.error(toastTitle, toastMessage);\n }\n },\n });\n }, [\n action,\n buildPayload,\n entities,\n environment,\n isSubmitting,\n node,\n onClose,\n onSuccess,\n routing?.history,\n t,\n tApp,\n toast,\n ]);\n\n const handleFormSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n handleSubmit();\n },\n [handleSubmit],\n );\n\n const resultLabel = useMemo(() => {\n if (action.result == null) {\n return null;\n }\n return resolveLabel(action.result.label, tApp);\n }, [action.result, tApp]);\n\n const resultRender = useMemo(() => {\n if (action.result?.render == null || resultResponse == null) {\n return null;\n }\n return action.result.render(resultResponse, node);\n }, [action.result, node, resultResponse]);\n\n const showResult =\n (resultValue != null && resultLabel != null) || resultRender != null;\n\n const submitLabel = resolveLabel(action.label, tApp);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <>\n <Modal\n isOpen={isOpen}\n onClose={handleClose}\n title={title}\n initialFocus=\"first-form-control\"\n footer={\n <div className={styles.actions}>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n disabled={isSubmitting}\n onClick={handleClose}\n >\n {t('actions.form.cancel')}\n </Button>\n {!showResult && (\n <Button\n type=\"submit\"\n variant=\"primary\"\n size=\"small\"\n disabled={isSubmitting}\n isLoading={isSubmitting}\n loadingLabel={t('actions.form.submitting')}\n onClick={handleSubmit}\n >\n {submitLabel}\n </Button>\n )}\n </div>\n }\n >\n <Form onSubmit={handleFormSubmit} className={styles.form}>\n <FormError message={formError} />\n <BackofficeFormSection>\n <FormGrid layout=\"vertical\">\n {action.fields.map((field) => {\n const fieldLabel = resolveLabel(field.label, tApp);\n let fieldDescription: string | null = null;\n if (field.description != null) {\n fieldDescription = resolveLabel(field.description, tApp);\n }\n const fieldInputId = `${formId}-${field.id}`;\n const fieldDescriptionId = `${fieldInputId}-description`;\n const fieldErrorId = `${fieldInputId}-error`;\n const fieldError = fieldErrors[field.id] ?? null;\n const isFieldInvalid = fieldError != null;\n let inputVariant: 'error' | undefined;\n let selectState: 'default' | 'error' = 'default';\n if (isFieldInvalid) {\n inputVariant = 'error';\n selectState = 'error';\n }\n let describedBy: string | undefined;\n if (fieldDescription != null && fieldError != null) {\n describedBy = `${fieldDescriptionId} ${fieldErrorId}`;\n } else if (fieldDescription != null) {\n describedBy = fieldDescriptionId;\n } else if (fieldError != null) {\n describedBy = fieldErrorId;\n }\n\n switch (field.kind) {\n case 'text': {\n const rawValue = values[field.id];\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue;\n }\n let placeholder: string | undefined;\n if (field.placeholder != null) {\n placeholder = resolveLabel(field.placeholder, tApp);\n }\n return (\n <FormFieldLayout\n key={field.id}\n label={fieldLabel}\n labelFor={fieldInputId}\n required={field.required}\n description={fieldDescription}\n descriptionId={fieldDescriptionId}\n error={fieldError}\n errorId={fieldErrorId}\n >\n <Input\n id={fieldInputId}\n type=\"text\"\n value={value}\n placeholder={placeholder}\n aria-describedby={describedBy}\n aria-invalid={isFieldInvalid}\n disabled={isSubmitting}\n variant={inputVariant}\n onChange={(event) => {\n setFieldValue(field.id, event.target.value);\n }}\n fullWidth\n />\n </FormFieldLayout>\n );\n }\n case 'textarea': {\n const rawValue = values[field.id];\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue;\n }\n let placeholder: string | undefined;\n if (field.placeholder != null) {\n placeholder = resolveLabel(field.placeholder, tApp);\n }\n return (\n <FormFieldLayout\n key={field.id}\n label={fieldLabel}\n labelFor={fieldInputId}\n required={field.required}\n description={fieldDescription}\n descriptionId={fieldDescriptionId}\n error={fieldError}\n errorId={fieldErrorId}\n >\n <Textarea\n id={fieldInputId}\n value={value}\n placeholder={placeholder}\n rows={field.rows ?? 8}\n aria-describedby={describedBy}\n aria-invalid={isFieldInvalid}\n disabled={isSubmitting}\n variant={inputVariant}\n onChange={(event) => {\n setFieldValue(field.id, event.target.value);\n }}\n fullWidth\n />\n </FormFieldLayout>\n );\n }\n case 'number': {\n const rawValue = values[field.id];\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue;\n }\n let placeholder: string | undefined;\n if (field.placeholder != null) {\n placeholder = resolveLabel(field.placeholder, tApp);\n }\n return (\n <FormFieldLayout\n key={field.id}\n label={fieldLabel}\n labelFor={fieldInputId}\n required={field.required}\n description={fieldDescription}\n descriptionId={fieldDescriptionId}\n error={fieldError}\n errorId={fieldErrorId}\n >\n <Input\n id={fieldInputId}\n type=\"number\"\n value={value}\n placeholder={placeholder}\n aria-describedby={describedBy}\n aria-invalid={isFieldInvalid}\n disabled={isSubmitting}\n variant={inputVariant}\n onChange={(event) => {\n setFieldValue(field.id, event.target.value);\n }}\n fullWidth\n />\n </FormFieldLayout>\n );\n }\n case 'json': {\n const rawValue = values[field.id];\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue;\n }\n let placeholder: string | undefined;\n if (field.placeholder != null) {\n placeholder = resolveLabel(field.placeholder, tApp);\n }\n return (\n <FormFieldLayout\n key={field.id}\n label={fieldLabel}\n labelFor={fieldInputId}\n required={field.required}\n description={fieldDescription}\n descriptionId={fieldDescriptionId}\n error={fieldError}\n errorId={fieldErrorId}\n >\n <Textarea\n id={fieldInputId}\n value={value}\n placeholder={placeholder}\n rows={8}\n aria-describedby={describedBy}\n aria-invalid={isFieldInvalid}\n disabled={isSubmitting}\n variant={inputVariant}\n onChange={(event) => {\n setFieldValue(field.id, event.target.value);\n }}\n fullWidth\n />\n </FormFieldLayout>\n );\n }\n case 'enum': {\n const rawValue = values[field.id];\n let selected = '';\n if (typeof rawValue === 'string') {\n selected = rawValue;\n }\n const options = field.options.map((option) => {\n return {\n id: option.value,\n value: option.value,\n label: resolveLabel(option.label, tApp),\n };\n });\n return (\n <FormFieldLayout\n key={field.id}\n label={fieldLabel}\n labelId={`${fieldInputId}-label`}\n required={field.required}\n description={fieldDescription}\n descriptionId={fieldDescriptionId}\n error={fieldError}\n errorId={fieldErrorId}\n >\n <SimpleSelect\n options={options}\n value={selected}\n placeholder={fieldLabel}\n ariaDescribedBy={describedBy}\n ariaInvalid={isFieldInvalid}\n ariaLabelledBy={`${fieldInputId}-label`}\n isDisabled={isSubmitting}\n state={selectState}\n onChange={(nextValue) => {\n setFieldValue(field.id, nextValue);\n }}\n />\n </FormFieldLayout>\n );\n }\n case 'boolean': {\n const checked = values[field.id] === true;\n return (\n <FormFieldLayout key={field.id}>\n <CheckboxField\n id={fieldInputId}\n label={fieldLabel}\n helperText={fieldDescription ?? undefined}\n error={fieldError ?? undefined}\n checked={checked}\n disabled={isSubmitting}\n onChange={(event) => {\n setFieldValue(field.id, event.target.checked);\n }}\n />\n </FormFieldLayout>\n );\n }\n case 'entityId': {\n const rawValue = values[field.id];\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue;\n }\n return (\n <FormFieldLayout\n key={field.id}\n label={fieldLabel}\n labelFor={fieldInputId}\n required={field.required}\n description={fieldDescription}\n descriptionId={fieldDescriptionId}\n error={fieldError}\n errorId={fieldErrorId}\n >\n <EntityIdFilterField\n id={fieldInputId}\n label={fieldLabel}\n value={value}\n ariaDescribedBy={describedBy}\n ariaInvalid={isFieldInvalid}\n disabled={isSubmitting}\n onPick={() => {\n setActiveEntityPicker({\n fieldId: field.id,\n entity: field.entity,\n label: fieldLabel,\n });\n }}\n onClear={() => {\n setFieldValue(field.id, '');\n }}\n />\n </FormFieldLayout>\n );\n }\n case 'multiEnum': {\n const rawValue = values[field.id];\n const fieldLegendId = `${fieldInputId}-legend`;\n let selected: string[] = [];\n if (Array.isArray(rawValue)) {\n selected = rawValue.filter((entry): entry is string => {\n return typeof entry === 'string';\n });\n }\n return (\n <FormFieldLayout\n key={field.id}\n as=\"fieldset\"\n label={fieldLabel}\n labelId={fieldLegendId}\n required={field.required}\n description={fieldDescription}\n descriptionId={fieldDescriptionId}\n error={fieldError}\n errorId={fieldErrorId}\n >\n <div\n className={styles.checkboxGroup}\n role=\"group\"\n aria-labelledby={fieldLegendId}\n aria-describedby={describedBy}\n aria-invalid={isFieldInvalid}\n >\n {field.options.map((option, index) => {\n const optionLabel = resolveLabel(\n option.label,\n tApp,\n );\n const isChecked = selected.includes(option.value);\n return (\n <CheckboxField\n key={`${option.value}-${index}`}\n id={`${fieldInputId}-${index}`}\n label={optionLabel}\n checked={isChecked}\n disabled={isSubmitting}\n onChange={(event) => {\n let nextList = selected;\n if (event.target.checked) {\n if (!selected.includes(option.value)) {\n nextList = [...selected, option.value];\n }\n } else {\n nextList = selected.filter((value) => {\n return value !== option.value;\n });\n }\n setFieldValue(field.id, nextList);\n }}\n />\n );\n })}\n </div>\n </FormFieldLayout>\n );\n }\n default: {\n return null;\n }\n }\n })}\n </FormGrid>\n </BackofficeFormSection>\n\n {showResult && (\n <div className={styles.resultSection}>\n {resultValue != null && resultLabel != null && (\n <HighlightCode\n badgeLabel={resultLabel}\n copyCode={resultValue}\n fallbackCodeText={resultValue}\n />\n )}\n {resultRender}\n </div>\n )}\n </Form>\n </Modal>\n <EntityIdPickerDialog\n isOpen={activeEntityPicker != null}\n entity={activeEntityPicker?.entity ?? ''}\n title={activeEntityPicker?.label ?? ''}\n onClose={() => {\n setActiveEntityPicker(null);\n }}\n onSelectId={(id) => {\n if (activeEntityPicker == null) {\n return;\n }\n setFieldValue(activeEntityPicker.fieldId, id);\n setActiveEntityPicker(null);\n }}\n />\n </>\n );\n};\n\nexport default BackofficeEntityActionFormDialog;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackofficeEntityActionFormDialog.js","names":[],"sources":["../../../../../src/components/backoffice/actions/BackofficeEntityActionFormDialog.tsx"],"sourcesContent":["import {\n type FormEvent,\n type JSX,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport {\n type MutationPayloadBase,\n resolveMutationOutcome,\n} from '../../../relay/mutationResult.js';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { Input } from '@plumile/ui/atomic/atoms/input/Input.js';\nimport { Modal } from '@plumile/ui/atomic/atoms/modal/Modal.js';\nimport { Textarea } from '@plumile/ui/atomic/atoms/textarea/Textarea.js';\nimport { CheckboxField } from '@plumile/ui/atomic/molecules/checkbox_field/CheckboxField.js';\nimport { Form } from '@plumile/ui/atomic/molecules/form/Form.js';\nimport { FormError } from '@plumile/ui/atomic/molecules/form_error/FormError.js';\nimport { FormGrid } from '@plumile/ui/atomic/molecules/form_grid/FormGrid.js';\nimport { FormFieldLayout } from '@plumile/ui/atomic/molecules/form_field_layout/FormFieldLayout.js';\nimport { HighlightCode } from '@plumile/ui/atomic/molecules/highlight/HighlightCode.js';\nimport { useToast } from '@plumile/ui/atomic/molecules/toast/ToastProvider.js';\nimport { BackofficeFormSection } from '@plumile/ui/backoffice/molecules/backoffice_form_section/BackofficeFormSection.js';\nimport { SimpleSelect } from '@plumile/ui/components/select/SimpleSelect.js';\nimport type {\n BackofficeEntityActionFormFieldSpec,\n BackofficeEntityFormMutationActionSpec,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { EntityIdFilterField } from '../filters/EntityIdFilterField.js';\nimport { EntityIdPickerDialog } from '../pickers/EntityIdPickerDialog.js';\nimport {\n resolveToastSpec,\n resolveToastViewActions,\n} from './toastViewAction.js';\n\nconst { commitMutation, useRelayEnvironment } = ReactRelay;\nimport RoutingContext from '@plumile/router/routing/RoutingContext.js';\n\nimport * as styles from './backofficeEntityActionFormDialog.css.js';\n\nexport type BackofficeEntityActionFormDialogProps<Node> = {\n isOpen: boolean;\n action: BackofficeEntityFormMutationActionSpec<Node, any, any, any>;\n node: Node;\n onClose: () => void;\n onSuccess?: () => void;\n};\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n};\n\nconst extractMutationPayload = (\n response: unknown,\n): MutationPayloadBase | null => {\n if (!isPlainObject(response)) {\n return null;\n }\n\n for (const value of Object.values(response)) {\n if (isPlainObject(value) && ('status' in value || 'result' in value)) {\n return value;\n }\n }\n\n return null;\n};\n\nconst buildDefaultValues = (\n fields: readonly BackofficeEntityActionFormFieldSpec[],\n): Record<string, unknown> => {\n const output: Record<string, unknown> = {};\n fields.forEach((field) => {\n if (field.kind === 'boolean') {\n output[field.id] = field.defaultValue ?? false;\n return;\n }\n if (field.kind === 'multiEnum') {\n output[field.id] = field.defaultValue ?? [];\n return;\n }\n if (field.defaultValue != null) {\n output[field.id] = field.defaultValue;\n return;\n }\n output[field.id] = '';\n });\n return output;\n};\n\nconst normalizeInitialValue = (\n field: BackofficeEntityActionFormFieldSpec,\n value: unknown,\n): unknown => {\n if (field.kind === 'number') {\n if (typeof value === 'number') {\n return String(value);\n }\n if (typeof value === 'string') {\n return value;\n }\n return '';\n }\n if (field.kind === 'multiEnum') {\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => {\n return typeof entry === 'string' && entry.trim() !== '';\n });\n }\n return [];\n }\n if (field.kind === 'boolean') {\n return value === true;\n }\n if (typeof value === 'string') {\n return value;\n }\n return value ?? '';\n};\n\nconst buildInitialValues = <Node,>(\n action: BackofficeEntityFormMutationActionSpec<Node, any, any, any>,\n node: Node,\n): Record<string, unknown> => {\n const defaults = buildDefaultValues(action.fields);\n if (action.getInitialValues == null) {\n return defaults;\n }\n const overrides: unknown = action.getInitialValues(node);\n if (!isPlainObject(overrides)) {\n return defaults;\n }\n const next: Record<string, unknown> = { ...defaults };\n action.fields.forEach((field) => {\n if (!(field.id in overrides)) {\n return;\n }\n next[field.id] = normalizeInitialValue(field, overrides[field.id]);\n });\n return next;\n};\n\nexport const BackofficeEntityActionFormDialog = <Node,>({\n isOpen,\n action,\n node,\n onClose,\n onSuccess,\n}: BackofficeEntityActionFormDialogProps<Node>): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const routing = useContext(RoutingContext);\n const environment = useRelayEnvironment();\n const toast = useToast();\n const formId = useId();\n\n const [values, setValues] = useState<Record<string, unknown>>({});\n const [formError, setFormError] = useState<string | null>(null);\n const [fieldErrors, setFieldErrors] = useState<Record<string, string>>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [resultValue, setResultValue] = useState<string | null>(null);\n const [resultResponse, setResultResponse] = useState<unknown>(null);\n const [activeEntityPicker, setActiveEntityPicker] = useState<{\n fieldId: string;\n entity: string;\n label: string;\n } | null>(null);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n setValues(buildInitialValues(action, node));\n setFormError(null);\n setFieldErrors({});\n setResultValue(null);\n setResultResponse(null);\n }, [action, isOpen, node]);\n\n const handleClose = useCallback(() => {\n if (isSubmitting) {\n return;\n }\n onClose();\n }, [isSubmitting, onClose]);\n\n const setFieldValue = useCallback((fieldId: string, value: unknown) => {\n setValues((current) => {\n return { ...current, [fieldId]: value };\n });\n setFieldErrors((current) => {\n if (current[fieldId] == null) {\n return current;\n }\n const { [fieldId]: removedValue, ...next } = current;\n return next;\n });\n }, []);\n\n const title = resolveLabel(action.label, tApp);\n\n const resolveRequiredError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.required', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const resolveInvalidNumberError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.invalidNumber', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const resolveInvalidJsonError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.invalidJson', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const resolveInvalidJsonObjectError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.invalidJsonObject', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const resolveInvalidJsonArrayError = useCallback(\n (fieldLabel: string): string => {\n return t('actions.form.errors.invalidJsonArray', {\n label: fieldLabel,\n });\n },\n [t],\n );\n\n const buildPayload = useCallback(():\n | { values: Record<string, unknown> }\n | { error: string; fieldId?: string } => {\n const output: Record<string, unknown> = {};\n\n for (const field of action.fields) {\n const fieldLabel = resolveLabel(field.label, tApp);\n const rawValue = values[field.id];\n\n switch (field.kind) {\n case 'text': {\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue.trim();\n }\n if (value === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n output[field.id] = value;\n break;\n }\n case 'textarea': {\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue.trim();\n }\n if (value === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n output[field.id] = value;\n break;\n }\n case 'number': {\n let valueString = '';\n if (typeof rawValue === 'string') {\n valueString = rawValue.trim();\n } else if (\n typeof rawValue === 'number' &&\n Number.isFinite(rawValue)\n ) {\n valueString = String(rawValue);\n }\n if (valueString === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n const parsed = Number(valueString);\n if (!Number.isFinite(parsed)) {\n return {\n error: resolveInvalidNumberError(fieldLabel),\n fieldId: field.id,\n };\n }\n output[field.id] = parsed;\n break;\n }\n case 'json': {\n let valueString = '';\n if (typeof rawValue === 'string') {\n valueString = rawValue.trim();\n }\n if (valueString === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(valueString);\n } catch {\n return {\n error: resolveInvalidJsonError(fieldLabel),\n fieldId: field.id,\n };\n }\n\n const jsonType = field.jsonType ?? 'object';\n if (jsonType === 'object' && !isPlainObject(parsed)) {\n return {\n error: resolveInvalidJsonObjectError(fieldLabel),\n fieldId: field.id,\n };\n }\n if (jsonType === 'array' && !Array.isArray(parsed)) {\n return {\n error: resolveInvalidJsonArrayError(fieldLabel),\n fieldId: field.id,\n };\n }\n\n output[field.id] = parsed;\n break;\n }\n case 'enum': {\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue.trim();\n }\n if (value === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n output[field.id] = value;\n break;\n }\n case 'boolean': {\n output[field.id] = rawValue === true;\n break;\n }\n case 'entityId': {\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue.trim();\n }\n if (value === '') {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n output[field.id] = value;\n break;\n }\n case 'multiEnum': {\n let list: string[] = [];\n if (Array.isArray(rawValue)) {\n list = rawValue.filter((entry): entry is string => {\n return typeof entry === 'string' && entry.trim() !== '';\n });\n }\n if (list.length === 0) {\n if (field.required) {\n return {\n error: resolveRequiredError(fieldLabel),\n fieldId: field.id,\n };\n }\n break;\n }\n output[field.id] = list;\n break;\n }\n default: {\n break;\n }\n }\n }\n\n return { values: output };\n }, [\n action.fields,\n resolveInvalidJsonArrayError,\n resolveInvalidJsonError,\n resolveInvalidJsonObjectError,\n resolveInvalidNumberError,\n resolveRequiredError,\n tApp,\n values,\n ]);\n\n const handleSubmit = useCallback(() => {\n if (isSubmitting) {\n return;\n }\n\n setFormError(null);\n setFieldErrors({});\n\n const payload = buildPayload();\n if ('error' in payload) {\n setFormError(payload.error);\n if (payload.fieldId != null) {\n setFieldErrors({ [payload.fieldId]: payload.error });\n }\n return;\n }\n\n let variables: ReturnType<typeof action.getVariables>;\n try {\n variables = action.getVariables(node, payload.values);\n } catch {\n const message = t('actions.form.errors.invalidPayload');\n setFormError(message);\n return;\n }\n\n setIsSubmitting(true);\n commitMutation(environment, {\n mutation: action.mutation,\n variables,\n updater: (store) => {\n action.updater?.(store, node);\n },\n onCompleted: (response) => {\n setIsSubmitting(false);\n const mutationPayload = extractMutationPayload(response);\n if (mutationPayload != null) {\n let defaultErrorMessage = t('actions.form.errors.invalidPayload');\n if (action.toasts?.error?.message != null) {\n defaultErrorMessage = resolveLabel(\n action.toasts.error.message,\n tApp,\n );\n } else if (action.toasts?.error?.title != null) {\n defaultErrorMessage = resolveLabel(action.toasts.error.title, tApp);\n }\n\n const outcome = resolveMutationOutcome(mutationPayload, {\n defaultErrorMessage,\n mapReason: (reason) => {\n const mapped = action.mapErrorReason?.(reason, node);\n if (mapped == null) {\n return null;\n }\n if (typeof mapped === 'function') {\n return resolveLabel(mapped, tApp);\n }\n return String(mapped);\n },\n });\n if (!outcome.ok) {\n const error = new Error(outcome.message);\n setFormError(outcome.message);\n action.onError?.(error, node);\n if (action.toasts?.error != null) {\n const toastTitle = resolveLabel(action.toasts.error.title, tApp);\n let toastMessage: string | undefined;\n if (action.toasts.error.message != null) {\n toastMessage = resolveLabel(action.toasts.error.message, tApp);\n }\n toast.error(toastTitle, toastMessage);\n }\n return;\n }\n }\n\n action.onCompleted?.(response, node);\n\n let hasCustomResult = false;\n if (action.result?.render != null) {\n const renderedResult = action.result.render(response, node);\n if (renderedResult != null) {\n hasCustomResult = true;\n setResultResponse(response);\n }\n }\n if (action.toasts?.success != null) {\n const toastSpec = resolveToastSpec(action.toasts.success, tApp);\n const toastActions = resolveToastViewActions({\n toast: action.toasts.success,\n response,\n node,\n tApp,\n entities,\n defaultLabel: t('actions.view'),\n navigateTo: (to) => {\n routing?.history.push({ pathname: to });\n },\n });\n toast.push({\n kind: 'info',\n title: toastSpec.title,\n message: toastSpec.message,\n actions: toastActions,\n });\n }\n\n if (action.result != null) {\n const nextValue = action.result.getValue(response, node);\n if (typeof nextValue === 'string' && nextValue.trim() !== '') {\n setResultValue(nextValue);\n onSuccess?.();\n return;\n }\n }\n\n if (hasCustomResult) {\n onSuccess?.();\n return;\n }\n\n onSuccess?.();\n onClose();\n },\n onError: (error) => {\n setIsSubmitting(false);\n const message = t('actions.form.errors.submitFailed');\n setFormError(message);\n action.onError?.(error, node);\n if (action.toasts?.error != null) {\n const toastTitle = resolveLabel(action.toasts.error.title, tApp);\n let toastMessage: string | undefined;\n if (action.toasts.error.message != null) {\n toastMessage = resolveLabel(action.toasts.error.message, tApp);\n }\n toast.error(toastTitle, toastMessage);\n }\n },\n });\n }, [\n action,\n buildPayload,\n entities,\n environment,\n isSubmitting,\n node,\n onClose,\n onSuccess,\n routing?.history,\n t,\n tApp,\n toast,\n ]);\n\n const handleFormSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n handleSubmit();\n },\n [handleSubmit],\n );\n\n const resultLabel = useMemo(() => {\n if (action.result == null) {\n return null;\n }\n return resolveLabel(action.result.label, tApp);\n }, [action.result, tApp]);\n\n const resultRender = useMemo(() => {\n if (action.result?.render == null || resultResponse == null) {\n return null;\n }\n return action.result.render(resultResponse, node);\n }, [action.result, node, resultResponse]);\n\n const showResult =\n (resultValue != null && resultLabel != null) || resultRender != null;\n\n const submitLabel = resolveLabel(action.label, tApp);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <>\n <Modal\n isOpen={isOpen}\n onClose={handleClose}\n title={title}\n initialFocus=\"first-form-control\"\n footer={\n <div className={styles.actions}>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n disabled={isSubmitting}\n onClick={handleClose}\n >\n {t('actions.form.cancel')}\n </Button>\n {!showResult && (\n <Button\n type=\"submit\"\n variant=\"primary\"\n size=\"small\"\n disabled={isSubmitting}\n isLoading={isSubmitting}\n loadingLabel={t('actions.form.submitting')}\n onClick={handleSubmit}\n >\n {submitLabel}\n </Button>\n )}\n </div>\n }\n >\n <Form onSubmit={handleFormSubmit} className={styles.form}>\n <FormError message={formError} />\n <BackofficeFormSection>\n <FormGrid layout=\"vertical\">\n {action.fields.map((field) => {\n const fieldLabel = resolveLabel(field.label, tApp);\n let fieldDescription: string | null = null;\n if (field.description != null) {\n fieldDescription = resolveLabel(field.description, tApp);\n }\n const fieldInputId = `${formId}-${field.id}`;\n const fieldDescriptionId = `${fieldInputId}-description`;\n const fieldErrorId = `${fieldInputId}-error`;\n const fieldError = fieldErrors[field.id] ?? null;\n const isFieldInvalid = fieldError != null;\n let inputVariant: 'error' | undefined;\n let selectState: 'default' | 'error' = 'default';\n if (isFieldInvalid) {\n inputVariant = 'error';\n selectState = 'error';\n }\n let describedBy: string | undefined;\n if (fieldDescription != null && fieldError != null) {\n describedBy = `${fieldDescriptionId} ${fieldErrorId}`;\n } else if (fieldDescription != null) {\n describedBy = fieldDescriptionId;\n } else if (fieldError != null) {\n describedBy = fieldErrorId;\n }\n\n switch (field.kind) {\n case 'text': {\n const rawValue = values[field.id];\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue;\n }\n let placeholder: string | undefined;\n if (field.placeholder != null) {\n placeholder = resolveLabel(field.placeholder, tApp);\n }\n return (\n <FormFieldLayout\n key={field.id}\n label={fieldLabel}\n labelFor={fieldInputId}\n required={field.required}\n description={fieldDescription}\n descriptionId={fieldDescriptionId}\n error={fieldError}\n errorId={fieldErrorId}\n >\n <Input\n id={fieldInputId}\n type=\"text\"\n value={value}\n placeholder={placeholder}\n aria-describedby={describedBy}\n aria-invalid={isFieldInvalid}\n disabled={isSubmitting}\n variant={inputVariant}\n onChange={(event) => {\n setFieldValue(field.id, event.target.value);\n }}\n fullWidth\n />\n </FormFieldLayout>\n );\n }\n case 'textarea': {\n const rawValue = values[field.id];\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue;\n }\n let placeholder: string | undefined;\n if (field.placeholder != null) {\n placeholder = resolveLabel(field.placeholder, tApp);\n }\n return (\n <FormFieldLayout\n key={field.id}\n label={fieldLabel}\n labelFor={fieldInputId}\n required={field.required}\n description={fieldDescription}\n descriptionId={fieldDescriptionId}\n error={fieldError}\n errorId={fieldErrorId}\n >\n <Textarea\n id={fieldInputId}\n value={value}\n placeholder={placeholder}\n rows={field.rows ?? 8}\n aria-describedby={describedBy}\n aria-invalid={isFieldInvalid}\n disabled={isSubmitting}\n variant={inputVariant}\n onChange={(event) => {\n setFieldValue(field.id, event.target.value);\n }}\n fullWidth\n />\n </FormFieldLayout>\n );\n }\n case 'number': {\n const rawValue = values[field.id];\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue;\n }\n let placeholder: string | undefined;\n if (field.placeholder != null) {\n placeholder = resolveLabel(field.placeholder, tApp);\n }\n return (\n <FormFieldLayout\n key={field.id}\n label={fieldLabel}\n labelFor={fieldInputId}\n required={field.required}\n description={fieldDescription}\n descriptionId={fieldDescriptionId}\n error={fieldError}\n errorId={fieldErrorId}\n >\n <Input\n id={fieldInputId}\n type=\"number\"\n value={value}\n placeholder={placeholder}\n aria-describedby={describedBy}\n aria-invalid={isFieldInvalid}\n disabled={isSubmitting}\n variant={inputVariant}\n onChange={(event) => {\n setFieldValue(field.id, event.target.value);\n }}\n fullWidth\n />\n </FormFieldLayout>\n );\n }\n case 'json': {\n const rawValue = values[field.id];\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue;\n }\n let placeholder: string | undefined;\n if (field.placeholder != null) {\n placeholder = resolveLabel(field.placeholder, tApp);\n }\n return (\n <FormFieldLayout\n key={field.id}\n label={fieldLabel}\n labelFor={fieldInputId}\n required={field.required}\n description={fieldDescription}\n descriptionId={fieldDescriptionId}\n error={fieldError}\n errorId={fieldErrorId}\n >\n <Textarea\n id={fieldInputId}\n value={value}\n placeholder={placeholder}\n rows={8}\n aria-describedby={describedBy}\n aria-invalid={isFieldInvalid}\n disabled={isSubmitting}\n variant={inputVariant}\n onChange={(event) => {\n setFieldValue(field.id, event.target.value);\n }}\n fullWidth\n />\n </FormFieldLayout>\n );\n }\n case 'enum': {\n const rawValue = values[field.id];\n let selected = '';\n if (typeof rawValue === 'string') {\n selected = rawValue;\n }\n const options = field.options.map((option) => {\n return {\n id: option.value,\n value: option.value,\n label: resolveLabel(option.label, tApp),\n };\n });\n return (\n <FormFieldLayout\n key={field.id}\n label={fieldLabel}\n labelId={`${fieldInputId}-label`}\n required={field.required}\n description={fieldDescription}\n descriptionId={fieldDescriptionId}\n error={fieldError}\n errorId={fieldErrorId}\n >\n <SimpleSelect\n options={options}\n value={selected}\n placeholder={fieldLabel}\n ariaDescribedBy={describedBy}\n ariaInvalid={isFieldInvalid}\n ariaLabelledBy={`${fieldInputId}-label`}\n isDisabled={isSubmitting}\n state={selectState}\n onChange={(nextValue) => {\n setFieldValue(field.id, nextValue);\n }}\n />\n </FormFieldLayout>\n );\n }\n case 'boolean': {\n const checked = values[field.id] === true;\n return (\n <FormFieldLayout key={field.id}>\n <CheckboxField\n id={fieldInputId}\n label={fieldLabel}\n helperText={fieldDescription ?? undefined}\n error={fieldError ?? undefined}\n checked={checked}\n disabled={isSubmitting}\n onChange={(event) => {\n setFieldValue(field.id, event.target.checked);\n }}\n />\n </FormFieldLayout>\n );\n }\n case 'entityId': {\n const rawValue = values[field.id];\n let value = '';\n if (typeof rawValue === 'string') {\n value = rawValue;\n }\n return (\n <FormFieldLayout\n key={field.id}\n label={fieldLabel}\n labelFor={fieldInputId}\n required={field.required}\n description={fieldDescription}\n descriptionId={fieldDescriptionId}\n error={fieldError}\n errorId={fieldErrorId}\n >\n <EntityIdFilterField\n id={fieldInputId}\n label={fieldLabel}\n value={value}\n ariaDescribedBy={describedBy}\n ariaInvalid={isFieldInvalid}\n disabled={isSubmitting}\n onPick={() => {\n setActiveEntityPicker({\n fieldId: field.id,\n entity: field.entity,\n label: fieldLabel,\n });\n }}\n onClear={() => {\n setFieldValue(field.id, '');\n }}\n />\n </FormFieldLayout>\n );\n }\n case 'multiEnum': {\n const rawValue = values[field.id];\n const fieldLegendId = `${fieldInputId}-legend`;\n let selected: string[] = [];\n if (Array.isArray(rawValue)) {\n selected = rawValue.filter((entry): entry is string => {\n return typeof entry === 'string';\n });\n }\n return (\n <FormFieldLayout\n key={field.id}\n as=\"fieldset\"\n label={fieldLabel}\n labelId={fieldLegendId}\n required={field.required}\n description={fieldDescription}\n descriptionId={fieldDescriptionId}\n error={fieldError}\n errorId={fieldErrorId}\n >\n <div\n className={styles.checkboxGroup}\n role=\"group\"\n aria-labelledby={fieldLegendId}\n aria-describedby={describedBy}\n aria-invalid={isFieldInvalid}\n >\n {field.options.map((option, index) => {\n const optionLabel = resolveLabel(\n option.label,\n tApp,\n );\n const isChecked = selected.includes(option.value);\n return (\n <CheckboxField\n key={`${option.value}-${index}`}\n id={`${fieldInputId}-${index}`}\n label={optionLabel}\n checked={isChecked}\n disabled={isSubmitting}\n onChange={(event) => {\n let nextList = selected;\n if (event.target.checked) {\n if (!selected.includes(option.value)) {\n nextList = [...selected, option.value];\n }\n } else {\n nextList = selected.filter((value) => {\n return value !== option.value;\n });\n }\n setFieldValue(field.id, nextList);\n }}\n />\n );\n })}\n </div>\n </FormFieldLayout>\n );\n }\n default: {\n return null;\n }\n }\n })}\n </FormGrid>\n </BackofficeFormSection>\n\n {showResult && (\n <div className={styles.resultSection}>\n {resultValue != null && resultLabel != null && (\n <HighlightCode\n badgeLabel={resultLabel}\n copyCode={resultValue}\n fallbackCodeText={resultValue}\n />\n )}\n {resultRender}\n </div>\n )}\n </Form>\n </Modal>\n <EntityIdPickerDialog\n isOpen={activeEntityPicker != null}\n entity={activeEntityPicker?.entity ?? ''}\n title={activeEntityPicker?.label ?? ''}\n onClose={() => {\n setActiveEntityPicker(null);\n }}\n onSelectId={(id) => {\n if (activeEntityPicker == null) {\n return;\n }\n setFieldValue(activeEntityPicker.fieldId, id);\n setActiveEntityPicker(null);\n }}\n />\n </>\n );\n};\n\nexport default BackofficeEntityActionFormDialog;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LazyBackofficeEntityActionFormDialog.js","names":[],"sources":["../../../../../src/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.tsx"],"sourcesContent":["import { Suspense, lazy, type JSX } from 'react';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\n\nimport type { BackofficeEntityActionFormDialogProps } from './BackofficeEntityActionFormDialog.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport * as styles from './backofficeEntityActionFormDialog.css.js';\n\nconst BackofficeEntityActionFormDialog = lazy(async () => {\n const module = await import('./BackofficeEntityActionFormDialog.js');\n return { default: module.BackofficeEntityActionFormDialog };\n});\n\nconst ActionDialogFallback = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return (\n <div\n className={styles.lazyFallback}\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <Spinner ariaLabel={t('common.loading')} size={20} />\n <span>{t('common.loading')}</span>\n </div>\n );\n};\n\nexport const LazyBackofficeEntityActionFormDialog = <Node,>(\n props: BackofficeEntityActionFormDialogProps<Node>,\n): JSX.Element => {\n const Dialog = BackofficeEntityActionFormDialog as <TNode>(\n dialogProps: BackofficeEntityActionFormDialogProps<TNode>,\n ) => JSX.Element;\n\n return (\n <Suspense fallback={<ActionDialogFallback />}>\n <Dialog {...props} />\n </Suspense>\n );\n};\n\nexport default LazyBackofficeEntityActionFormDialog;\n"],"mappings":";;;;;;AAOA,IAAM,IAAmC,EAAK,aAErC,EAAE,UAAS,MADG,OAAO,yCAAA,CACH,iCAAiC,EAC3D,GAEK,UAA0C;CAC9C,IAAM,EAAE,SAAM,EAA8B;CAE5C,OACE,kBAAC,OAAD;EACE,WAAW;EACX,MAAK;EACL,aAAU;EACV,aAAU;
|
|
1
|
+
{"version":3,"file":"LazyBackofficeEntityActionFormDialog.js","names":[],"sources":["../../../../../src/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.tsx"],"sourcesContent":["import { Suspense, lazy, type JSX } from 'react';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\n\nimport type { BackofficeEntityActionFormDialogProps } from './BackofficeEntityActionFormDialog.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport * as styles from './backofficeEntityActionFormDialog.css.js';\n\nconst BackofficeEntityActionFormDialog = lazy(async () => {\n const module = await import('./BackofficeEntityActionFormDialog.js');\n return { default: module.BackofficeEntityActionFormDialog };\n});\n\nconst ActionDialogFallback = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return (\n <div\n className={styles.lazyFallback}\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <Spinner ariaLabel={t('common.loading')} size={20} />\n <span>{t('common.loading')}</span>\n </div>\n );\n};\n\nexport const LazyBackofficeEntityActionFormDialog = <Node,>(\n props: BackofficeEntityActionFormDialogProps<Node>,\n): JSX.Element => {\n const Dialog = BackofficeEntityActionFormDialog as <TNode>(\n dialogProps: BackofficeEntityActionFormDialogProps<TNode>,\n ) => JSX.Element;\n\n return (\n <Suspense fallback={<ActionDialogFallback />}>\n <Dialog {...props} />\n </Suspense>\n );\n};\n\nexport default LazyBackofficeEntityActionFormDialog;\n"],"mappings":";;;;;;AAOA,IAAM,IAAmC,EAAK,aAErC,EAAE,UAAS,MADG,OAAO,yCAAA,CACH,iCAAiC,EAC3D,GAEK,UAA0C;CAC9C,IAAM,EAAE,SAAM,EAA8B;CAE5C,OACE,kBAAC,OAAD;EACE,WAAW;EACX,MAAK;EACL,aAAU;EACV,aAAU;EAJZ,UAAA,CAME,kBAAC,GAAD;GAAS,WAAW,EAAE,gBAAgB;GAAG,MAAM;EAAK,CAAA,GACpD,kBAAC,QAAD,EAAA,UAAO,EAAE,gBAAgB,EAAQ,CAAA,CAC9B;;AAET,GAEa,KACX,MAOE,kBAAC,GAAD;CAAU,UAAU,kBAAC,GAAD,CAAuB,CAAA;CACzC,UAAA,kBAAC,GAAD,EAAQ,GAAI,EAAQ,CAAA;AACZ,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeBillingUsageChart.js","names":[],"sources":["../../../../../src/components/backoffice/billing/BackofficeBillingUsageChart.tsx"],"sourcesContent":["import { useMemo, type JSX } from 'react';\nimport { FormattedDate } from '@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js';\nimport { TimeSeriesLineChart } from '@plumile/ui/components/charts/TimeSeriesLineChart.js';\nimport { formatCurrencyAmount } from '@plumile/ui/shared/currencyAmount.js';\nimport { toUtcDailyCategorySeries } from '@plumile/ui/shared/timeSeries.js';\n\nimport * as styles from './backofficeBillingUsageChart.css.js';\n\nexport type BackofficeBillingUsageChartBucket = {\n readonly day: string;\n readonly category: string;\n readonly value: number;\n};\n\nexport type BackofficeBillingUsageChartCategory = {\n readonly id: string;\n readonly label: string;\n readonly color: string;\n};\n\nexport type BackofficeBillingUsageChartProps = {\n readonly currency: string;\n readonly totalAmount: number;\n readonly from: string | null;\n readonly to: string | null;\n readonly buckets: readonly BackofficeBillingUsageChartBucket[];\n readonly categories: readonly BackofficeBillingUsageChartCategory[];\n readonly emptyLabel: string;\n readonly rangePrefix: string;\n readonly ariaLabel: string;\n};\n\nconst dateSeparator = '->';\n\nconst formatBillingAxisValue = (value: number, currency: string): string => {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n};\n\nexport const BackofficeBillingUsageChart = ({\n ariaLabel,\n buckets,\n categories,\n currency,\n emptyLabel,\n from,\n rangePrefix,\n to,\n totalAmount,\n}: BackofficeBillingUsageChartProps): JSX.Element => {\n const categoryOrder = useMemo(() => {\n return categories.map((category) => {\n return category.id;\n });\n }, [categories]);\n\n const categoryColorById = useMemo(() => {\n return Object.fromEntries(\n categories.map((category) => {\n return [category.id, category.color];\n }),\n );\n }, [categories]);\n\n const categoryLabelById = useMemo(() => {\n return Object.fromEntries(\n categories.map((category) => {\n return [category.id, category.label];\n }),\n );\n }, [categories]);\n\n const series = useMemo(() => {\n if (from == null || to == null) {\n return [];\n }\n\n return toUtcDailyCategorySeries({\n fromIsoDateTime: from,\n toIsoDateTime: to,\n buckets,\n categories: categoryOrder,\n });\n }, [buckets, categoryOrder, from, to]);\n\n const formatChartValue = (value: number): string => {\n return formatCurrencyAmount({\n amount: value,\n currency,\n });\n };\n\n if (buckets.length === 0) {\n return <p className={styles.rangeText}>{emptyLabel}</p>;\n }\n\n return (\n <div className={styles.root}>\n <p className={styles.totalValue}>{formatChartValue(totalAmount)}</p>\n {from != null && to != null && (\n <p className={styles.rangeText}>\n {rangePrefix} <FormattedDate value={from} /> {dateSeparator}{' '}\n <FormattedDate value={to} />\n </p>\n )}\n <TimeSeriesLineChart\n ariaLabel={ariaLabel}\n categoryColorById={categoryColorById}\n categoryLabel={(category) => {\n return categoryLabelById[category] ?? category;\n }}\n categoryOrder={categoryOrder}\n formatValue={formatChartValue}\n series={series}\n yAxis={{\n min: 0,\n minTickStep: 1,\n maxTickCount: 5,\n formatValue: (value) => {\n return formatBillingAxisValue(value, currency);\n },\n }}\n />\n </div>\n );\n};\n\nexport default BackofficeBillingUsageChart;\n"],"mappings":";;;;;;;;AAgCA,IAAM,IAAgB,MAEhB,KAA0B,GAAe,MACtC,IAAI,KAAK,aAAa,KAAA,GAAW;CACtC,OAAO;CACP;CACA,uBAAuB;CACvB,uBAAuB;AACzB,CAAC,CAAC,CAAC,OAAO,CAAK,GAGJ,KAA+B,EAC1C,cACA,YACA,eACA,aACA,eACA,SACA,gBACA,OACA,qBACmD;CACnD,IAAM,IAAgB,QACb,EAAW,KAAK,MACd,EAAS,EACjB,GACA,CAAC,CAAU,CAAC,GAET,IAAoB,QACjB,OAAO,YACZ,EAAW,KAAK,MACP,CAAC,EAAS,IAAI,EAAS,KAAK,CACpC,CACH,GACC,CAAC,CAAU,CAAC,GAET,IAAoB,QACjB,OAAO,YACZ,EAAW,KAAK,MACP,CAAC,EAAS,IAAI,EAAS,KAAK,CACpC,CACH,GACC,CAAC,CAAU,CAAC,GAET,IAAS,QACT,KAAQ,QAAQ,KAAM,OACjB,CAAC,IAGH,EAAyB;EAC9B,iBAAiB;EACjB,eAAe;EACf;EACA,YAAY;CACd,CAAC,GACA;EAAC;EAAS;EAAe;EAAM;CAAE,CAAC,GAE/B,KAAoB,MACjB,EAAqB;EAC1B,QAAQ;EACR;CACF,CAAC;CAOH,OAJI,EAAQ,WAAW,IACd,kBAAC,KAAD;EAAG,WAAW;
|
|
1
|
+
{"version":3,"file":"BackofficeBillingUsageChart.js","names":[],"sources":["../../../../../src/components/backoffice/billing/BackofficeBillingUsageChart.tsx"],"sourcesContent":["import { useMemo, type JSX } from 'react';\nimport { FormattedDate } from '@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js';\nimport { TimeSeriesLineChart } from '@plumile/ui/components/charts/TimeSeriesLineChart.js';\nimport { formatCurrencyAmount } from '@plumile/ui/shared/currencyAmount.js';\nimport { toUtcDailyCategorySeries } from '@plumile/ui/shared/timeSeries.js';\n\nimport * as styles from './backofficeBillingUsageChart.css.js';\n\nexport type BackofficeBillingUsageChartBucket = {\n readonly day: string;\n readonly category: string;\n readonly value: number;\n};\n\nexport type BackofficeBillingUsageChartCategory = {\n readonly id: string;\n readonly label: string;\n readonly color: string;\n};\n\nexport type BackofficeBillingUsageChartProps = {\n readonly currency: string;\n readonly totalAmount: number;\n readonly from: string | null;\n readonly to: string | null;\n readonly buckets: readonly BackofficeBillingUsageChartBucket[];\n readonly categories: readonly BackofficeBillingUsageChartCategory[];\n readonly emptyLabel: string;\n readonly rangePrefix: string;\n readonly ariaLabel: string;\n};\n\nconst dateSeparator = '->';\n\nconst formatBillingAxisValue = (value: number, currency: string): string => {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n};\n\nexport const BackofficeBillingUsageChart = ({\n ariaLabel,\n buckets,\n categories,\n currency,\n emptyLabel,\n from,\n rangePrefix,\n to,\n totalAmount,\n}: BackofficeBillingUsageChartProps): JSX.Element => {\n const categoryOrder = useMemo(() => {\n return categories.map((category) => {\n return category.id;\n });\n }, [categories]);\n\n const categoryColorById = useMemo(() => {\n return Object.fromEntries(\n categories.map((category) => {\n return [category.id, category.color];\n }),\n );\n }, [categories]);\n\n const categoryLabelById = useMemo(() => {\n return Object.fromEntries(\n categories.map((category) => {\n return [category.id, category.label];\n }),\n );\n }, [categories]);\n\n const series = useMemo(() => {\n if (from == null || to == null) {\n return [];\n }\n\n return toUtcDailyCategorySeries({\n fromIsoDateTime: from,\n toIsoDateTime: to,\n buckets,\n categories: categoryOrder,\n });\n }, [buckets, categoryOrder, from, to]);\n\n const formatChartValue = (value: number): string => {\n return formatCurrencyAmount({\n amount: value,\n currency,\n });\n };\n\n if (buckets.length === 0) {\n return <p className={styles.rangeText}>{emptyLabel}</p>;\n }\n\n return (\n <div className={styles.root}>\n <p className={styles.totalValue}>{formatChartValue(totalAmount)}</p>\n {from != null && to != null && (\n <p className={styles.rangeText}>\n {rangePrefix} <FormattedDate value={from} /> {dateSeparator}{' '}\n <FormattedDate value={to} />\n </p>\n )}\n <TimeSeriesLineChart\n ariaLabel={ariaLabel}\n categoryColorById={categoryColorById}\n categoryLabel={(category) => {\n return categoryLabelById[category] ?? category;\n }}\n categoryOrder={categoryOrder}\n formatValue={formatChartValue}\n series={series}\n yAxis={{\n min: 0,\n minTickStep: 1,\n maxTickCount: 5,\n formatValue: (value) => {\n return formatBillingAxisValue(value, currency);\n },\n }}\n />\n </div>\n );\n};\n\nexport default BackofficeBillingUsageChart;\n"],"mappings":";;;;;;;;AAgCA,IAAM,IAAgB,MAEhB,KAA0B,GAAe,MACtC,IAAI,KAAK,aAAa,KAAA,GAAW;CACtC,OAAO;CACP;CACA,uBAAuB;CACvB,uBAAuB;AACzB,CAAC,CAAC,CAAC,OAAO,CAAK,GAGJ,KAA+B,EAC1C,cACA,YACA,eACA,aACA,eACA,SACA,gBACA,OACA,qBACmD;CACnD,IAAM,IAAgB,QACb,EAAW,KAAK,MACd,EAAS,EACjB,GACA,CAAC,CAAU,CAAC,GAET,IAAoB,QACjB,OAAO,YACZ,EAAW,KAAK,MACP,CAAC,EAAS,IAAI,EAAS,KAAK,CACpC,CACH,GACC,CAAC,CAAU,CAAC,GAET,IAAoB,QACjB,OAAO,YACZ,EAAW,KAAK,MACP,CAAC,EAAS,IAAI,EAAS,KAAK,CACpC,CACH,GACC,CAAC,CAAU,CAAC,GAET,IAAS,QACT,KAAQ,QAAQ,KAAM,OACjB,CAAC,IAGH,EAAyB;EAC9B,iBAAiB;EACjB,eAAe;EACf;EACA,YAAY;CACd,CAAC,GACA;EAAC;EAAS;EAAe;EAAM;CAAE,CAAC,GAE/B,KAAoB,MACjB,EAAqB;EAC1B,QAAQ;EACR;CACF,CAAC;CAOH,OAJI,EAAQ,WAAW,IACd,kBAAC,KAAD;EAAG,WAAW;EAAmB,UAAA;CAAc,CAAA,IAItD,kBAAC,OAAD;EAAK,WAAW;EAAhB,UAAA;GACE,kBAAC,KAAD;IAAG,WAAW;IAAoB,UAAA,EAAiB,CAAW;GAAK,CAAA;GAClE,KAAQ,QAAQ,KAAM,QACrB,kBAAC,KAAD;IAAG,WAAW;IAAd,UAAA;KACG;KAAY;KAAC,kBAAC,GAAD,EAAe,OAAO,EAAO,CAAA;KAAC;KAAE;KAAe;KAC7D,kBAAC,GAAD,EAAe,OAAO,EAAK,CAAA;IAC1B;;GAEL,kBAAC,GAAD;IACa;IACQ;IACnB,gBAAgB,MACP,EAAkB,MAAa;IAEzB;IACf,aAAa;IACL;IACR,OAAO;KACL,KAAK;KACL,aAAa;KACb,cAAc;KACd,cAAc,MACL,EAAuB,GAAO,CAAQ;IAEjD;GACD,CAAA;EACE;;AAET"}
|
|
@@ -41,21 +41,26 @@ function d(d, f) {
|
|
|
41
41
|
children: e
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
|
-
case "dateTime":
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
case "dateTime": {
|
|
45
|
+
let e = u.value(c);
|
|
46
|
+
return /* @__PURE__ */ r(i, {
|
|
47
|
+
value: e,
|
|
48
|
+
fallback: h,
|
|
49
|
+
options: a
|
|
50
|
+
});
|
|
51
|
+
}
|
|
49
52
|
case "entityRef": {
|
|
50
53
|
let t = u.value(c);
|
|
51
54
|
if (t.trim() === "") return h;
|
|
52
55
|
let n = u.label?.(c);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
if (n == null || n.trim() === "") return m("filters.placeholders.unresolved");
|
|
57
|
+
let i = {
|
|
58
|
+
kind: "entity-detail",
|
|
59
|
+
entityId: u.entity,
|
|
60
|
+
id: t
|
|
61
|
+
};
|
|
62
|
+
return /* @__PURE__ */ r(e, {
|
|
63
|
+
target: i,
|
|
59
64
|
children: n
|
|
60
65
|
});
|
|
61
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildDataTableColumns.js","names":[],"sources":["../../../../../src/components/backoffice/columns/buildDataTableColumns.tsx"],"sourcesContent":["import { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeColumnSpec,\n BackofficeFieldSize,\n BackofficeListColumnVisibility,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { TFunction } from 'i18next';\nimport Link from '@plumile/router/routing/Link.js';\nimport { FormattedDate } from '@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { type DataTableColumn } from '@plumile/ui/components/data-table/DataTable.js';\nimport { type DataTableBreakpoint } from '@plumile/ui/components/data-table/tableBreakpoints.js';\nimport { BackofficeInlineLink } from '../links/BackofficeInlineLink.js';\nimport type { BackofficeLinkTarget } from '../links/types.js';\nimport { TechnicalIdentifierValue } from '../technical/TechnicalIdentifierValue.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst resolveTextValue = (\n value: string | number | null,\n fallback: string,\n): string => {\n if (value == null) {\n return fallback;\n }\n if (typeof value === 'string' && value.trim() === '') {\n return fallback;\n }\n return String(value);\n};\n\nexport type BuildDataTableColumnsOptions = {\n tApp: TFunction;\n t: TFunction;\n};\n\nexport type BackofficeSizedDataTableColumn<Row> = DataTableColumn<Row> & {\n size: BackofficeFieldSize;\n};\n\nconst resolveBreakpoint = (\n value: BackofficeListColumnVisibility['minVisibleAt'] | undefined,\n): DataTableBreakpoint | undefined => {\n if (value === 'sm' || value === 'md' || value === 'lg' || value === 'xl') {\n return value;\n }\n return undefined;\n};\n\n/**\n *\n */\nexport function buildDataTableColumns<Row>(\n columns: readonly BackofficeColumnSpec<Row>[],\n options: BuildDataTableColumnsOptions,\n): readonly BackofficeSizedDataTableColumn<Row>[] {\n const { tApp, t } = options;\n const fallback = t('common.notAvailable');\n const filteredColumns = columns.filter((column) => {\n return column.key !== 'id';\n });\n\n return filteredColumns.map((column) => {\n return {\n id: column.key,\n header: resolveLabel(column.header, tApp),\n size: column.size,\n isPrimary: column.visibility?.priority === 'primary',\n priority: column.visibility?.priority,\n align: column.visibility?.align,\n mobileRole: column.visibility?.mobile,\n minVisibleAt: resolveBreakpoint(column.visibility?.minVisibleAt),\n cell: (row) => {\n const { cell } = column;\n switch (cell.type) {\n case 'text': {\n return resolveTextValue(cell.value(row), fallback);\n }\n case 'link': {\n const value = cell.value(row);\n if (\n value == null ||\n (typeof value === 'string' && value.trim() === '')\n ) {\n return fallback;\n }\n return (\n <Link to={cell.to(row)} preloadOnHover=\"code\">\n {value}\n </Link>\n );\n }\n case 'badge': {\n const value = cell.value(row);\n if (value == null || value.trim() === '') {\n return fallback;\n }\n let { tone } = cell;\n if (typeof tone === 'function') {\n tone = tone(row);\n }\n return <Tag tone={tone}>{value}</Tag>;\n }\n case 'dateTime': {\n const value = cell.value(row);\n return (\n <FormattedDate\n value={value}\n fallback={fallback}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n />\n );\n }\n case 'entityRef': {\n const id = cell.value(row);\n if (id.trim() === '') {\n return fallback;\n }\n const label = cell.label?.(row);\n if (label == null || label.trim() === '') {\n return t('filters.placeholders.unresolved');\n }\n const target = {\n kind: 'entity-detail',\n entityId: cell.entity,\n id,\n } as BackofficeLinkTarget;\n return (\n <BackofficeInlineLink target={target}>\n {label}\n </BackofficeInlineLink>\n );\n }\n case 'technicalIdentifier': {\n const value = cell.value(row);\n if (value == null || String(value).trim() === '') {\n return fallback;\n }\n return (\n <TechnicalIdentifierValue\n value={value}\n copyValue={cell.copyValue?.(row) ?? undefined}\n variant={cell.variant}\n copyLabel={t('common.actions.copy')}\n />\n );\n }\n case 'custom': {\n const rendered = cell.render(row);\n if (rendered == null || rendered === '') {\n return fallback;\n }\n return <>{rendered}</>;\n }\n default: {\n return fallback;\n }\n }\n },\n };\n });\n}\n"],"mappings":";;;;;;;;AAiBA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,CAAI,GAGb,KACJ,GACA,MAEI,KAAS,QAGT,OAAO,KAAU,YAAY,EAAM,KAAK,MAAM,KACzC,IAEF,OAAO,CAAK,GAYf,KACJ,MACoC;CACpC,IAAI,MAAU,QAAQ,MAAU,QAAQ,MAAU,QAAQ,MAAU,MAClE,OAAO;AAGX;AAKA,SAAgB,EACd,GACA,GACgD;CAChD,IAAM,EAAE,SAAM,SAAM,GACd,IAAW,EAAE,qBAAqB;CAKxC,OAJwB,EAAQ,QAAQ,MAC/B,EAAO,QAAQ,IAGjB,CAAA,CAAgB,KAAK,OACnB;EACL,IAAI,EAAO;EACX,QAAQ,EAAa,EAAO,QAAQ,CAAI;EACxC,MAAM,EAAO;EACb,WAAW,EAAO,YAAY,aAAa;EAC3C,UAAU,EAAO,YAAY;EAC7B,OAAO,EAAO,YAAY;EAC1B,YAAY,EAAO,YAAY;EAC/B,cAAc,EAAkB,EAAO,YAAY,YAAY;EAC/D,OAAO,MAAQ;GACb,IAAM,EAAE,YAAS;GACjB,QAAQ,EAAK,MAAb;IACE,KAAK,QACH,OAAO,EAAiB,EAAK,MAAM,CAAG,GAAG,CAAQ;IAEnD,KAAK,QAAQ;KACX,IAAM,IAAQ,EAAK,MAAM,CAAG;KAO5B,OALE,KAAS,QACR,OAAO,KAAU,YAAY,EAAM,KAAK,MAAM,KAExC,IAGP,kBAAC,GAAD;MAAM,IAAI,EAAK,GAAG,CAAG;MAAG,gBAAe;
|
|
1
|
+
{"version":3,"file":"buildDataTableColumns.js","names":[],"sources":["../../../../../src/components/backoffice/columns/buildDataTableColumns.tsx"],"sourcesContent":["import { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeColumnSpec,\n BackofficeFieldSize,\n BackofficeListColumnVisibility,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { TFunction } from 'i18next';\nimport Link from '@plumile/router/routing/Link.js';\nimport { FormattedDate } from '@plumile/ui/atomic/atoms/formatted-date/FormattedDate.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { type DataTableColumn } from '@plumile/ui/components/data-table/DataTable.js';\nimport { type DataTableBreakpoint } from '@plumile/ui/components/data-table/tableBreakpoints.js';\nimport { BackofficeInlineLink } from '../links/BackofficeInlineLink.js';\nimport type { BackofficeLinkTarget } from '../links/types.js';\nimport { TechnicalIdentifierValue } from '../technical/TechnicalIdentifierValue.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst resolveTextValue = (\n value: string | number | null,\n fallback: string,\n): string => {\n if (value == null) {\n return fallback;\n }\n if (typeof value === 'string' && value.trim() === '') {\n return fallback;\n }\n return String(value);\n};\n\nexport type BuildDataTableColumnsOptions = {\n tApp: TFunction;\n t: TFunction;\n};\n\nexport type BackofficeSizedDataTableColumn<Row> = DataTableColumn<Row> & {\n size: BackofficeFieldSize;\n};\n\nconst resolveBreakpoint = (\n value: BackofficeListColumnVisibility['minVisibleAt'] | undefined,\n): DataTableBreakpoint | undefined => {\n if (value === 'sm' || value === 'md' || value === 'lg' || value === 'xl') {\n return value;\n }\n return undefined;\n};\n\n/**\n *\n */\nexport function buildDataTableColumns<Row>(\n columns: readonly BackofficeColumnSpec<Row>[],\n options: BuildDataTableColumnsOptions,\n): readonly BackofficeSizedDataTableColumn<Row>[] {\n const { tApp, t } = options;\n const fallback = t('common.notAvailable');\n const filteredColumns = columns.filter((column) => {\n return column.key !== 'id';\n });\n\n return filteredColumns.map((column) => {\n return {\n id: column.key,\n header: resolveLabel(column.header, tApp),\n size: column.size,\n isPrimary: column.visibility?.priority === 'primary',\n priority: column.visibility?.priority,\n align: column.visibility?.align,\n mobileRole: column.visibility?.mobile,\n minVisibleAt: resolveBreakpoint(column.visibility?.minVisibleAt),\n cell: (row) => {\n const { cell } = column;\n switch (cell.type) {\n case 'text': {\n return resolveTextValue(cell.value(row), fallback);\n }\n case 'link': {\n const value = cell.value(row);\n if (\n value == null ||\n (typeof value === 'string' && value.trim() === '')\n ) {\n return fallback;\n }\n return (\n <Link to={cell.to(row)} preloadOnHover=\"code\">\n {value}\n </Link>\n );\n }\n case 'badge': {\n const value = cell.value(row);\n if (value == null || value.trim() === '') {\n return fallback;\n }\n let { tone } = cell;\n if (typeof tone === 'function') {\n tone = tone(row);\n }\n return <Tag tone={tone}>{value}</Tag>;\n }\n case 'dateTime': {\n const value = cell.value(row);\n return (\n <FormattedDate\n value={value}\n fallback={fallback}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n />\n );\n }\n case 'entityRef': {\n const id = cell.value(row);\n if (id.trim() === '') {\n return fallback;\n }\n const label = cell.label?.(row);\n if (label == null || label.trim() === '') {\n return t('filters.placeholders.unresolved');\n }\n const target = {\n kind: 'entity-detail',\n entityId: cell.entity,\n id,\n } as BackofficeLinkTarget;\n return (\n <BackofficeInlineLink target={target}>\n {label}\n </BackofficeInlineLink>\n );\n }\n case 'technicalIdentifier': {\n const value = cell.value(row);\n if (value == null || String(value).trim() === '') {\n return fallback;\n }\n return (\n <TechnicalIdentifierValue\n value={value}\n copyValue={cell.copyValue?.(row) ?? undefined}\n variant={cell.variant}\n copyLabel={t('common.actions.copy')}\n />\n );\n }\n case 'custom': {\n const rendered = cell.render(row);\n if (rendered == null || rendered === '') {\n return fallback;\n }\n return <>{rendered}</>;\n }\n default: {\n return fallback;\n }\n }\n },\n };\n });\n}\n"],"mappings":";;;;;;;;AAiBA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,CAAI,GAGb,KACJ,GACA,MAEI,KAAS,QAGT,OAAO,KAAU,YAAY,EAAM,KAAK,MAAM,KACzC,IAEF,OAAO,CAAK,GAYf,KACJ,MACoC;CACpC,IAAI,MAAU,QAAQ,MAAU,QAAQ,MAAU,QAAQ,MAAU,MAClE,OAAO;AAGX;AAKA,SAAgB,EACd,GACA,GACgD;CAChD,IAAM,EAAE,SAAM,SAAM,GACd,IAAW,EAAE,qBAAqB;CAKxC,OAJwB,EAAQ,QAAQ,MAC/B,EAAO,QAAQ,IAGjB,CAAA,CAAgB,KAAK,OACnB;EACL,IAAI,EAAO;EACX,QAAQ,EAAa,EAAO,QAAQ,CAAI;EACxC,MAAM,EAAO;EACb,WAAW,EAAO,YAAY,aAAa;EAC3C,UAAU,EAAO,YAAY;EAC7B,OAAO,EAAO,YAAY;EAC1B,YAAY,EAAO,YAAY;EAC/B,cAAc,EAAkB,EAAO,YAAY,YAAY;EAC/D,OAAO,MAAQ;GACb,IAAM,EAAE,YAAS;GACjB,QAAQ,EAAK,MAAb;IACE,KAAK,QACH,OAAO,EAAiB,EAAK,MAAM,CAAG,GAAG,CAAQ;IAEnD,KAAK,QAAQ;KACX,IAAM,IAAQ,EAAK,MAAM,CAAG;KAO5B,OALE,KAAS,QACR,OAAO,KAAU,YAAY,EAAM,KAAK,MAAM,KAExC,IAGP,kBAAC,GAAD;MAAM,IAAI,EAAK,GAAG,CAAG;MAAG,gBAAe;MACpC,UAAA;KACG,CAAA;IAEV;IACA,KAAK,SAAS;KACZ,IAAM,IAAQ,EAAK,MAAM,CAAG;KAC5B,IAAI,KAAS,QAAQ,EAAM,KAAK,MAAM,IACpC,OAAO;KAET,IAAI,EAAE,YAAS;KAIf,OAHI,OAAO,KAAS,eAClB,IAAO,EAAK,CAAG,IAEV,kBAAC,GAAD;MAAW;MAAO,UAAA;KAAW,CAAA;IACtC;IACA,KAAK,YAAY;KACf,IAAM,IAAQ,EAAK,MAAM,CAAG;KAC5B,OACE,kBAAC,GAAD;MACS;MACG;MACV,SAAS;KACV,CAAA;IAEL;IACA,KAAK,aAAa;KAChB,IAAM,IAAK,EAAK,MAAM,CAAG;KACzB,IAAI,EAAG,KAAK,MAAM,IAChB,OAAO;KAET,IAAM,IAAQ,EAAK,QAAQ,CAAG;KAC9B,IAAI,KAAS,QAAQ,EAAM,KAAK,MAAM,IACpC,OAAO,EAAE,iCAAiC;KAE5C,IAAM,IAAS;MACb,MAAM;MACN,UAAU,EAAK;MACf;KACF;KACA,OACE,kBAAC,GAAD;MAA8B;MAC3B,UAAA;KACmB,CAAA;IAE1B;IACA,KAAK,uBAAuB;KAC1B,IAAM,IAAQ,EAAK,MAAM,CAAG;KAI5B,OAHI,KAAS,QAAQ,OAAO,CAAK,CAAC,CAAC,KAAK,MAAM,KACrC,IAGP,kBAAC,GAAD;MACS;MACP,WAAW,EAAK,YAAY,CAAG,KAAK,KAAA;MACpC,SAAS,EAAK;MACd,WAAW,EAAE,qBAAqB;KACnC,CAAA;IAEL;IACA,KAAK,UAAU;KACb,IAAM,IAAW,EAAK,OAAO,CAAG;KAIhC,OAHI,KAAY,QAAQ,MAAa,KAC5B,IAEF,kBAAA,GAAA,EAAA,UAAG,EAAW,CAAA;IACvB;IACA,SACE,OAAO;GAEX;EACF;CACF,EACD;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeDetailBadgeRow.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailBadgeRow.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport type { BackofficeBadgeItem } from '@plumile/backoffice-core/types.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\n\nimport * as styles from './backofficeDetailBadgeRow.css.js';\n\nexport type BackofficeDetailBadgeRowProps = {\n items: readonly BackofficeBadgeItem[];\n};\n\nexport const BackofficeDetailBadgeRow = ({\n items,\n}: BackofficeDetailBadgeRowProps): JSX.Element => {\n const { t } = useTranslation();\n return (\n <div className={styles.row}>\n {items.map((item) => {\n const label =\n typeof item.label === 'function' ? item.label(t) : item.label;\n const title =\n typeof item.title === 'function' ? item.title(t) : item.title;\n return (\n <Tag key={item.id} tone={item.tone ?? 'neutral'} title={title}>\n {label}\n </Tag>\n );\n })}\n </div>\n );\n};\n\nexport default BackofficeDetailBadgeRow;\n"],"mappings":";;;;;AAaA,IAAa,KAA4B,EACvC,eACgD;CAChD,IAAM,EAAE,SAAM,EAAe;CAC7B,OACE,kBAAC,OAAD;EAAK,WAAW;
|
|
1
|
+
{"version":3,"file":"BackofficeDetailBadgeRow.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailBadgeRow.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport type { BackofficeBadgeItem } from '@plumile/backoffice-core/types.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\n\nimport * as styles from './backofficeDetailBadgeRow.css.js';\n\nexport type BackofficeDetailBadgeRowProps = {\n items: readonly BackofficeBadgeItem[];\n};\n\nexport const BackofficeDetailBadgeRow = ({\n items,\n}: BackofficeDetailBadgeRowProps): JSX.Element => {\n const { t } = useTranslation();\n return (\n <div className={styles.row}>\n {items.map((item) => {\n const label =\n typeof item.label === 'function' ? item.label(t) : item.label;\n const title =\n typeof item.title === 'function' ? item.title(t) : item.title;\n return (\n <Tag key={item.id} tone={item.tone ?? 'neutral'} title={title}>\n {label}\n </Tag>\n );\n })}\n </div>\n );\n};\n\nexport default BackofficeDetailBadgeRow;\n"],"mappings":";;;;;AAaA,IAAa,KAA4B,EACvC,eACgD;CAChD,IAAM,EAAE,SAAM,EAAe;CAC7B,OACE,kBAAC,OAAD;EAAK,WAAW;EACb,UAAA,EAAM,KAAK,MAAS;GACnB,IAAM,IACJ,OAAO,EAAK,SAAU,aAAa,EAAK,MAAM,CAAC,IAAI,EAAK,OACpD,IACJ,OAAO,EAAK,SAAU,aAAa,EAAK,MAAM,CAAC,IAAI,EAAK;GAC1D,OACE,kBAAC,GAAD;IAAmB,MAAM,EAAK,QAAQ;IAAkB;IACrD,UAAA;GACE,GAFK,EAAK,EAEV;EAET,CAAC;CACE,CAAA;AAET"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeDetailErrorList.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailErrorList.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport { BackofficePayloadViewer } from '@plumile/ui/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js';\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './backofficeDetailErrorList.css.js';\n\nexport type BackofficeDetailErrorItem = {\n code: string;\n message: string;\n details?: unknown;\n};\n\nexport type BackofficeDetailErrorListProps = {\n title: string;\n description?: string;\n items: readonly BackofficeDetailErrorItem[];\n};\n\nexport const BackofficeDetailErrorList = ({\n title,\n description,\n items,\n}: BackofficeDetailErrorListProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n\n if (items.length === 0) {\n return null;\n }\n\n return (\n <BackofficeDetailSection title={title} description={description}>\n <div className={styles.list}>\n {items.map((error, index) => {\n return (\n <div\n key={`${error.code}-${index}`}\n className={cx(styles.item, styles.itemSurface)}\n >\n <div className={styles.header}>\n <span className={styles.code}>{error.code}</span>\n <span className={styles.message}>{error.message}</span>\n </div>\n <div className={styles.details}>\n <BackofficePayloadViewer\n content={error.details}\n format=\"json\"\n mode=\"details\"\n initiallyExpanded\n emptyState={t('common.notAvailable')}\n labels={{\n details: t('detail.actions.viewDetails'),\n }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </BackofficeDetailSection>\n );\n};\n\nexport default BackofficeDetailErrorList;\n"],"mappings":";;;;;;;AAsBA,IAAa,KAA6B,EACxC,UACA,gBACA,eACwD;CACxD,IAAM,EAAE,SAAM,EAA8B;CAM5C,OAJI,EAAM,WAAW,IACZ,OAIP,kBAAC,GAAD;EAAgC;EAAoB;
|
|
1
|
+
{"version":3,"file":"BackofficeDetailErrorList.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailErrorList.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport { BackofficePayloadViewer } from '@plumile/ui/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js';\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './backofficeDetailErrorList.css.js';\n\nexport type BackofficeDetailErrorItem = {\n code: string;\n message: string;\n details?: unknown;\n};\n\nexport type BackofficeDetailErrorListProps = {\n title: string;\n description?: string;\n items: readonly BackofficeDetailErrorItem[];\n};\n\nexport const BackofficeDetailErrorList = ({\n title,\n description,\n items,\n}: BackofficeDetailErrorListProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n\n if (items.length === 0) {\n return null;\n }\n\n return (\n <BackofficeDetailSection title={title} description={description}>\n <div className={styles.list}>\n {items.map((error, index) => {\n return (\n <div\n key={`${error.code}-${index}`}\n className={cx(styles.item, styles.itemSurface)}\n >\n <div className={styles.header}>\n <span className={styles.code}>{error.code}</span>\n <span className={styles.message}>{error.message}</span>\n </div>\n <div className={styles.details}>\n <BackofficePayloadViewer\n content={error.details}\n format=\"json\"\n mode=\"details\"\n initiallyExpanded\n emptyState={t('common.notAvailable')}\n labels={{\n details: t('detail.actions.viewDetails'),\n }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </BackofficeDetailSection>\n );\n};\n\nexport default BackofficeDetailErrorList;\n"],"mappings":";;;;;;;AAsBA,IAAa,KAA6B,EACxC,UACA,gBACA,eACwD;CACxD,IAAM,EAAE,SAAM,EAA8B;CAM5C,OAJI,EAAM,WAAW,IACZ,OAIP,kBAAC,GAAD;EAAgC;EAAoB;EAClD,UAAA,kBAAC,OAAD;GAAK,WAAW;GACb,UAAA,EAAM,KAAK,GAAO,MAEf,kBAAC,OAAD;IAEE,WAAW,EAAG,GAAa,CAAkB;IAF/C,UAAA,CAIE,kBAAC,OAAD;KAAK,WAAW;KAAhB,UAAA,CACE,kBAAC,QAAD;MAAM,WAAW;MAAc,UAAA,EAAM;KAAW,CAAA,GAChD,kBAAC,QAAD;MAAM,WAAW;MAAiB,UAAA,EAAM;KAAc,CAAA,CACnD;IACL,CAAA,GAAA,kBAAC,OAAD;KAAK,WAAW;KACd,UAAA,kBAAC,GAAD;MACE,SAAS,EAAM;MACf,QAAO;MACP,MAAK;MACL,mBAAA;MACA,YAAY,EAAE,qBAAqB;MACnC,QAAQ,EACN,SAAS,EAAE,4BAA4B,EACzC;KACD,CAAA;IACE,CAAA,CACF;GAnBE,GAAA,GAAG,EAAM,KAAK,GAAG,GAmBnB,CAER;EACE,CAAA;CACkB,CAAA;AAE7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeEntitySummaryHeader.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeEntitySummaryHeader.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { CopyableText } from '@plumile/ui/backoffice/atoms/copyable_text/CopyableText.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport {\n BackofficeStatusMetaBadge,\n type BackofficeStatusMetaTone,\n} from './BackofficeStatusMetaBadge.js';\nimport * as styles from './backofficeEntitySummaryHeader.css.js';\n\nexport type BackofficeEntitySummaryHeaderTone = BackofficeStatusMetaTone;\n\nexport type BackofficeEntitySummaryHeaderMetaItem = {\n readonly id: string;\n readonly label: string;\n readonly value: ReactNode;\n readonly copyValue?: string;\n readonly tone?: BackofficeEntitySummaryHeaderTone;\n};\n\nexport type BackofficeEntitySummaryHeaderAction = {\n readonly id: string;\n readonly label: string;\n readonly icon?: ReactNode;\n readonly disabled?: boolean;\n readonly loading?: boolean;\n readonly tone?: 'neutral' | 'primary' | 'danger';\n readonly onPress: () => void;\n};\n\nexport type BackofficeEntitySummaryHeaderProps = {\n readonly title: ReactNode;\n readonly entityLabel: string;\n readonly subtitle?: ReactNode;\n readonly status?: {\n readonly label: string;\n readonly tone: BackofficeEntitySummaryHeaderTone;\n };\n readonly meta?: readonly BackofficeEntitySummaryHeaderMetaItem[];\n readonly primaryActions?: readonly BackofficeEntitySummaryHeaderAction[];\n readonly secondaryActions?: readonly BackofficeEntitySummaryHeaderAction[];\n};\n\nconst resolveActionVariant = (\n tone: BackofficeEntitySummaryHeaderAction['tone'],\n): 'primary' | 'secondary' | 'danger' => {\n if (tone === 'danger') {\n return 'danger';\n }\n if (tone === 'neutral') {\n return 'secondary';\n }\n return 'primary';\n};\n\nconst renderAction = (\n action: BackofficeEntitySummaryHeaderAction,\n): JSX.Element => {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={resolveActionVariant(action.tone)}\n size=\"small\"\n leftIcon={action.icon}\n disabled={action.disabled}\n isLoading={action.loading}\n onClick={action.onPress}\n >\n {action.label}\n </Button>\n );\n};\n\nexport const BackofficeEntitySummaryHeader = ({\n title,\n entityLabel,\n subtitle,\n status,\n meta,\n primaryActions,\n secondaryActions,\n}: BackofficeEntitySummaryHeaderProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const actions = [...(primaryActions ?? []), ...(secondaryActions ?? [])];\n\n return (\n <header className={styles.root}>\n <div className={styles.top}>\n <div className={styles.identity}>\n <div className={styles.titleRow}>\n <h1 className={styles.title}>{title}</h1>\n <Tag tone=\"neutral\">{entityLabel}</Tag>\n {status != null && <BackofficeStatusMetaBadge status={status} />}\n </div>\n {subtitle != null && (\n <div className={styles.subtitle}>{subtitle}</div>\n )}\n </div>\n {actions.length > 0 && (\n <div className={styles.actions}>{actions.map(renderAction)}</div>\n )}\n </div>\n {meta != null && meta.length > 0 && (\n <div className={styles.meta}>\n {meta.map((item) => {\n let valueNode = item.value;\n if (item.copyValue != null && item.copyValue !== '') {\n valueNode = (\n <CopyableText\n value={item.copyValue}\n copyValue={item.copyValue}\n truncate={false}\n copyLabel={t('common.actions.copy')}\n copiedLabel={t('common.actions.copied')}\n />\n );\n }\n\n return (\n <div key={item.id} className={styles.metaItem}>\n <span className={styles.metaLabel}>{item.label}</span>\n <span className={styles.metaValue}>{valueNode}</span>\n </div>\n );\n })}\n </div>\n )}\n </header>\n );\n};\n\nexport default BackofficeEntitySummaryHeader;\n"],"mappings":";;;;;;;;AA6CA,IAAM,KACJ,MAEI,MAAS,WACJ,WAEL,MAAS,YACJ,cAEF,WAGH,KACJ,MAGE,kBAAC,GAAD;CAEE,MAAK;CACL,SAAS,EAAqB,EAAO,IAAI;CACzC,MAAK;CACL,UAAU,EAAO;CACjB,UAAU,EAAO;CACjB,WAAW,EAAO;CAClB,SAAS,EAAO;
|
|
1
|
+
{"version":3,"file":"BackofficeEntitySummaryHeader.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeEntitySummaryHeader.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { CopyableText } from '@plumile/ui/backoffice/atoms/copyable_text/CopyableText.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport {\n BackofficeStatusMetaBadge,\n type BackofficeStatusMetaTone,\n} from './BackofficeStatusMetaBadge.js';\nimport * as styles from './backofficeEntitySummaryHeader.css.js';\n\nexport type BackofficeEntitySummaryHeaderTone = BackofficeStatusMetaTone;\n\nexport type BackofficeEntitySummaryHeaderMetaItem = {\n readonly id: string;\n readonly label: string;\n readonly value: ReactNode;\n readonly copyValue?: string;\n readonly tone?: BackofficeEntitySummaryHeaderTone;\n};\n\nexport type BackofficeEntitySummaryHeaderAction = {\n readonly id: string;\n readonly label: string;\n readonly icon?: ReactNode;\n readonly disabled?: boolean;\n readonly loading?: boolean;\n readonly tone?: 'neutral' | 'primary' | 'danger';\n readonly onPress: () => void;\n};\n\nexport type BackofficeEntitySummaryHeaderProps = {\n readonly title: ReactNode;\n readonly entityLabel: string;\n readonly subtitle?: ReactNode;\n readonly status?: {\n readonly label: string;\n readonly tone: BackofficeEntitySummaryHeaderTone;\n };\n readonly meta?: readonly BackofficeEntitySummaryHeaderMetaItem[];\n readonly primaryActions?: readonly BackofficeEntitySummaryHeaderAction[];\n readonly secondaryActions?: readonly BackofficeEntitySummaryHeaderAction[];\n};\n\nconst resolveActionVariant = (\n tone: BackofficeEntitySummaryHeaderAction['tone'],\n): 'primary' | 'secondary' | 'danger' => {\n if (tone === 'danger') {\n return 'danger';\n }\n if (tone === 'neutral') {\n return 'secondary';\n }\n return 'primary';\n};\n\nconst renderAction = (\n action: BackofficeEntitySummaryHeaderAction,\n): JSX.Element => {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={resolveActionVariant(action.tone)}\n size=\"small\"\n leftIcon={action.icon}\n disabled={action.disabled}\n isLoading={action.loading}\n onClick={action.onPress}\n >\n {action.label}\n </Button>\n );\n};\n\nexport const BackofficeEntitySummaryHeader = ({\n title,\n entityLabel,\n subtitle,\n status,\n meta,\n primaryActions,\n secondaryActions,\n}: BackofficeEntitySummaryHeaderProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const actions = [...(primaryActions ?? []), ...(secondaryActions ?? [])];\n\n return (\n <header className={styles.root}>\n <div className={styles.top}>\n <div className={styles.identity}>\n <div className={styles.titleRow}>\n <h1 className={styles.title}>{title}</h1>\n <Tag tone=\"neutral\">{entityLabel}</Tag>\n {status != null && <BackofficeStatusMetaBadge status={status} />}\n </div>\n {subtitle != null && (\n <div className={styles.subtitle}>{subtitle}</div>\n )}\n </div>\n {actions.length > 0 && (\n <div className={styles.actions}>{actions.map(renderAction)}</div>\n )}\n </div>\n {meta != null && meta.length > 0 && (\n <div className={styles.meta}>\n {meta.map((item) => {\n let valueNode = item.value;\n if (item.copyValue != null && item.copyValue !== '') {\n valueNode = (\n <CopyableText\n value={item.copyValue}\n copyValue={item.copyValue}\n truncate={false}\n copyLabel={t('common.actions.copy')}\n copiedLabel={t('common.actions.copied')}\n />\n );\n }\n\n return (\n <div key={item.id} className={styles.metaItem}>\n <span className={styles.metaLabel}>{item.label}</span>\n <span className={styles.metaValue}>{valueNode}</span>\n </div>\n );\n })}\n </div>\n )}\n </header>\n );\n};\n\nexport default BackofficeEntitySummaryHeader;\n"],"mappings":";;;;;;;;AA6CA,IAAM,KACJ,MAEI,MAAS,WACJ,WAEL,MAAS,YACJ,cAEF,WAGH,KACJ,MAGE,kBAAC,GAAD;CAEE,MAAK;CACL,SAAS,EAAqB,EAAO,IAAI;CACzC,MAAK;CACL,UAAU,EAAO;CACjB,UAAU,EAAO;CACjB,WAAW,EAAO;CAClB,SAAS,EAAO;CAEf,UAAA,EAAO;AACF,GAVD,EAAO,EAUN,GAIC,KAAiC,EAC5C,OAAA,GACA,gBACA,UAAA,GACA,WACA,MAAA,GACA,mBACA,0BACqD;CACrD,IAAM,EAAE,SAAM,EAA8B,GACtC,IAAU,CAAC,GAAI,KAAkB,CAAC,GAAI,GAAI,KAAoB,CAAC,CAAE;CAEvE,OACE,kBAAC,UAAD;EAAQ,WAAW;EAAnB,UAAA,CACE,kBAAC,OAAD;GAAK,WAAW;GAAhB,UAAA,CACE,kBAAC,OAAD;IAAK,WAAW;IAAhB,UAAA,CACE,kBAAC,OAAD;KAAK,WAAW;KAAhB,UAAA;MACE,kBAAC,MAAD;OAAI,WAAW;OAAe,UAAA;MAAU,CAAA;MACxC,kBAAC,GAAD;OAAK,MAAK;OAAW,UAAA;MAAiB,CAAA;MACrC,KAAU,QAAQ,kBAAC,GAAD,EAAmC,UAAS,CAAA;KAC5D;IACJ,CAAA,GAAA,KAAY,QACX,kBAAC,OAAD;KAAK,WAAW;KAAkB,UAAA;IAAc,CAAA,CAE/C;GACJ,CAAA,GAAA,EAAQ,SAAS,KAChB,kBAAC,OAAD;IAAK,WAAW;IAAiB,UAAA,EAAQ,IAAI,CAAY;GAAO,CAAA,CAE/D;EACJ,CAAA,GAAA,KAAQ,QAAQ,EAAK,SAAS,KAC7B,kBAAC,OAAD;GAAK,WAAW;GACb,UAAA,EAAK,KAAK,MAAS;IAClB,IAAI,IAAY,EAAK;IAarB,OAZI,EAAK,aAAa,QAAQ,EAAK,cAAc,OAC/C,IACE,kBAAC,GAAD;KACE,OAAO,EAAK;KACZ,WAAW,EAAK;KAChB,UAAU;KACV,WAAW,EAAE,qBAAqB;KAClC,aAAa,EAAE,uBAAuB;IACvC,CAAA,IAKH,kBAAC,OAAD;KAAmB,WAAW;KAA9B,UAAA,CACE,kBAAC,QAAD;MAAM,WAAW;MAAmB,UAAA,EAAK;KAAY,CAAA,GACrD,kBAAC,QAAD;MAAM,WAAW;MAAmB,UAAA;KAAgB,CAAA,CACjD;IAHK,GAAA,EAAK,EAGV;GAET,CAAC;EACE,CAAA,CAED;;AAEZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeLifecycleTimelineSection.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeLifecycleTimelineSection.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport { AuditTimeline } from '@plumile/ui/backoffice/organisms/audit_timeline/AuditTimeline.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nexport type BackofficeLifecycleEventTone =\n 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\nexport type BackofficeLifecycleEvent = {\n readonly id: string;\n readonly label: string;\n readonly timestamp?: ReactNode;\n readonly description?: ReactNode;\n readonly actor?: ReactNode;\n readonly tone?: BackofficeLifecycleEventTone;\n readonly payload?: ReactNode;\n};\n\nexport type BackofficeLifecycleTimelineSectionProps = {\n readonly title: string;\n readonly description?: string;\n readonly events: readonly BackofficeLifecycleEvent[];\n readonly emptyLabel?: string;\n};\n\nexport const BackofficeLifecycleTimelineSection = ({\n title,\n description,\n events,\n emptyLabel,\n}: BackofficeLifecycleTimelineSectionProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n if (events.length === 0) {\n return (\n <BackofficeDetailSection title={title} description={description}>\n {emptyLabel ?? t('common.notAvailable')}\n </BackofficeDetailSection>\n );\n }\n\n return (\n <BackofficeDetailSection title={title} description={description}>\n <AuditTimeline\n events={events.map((event) => {\n return {\n id: event.id,\n title: event.label,\n time: event.timestamp,\n description: event.description,\n actor: event.actor,\n details: event.payload,\n tone: event.tone,\n };\n })}\n />\n </BackofficeDetailSection>\n );\n};\n\nexport default BackofficeLifecycleTimelineSection;\n"],"mappings":";;;;;AA0BA,IAAa,KAAsC,EACjD,UACA,gBACA,WACA,oBAC0D;CAC1D,IAAM,EAAE,SAAM,EAA8B;CAU5C,OARI,EAAO,WAAW,IAElB,kBAAC,GAAD;EAAgC;EAAoB;
|
|
1
|
+
{"version":3,"file":"BackofficeLifecycleTimelineSection.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeLifecycleTimelineSection.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport { AuditTimeline } from '@plumile/ui/backoffice/organisms/audit_timeline/AuditTimeline.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nexport type BackofficeLifecycleEventTone =\n 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n\nexport type BackofficeLifecycleEvent = {\n readonly id: string;\n readonly label: string;\n readonly timestamp?: ReactNode;\n readonly description?: ReactNode;\n readonly actor?: ReactNode;\n readonly tone?: BackofficeLifecycleEventTone;\n readonly payload?: ReactNode;\n};\n\nexport type BackofficeLifecycleTimelineSectionProps = {\n readonly title: string;\n readonly description?: string;\n readonly events: readonly BackofficeLifecycleEvent[];\n readonly emptyLabel?: string;\n};\n\nexport const BackofficeLifecycleTimelineSection = ({\n title,\n description,\n events,\n emptyLabel,\n}: BackofficeLifecycleTimelineSectionProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n if (events.length === 0) {\n return (\n <BackofficeDetailSection title={title} description={description}>\n {emptyLabel ?? t('common.notAvailable')}\n </BackofficeDetailSection>\n );\n }\n\n return (\n <BackofficeDetailSection title={title} description={description}>\n <AuditTimeline\n events={events.map((event) => {\n return {\n id: event.id,\n title: event.label,\n time: event.timestamp,\n description: event.description,\n actor: event.actor,\n details: event.payload,\n tone: event.tone,\n };\n })}\n />\n </BackofficeDetailSection>\n );\n};\n\nexport default BackofficeLifecycleTimelineSection;\n"],"mappings":";;;;;AA0BA,IAAa,KAAsC,EACjD,UACA,gBACA,WACA,oBAC0D;CAC1D,IAAM,EAAE,SAAM,EAA8B;CAU5C,OARI,EAAO,WAAW,IAElB,kBAAC,GAAD;EAAgC;EAAoB;EACjD,UAAA,KAAc,EAAE,qBAAqB;CACf,CAAA,IAK3B,kBAAC,GAAD;EAAgC;EAAoB;EAClD,UAAA,kBAAC,GAAD,EACE,QAAQ,EAAO,KAAK,OACX;GACL,IAAI,EAAM;GACV,OAAO,EAAM;GACb,MAAM,EAAM;GACZ,aAAa,EAAM;GACnB,OAAO,EAAM;GACb,SAAS,EAAM;GACf,MAAM,EAAM;EACd,EACD,EACF,CAAA;CACsB,CAAA;AAE7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeRelationsSummaryGrid.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeRelationsSummaryGrid.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport Link from '@plumile/router/routing/Link.js';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport type { MetricTone } from '@plumile/ui/components/dashboard/metric_card/MetricCard.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport * as styles from './backofficeRelationsSummaryGrid.css.js';\n\nexport type BackofficeRelationSummaryItem = {\n readonly id: string;\n readonly label: string;\n readonly count?: ReactNode;\n readonly href?: string;\n readonly description?: ReactNode;\n readonly tone?: MetricTone;\n};\n\nexport type BackofficeRelationsSummaryGridProps = {\n readonly title: string;\n readonly items: readonly BackofficeRelationSummaryItem[];\n};\n\nexport const BackofficeRelationsSummaryGrid = ({\n title,\n items,\n}: BackofficeRelationsSummaryGridProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n\n if (items.length === 0) {\n return null;\n }\n\n return (\n <BackofficeDetailSection title={title}>\n <div className={styles.grid}>\n {items.map((item) => {\n const countNode = item.count ?? t('common.notAvailable');\n const content = (\n <>\n <span className={styles.label}>{item.label}</span>\n <span className={styles.count}>{countNode}</span>\n {item.description != null && (\n <span className={styles.description}>{item.description}</span>\n )}\n </>\n );\n\n if (item.href == null) {\n return (\n <div className={styles.item} key={item.id}>\n {content}\n </div>\n );\n }\n\n return (\n <Link\n className={styles.item}\n key={item.id}\n to={item.href}\n preloadOnHover=\"code-and-data\"\n >\n {content}\n </Link>\n );\n })}\n </div>\n </BackofficeDetailSection>\n );\n};\n\nexport default BackofficeRelationsSummaryGrid;\n"],"mappings":";;;;;;AAsBA,IAAa,KAAkC,EAC7C,UACA,eAC6D;CAC7D,IAAM,EAAE,SAAM,EAA8B;CAM5C,OAJI,EAAM,WAAW,IACZ,OAIP,kBAAC,GAAD;EAAgC;
|
|
1
|
+
{"version":3,"file":"BackofficeRelationsSummaryGrid.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeRelationsSummaryGrid.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport Link from '@plumile/router/routing/Link.js';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport type { MetricTone } from '@plumile/ui/components/dashboard/metric_card/MetricCard.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport * as styles from './backofficeRelationsSummaryGrid.css.js';\n\nexport type BackofficeRelationSummaryItem = {\n readonly id: string;\n readonly label: string;\n readonly count?: ReactNode;\n readonly href?: string;\n readonly description?: ReactNode;\n readonly tone?: MetricTone;\n};\n\nexport type BackofficeRelationsSummaryGridProps = {\n readonly title: string;\n readonly items: readonly BackofficeRelationSummaryItem[];\n};\n\nexport const BackofficeRelationsSummaryGrid = ({\n title,\n items,\n}: BackofficeRelationsSummaryGridProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n\n if (items.length === 0) {\n return null;\n }\n\n return (\n <BackofficeDetailSection title={title}>\n <div className={styles.grid}>\n {items.map((item) => {\n const countNode = item.count ?? t('common.notAvailable');\n const content = (\n <>\n <span className={styles.label}>{item.label}</span>\n <span className={styles.count}>{countNode}</span>\n {item.description != null && (\n <span className={styles.description}>{item.description}</span>\n )}\n </>\n );\n\n if (item.href == null) {\n return (\n <div className={styles.item} key={item.id}>\n {content}\n </div>\n );\n }\n\n return (\n <Link\n className={styles.item}\n key={item.id}\n to={item.href}\n preloadOnHover=\"code-and-data\"\n >\n {content}\n </Link>\n );\n })}\n </div>\n </BackofficeDetailSection>\n );\n};\n\nexport default BackofficeRelationsSummaryGrid;\n"],"mappings":";;;;;;AAsBA,IAAa,KAAkC,EAC7C,UACA,eAC6D;CAC7D,IAAM,EAAE,SAAM,EAA8B;CAM5C,OAJI,EAAM,WAAW,IACZ,OAIP,kBAAC,GAAD;EAAgC;EAC9B,UAAA,kBAAC,OAAD;GAAK,WAAW;GACb,UAAA,EAAM,KAAK,MAAS;IACnB,IAAM,IAAY,EAAK,SAAS,EAAE,qBAAqB,GACjD,IACJ,kBAAA,GAAA,EAAA,UAAA;KACE,kBAAC,QAAD;MAAM,WAAW;MAAe,UAAA,EAAK;KAAY,CAAA;KACjD,kBAAC,QAAD;MAAM,WAAW;MAAe,UAAA;KAAgB,CAAA;KAC/C,EAAK,eAAe,QACnB,kBAAC,QAAD;MAAM,WAAW;MAAqB,UAAA,EAAK;KAAkB,CAAA;IAE/D,EAAA,CAAA;IAWJ,OARI,EAAK,QAAQ,OAEb,kBAAC,OAAD;KAAK,WAAW;KACb,UAAA;IACE,GAF6B,EAAK,EAElC,IAKP,kBAAC,GAAD;KACE,WAAW;KAEX,IAAI,EAAK;KACT,gBAAe;KAEd,UAAA;IACG,GALC,EAAK,EAKN;GAEV,CAAC;EACE,CAAA;CACkB,CAAA;AAE7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeTokenUsageBreakdown.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeTokenUsageBreakdown.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { MetricCard } from '@plumile/ui/components/dashboard/metric_card/MetricCard.js';\nimport { MetricTileGroup } from '@plumile/ui/components/dashboard/metric_tile_group/MetricTileGroup.js';\n\nexport type BackofficeTokenUsageBreakdownProps = {\n readonly title: string;\n readonly total?: ReactNode;\n readonly input?: ReactNode;\n readonly cachedInput?: ReactNode;\n readonly output?: ReactNode;\n readonly reasoning?: ReactNode;\n readonly labels: {\n readonly input: string;\n readonly cachedInput: string;\n readonly output: string;\n readonly reasoning: string;\n };\n};\n\nexport const BackofficeTokenUsageBreakdown = ({\n title,\n total,\n input,\n cachedInput,\n output,\n reasoning,\n labels,\n}: BackofficeTokenUsageBreakdownProps): JSX.Element => {\n const items = [\n { id: 'total', label: title, value: total },\n { id: 'input', label: labels.input, value: input },\n { id: 'cached-input', label: labels.cachedInput, value: cachedInput },\n { id: 'output', label: labels.output, value: output },\n { id: 'reasoning', label: labels.reasoning, value: reasoning },\n ].filter((item) => {\n return item.value != null;\n });\n\n if (items.length === 0) {\n return <></>;\n }\n\n return (\n <MetricTileGroup density=\"compact\" minColumn=\"180\">\n {items.map((item) => {\n return (\n <MetricCard\n key={item.id}\n label={item.label}\n value={item.value}\n density=\"compact\"\n tone=\"neutral\"\n />\n );\n })}\n </MetricTileGroup>\n );\n};\n\nexport default BackofficeTokenUsageBreakdown;\n"],"mappings":";;;;AAmBA,IAAa,KAAiC,EAC5C,UACA,UACA,UACA,gBACA,WACA,cACA,gBACqD;CACrD,IAAM,IAAQ;EACZ;GAAE,IAAI;GAAS,OAAO;GAAO,OAAO;EAAM;EAC1C;GAAE,IAAI;GAAS,OAAO,EAAO;GAAO,OAAO;EAAM;EACjD;GAAE,IAAI;GAAgB,OAAO,EAAO;GAAa,OAAO;EAAY;EACpE;GAAE,IAAI;GAAU,OAAO,EAAO;GAAQ,OAAO;EAAO;EACpD;GAAE,IAAI;GAAa,OAAO,EAAO;GAAW,OAAO;EAAU;CAC/D,CAAC,CAAC,QAAQ,MACD,EAAK,SAAS,IACtB;CAMD,OAJI,EAAM,WAAW,IACZ,kBAAA,GAAA,CAAI,CAAA,IAIX,kBAAC,GAAD;EAAiB,SAAQ;EAAU,WAAU;
|
|
1
|
+
{"version":3,"file":"BackofficeTokenUsageBreakdown.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeTokenUsageBreakdown.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { MetricCard } from '@plumile/ui/components/dashboard/metric_card/MetricCard.js';\nimport { MetricTileGroup } from '@plumile/ui/components/dashboard/metric_tile_group/MetricTileGroup.js';\n\nexport type BackofficeTokenUsageBreakdownProps = {\n readonly title: string;\n readonly total?: ReactNode;\n readonly input?: ReactNode;\n readonly cachedInput?: ReactNode;\n readonly output?: ReactNode;\n readonly reasoning?: ReactNode;\n readonly labels: {\n readonly input: string;\n readonly cachedInput: string;\n readonly output: string;\n readonly reasoning: string;\n };\n};\n\nexport const BackofficeTokenUsageBreakdown = ({\n title,\n total,\n input,\n cachedInput,\n output,\n reasoning,\n labels,\n}: BackofficeTokenUsageBreakdownProps): JSX.Element => {\n const items = [\n { id: 'total', label: title, value: total },\n { id: 'input', label: labels.input, value: input },\n { id: 'cached-input', label: labels.cachedInput, value: cachedInput },\n { id: 'output', label: labels.output, value: output },\n { id: 'reasoning', label: labels.reasoning, value: reasoning },\n ].filter((item) => {\n return item.value != null;\n });\n\n if (items.length === 0) {\n return <></>;\n }\n\n return (\n <MetricTileGroup density=\"compact\" minColumn=\"180\">\n {items.map((item) => {\n return (\n <MetricCard\n key={item.id}\n label={item.label}\n value={item.value}\n density=\"compact\"\n tone=\"neutral\"\n />\n );\n })}\n </MetricTileGroup>\n );\n};\n\nexport default BackofficeTokenUsageBreakdown;\n"],"mappings":";;;;AAmBA,IAAa,KAAiC,EAC5C,UACA,UACA,UACA,gBACA,WACA,cACA,gBACqD;CACrD,IAAM,IAAQ;EACZ;GAAE,IAAI;GAAS,OAAO;GAAO,OAAO;EAAM;EAC1C;GAAE,IAAI;GAAS,OAAO,EAAO;GAAO,OAAO;EAAM;EACjD;GAAE,IAAI;GAAgB,OAAO,EAAO;GAAa,OAAO;EAAY;EACpE;GAAE,IAAI;GAAU,OAAO,EAAO;GAAQ,OAAO;EAAO;EACpD;GAAE,IAAI;GAAa,OAAO,EAAO;GAAW,OAAO;EAAU;CAC/D,CAAC,CAAC,QAAQ,MACD,EAAK,SAAS,IACtB;CAMD,OAJI,EAAM,WAAW,IACZ,kBAAA,GAAA,CAAI,CAAA,IAIX,kBAAC,GAAD;EAAiB,SAAQ;EAAU,WAAU;EAC1C,UAAA,EAAM,KAAK,MAER,kBAAC,GAAD;GAEE,OAAO,EAAK;GACZ,OAAO,EAAK;GACZ,SAAQ;GACR,MAAK;EACN,GALM,EAAK,EAKX,CAEJ;CACc,CAAA;AAErB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeUsageCostBreakdown.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeUsageCostBreakdown.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport {\n MetricCard,\n type MetricTone,\n} from '@plumile/ui/components/dashboard/metric_card/MetricCard.js';\nimport { MetricTileGroup } from '@plumile/ui/components/dashboard/metric_tile_group/MetricTileGroup.js';\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport * as styles from './backofficeUsageCostBreakdown.css.js';\n\nexport type BackofficeMoneyValue = {\n readonly amount: string | number;\n readonly currency: string;\n};\n\nexport type BackofficeUsageCostBreakdownRow = {\n readonly id: string;\n readonly label: string;\n readonly rawCost?: ReactNode;\n readonly markup?: ReactNode;\n readonly charged?: ReactNode;\n readonly eventsCount?: ReactNode;\n readonly quantity?: ReactNode;\n};\n\nexport type BackofficeUsageCostBreakdownTotal = {\n readonly id: string;\n readonly label: string;\n readonly value: ReactNode;\n readonly hint?: ReactNode;\n readonly tone?: MetricTone;\n readonly copyValue?: string;\n};\n\nexport type BackofficeUsageCostBreakdownProps = {\n readonly title: string;\n readonly rows: readonly BackofficeUsageCostBreakdownRow[];\n readonly totals?: readonly BackofficeUsageCostBreakdownTotal[];\n readonly emptyLabel?: string;\n readonly columnLabels?: {\n readonly name: string;\n readonly rawCost: string;\n readonly markup: string;\n readonly charged: string;\n readonly events: string;\n };\n};\n\nexport const BackofficeUsageCostBreakdown = ({\n title,\n rows,\n totals,\n emptyLabel,\n columnLabels,\n}: BackofficeUsageCostBreakdownProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const missing = t('common.notAvailable');\n const labels = columnLabels ?? {\n name: t('detail.columns.name'),\n rawCost: t('detail.columns.rawCost'),\n markup: t('detail.columns.markup'),\n charged: t('detail.columns.charged'),\n events: t('detail.columns.events'),\n };\n\n if (rows.length === 0 && (totals == null || totals.length === 0)) {\n return (\n <BackofficeDetailSection title={title}>\n {emptyLabel ?? missing}\n </BackofficeDetailSection>\n );\n }\n\n return (\n <BackofficeDetailSection title={title}>\n <div className={styles.content}>\n {totals != null && totals.length > 0 && (\n <MetricTileGroup density=\"compact\" minColumn=\"180\">\n {totals.map((total) => {\n return (\n <MetricCard\n key={total.id}\n label={total.label}\n value={total.value}\n hint={total.hint}\n tone={total.tone ?? 'neutral'}\n density=\"compact\"\n copyValue={total.copyValue}\n copyLabel={t('common.actions.copy')}\n copiedLabel={t('common.actions.copied')}\n />\n );\n })}\n </MetricTileGroup>\n )}\n {rows.length > 0 && (\n <div className={styles.table}>\n <div className={styles.row}>\n <span className={styles.header}>{labels.name}</span>\n <span className={styles.header}>{labels.rawCost}</span>\n <span className={styles.header}>{labels.markup}</span>\n <span className={styles.header}>{labels.charged}</span>\n <span className={styles.header}>{labels.events}</span>\n </div>\n {rows.map((row) => {\n return (\n <div className={styles.row} key={row.id}>\n <span className={cx(styles.cell, styles.label)}>\n {row.label}\n </span>\n <span className={styles.cell}>{row.rawCost ?? missing}</span>\n <span className={styles.cell}>{row.markup ?? missing}</span>\n <span className={styles.cell}>{row.charged ?? missing}</span>\n <span className={styles.cell}>\n {row.eventsCount ?? row.quantity ?? missing}\n </span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </BackofficeDetailSection>\n );\n};\n\nexport default BackofficeUsageCostBreakdown;\n"],"mappings":";;;;;;;;AAkDA,IAAa,KAAgC,EAC3C,UACA,SACA,WACA,eACA,sBACoD;CACpD,IAAM,EAAE,SAAM,EAA8B,GACtC,IAAU,EAAE,qBAAqB,GACjC,IAAS,KAAgB;EAC7B,MAAM,EAAE,qBAAqB;EAC7B,SAAS,EAAE,wBAAwB;EACnC,QAAQ,EAAE,uBAAuB;EACjC,SAAS,EAAE,wBAAwB;EACnC,QAAQ,EAAE,uBAAuB;CACnC;CAUA,OARI,EAAK,WAAW,MAAM,KAAU,QAAQ,EAAO,WAAW,KAE1D,kBAAC,GAAD;EAAgC;
|
|
1
|
+
{"version":3,"file":"BackofficeUsageCostBreakdown.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeUsageCostBreakdown.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport {\n MetricCard,\n type MetricTone,\n} from '@plumile/ui/components/dashboard/metric_card/MetricCard.js';\nimport { MetricTileGroup } from '@plumile/ui/components/dashboard/metric_tile_group/MetricTileGroup.js';\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport * as styles from './backofficeUsageCostBreakdown.css.js';\n\nexport type BackofficeMoneyValue = {\n readonly amount: string | number;\n readonly currency: string;\n};\n\nexport type BackofficeUsageCostBreakdownRow = {\n readonly id: string;\n readonly label: string;\n readonly rawCost?: ReactNode;\n readonly markup?: ReactNode;\n readonly charged?: ReactNode;\n readonly eventsCount?: ReactNode;\n readonly quantity?: ReactNode;\n};\n\nexport type BackofficeUsageCostBreakdownTotal = {\n readonly id: string;\n readonly label: string;\n readonly value: ReactNode;\n readonly hint?: ReactNode;\n readonly tone?: MetricTone;\n readonly copyValue?: string;\n};\n\nexport type BackofficeUsageCostBreakdownProps = {\n readonly title: string;\n readonly rows: readonly BackofficeUsageCostBreakdownRow[];\n readonly totals?: readonly BackofficeUsageCostBreakdownTotal[];\n readonly emptyLabel?: string;\n readonly columnLabels?: {\n readonly name: string;\n readonly rawCost: string;\n readonly markup: string;\n readonly charged: string;\n readonly events: string;\n };\n};\n\nexport const BackofficeUsageCostBreakdown = ({\n title,\n rows,\n totals,\n emptyLabel,\n columnLabels,\n}: BackofficeUsageCostBreakdownProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const missing = t('common.notAvailable');\n const labels = columnLabels ?? {\n name: t('detail.columns.name'),\n rawCost: t('detail.columns.rawCost'),\n markup: t('detail.columns.markup'),\n charged: t('detail.columns.charged'),\n events: t('detail.columns.events'),\n };\n\n if (rows.length === 0 && (totals == null || totals.length === 0)) {\n return (\n <BackofficeDetailSection title={title}>\n {emptyLabel ?? missing}\n </BackofficeDetailSection>\n );\n }\n\n return (\n <BackofficeDetailSection title={title}>\n <div className={styles.content}>\n {totals != null && totals.length > 0 && (\n <MetricTileGroup density=\"compact\" minColumn=\"180\">\n {totals.map((total) => {\n return (\n <MetricCard\n key={total.id}\n label={total.label}\n value={total.value}\n hint={total.hint}\n tone={total.tone ?? 'neutral'}\n density=\"compact\"\n copyValue={total.copyValue}\n copyLabel={t('common.actions.copy')}\n copiedLabel={t('common.actions.copied')}\n />\n );\n })}\n </MetricTileGroup>\n )}\n {rows.length > 0 && (\n <div className={styles.table}>\n <div className={styles.row}>\n <span className={styles.header}>{labels.name}</span>\n <span className={styles.header}>{labels.rawCost}</span>\n <span className={styles.header}>{labels.markup}</span>\n <span className={styles.header}>{labels.charged}</span>\n <span className={styles.header}>{labels.events}</span>\n </div>\n {rows.map((row) => {\n return (\n <div className={styles.row} key={row.id}>\n <span className={cx(styles.cell, styles.label)}>\n {row.label}\n </span>\n <span className={styles.cell}>{row.rawCost ?? missing}</span>\n <span className={styles.cell}>{row.markup ?? missing}</span>\n <span className={styles.cell}>{row.charged ?? missing}</span>\n <span className={styles.cell}>\n {row.eventsCount ?? row.quantity ?? missing}\n </span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </BackofficeDetailSection>\n );\n};\n\nexport default BackofficeUsageCostBreakdown;\n"],"mappings":";;;;;;;;AAkDA,IAAa,KAAgC,EAC3C,UACA,SACA,WACA,eACA,sBACoD;CACpD,IAAM,EAAE,SAAM,EAA8B,GACtC,IAAU,EAAE,qBAAqB,GACjC,IAAS,KAAgB;EAC7B,MAAM,EAAE,qBAAqB;EAC7B,SAAS,EAAE,wBAAwB;EACnC,QAAQ,EAAE,uBAAuB;EACjC,SAAS,EAAE,wBAAwB;EACnC,QAAQ,EAAE,uBAAuB;CACnC;CAUA,OARI,EAAK,WAAW,MAAM,KAAU,QAAQ,EAAO,WAAW,KAE1D,kBAAC,GAAD;EAAgC;EAC7B,UAAA,KAAc;CACQ,CAAA,IAK3B,kBAAC,GAAD;EAAgC;EAC9B,UAAA,kBAAC,OAAD;GAAK,WAAW;GAAhB,UAAA,CACG,KAAU,QAAQ,EAAO,SAAS,KACjC,kBAAC,GAAD;IAAiB,SAAQ;IAAU,WAAU;IAC1C,UAAA,EAAO,KAAK,MAET,kBAAC,GAAD;KAEE,OAAO,EAAM;KACb,OAAO,EAAM;KACb,MAAM,EAAM;KACZ,MAAM,EAAM,QAAQ;KACpB,SAAQ;KACR,WAAW,EAAM;KACjB,WAAW,EAAE,qBAAqB;KAClC,aAAa,EAAE,uBAAuB;IACvC,GATM,EAAM,EASZ,CAEJ;GACc,CAAA,GAElB,EAAK,SAAS,KACb,kBAAC,OAAD;IAAK,WAAW;IAAhB,UAAA,CACE,kBAAC,OAAD;KAAK,WAAW;KAAhB,UAAA;MACE,kBAAC,QAAD;OAAM,WAAW;OAAgB,UAAA,EAAO;MAAW,CAAA;MACnD,kBAAC,QAAD;OAAM,WAAW;OAAgB,UAAA,EAAO;MAAc,CAAA;MACtD,kBAAC,QAAD;OAAM,WAAW;OAAgB,UAAA,EAAO;MAAa,CAAA;MACrD,kBAAC,QAAD;OAAM,WAAW;OAAgB,UAAA,EAAO;MAAc,CAAA;MACtD,kBAAC,QAAD;OAAM,WAAW;OAAgB,UAAA,EAAO;MAAa,CAAA;KAClD;IACJ,CAAA,GAAA,EAAK,KAAK,MAEP,kBAAC,OAAD;KAAK,WAAW;KAAhB,UAAA;MACE,kBAAC,QAAD;OAAM,WAAW,EAAG,iCAAa,WAAY;OAC1C,UAAA,EAAI;MACD,CAAA;MACN,kBAAC,QAAD;OAAM,WAAW;OAAc,UAAA,EAAI,WAAW;MAAc,CAAA;MAC5D,kBAAC,QAAD;OAAM,WAAW;OAAc,UAAA,EAAI,UAAU;MAAc,CAAA;MAC3D,kBAAC,QAAD;OAAM,WAAW;OAAc,UAAA,EAAI,WAAW;MAAc,CAAA;MAC5D,kBAAC,QAAD;OAAM,WAAW;OACd,UAAA,EAAI,eAAe,EAAI,YAAY;MAChC,CAAA;KACH;IAV4B,GAAA,EAAI,EAUhC,CAER,CACE;GAEJ,CAAA,CAAA;;CACkB,CAAA;AAE7B"}
|
|
@@ -31,9 +31,9 @@ var m = (e, t) => e(t), h = (h) => {
|
|
|
31
31
|
},
|
|
32
32
|
children: k
|
|
33
33
|
});
|
|
34
|
-
let A =
|
|
34
|
+
let A = T.listDefaults?.where ?? T.list.defaultState?.where ?? null, j = p(A, y, b, x), M = d(T, { where: j });
|
|
35
35
|
return /* @__PURE__ */ c(u, {
|
|
36
|
-
to:
|
|
36
|
+
to: M,
|
|
37
37
|
className: o,
|
|
38
38
|
title: O,
|
|
39
39
|
"aria-label": O,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeFilterAction.js","names":[],"sources":["../../../../../src/components/backoffice/filters/BackofficeFilterAction.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Link from '@plumile/router/routing/Link.js';\nimport { SidebarSearchSvg } from '@plumile/ui/icons/SidebarSearchSvg.js';\n\nimport type {\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { TFunction } from 'i18next';\nimport { buildBackofficeListLink } from '@plumile/backoffice-core/state/buildListHref.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\n\nimport {\n canFilterValue,\n resolveFilterForColumn,\n resolveFilterForWhereKey,\n} from '../../../filters/filterHelpers.js';\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { useBackofficeListFilterContext } from '../scaffolds/BackofficeListFilterContext.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './backofficeFilterAction.css.js';\n\nexport type BackofficeFilterActionProps = {\n whereKey: string;\n value: unknown;\n path?: readonly string[];\n label?: string;\n listConfig?: BackofficeRuntimeResolvedListFacetConfig;\n};\n\ntype ListFilterContext = {\n config: BackofficeRuntimeResolvedListFacetConfig;\n applyFilter: (\n whereKey: string,\n value: unknown,\n path?: readonly string[],\n ) => void;\n};\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const BackofficeFilterAction = (\n props: BackofficeFilterActionProps,\n): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { filterColumnAliases } = useBackofficeConfig();\n const { whereKey, value, path, label, listConfig } = props;\n\n const getContext =\n useBackofficeListFilterContext as () => ListFilterContext | null;\n const context = getContext();\n let config: BackofficeRuntimeResolvedListFacetConfig | null = null;\n\n if (listConfig != null) {\n config = listConfig;\n } else if (context != null) {\n config = context.config;\n }\n\n if (config == null) {\n return null;\n }\n\n let filter = resolveFilterForWhereKey(config, whereKey, path);\n if (filter == null && path == null) {\n filter = resolveFilterForColumn(config, whereKey, filterColumnAliases);\n }\n if (filter == null || !canFilterValue(filter, value)) {\n return null;\n }\n\n const filterLabel = resolveLabel(filter.label, tApp);\n const actionLabel =\n label ??\n t('filters.actions.filterBy', {\n label: filterLabel,\n });\n const icon = (\n <SidebarSearchSvg\n width={14}\n height={14}\n className={styles.icon}\n aria-hidden=\"true\"\n />\n );\n\n if (context != null) {\n return (\n <button\n type=\"button\"\n className={styles.action}\n title={actionLabel}\n aria-label={actionLabel}\n onClick={() => {\n context.applyFilter(whereKey, value, path);\n }}\n >\n {icon}\n </button>\n );\n }\n\n const baseWhere =\n config.listDefaults?.where ?? config.list.defaultState?.where ?? null;\n const nextWhere = setWhereValue(baseWhere, whereKey, value, path);\n const to = buildBackofficeListLink(config, { where: nextWhere });\n\n return (\n <Link\n to={to}\n className={styles.action}\n title={actionLabel}\n aria-label={actionLabel}\n preloadOnHover=\"code\"\n >\n {icon}\n </Link>\n );\n};\n\nexport default BackofficeFilterAction;\n"],"mappings":";;;;;;;;;;;;AAyCA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,CAAI,GAGN,KACX,MACuB;CACvB,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,EAAE,2BAAwB,EAAoB,GAC9C,EAAE,aAAU,UAAO,SAAM,UAAO,kBAAe,GAI/C,IAAU,EAAW,GACvB,IAA0D;CAQ9D,IANI,KAAc,OAEP,KAAW,SACpB,IAAS,EAAQ,UAFjB,IAAS,GAKP,KAAU,MACZ,OAAO;CAGT,IAAI,IAAS,EAAyB,GAAQ,GAAU,CAAI;CAI5D,IAHI,KAAU,QAAQ,KAAQ,SAC5B,IAAS,EAAuB,GAAQ,GAAU,CAAmB,IAEnE,KAAU,QAAQ,CAAC,EAAe,GAAQ,CAAK,GACjD,OAAO;CAGT,IAAM,IAAc,EAAa,EAAO,OAAO,CAAI,GAC7C,IACJ,KACA,EAAE,4BAA4B,EAC5B,OAAO,EACT,CAAC,GACG,IACJ,kBAAC,GAAD;EACE,OAAO;EACP,QAAQ;EACR,WAAW;EACX,eAAY;CACb,CAAA;CAGH,IAAI,KAAW,MACb,OACE,kBAAC,UAAD;EACE,MAAK;EACL,WAAW;EACX,OAAO;EACP,cAAY;EACZ,eAAe;GACb,EAAQ,YAAY,GAAU,GAAO,CAAI;EAC3C;
|
|
1
|
+
{"version":3,"file":"BackofficeFilterAction.js","names":[],"sources":["../../../../../src/components/backoffice/filters/BackofficeFilterAction.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Link from '@plumile/router/routing/Link.js';\nimport { SidebarSearchSvg } from '@plumile/ui/icons/SidebarSearchSvg.js';\n\nimport type {\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { TFunction } from 'i18next';\nimport { buildBackofficeListLink } from '@plumile/backoffice-core/state/buildListHref.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\n\nimport {\n canFilterValue,\n resolveFilterForColumn,\n resolveFilterForWhereKey,\n} from '../../../filters/filterHelpers.js';\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { useBackofficeListFilterContext } from '../scaffolds/BackofficeListFilterContext.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './backofficeFilterAction.css.js';\n\nexport type BackofficeFilterActionProps = {\n whereKey: string;\n value: unknown;\n path?: readonly string[];\n label?: string;\n listConfig?: BackofficeRuntimeResolvedListFacetConfig;\n};\n\ntype ListFilterContext = {\n config: BackofficeRuntimeResolvedListFacetConfig;\n applyFilter: (\n whereKey: string,\n value: unknown,\n path?: readonly string[],\n ) => void;\n};\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const BackofficeFilterAction = (\n props: BackofficeFilterActionProps,\n): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { filterColumnAliases } = useBackofficeConfig();\n const { whereKey, value, path, label, listConfig } = props;\n\n const getContext =\n useBackofficeListFilterContext as () => ListFilterContext | null;\n const context = getContext();\n let config: BackofficeRuntimeResolvedListFacetConfig | null = null;\n\n if (listConfig != null) {\n config = listConfig;\n } else if (context != null) {\n config = context.config;\n }\n\n if (config == null) {\n return null;\n }\n\n let filter = resolveFilterForWhereKey(config, whereKey, path);\n if (filter == null && path == null) {\n filter = resolveFilterForColumn(config, whereKey, filterColumnAliases);\n }\n if (filter == null || !canFilterValue(filter, value)) {\n return null;\n }\n\n const filterLabel = resolveLabel(filter.label, tApp);\n const actionLabel =\n label ??\n t('filters.actions.filterBy', {\n label: filterLabel,\n });\n const icon = (\n <SidebarSearchSvg\n width={14}\n height={14}\n className={styles.icon}\n aria-hidden=\"true\"\n />\n );\n\n if (context != null) {\n return (\n <button\n type=\"button\"\n className={styles.action}\n title={actionLabel}\n aria-label={actionLabel}\n onClick={() => {\n context.applyFilter(whereKey, value, path);\n }}\n >\n {icon}\n </button>\n );\n }\n\n const baseWhere =\n config.listDefaults?.where ?? config.list.defaultState?.where ?? null;\n const nextWhere = setWhereValue(baseWhere, whereKey, value, path);\n const to = buildBackofficeListLink(config, { where: nextWhere });\n\n return (\n <Link\n to={to}\n className={styles.action}\n title={actionLabel}\n aria-label={actionLabel}\n preloadOnHover=\"code\"\n >\n {icon}\n </Link>\n );\n};\n\nexport default BackofficeFilterAction;\n"],"mappings":";;;;;;;;;;;;AAyCA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,CAAI,GAGN,KACX,MACuB;CACvB,IAAM,EAAE,GAAG,MAAS,EAAe,GAC7B,EAAE,SAAM,EAA8B,GACtC,EAAE,2BAAwB,EAAoB,GAC9C,EAAE,aAAU,UAAO,SAAM,UAAO,kBAAe,GAI/C,IAAU,EAAW,GACvB,IAA0D;CAQ9D,IANI,KAAc,OAEP,KAAW,SACpB,IAAS,EAAQ,UAFjB,IAAS,GAKP,KAAU,MACZ,OAAO;CAGT,IAAI,IAAS,EAAyB,GAAQ,GAAU,CAAI;CAI5D,IAHI,KAAU,QAAQ,KAAQ,SAC5B,IAAS,EAAuB,GAAQ,GAAU,CAAmB,IAEnE,KAAU,QAAQ,CAAC,EAAe,GAAQ,CAAK,GACjD,OAAO;CAGT,IAAM,IAAc,EAAa,EAAO,OAAO,CAAI,GAC7C,IACJ,KACA,EAAE,4BAA4B,EAC5B,OAAO,EACT,CAAC,GACG,IACJ,kBAAC,GAAD;EACE,OAAO;EACP,QAAQ;EACR,WAAW;EACX,eAAY;CACb,CAAA;CAGH,IAAI,KAAW,MACb,OACE,kBAAC,UAAD;EACE,MAAK;EACL,WAAW;EACX,OAAO;EACP,cAAY;EACZ,eAAe;GACb,EAAQ,YAAY,GAAU,GAAO,CAAI;EAC3C;EAEC,UAAA;CACK,CAAA;CAIZ,IAAM,IACJ,EAAO,cAAc,SAAS,EAAO,KAAK,cAAc,SAAS,MAC7D,IAAY,EAAc,GAAW,GAAU,GAAO,CAAI,GAC1D,IAAK,EAAwB,GAAQ,EAAE,OAAO,EAAU,CAAC;CAE/D,OACE,kBAAC,GAAD;EACM;EACJ,WAAW;EACX,OAAO;EACP,cAAY;EACZ,gBAAe;EAEd,UAAA;CACG,CAAA;AAEV"}
|