@burdenoff/microfe-proserviceworld 2026.731.1 → 2026.827.1

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 (26) hide show
  1. package/dist/proserviceworld/ProServiceWorldRoutes.js +1 -1
  2. package/dist/proserviceworld/ProServiceWorldRoutes.js.map +1 -1
  3. package/dist/proserviceworld/hooks/useActorNames.d.ts +16 -0
  4. package/dist/proserviceworld/hooks/useActorNames.d.ts.map +1 -0
  5. package/dist/proserviceworld/hooks/useActorNames.js +18 -0
  6. package/dist/proserviceworld/hooks/useActorNames.js.map +1 -0
  7. package/dist/proserviceworld/hooks/usePageViewAnalytics.js +1 -1
  8. package/dist/proserviceworld/hooks/usePageViewAnalytics.js.map +1 -1
  9. package/dist/proserviceworld/hooks/useProServiceWorldApi.d.ts +53 -0
  10. package/dist/proserviceworld/hooks/useProServiceWorldApi.d.ts.map +1 -1
  11. package/dist/proserviceworld/hooks/useProServiceWorldApi.js +289 -227
  12. package/dist/proserviceworld/hooks/useProServiceWorldApi.js.map +1 -1
  13. package/dist/proserviceworld/pages/ClientDetailPage.d.ts.map +1 -1
  14. package/dist/proserviceworld/pages/ClientDetailPage.js +268 -144
  15. package/dist/proserviceworld/pages/ClientDetailPage.js.map +1 -1
  16. package/dist/proserviceworld/pages/ClientsPage.d.ts.map +1 -1
  17. package/dist/proserviceworld/pages/ClientsPage.js +244 -163
  18. package/dist/proserviceworld/pages/ClientsPage.js.map +1 -1
  19. package/dist/proserviceworld/pages/EngagementDetailPage.d.ts.map +1 -1
  20. package/dist/proserviceworld/pages/EngagementDetailPage.js +420 -186
  21. package/dist/proserviceworld/pages/EngagementDetailPage.js.map +1 -1
  22. package/dist/proserviceworld/providers/ProServiceWorldProvider.js +1 -1
  23. package/dist/proserviceworld/providers/ProServiceWorldProvider.js.map +1 -1
  24. package/dist/proserviceworld/utils/nav.js +1 -1
  25. package/dist/proserviceworld/utils/nav.js.map +1 -1
  26. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"ClientDetailPage.js","names":[],"sources":["../../../src/proserviceworld/pages/ClientDetailPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport {\n ArrowLeft,\n Briefcase,\n FolderKanban,\n GitBranch,\n Mail,\n Phone,\n MapPin,\n Plus,\n StickyNote,\n ChevronRight,\n} from 'lucide-react';\nimport {\n useClient,\n useConflictChecks,\n useCreateConflictCheck,\n type PswEngagement,\n type PswMatter,\n} from '../hooks/useProServiceWorldApi';\nimport { useNav } from '../utils/nav';\nimport { cn } from '../utils/cn';\nimport { DiscussionThread } from '../components/DiscussionThread';\nimport {\n PageHeader,\n SectionCard,\n LoadingBlock,\n ErrorState,\n Empty,\n StatusPill,\n Modal,\n Field,\n TextInput,\n TextArea,\n Banner,\n TableWrap,\n Th,\n Td,\n fmtDate,\n fmtMoney,\n humanize,\n} from '../components/ui';\n\nconst initials = (name: string): string =>\n name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0]?.toUpperCase() ?? '')\n .join('') || '?';\n\nexport const ClientDetailPage: FC = () => {\n const { id = '' } = useParams();\n const nav = useNav();\n const { data: client, isLoading, error, refetch } = useClient(id);\n const conflicts = useConflictChecks({ clientId: id });\n const [runConflict, setRunConflict] = useState(false);\n\n if (isLoading) return <LoadingBlock />;\n if (error) return <ErrorState error={error} onRetry={() => void refetch()} />;\n if (!client)\n return (\n <Empty\n title=\"Client not found\"\n description=\"It may have been archived or belongs to another workspace.\"\n />\n );\n\n const avatarName = client.contactName || client.name;\n\n return (\n <div className=\"space-y-6\">\n <button\n type=\"button\"\n onClick={() => nav('clients')}\n className=\"flex items-center gap-1.5 text-sm text-text-secondary transition-colors hover:text-accent\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back to clients\n </button>\n\n <PageHeader\n title={client.name}\n subtitle={[client.type === 'ORGANIZATION' ? 'Organization' : 'Individual', client.industry]\n .filter(Boolean)\n .join(' · ')}\n actions={<StatusPill status={client.status} />}\n />\n\n {client.tags.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {client.tags.map((t) => (\n <span\n key={t}\n className=\"rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary\"\n >\n {t}\n </span>\n ))}\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <SectionCard title=\"Contact\" className=\"lg:col-span-1\">\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-full bg-accent/10 text-sm font-semibold text-accent ring-1 ring-inset ring-accent/15\">\n {initials(avatarName)}\n </span>\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold text-text-primary\">\n {client.contactName || client.name}\n </div>\n <div className=\"truncate text-xs text-text-tertiary\">\n {client.contactName ? 'Primary contact' : 'Client record'}\n </div>\n </div>\n </div>\n\n <dl className=\"space-y-2.5 text-sm\">\n {client.contactEmail && (\n <IconRow icon={<Mail className=\"h-4 w-4\" />} value={client.contactEmail} />\n )}\n {client.contactPhone && (\n <IconRow icon={<Phone className=\"h-4 w-4\" />} value={client.contactPhone} />\n )}\n {client.address && (\n <IconRow icon={<MapPin className=\"h-4 w-4\" />} value={client.address} />\n )}\n {client.notes && (\n <IconRow icon={<StickyNote className=\"h-4 w-4\" />} value={client.notes} multiline />\n )}\n {!client.contactEmail && !client.contactPhone && !client.address && !client.notes && (\n <p className=\"text-sm text-text-tertiary\">No contact details recorded yet.</p>\n )}\n </dl>\n </div>\n </SectionCard>\n\n <SectionCard\n title=\"Conflict checks\"\n className=\"lg:col-span-2\"\n action={\n <Button size=\"sm\" variant=\"outline\" onClick={() => setRunConflict(true)}>\n <GitBranch className=\"mr-1.5 h-4 w-4\" /> Run check\n </Button>\n }\n >\n {conflicts.isLoading ? (\n <LoadingBlock label=\"Loading…\" />\n ) : !conflicts.data || conflicts.data.items.length === 0 ? (\n <Empty\n title=\"No conflict checks\"\n description=\"Run a conflict check before accepting new work for this client.\"\n icon={<GitBranch className=\"h-7 w-7\" />}\n />\n ) : (\n <TableWrap>\n <thead>\n <tr>\n <Th>Parties searched</Th>\n <Th>Date</Th>\n <Th className=\"text-right\">Status</Th>\n </tr>\n </thead>\n <tbody>\n {conflicts.data.items.map((c) => (\n <tr key={c.id} className=\"transition-colors hover:bg-bg-sunken/60\">\n <Td>\n <div className=\"font-medium text-text-primary\">\n {c.searchedParties.join(', ') || 'Conflict search'}\n </div>\n {c.findings ? (\n <div className=\"text-xs text-text-tertiary\">{c.findings}</div>\n ) : null}\n </Td>\n <Td className=\"whitespace-nowrap\">{fmtDate(c.createdAt)}</Td>\n <Td className=\"text-right\">\n <StatusPill status={c.status} />\n </Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n )}\n </SectionCard>\n </div>\n\n <SectionCard\n title=\"Engagements\"\n description={`${client.engagements.length} scoped for this client`}\n action={\n <Button size=\"sm\" variant=\"outline\" onClick={() => nav('engagements')}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n Manage\n </Button>\n }\n >\n {client.engagements.length === 0 ? (\n <Empty\n title=\"No engagements\"\n description=\"Scope the first engagement for this client.\"\n icon={<Briefcase className=\"h-7 w-7\" />}\n />\n ) : (\n <TableWrap>\n <thead>\n <tr>\n <Th>Engagement</Th>\n <Th>Fee</Th>\n <Th>Started</Th>\n <Th className=\"text-right\">Status</Th>\n </tr>\n </thead>\n <tbody>\n {client.engagements.map((e: PswEngagement) => (\n <tr\n key={e.id}\n className=\"group cursor-pointer transition-colors hover:bg-bg-sunken/60\"\n onClick={() => nav(`engagements/${e.id}`)}\n >\n <Td>\n <div className=\"flex items-center gap-1 font-medium text-text-primary transition-colors group-hover:text-accent\">\n <span>{e.name}</span>\n <ChevronRight className=\"h-3.5 w-3.5 shrink-0 text-text-tertiary opacity-0 transition-opacity group-hover:opacity-100\" />\n </div>\n </Td>\n <Td className=\"whitespace-nowrap\">\n {fmtMoney(e.feeAmount, e.currency)}{' '}\n <span className=\"text-xs text-text-tertiary\">\n / {humanize(e.feeArrangement)}\n </span>\n </Td>\n <Td className=\"whitespace-nowrap\">{fmtDate(e.startDate)}</Td>\n <Td className=\"text-right\">\n <StatusPill status={e.status} />\n </Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n )}\n </SectionCard>\n\n <SectionCard\n title=\"Matters\"\n description={`${client.matters.length} tracked for this client`}\n action={\n <Button size=\"sm\" variant=\"outline\" onClick={() => nav('matters')}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n Manage\n </Button>\n }\n >\n {client.matters.length === 0 ? (\n <Empty\n title=\"No matters\"\n description=\"Open a matter to track regulated work for this client.\"\n icon={<FolderKanban className=\"h-7 w-7\" />}\n />\n ) : (\n <TableWrap>\n <thead>\n <tr>\n <Th>Reference</Th>\n <Th>Title</Th>\n <Th>Due</Th>\n <Th>Priority</Th>\n <Th className=\"text-right\">Status</Th>\n </tr>\n </thead>\n <tbody>\n {client.matters.map((m: PswMatter) => (\n <tr key={m.id} className=\"transition-colors hover:bg-bg-sunken/60\">\n <Td className=\"whitespace-nowrap font-medium text-text-primary\">\n {m.reference || '—'}\n </Td>\n <Td>{m.title}</Td>\n <Td className=\"whitespace-nowrap\">{fmtDate(m.dueDate)}</Td>\n <Td>\n <StatusPill status={m.priority} />\n </Td>\n <Td className=\"text-right\">\n <StatusPill status={m.status} />\n </Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n )}\n </SectionCard>\n\n <DiscussionThread entityType=\"proserviceworld-client\" entityId={id} />\n\n {runConflict && (\n <ConflictModal\n clientId={id}\n onClose={() => setRunConflict(false)}\n onDone={() => void conflicts.refetch()}\n />\n )}\n </div>\n );\n};\n\nconst IconRow: FC<{ icon: React.ReactNode; value: string; multiline?: boolean }> = ({\n icon,\n value,\n multiline,\n}) => (\n <div\n className={cn('flex gap-2.5 text-text-secondary', multiline ? 'items-start' : 'items-center')}\n >\n <span className=\"mt-0.5 flex h-7 w-7 shrink-0 items-center justify-center rounded-lg bg-bg-sunken text-text-tertiary\">\n {icon}\n </span>\n <span className={cn('min-w-0 break-words', multiline ? 'leading-relaxed' : 'truncate')}>\n {value}\n </span>\n </div>\n);\n\nconst ConflictModal: FC<{ clientId: string; onClose: () => void; onDone: () => void }> = ({\n clientId,\n onClose,\n onDone,\n}) => {\n const create = useCreateConflictCheck();\n const [parties, setParties] = useState('');\n const [findings, setFindings] = useState('');\n const [err, setErr] = useState<string | null>(null);\n\n const submit = () => {\n setErr(null);\n const searchedParties = parties\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n if (searchedParties.length === 0) return setErr('Add at least one party to search.');\n create.mutate(\n { clientId, searchedParties, findings: findings.trim() || null },\n {\n onSuccess: () => {\n onDone();\n onClose();\n },\n onError: (e) => setErr(e instanceof Error ? e.message : 'Failed.'),\n }\n );\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n title=\"Run conflict check\"\n footer={\n <>\n <Button variant=\"outline\" onClick={onClose} disabled={create.isPending}>\n Cancel\n </Button>\n <Button onClick={submit} disabled={create.isPending}>\n {create.isPending ? 'Running…' : 'Record check'}\n </Button>\n </>\n }\n >\n <div className=\"space-y-3\">\n {err && <Banner tone=\"danger\">{err}</Banner>}\n <Field\n label=\"Parties searched\"\n required\n hint=\"Comma-separated — counterparties, related entities, principals.\"\n >\n <TextInput\n value={parties}\n onChange={(e) => setParties(e.target.value)}\n placeholder=\"Beta Corp, John Roe, Gamma LLP\"\n />\n </Field>\n <Field label=\"Findings\">\n <TextArea\n value={findings}\n onChange={(e) => setFindings(e.target.value)}\n placeholder=\"Notes on any potential conflicts…\"\n />\n </Field>\n </div>\n </Modal>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"ClientDetailPage.js","names":[],"sources":["../../../src/proserviceworld/pages/ClientDetailPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport {\n ArrowLeft,\n Briefcase,\n FolderKanban,\n GitBranch,\n Mail,\n Phone,\n MapPin,\n Plus,\n StickyNote,\n ChevronRight,\n UserRoundCheck,\n Users,\n} from 'lucide-react';\nimport {\n useClient,\n useClientTeamAssignments,\n useConflictChecks,\n useCreateConflictCheck,\n type PswEngagement,\n type PswMatter,\n type PswTeamAssignmentScoped,\n} from '../hooks/useProServiceWorldApi';\nimport { useActorNames, type UseActorNamesResult } from '../hooks/useActorNames';\nimport { useNav } from '../utils/nav';\nimport { cn } from '../utils/cn';\nimport { DiscussionThread } from '../components/DiscussionThread';\nimport {\n PageHeader,\n SectionCard,\n LoadingBlock,\n ErrorState,\n Empty,\n StatusPill,\n Modal,\n Field,\n TextInput,\n TextArea,\n Banner,\n TableWrap,\n Th,\n Td,\n fmtDate,\n fmtMoney,\n humanize,\n} from '../components/ui';\n\nconst initials = (name: string): string =>\n name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0]?.toUpperCase() ?? '')\n .join('') || '?';\n\nexport const ClientDetailPage: FC = () => {\n const { id = '' } = useParams();\n const nav = useNav();\n const { data: client, isLoading, error, refetch } = useClient(id);\n const conflicts = useConflictChecks({ clientId: id });\n const [runConflict, setRunConflict] = useState(false);\n\n // Staffing is stored per engagement / per matter — `pswListTeamAssignments`\n // has no clientId filter — so the client-level roll-up is keyed off the\n // engagements and matters this page has already loaded.\n const teamScopes = useMemo(\n () => [\n ...(client?.engagements ?? []).map((e) => ({\n type: 'engagement' as const,\n id: e.id,\n name: e.name,\n })),\n ...(client?.matters ?? []).map((m) => ({\n type: 'matter' as const,\n id: m.id,\n name: m.reference || m.title,\n })),\n ],\n [client]\n );\n const team = useClientTeamAssignments(teamScopes);\n\n // Every person on this page arrives as a bare workspace actor id\n // (relationshipOwnerId / responsiblePartnerId / leadPractitionerId /\n // practitionerId), all of them already in the queries above.\n const actors = useActorNames([\n client?.relationshipOwnerId,\n ...(client?.engagements ?? []).map((e) => e.responsiblePartnerId),\n ...(client?.matters ?? []).map((m) => m.leadPractitionerId),\n ...(team.data ?? []).map((t) => t.practitionerId),\n ]);\n\n if (isLoading) return <LoadingBlock />;\n if (error) return <ErrorState error={error} onRetry={() => void refetch()} />;\n if (!client)\n return (\n <Empty\n title=\"Client not found\"\n description=\"It may have been archived or belongs to another workspace.\"\n />\n );\n\n const avatarName = client.contactName || client.name;\n\n return (\n <div className=\"space-y-6\">\n <button\n type=\"button\"\n onClick={() => nav('clients')}\n className=\"flex items-center gap-1.5 text-sm text-text-secondary transition-colors hover:text-accent\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back to clients\n </button>\n\n <PageHeader\n title={client.name}\n subtitle={[client.type === 'ORGANIZATION' ? 'Organization' : 'Individual', client.industry]\n .filter(Boolean)\n .join(' · ')}\n actions={<StatusPill status={client.status} />}\n />\n\n {client.tags.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {client.tags.map((t) => (\n <span\n key={t}\n className=\"rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary\"\n >\n {t}\n </span>\n ))}\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <SectionCard title=\"Contact\" className=\"lg:col-span-1\">\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-full bg-accent/10 text-sm font-semibold text-accent ring-1 ring-inset ring-accent/15\">\n {initials(avatarName)}\n </span>\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold text-text-primary\">\n {client.contactName || client.name}\n </div>\n <div className=\"truncate text-xs text-text-tertiary\">\n {client.contactName ? 'Primary contact' : 'Client record'}\n </div>\n </div>\n </div>\n\n <dl className=\"space-y-2.5 text-sm\">\n {client.contactEmail && (\n <IconRow icon={<Mail className=\"h-4 w-4\" />} value={client.contactEmail} />\n )}\n {client.contactPhone && (\n <IconRow icon={<Phone className=\"h-4 w-4\" />} value={client.contactPhone} />\n )}\n {client.address && (\n <IconRow icon={<MapPin className=\"h-4 w-4\" />} value={client.address} />\n )}\n {client.notes && (\n <IconRow icon={<StickyNote className=\"h-4 w-4\" />} value={client.notes} multiline />\n )}\n {client.relationshipOwnerId && (\n <IconRow\n icon={<UserRoundCheck className=\"h-4 w-4\" />}\n value={`${actors.nameOf(client.relationshipOwnerId)} · relationship owner`}\n />\n )}\n {!client.contactEmail &&\n !client.contactPhone &&\n !client.address &&\n !client.notes &&\n !client.relationshipOwnerId && (\n <p className=\"text-sm text-text-tertiary\">No contact details recorded yet.</p>\n )}\n </dl>\n </div>\n </SectionCard>\n\n <SectionCard\n title=\"Conflict checks\"\n className=\"lg:col-span-2\"\n action={\n <Button size=\"sm\" variant=\"outline\" onClick={() => setRunConflict(true)}>\n <GitBranch className=\"mr-1.5 h-4 w-4\" /> Run check\n </Button>\n }\n >\n {conflicts.isLoading ? (\n <LoadingBlock label=\"Loading…\" />\n ) : !conflicts.data || conflicts.data.items.length === 0 ? (\n <Empty\n title=\"No conflict checks\"\n description=\"Run a conflict check before accepting new work for this client.\"\n icon={<GitBranch className=\"h-7 w-7\" />}\n />\n ) : (\n <TableWrap>\n <thead>\n <tr>\n <Th>Parties searched</Th>\n <Th>Date</Th>\n <Th className=\"text-right\">Status</Th>\n </tr>\n </thead>\n <tbody>\n {conflicts.data.items.map((c) => (\n <tr key={c.id} className=\"transition-colors hover:bg-bg-sunken/60\">\n <Td>\n <div className=\"font-medium text-text-primary\">\n {c.searchedParties.join(', ') || 'Conflict search'}\n </div>\n {c.findings ? (\n <div className=\"text-xs text-text-tertiary\">{c.findings}</div>\n ) : null}\n </Td>\n <Td className=\"whitespace-nowrap\">{fmtDate(c.createdAt)}</Td>\n <Td className=\"text-right\">\n <StatusPill status={c.status} />\n </Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n )}\n </SectionCard>\n </div>\n\n <ClientTeamCard\n rows={team.data ?? []}\n loading={team.isLoading}\n error={team.error}\n hasScopes={teamScopes.length > 0}\n actors={actors}\n />\n\n <SectionCard\n title=\"Engagements\"\n description={`${client.engagements.length} scoped for this client`}\n action={\n <Button size=\"sm\" variant=\"outline\" onClick={() => nav('engagements')}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n Manage\n </Button>\n }\n >\n {client.engagements.length === 0 ? (\n <Empty\n title=\"No engagements\"\n description=\"Scope the first engagement for this client.\"\n icon={<Briefcase className=\"h-7 w-7\" />}\n />\n ) : (\n <TableWrap>\n <thead>\n <tr>\n <Th>Engagement</Th>\n <Th>Partner</Th>\n <Th>Fee</Th>\n <Th>Started</Th>\n <Th className=\"text-right\">Status</Th>\n </tr>\n </thead>\n <tbody>\n {client.engagements.map((e: PswEngagement) => (\n <tr\n key={e.id}\n className=\"group cursor-pointer transition-colors hover:bg-bg-sunken/60\"\n onClick={() => nav(`engagements/${e.id}`)}\n >\n <Td>\n <div className=\"flex items-center gap-1 font-medium text-text-primary transition-colors group-hover:text-accent\">\n <span>{e.name}</span>\n <ChevronRight className=\"h-3.5 w-3.5 shrink-0 text-text-tertiary opacity-0 transition-opacity group-hover:opacity-100\" />\n </div>\n </Td>\n <Td className=\"whitespace-nowrap\">\n {e.responsiblePartnerId ? (\n actors.nameOf(e.responsiblePartnerId)\n ) : (\n <span className=\"text-text-tertiary\">Unassigned</span>\n )}\n </Td>\n <Td className=\"whitespace-nowrap\">\n {fmtMoney(e.feeAmount, e.currency)}{' '}\n <span className=\"text-xs text-text-tertiary\">\n / {humanize(e.feeArrangement)}\n </span>\n </Td>\n <Td className=\"whitespace-nowrap\">{fmtDate(e.startDate)}</Td>\n <Td className=\"text-right\">\n <StatusPill status={e.status} />\n </Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n )}\n </SectionCard>\n\n <SectionCard\n title=\"Matters\"\n description={`${client.matters.length} tracked for this client`}\n action={\n <Button size=\"sm\" variant=\"outline\" onClick={() => nav('matters')}>\n <Plus className=\"mr-1.5 h-4 w-4\" />\n Manage\n </Button>\n }\n >\n {client.matters.length === 0 ? (\n <Empty\n title=\"No matters\"\n description=\"Open a matter to track regulated work for this client.\"\n icon={<FolderKanban className=\"h-7 w-7\" />}\n />\n ) : (\n <TableWrap>\n <thead>\n <tr>\n <Th>Reference</Th>\n <Th>Title</Th>\n <Th>Lead</Th>\n <Th>Due</Th>\n <Th>Priority</Th>\n <Th className=\"text-right\">Status</Th>\n </tr>\n </thead>\n <tbody>\n {client.matters.map((m: PswMatter) => (\n <tr key={m.id} className=\"transition-colors hover:bg-bg-sunken/60\">\n <Td className=\"whitespace-nowrap font-medium text-text-primary\">\n {m.reference || '—'}\n </Td>\n <Td>{m.title}</Td>\n <Td className=\"whitespace-nowrap\">\n {m.leadPractitionerId ? (\n actors.nameOf(m.leadPractitionerId)\n ) : (\n <span className=\"text-text-tertiary\">Unassigned</span>\n )}\n </Td>\n <Td className=\"whitespace-nowrap\">{fmtDate(m.dueDate)}</Td>\n <Td>\n <StatusPill status={m.priority} />\n </Td>\n <Td className=\"text-right\">\n <StatusPill status={m.status} />\n </Td>\n </tr>\n ))}\n </tbody>\n </TableWrap>\n )}\n </SectionCard>\n\n <DiscussionThread entityType=\"proserviceworld-client\" entityId={id} />\n\n {runConflict && (\n <ConflictModal\n clientId={id}\n onClose={() => setRunConflict(false)}\n onDone={() => void conflicts.refetch()}\n />\n )}\n </div>\n );\n};\n\n/**\n * Client-level staffing roll-up (`pswListTeamAssignments`, aggregated across\n * this client's engagements and matters).\n *\n * One row per practitioner, because a person is commonly staffed on several\n * engagements for the same client. Allocation % and billing rate are per\n * assignment, not per person, so they are deliberately NOT summed here — they\n * are shown on the engagement's own Team section where they are unambiguous.\n */\ninterface TeamMemberRow {\n practitionerId: string;\n roles: string[];\n isLead: boolean;\n scopes: { id: string; name: string; type: 'engagement' | 'matter' }[];\n}\n\nfunction groupByPractitioner(rows: PswTeamAssignmentScoped[]): TeamMemberRow[] {\n const byPerson = new Map<string, TeamMemberRow>();\n for (const row of rows) {\n const entry = byPerson.get(row.practitionerId) ?? {\n practitionerId: row.practitionerId,\n roles: [],\n isLead: false,\n scopes: [],\n };\n // Enum casing is normalised by humanize(), so a lowercase role from the\n // service renders identically to the SCREAMING_CASE the schema declares.\n const role = humanize(row.role);\n if (!entry.roles.includes(role)) entry.roles.push(role);\n entry.isLead = entry.isLead || row.isLead;\n if (!entry.scopes.some((s) => s.id === row.scopeId)) {\n entry.scopes.push({ id: row.scopeId, name: row.scopeName, type: row.scopeType });\n }\n byPerson.set(row.practitionerId, entry);\n }\n return [...byPerson.values()].sort((a, b) => Number(b.isLead) - Number(a.isLead));\n}\n\nconst ClientTeamCard: FC<{\n rows: PswTeamAssignmentScoped[];\n loading: boolean;\n error: unknown;\n hasScopes: boolean;\n actors: UseActorNamesResult;\n}> = ({ rows, loading, error, hasScopes, actors }) => {\n const members = groupByPractitioner(rows);\n\n return (\n <SectionCard\n title=\"Client team\"\n description=\"Everyone staffed on this client's engagements and matters.\"\n >\n {loading ? (\n <LoadingBlock label=\"Loading…\" />\n ) : error ? (\n <ErrorState error={error} />\n ) : !hasScopes ? (\n <Empty\n title=\"Nothing to staff yet\"\n description=\"Scope an engagement or open a matter, then assign the team that will deliver it.\"\n icon={<Users className=\"h-7 w-7\" />}\n />\n ) : members.length === 0 ? (\n <Empty\n title=\"No one assigned\"\n description=\"Staff practitioners from an engagement's Team section to see them here.\"\n icon={<Users className=\"h-7 w-7\" />}\n />\n ) : (\n <ul className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n {members.map((m) => {\n const name = actors.nameOf(m.practitionerId);\n const email = actors.profiles[m.practitionerId]?.email;\n return (\n <li\n key={m.practitionerId}\n className=\"flex items-start gap-3 rounded-xl border border-border-seam bg-bg-canvas p-3.5\"\n >\n <span className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-accent/10 text-xs font-semibold text-accent ring-1 ring-inset ring-accent/15\">\n {initials(name)}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium text-text-primary\">{name}</span>\n {m.isLead && (\n <span className=\"shrink-0 rounded-full bg-bg-sunken px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-accent\">\n Lead\n </span>\n )}\n </div>\n <div className=\"mt-0.5 truncate text-xs text-text-tertiary\">\n {m.roles.join(' · ')}\n </div>\n <div className=\"mt-2 flex flex-wrap gap-1.5\">\n {m.scopes.map((s) => (\n <span\n key={s.id}\n className=\"inline-flex max-w-full items-center gap-1 rounded-md bg-bg-sunken px-1.5 py-0.5 text-[11px] text-text-secondary\"\n >\n {s.type === 'engagement' ? (\n <Briefcase className=\"h-3 w-3 shrink-0 text-text-tertiary\" />\n ) : (\n <FolderKanban className=\"h-3 w-3 shrink-0 text-text-tertiary\" />\n )}\n <span className=\"truncate\">{s.name}</span>\n </span>\n ))}\n </div>\n </div>\n {email ? (\n <a\n href={`mailto:${email}`}\n className=\"shrink-0 rounded-lg p-1.5 text-text-tertiary transition-colors hover:bg-bg-sunken hover:text-accent\"\n aria-label={`Email ${name}`}\n title={email}\n >\n <Mail className=\"h-4 w-4\" />\n </a>\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </SectionCard>\n );\n};\n\nconst IconRow: FC<{ icon: React.ReactNode; value: string; multiline?: boolean }> = ({\n icon,\n value,\n multiline,\n}) => (\n <div\n className={cn('flex gap-2.5 text-text-secondary', multiline ? 'items-start' : 'items-center')}\n >\n <span className=\"mt-0.5 flex h-7 w-7 shrink-0 items-center justify-center rounded-lg bg-bg-sunken text-text-tertiary\">\n {icon}\n </span>\n <span className={cn('min-w-0 break-words', multiline ? 'leading-relaxed' : 'truncate')}>\n {value}\n </span>\n </div>\n);\n\nconst ConflictModal: FC<{ clientId: string; onClose: () => void; onDone: () => void }> = ({\n clientId,\n onClose,\n onDone,\n}) => {\n const create = useCreateConflictCheck();\n const [parties, setParties] = useState('');\n const [findings, setFindings] = useState('');\n const [err, setErr] = useState<string | null>(null);\n\n const submit = () => {\n setErr(null);\n const searchedParties = parties\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n if (searchedParties.length === 0) return setErr('Add at least one party to search.');\n create.mutate(\n { clientId, searchedParties, findings: findings.trim() || null },\n {\n onSuccess: () => {\n onDone();\n onClose();\n },\n onError: (e) => setErr(e instanceof Error ? e.message : 'Failed.'),\n }\n );\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n title=\"Run conflict check\"\n footer={\n <>\n <Button variant=\"outline\" onClick={onClose} disabled={create.isPending}>\n Cancel\n </Button>\n <Button onClick={submit} disabled={create.isPending}>\n {create.isPending ? 'Running…' : 'Record check'}\n </Button>\n </>\n }\n >\n <div className=\"space-y-3\">\n {err && <Banner tone=\"danger\">{err}</Banner>}\n <Field\n label=\"Parties searched\"\n required\n hint=\"Comma-separated — counterparties, related entities, principals.\"\n >\n <TextInput\n value={parties}\n onChange={(e) => setParties(e.target.value)}\n placeholder=\"Beta Corp, John Roe, Gamma LLP\"\n />\n </Field>\n <Field label=\"Findings\">\n <TextArea\n value={findings}\n onChange={(e) => setFindings(e.target.value)}\n placeholder=\"Notes on any potential conflicts…\"\n />\n </Field>\n </div>\n </Modal>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ClientsPage.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/pages/ClientsPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAkDhC,qDAAqD;AACrD,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAU3D,CAAC;AAyBF,eAAO,MAAM,WAAW,EAAE,EAwNzB,CAAC"}
1
+ {"version":3,"file":"ClientsPage.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/pages/ClientsPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAkDhC,qDAAqD;AACrD,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAU3D,CAAC;AAyBF,eAAO,MAAM,WAAW,EAAE,EAwSzB,CAAC"}