@open-mercato/core 0.5.1-develop.2802.9223828f7f → 0.5.1-develop.2851.2854b4507f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/generated/entities/action_log/index.js +4 -0
  3. package/dist/generated/entities/action_log/index.js.map +2 -2
  4. package/dist/generated/entity-fields-registry.js +2 -0
  5. package/dist/generated/entity-fields-registry.js.map +2 -2
  6. package/dist/modules/audit_logs/data/entities.js +10 -1
  7. package/dist/modules/audit_logs/data/entities.js.map +2 -2
  8. package/dist/modules/audit_logs/data/validators.js +2 -0
  9. package/dist/modules/audit_logs/data/validators.js.map +2 -2
  10. package/dist/modules/audit_logs/migrations/Migration20260423202109.js +15 -0
  11. package/dist/modules/audit_logs/migrations/Migration20260423202109.js.map +7 -0
  12. package/dist/modules/audit_logs/services/accessLogService.js +3 -2
  13. package/dist/modules/audit_logs/services/accessLogService.js.map +3 -3
  14. package/dist/modules/audit_logs/services/actionLogService.js +13 -2
  15. package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
  16. package/dist/modules/customers/api/entity-roles-factory.js +3 -18
  17. package/dist/modules/customers/api/entity-roles-factory.js.map +2 -2
  18. package/dist/modules/customers/api/interactions/cancel/route.js +7 -2
  19. package/dist/modules/customers/api/interactions/cancel/route.js.map +2 -2
  20. package/dist/modules/customers/api/interactions/complete/route.js +7 -2
  21. package/dist/modules/customers/api/interactions/complete/route.js.map +2 -2
  22. package/dist/modules/customers/backend/customers/deals/page.js +45 -44
  23. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  24. package/dist/modules/customers/commands/comments.js +6 -0
  25. package/dist/modules/customers/commands/comments.js.map +2 -2
  26. package/dist/modules/customers/components/detail/AssignRoleDialog.js +41 -13
  27. package/dist/modules/customers/components/detail/AssignRoleDialog.js.map +2 -2
  28. package/dist/modules/customers/components/detail/CompanyDetailHeader.js +30 -0
  29. package/dist/modules/customers/components/detail/CompanyDetailHeader.js.map +2 -2
  30. package/dist/modules/customers/components/detail/DealDetailHeader.js +32 -0
  31. package/dist/modules/customers/components/detail/DealDetailHeader.js.map +2 -2
  32. package/dist/modules/customers/components/detail/DealWonPopup.js +2 -2
  33. package/dist/modules/customers/components/detail/DealWonPopup.js.map +2 -2
  34. package/dist/modules/customers/components/detail/InlineActivityComposer.js +62 -6
  35. package/dist/modules/customers/components/detail/InlineActivityComposer.js.map +2 -2
  36. package/dist/modules/customers/components/detail/ObjectHistoryButton.js +39 -0
  37. package/dist/modules/customers/components/detail/ObjectHistoryButton.js.map +7 -0
  38. package/dist/modules/customers/components/detail/PersonDetailHeader.js +30 -0
  39. package/dist/modules/customers/components/detail/PersonDetailHeader.js.map +2 -2
  40. package/dist/modules/customers/components/detail/RolesSection.js +14 -4
  41. package/dist/modules/customers/components/detail/RolesSection.js.map +3 -3
  42. package/dist/modules/customers/components/formConfig.js +16 -2
  43. package/dist/modules/customers/components/formConfig.js.map +2 -2
  44. package/dist/modules/customers/lib/displayName.js +15 -0
  45. package/dist/modules/customers/lib/displayName.js.map +7 -0
  46. package/dist/modules/customers/lib/interactionReadModel.js +1 -2
  47. package/dist/modules/customers/lib/interactionReadModel.js.map +2 -2
  48. package/dist/modules/customers/lib/operationMetadata.js +21 -0
  49. package/dist/modules/customers/lib/operationMetadata.js.map +7 -0
  50. package/generated/entities/action_log/index.ts +2 -0
  51. package/generated/entity-fields-registry.ts +2 -0
  52. package/package.json +3 -3
  53. package/src/modules/audit_logs/data/entities.ts +7 -0
  54. package/src/modules/audit_logs/data/validators.ts +2 -0
  55. package/src/modules/audit_logs/migrations/.snapshot-open-mercato.json +51 -5
  56. package/src/modules/audit_logs/migrations/Migration20260423202109.ts +15 -0
  57. package/src/modules/audit_logs/services/accessLogService.ts +1 -3
  58. package/src/modules/audit_logs/services/actionLogService.ts +11 -6
  59. package/src/modules/customers/api/entity-roles-factory.ts +3 -23
  60. package/src/modules/customers/api/interactions/cancel/route.ts +7 -2
  61. package/src/modules/customers/api/interactions/complete/route.ts +7 -2
  62. package/src/modules/customers/backend/customers/deals/page.tsx +48 -44
  63. package/src/modules/customers/commands/comments.ts +6 -0
  64. package/src/modules/customers/components/detail/AssignRoleDialog.tsx +37 -9
  65. package/src/modules/customers/components/detail/CompanyDetailHeader.tsx +25 -0
  66. package/src/modules/customers/components/detail/DealDetailHeader.tsx +29 -0
  67. package/src/modules/customers/components/detail/DealWonPopup.tsx +2 -2
  68. package/src/modules/customers/components/detail/InlineActivityComposer.tsx +65 -6
  69. package/src/modules/customers/components/detail/ObjectHistoryButton.tsx +47 -0
  70. package/src/modules/customers/components/detail/PersonDetailHeader.tsx +25 -0
  71. package/src/modules/customers/components/detail/RolesSection.tsx +20 -1
  72. package/src/modules/customers/components/formConfig.tsx +14 -2
  73. package/src/modules/customers/i18n/de.json +12 -0
  74. package/src/modules/customers/i18n/en.json +12 -0
  75. package/src/modules/customers/i18n/es.json +13 -1
  76. package/src/modules/customers/i18n/pl.json +13 -1
  77. package/src/modules/customers/lib/displayName.ts +16 -0
  78. package/src/modules/customers/lib/interactionReadModel.ts +1 -7
  79. package/src/modules/customers/lib/operationMetadata.ts +38 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/customers/components/detail/RolesSection.tsx"],
4
- "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { Plus } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { apiCallOrThrow, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport type { DictionaryEntryOption } from '@open-mercato/core/modules/dictionaries/lib/clientEntries'\nimport { RoleAssignmentRow, type RoleAssignment } from './RoleAssignmentRow'\nimport { AssignRoleDialog } from './AssignRoleDialog'\n\ninterface RolesSectionProps {\n entityType: 'company' | 'person'\n entityId: string\n entityName?: string | null\n}\n\ntype GuardedMutationRunner = <T,>(\n operation: () => Promise<T>,\n mutationPayload?: Record<string, unknown>,\n) => Promise<T>\n\nexport function RolesSection({ entityType, entityId, entityName }: RolesSectionProps) {\n const t = useT()\n const [roles, setRoles] = React.useState<RoleAssignment[]>([])\n const [roleTypes, setRoleTypes] = React.useState<DictionaryEntryOption[]>([])\n const [loading, setLoading] = React.useState(true)\n const [dialogOpen, setDialogOpen] = React.useState(false)\n const [initialRoleType, setInitialRoleType] = React.useState<string | null>(null)\n const hasConfiguredRoleTypes = roleTypes.length > 0\n\n const basePath = entityType === 'company' ? 'companies' : 'people'\n const resourceKind = entityType === 'company' ? 'customers.company' : 'customers.person'\n const mutationContextId = React.useMemo(\n () => `customer-roles:${entityType}:${entityId}`,\n [entityId, entityType],\n )\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n formId: string\n resourceKind: string\n resourceId: string\n entityType: 'company' | 'person'\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: mutationContextId,\n blockedMessage: t('ui.forms.flash.saveBlocked', 'Save blocked by validation'),\n })\n const mutationContext = React.useMemo(\n () => ({\n formId: mutationContextId,\n resourceKind,\n resourceId: entityId,\n entityType,\n retryLastMutation,\n }),\n [entityId, entityType, mutationContextId, resourceKind, retryLastMutation],\n )\n const runMutationWithContext = React.useCallback<GuardedMutationRunner>(\n async <T,>(operation: () => Promise<T>, mutationPayload?: Record<string, unknown>) => {\n return runMutation({\n operation,\n mutationPayload,\n context: mutationContext,\n })\n },\n [mutationContext, runMutation],\n )\n\n const loadRoles = React.useCallback(async () => {\n try {\n const data = await readApiResultOrThrow<{ items?: RoleAssignment[] }>(\n `/api/customers/${basePath}/${entityId}/roles`,\n )\n setRoles(Array.isArray(data?.items) ? data.items : [])\n } catch (error) {\n console.error('customers.roles.load failed', error)\n flash(t('customers.roles.loadFailed', 'Failed to load role assignments.'), 'error')\n setRoles([])\n }\n setLoading(false)\n }, [basePath, entityId, t])\n\n React.useEffect(() => {\n loadRoles()\n }, [loadRoles])\n\n React.useEffect(() => {\n let active = true\n\n readApiResultOrThrow<{ items?: Array<Record<string, unknown>> }>(\n '/api/customers/dictionaries/person-company-roles',\n )\n .then((payload) => {\n if (!active) return\n const entries = (Array.isArray(payload?.items) ? payload.items : [])\n .map((item) => {\n const id = typeof item.id === 'string' ? item.id : null\n const value = typeof item.value === 'string' ? item.value.trim() : ''\n if (!id || value.length === 0) return null\n return {\n id,\n value,\n label:\n typeof item.label === 'string' && item.label.trim().length > 0\n ? item.label.trim()\n : value,\n color: typeof item.color === 'string' ? item.color : null,\n icon: typeof item.icon === 'string' ? item.icon : null,\n } satisfies DictionaryEntryOption\n })\n .filter((entry): entry is DictionaryEntryOption => entry !== null)\n\n setRoleTypes(entries)\n })\n .catch((error) => {\n if (!active) return\n console.error('customers.roles.roleTypes failed', error)\n setRoleTypes([])\n })\n\n return () => {\n active = false\n }\n }, [])\n\n const assignedRoleTypes = React.useMemo(\n () => new Set(roles.map((role) => role.roleType)),\n [roles],\n )\n\n const handleDialogAssign = React.useCallback(async (roleType: string, userId: string) => {\n await runMutationWithContext(\n () =>\n apiCallOrThrow(`/api/customers/${basePath}/${entityId}/roles`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ roleType, userId }),\n }),\n { roleType, userId },\n )\n flash(t('customers.roles.assigned', 'Role assigned'), 'success')\n await loadRoles()\n }, [basePath, entityId, loadRoles, runMutationWithContext, t])\n\n const getRoleTypeLabel = React.useCallback(\n (value: string) => roleTypes.find((roleType) => roleType.value === value)?.label ?? value,\n [roleTypes],\n )\n\n const cards = React.useMemo(() => {\n const roleByType = new Map(roles.map((role) => [role.roleType, role]))\n const configuredCards = roleTypes.map((roleType) => ({\n roleType: roleType.value,\n roleTypeLabel: roleType.label,\n role: roleByType.get(roleType.value) ?? null,\n }))\n const configuredRoleTypes = new Set(roleTypes.map((roleType) => roleType.value))\n const extraAssignedCards = roles\n .filter((role) => !configuredRoleTypes.has(role.roleType))\n .map((role) => ({\n roleType: role.roleType,\n roleTypeLabel: getRoleTypeLabel(role.roleType),\n role,\n }))\n\n return [...configuredCards, ...extraAssignedCards]\n }, [getRoleTypeLabel, roleTypes, roles])\n\n const openDialog = React.useCallback((roleType?: string | null) => {\n if (!hasConfiguredRoleTypes) return\n setInitialRoleType(roleType ?? null)\n setDialogOpen(true)\n }, [hasConfiguredRoleTypes])\n\n if (loading) {\n return (\n <div className=\"py-2 text-sm text-muted-foreground\">\n {t('customers.roles.loading', 'Loading roles...')}\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-1\">\n <div className=\"text-sm font-semibold\">{t('customers.roles.groupTitle', 'Roles')}</div>\n <p className=\"text-xs text-muted-foreground\">\n {entityType === 'company'\n ? t('customers.roles.subtitle.company', 'Who is responsible for this company on your side')\n : t('customers.roles.subtitle.person', 'Who owns the relationship on your side')}\n </p>\n </div>\n\n {cards.length > 0 ? (\n <div\n className=\"grid items-start gap-4\"\n style={{ gridTemplateColumns: 'repeat(auto-fit, minmax(min(100%, 18rem), 1fr))' }}\n >\n {cards.map((entry) =>\n entry.role ? (\n <RoleAssignmentRow\n key={entry.role.id}\n role={entry.role}\n roleTypeLabel={entry.roleTypeLabel}\n runMutationWithContext={runMutationWithContext}\n entityType={entityType}\n entityId={entityId}\n onRemoved={loadRoles}\n onUpdated={loadRoles}\n />\n ) : (\n <div key={entry.roleType} className=\"flex h-full min-w-0 flex-col rounded-xl border border-dashed bg-muted/20 p-4\">\n <div className=\"break-words text-overline font-semibold uppercase tracking-[0.08em] text-muted-foreground\">\n {entry.roleTypeLabel}\n </div>\n <div className=\"mt-4 text-sm font-medium text-foreground\">\n {t('customers.roles.emptySlot', 'Not assigned')}\n </div>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {t('customers.roles.emptyState', 'No roles assigned yet. Click below to assign a person.')}\n </p>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-4 self-start\"\n onClick={() => openDialog(entry.roleType)}\n >\n {t('customers.roles.choosePerson', 'Choose person')}\n </Button>\n </div>\n ),\n )}\n </div>\n ) : hasConfiguredRoleTypes ? (\n <div className=\"rounded-lg border border-dashed p-4 text-center\">\n <p className=\"text-xs text-muted-foreground\">\n {t('customers.roles.emptyState', 'No roles assigned yet. Click below to assign a person.')}\n </p>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-2\"\n onClick={() => openDialog(null)}\n >\n {t('customers.roles.choosePerson', 'Choose person')}\n </Button>\n </div>\n ) : (\n <div className=\"rounded-lg border border-dashed p-4 text-center\">\n <div className=\"text-sm font-medium text-foreground\">\n {t('customers.roles.noRoleTypesTitle', 'No role types configured')}\n </div>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {t(\n 'customers.roles.noRoleTypesDescription',\n 'Create role types in Customers config before assigning owners here.',\n )}\n </p>\n <Button asChild type=\"button\" variant=\"outline\" size=\"sm\" className=\"mt-3\">\n <Link href=\"/backend/config/customers\">\n {t('customers.roles.configureRoleTypes', 'Configure role types')}\n </Link>\n </Button>\n </div>\n )}\n\n {hasConfiguredRoleTypes ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => openDialog(null)}\n >\n <Plus className=\"mr-1 size-3.5\" />\n {t('customers.roles.addRole', 'Add role')}\n </Button>\n ) : (\n <Button asChild type=\"button\" variant=\"ghost\" size=\"sm\">\n <Link href=\"/backend/config/customers\">\n {t('customers.roles.configureRoleTypes', 'Configure role types')}\n </Link>\n </Button>\n )}\n\n <AssignRoleDialog\n open={dialogOpen}\n onClose={() => {\n setDialogOpen(false)\n setInitialRoleType(null)\n }}\n onAssign={handleDialogAssign}\n roleTypes={roleTypes}\n entityName={\n entityName && entityName.trim().length\n ? entityName\n : entityType === 'company'\n ? t('customers.roles.dialog.defaultEntity.company', 'this company')\n : t('customers.roles.dialog.defaultEntity.person', 'this person')\n }\n existingRoleTypes={assignedRoleTypes}\n existingAssignments={roles}\n initialRoleType={initialRoleType}\n />\n </div>\n )\n}\n"],
5
- "mappings": "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",
6
- "names": []
4
+ "sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { Plus } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { apiCallOrThrow, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { useBackendChrome } from '@open-mercato/ui/backend/BackendChromeProvider'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { hasFeature } from '@open-mercato/shared/security/features'\nimport type { DictionaryEntryOption } from '@open-mercato/core/modules/dictionaries/lib/clientEntries'\nimport { RoleAssignmentRow, type RoleAssignment } from './RoleAssignmentRow'\nimport { AssignRoleDialog } from './AssignRoleDialog'\n\ninterface RolesSectionProps {\n entityType: 'company' | 'person'\n entityId: string\n entityName?: string | null\n}\n\ntype GuardedMutationRunner = <T,>(\n operation: () => Promise<T>,\n mutationPayload?: Record<string, unknown>,\n) => Promise<T>\n\nexport function RolesSection({ entityType, entityId, entityName }: RolesSectionProps) {\n const t = useT()\n const { payload } = useBackendChrome()\n const canManageRoleTypes = React.useMemo(\n () => hasFeature(payload?.grantedFeatures ?? [], 'customers.settings.manage'),\n [payload?.grantedFeatures],\n )\n const [roles, setRoles] = React.useState<RoleAssignment[]>([])\n const [roleTypes, setRoleTypes] = React.useState<DictionaryEntryOption[]>([])\n const [loading, setLoading] = React.useState(true)\n const [dialogOpen, setDialogOpen] = React.useState(false)\n const [initialRoleType, setInitialRoleType] = React.useState<string | null>(null)\n const hasConfiguredRoleTypes = roleTypes.length > 0\n\n const basePath = entityType === 'company' ? 'companies' : 'people'\n const resourceKind = entityType === 'company' ? 'customers.company' : 'customers.person'\n const mutationContextId = React.useMemo(\n () => `customer-roles:${entityType}:${entityId}`,\n [entityId, entityType],\n )\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n formId: string\n resourceKind: string\n resourceId: string\n entityType: 'company' | 'person'\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: mutationContextId,\n blockedMessage: t('ui.forms.flash.saveBlocked', 'Save blocked by validation'),\n })\n const mutationContext = React.useMemo(\n () => ({\n formId: mutationContextId,\n resourceKind,\n resourceId: entityId,\n entityType,\n retryLastMutation,\n }),\n [entityId, entityType, mutationContextId, resourceKind, retryLastMutation],\n )\n const runMutationWithContext = React.useCallback<GuardedMutationRunner>(\n async <T,>(operation: () => Promise<T>, mutationPayload?: Record<string, unknown>) => {\n return runMutation({\n operation,\n mutationPayload,\n context: mutationContext,\n })\n },\n [mutationContext, runMutation],\n )\n\n const loadRoles = React.useCallback(async () => {\n try {\n const data = await readApiResultOrThrow<{ items?: RoleAssignment[] }>(\n `/api/customers/${basePath}/${entityId}/roles`,\n )\n setRoles(Array.isArray(data?.items) ? data.items : [])\n } catch (error) {\n console.error('customers.roles.load failed', error)\n flash(t('customers.roles.loadFailed', 'Failed to load role assignments.'), 'error')\n setRoles([])\n }\n setLoading(false)\n }, [basePath, entityId, t])\n\n React.useEffect(() => {\n loadRoles()\n }, [loadRoles])\n\n React.useEffect(() => {\n let active = true\n\n readApiResultOrThrow<{ items?: Array<Record<string, unknown>> }>(\n '/api/customers/dictionaries/person-company-roles',\n )\n .then((payload) => {\n if (!active) return\n const entries = (Array.isArray(payload?.items) ? payload.items : [])\n .map((item) => {\n const id = typeof item.id === 'string' ? item.id : null\n const value = typeof item.value === 'string' ? item.value.trim() : ''\n if (!id || value.length === 0) return null\n return {\n id,\n value,\n label:\n typeof item.label === 'string' && item.label.trim().length > 0\n ? item.label.trim()\n : value,\n color: typeof item.color === 'string' ? item.color : null,\n icon: typeof item.icon === 'string' ? item.icon : null,\n } satisfies DictionaryEntryOption\n })\n .filter((entry): entry is DictionaryEntryOption => entry !== null)\n\n setRoleTypes(entries)\n })\n .catch((error) => {\n if (!active) return\n console.error('customers.roles.roleTypes failed', error)\n setRoleTypes([])\n })\n\n return () => {\n active = false\n }\n }, [])\n\n const assignedRoleTypes = React.useMemo(\n () => new Set(roles.map((role) => role.roleType)),\n [roles],\n )\n\n const handleDialogAssign = React.useCallback(async (roleType: string, userId: string) => {\n await runMutationWithContext(\n () =>\n apiCallOrThrow(`/api/customers/${basePath}/${entityId}/roles`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ roleType, userId }),\n }),\n { roleType, userId },\n )\n flash(t('customers.roles.assigned', 'Role assigned'), 'success')\n await loadRoles()\n }, [basePath, entityId, loadRoles, runMutationWithContext, t])\n\n const getRoleTypeLabel = React.useCallback(\n (value: string) => roleTypes.find((roleType) => roleType.value === value)?.label ?? value,\n [roleTypes],\n )\n\n const cards = React.useMemo(() => {\n const roleByType = new Map(roles.map((role) => [role.roleType, role]))\n const configuredCards = roleTypes.map((roleType) => ({\n roleType: roleType.value,\n roleTypeLabel: roleType.label,\n role: roleByType.get(roleType.value) ?? null,\n }))\n const configuredRoleTypes = new Set(roleTypes.map((roleType) => roleType.value))\n const extraAssignedCards = roles\n .filter((role) => !configuredRoleTypes.has(role.roleType))\n .map((role) => ({\n roleType: role.roleType,\n roleTypeLabel: getRoleTypeLabel(role.roleType),\n role,\n }))\n\n return [...configuredCards, ...extraAssignedCards]\n }, [getRoleTypeLabel, roleTypes, roles])\n\n const openDialog = React.useCallback((roleType?: string | null) => {\n if (!hasConfiguredRoleTypes) return\n setInitialRoleType(roleType ?? null)\n setDialogOpen(true)\n }, [hasConfiguredRoleTypes])\n\n if (loading) {\n return (\n <div className=\"py-2 text-sm text-muted-foreground\">\n {t('customers.roles.loading', 'Loading roles...')}\n </div>\n )\n }\n\n const resolvedEntityName =\n entityName && entityName.trim().length\n ? entityName.trim()\n : entityType === 'company'\n ? t('customers.roles.defaultEntityName.company', 'this company')\n : t('customers.roles.defaultEntityName.person', 'this person')\n const groupTitle =\n entityType === 'company'\n ? t('customers.roles.groupTitle.company', 'Roles at {{name}}', { name: resolvedEntityName })\n : t('customers.roles.groupTitle.person', 'My roles with {{name}}', { name: resolvedEntityName })\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-1\">\n <div className=\"text-sm font-semibold\">{groupTitle}</div>\n <p className=\"text-xs text-muted-foreground\">\n {entityType === 'company'\n ? t('customers.roles.subtitle.company', 'Who is responsible for this company on your side')\n : t('customers.roles.subtitle.person', 'Who owns the relationship on your side')}\n </p>\n </div>\n\n {cards.length > 0 ? (\n <div\n className=\"grid items-start gap-4\"\n style={{ gridTemplateColumns: 'repeat(auto-fit, minmax(min(100%, 18rem), 1fr))' }}\n >\n {cards.map((entry) =>\n entry.role ? (\n <RoleAssignmentRow\n key={entry.role.id}\n role={entry.role}\n roleTypeLabel={entry.roleTypeLabel}\n runMutationWithContext={runMutationWithContext}\n entityType={entityType}\n entityId={entityId}\n onRemoved={loadRoles}\n onUpdated={loadRoles}\n />\n ) : (\n <div key={entry.roleType} className=\"flex h-full min-w-0 flex-col rounded-xl border border-dashed bg-muted/20 p-4\">\n <div className=\"break-words text-overline font-semibold uppercase tracking-[0.08em] text-muted-foreground\">\n {entry.roleTypeLabel}\n </div>\n <div className=\"mt-4 text-sm font-medium text-foreground\">\n {t('customers.roles.emptySlot', 'Not assigned')}\n </div>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {t('customers.roles.emptyState', 'No roles assigned yet. Click below to assign a person.')}\n </p>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-4 self-start\"\n onClick={() => openDialog(entry.roleType)}\n >\n {t('customers.roles.choosePerson', 'Choose person')}\n </Button>\n </div>\n ),\n )}\n </div>\n ) : hasConfiguredRoleTypes ? (\n <div className=\"rounded-lg border border-dashed p-4 text-center\">\n <p className=\"text-xs text-muted-foreground\">\n {t('customers.roles.emptyState', 'No roles assigned yet. Click below to assign a person.')}\n </p>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-2\"\n onClick={() => openDialog(null)}\n >\n {t('customers.roles.choosePerson', 'Choose person')}\n </Button>\n </div>\n ) : (\n <div className=\"rounded-lg border border-dashed p-4 text-center\">\n <div className=\"text-sm font-medium text-foreground\">\n {t('customers.roles.noRoleTypesTitle', 'No role types configured')}\n </div>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {t(\n 'customers.roles.noRoleTypesDescription',\n 'Create role types in Customers config before assigning owners here.',\n )}\n </p>\n <Button asChild type=\"button\" variant=\"outline\" size=\"sm\" className=\"mt-3\">\n <Link href=\"/backend/config/customers\">\n {t('customers.roles.configureRoleTypes', 'Configure role types')}\n </Link>\n </Button>\n </div>\n )}\n\n {hasConfiguredRoleTypes ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => openDialog(null)}\n >\n <Plus className=\"mr-1 size-3.5\" />\n {t('customers.roles.addRole', 'Add role')}\n </Button>\n ) : (\n <Button asChild type=\"button\" variant=\"ghost\" size=\"sm\">\n <Link href=\"/backend/config/customers\">\n {t('customers.roles.configureRoleTypes', 'Configure role types')}\n </Link>\n </Button>\n )}\n\n <AssignRoleDialog\n open={dialogOpen}\n onClose={() => {\n setDialogOpen(false)\n setInitialRoleType(null)\n }}\n onAssign={handleDialogAssign}\n roleTypes={roleTypes}\n entityName={\n entityName && entityName.trim().length\n ? entityName\n : entityType === 'company'\n ? t('customers.roles.dialog.defaultEntity.company', 'this company')\n : t('customers.roles.dialog.defaultEntity.person', 'this person')\n }\n existingRoleTypes={assignedRoleTypes}\n existingAssignments={roles}\n initialRoleType={initialRoleType}\n canManageRoleTypes={canManageRoleTypes}\n />\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["payload"]
7
7
  }
@@ -1157,7 +1157,14 @@ const createCompanyEditGroups = (t) => [
1157
1157
  id: "roles",
1158
1158
  title: t("customers.roles.groupTitle", "Roles"),
1159
1159
  column: 1,
1160
- component: ({ values }) => values.id ? /* @__PURE__ */ jsx(RolesSection, { entityType: "company", entityId: values.id }) : null
1160
+ component: ({ values }) => values.id ? /* @__PURE__ */ jsx(
1161
+ RolesSection,
1162
+ {
1163
+ entityType: "company",
1164
+ entityId: values.id,
1165
+ entityName: typeof values.displayName === "string" ? values.displayName : null
1166
+ }
1167
+ ) : null
1161
1168
  },
1162
1169
  {
1163
1170
  id: "profile",
@@ -1240,7 +1247,14 @@ const createPersonEditGroups = (t) => [
1240
1247
  id: "roles",
1241
1248
  title: t("customers.roles.groupTitle", "Roles"),
1242
1249
  column: 1,
1243
- component: ({ values }) => values.id ? /* @__PURE__ */ jsx(RolesSection, { entityType: "person", entityId: values.id }) : null
1250
+ component: ({ values }) => values.id ? /* @__PURE__ */ jsx(
1251
+ RolesSection,
1252
+ {
1253
+ entityType: "person",
1254
+ entityId: values.id,
1255
+ entityName: typeof values.displayName === "string" ? values.displayName : null
1256
+ }
1257
+ ) : null
1244
1258
  },
1245
1259
  {
1246
1260
  id: "social",