@burdenoff/microfe-brainyrich 2026.825.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.
- package/dist/brainyrich/components/reuse/DocumentsPanel.d.ts +4 -0
- package/dist/brainyrich/components/reuse/DocumentsPanel.d.ts.map +1 -1
- package/dist/brainyrich/components/reuse/DocumentsPanel.js +150 -99
- package/dist/brainyrich/components/reuse/DocumentsPanel.js.map +1 -1
- package/dist/brainyrich/hooks/useBrainyRichApi.d.ts +176 -0
- package/dist/brainyrich/hooks/useBrainyRichApi.d.ts.map +1 -1
- package/dist/brainyrich/hooks/useBrainyRichApi.js +96 -82
- package/dist/brainyrich/hooks/useBrainyRichApi.js.map +1 -1
- package/dist/brainyrich/pages/AdminFirmPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/AdminFirmPage.js +115 -83
- package/dist/brainyrich/pages/AdminFirmPage.js.map +1 -1
- package/dist/brainyrich/pages/AiAssistantPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/AiAssistantPage.js +251 -230
- package/dist/brainyrich/pages/AiAssistantPage.js.map +1 -1
- package/dist/brainyrich/pages/FirmPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/FirmPage.js +148 -116
- package/dist/brainyrich/pages/FirmPage.js.map +1 -1
- package/dist/brainyrich/pages/PortfoliosPage.d.ts +14 -0
- package/dist/brainyrich/pages/PortfoliosPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/PortfoliosPage.js +530 -353
- package/dist/brainyrich/pages/PortfoliosPage.js.map +1 -1
- package/dist/brainyrich/pages/RiskPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/RiskPage.js +381 -396
- package/dist/brainyrich/pages/RiskPage.js.map +1 -1
- package/dist/brainyrich/pages/_shared.d.ts +21 -0
- package/dist/brainyrich/pages/_shared.d.ts.map +1 -1
- package/dist/brainyrich/pages/_shared.js +66 -31
- package/dist/brainyrich/pages/_shared.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,137 +1,169 @@
|
|
|
1
1
|
import { tWithFallback as e } from "../utils/i18n.js";
|
|
2
2
|
import { useAdminFirmSummary as t, useMyAdvisorProfile as n } from "../hooks/useBrainyRichApi.js";
|
|
3
3
|
import { FadeIn as r, StatTile as i } from "../components/viz.js";
|
|
4
|
-
import {
|
|
5
|
-
import { Building2 as
|
|
6
|
-
import { useI18n as
|
|
7
|
-
import { jsx as
|
|
8
|
-
import { Badge as
|
|
4
|
+
import { AllocationBars as a, EmptyState as o, ErrorState as s, LoadingState as c, SectionShell as l, formatDate as u, formatMoney as d, formatPct as f, statusBadgeVariant as p } from "./_shared.js";
|
|
5
|
+
import { Building2 as m, Landmark as h, ShieldAlert as g, Users as _ } from "lucide-react";
|
|
6
|
+
import { useI18n as v } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
7
|
+
import { jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
8
|
+
import { Badge as x, Card as S, CardContent as C, CardDescription as w, CardHeader as T, CardTitle as E, Table as D, TableBody as O, TableCell as k, TableHead as A, TableHeader as j, TableRow as M } from "@burdenoff/fe-libs/ui";
|
|
9
9
|
//#region src/brainyrich/pages/AdminFirmPage.tsx
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
return
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
10
|
+
var N = 8;
|
|
11
|
+
function P(e, t, n) {
|
|
12
|
+
return t <= 0 ? [] : e.slice(0, N).map((e) => {
|
|
13
|
+
let r = e.aum / t * 100;
|
|
14
|
+
return {
|
|
15
|
+
label: e.displayName ?? e.email ?? e.advisorId,
|
|
16
|
+
value: r,
|
|
17
|
+
tone: "accent",
|
|
18
|
+
caption: `${d(e.aum, n)} · ${f(r)}`
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function F() {
|
|
23
|
+
let { t: f } = v(), F = (t, n, r) => e(f, t, n, r), I = n(), L = t(), R = I.data, z = L.data, B = R?.role === "FIRM_ADMIN";
|
|
24
|
+
return I.isLoading || L.isLoading ? /* @__PURE__ */ y(l, {
|
|
25
|
+
title: F("brainyrich.admin.firm.title", "Firm supervision"),
|
|
26
|
+
description: F("brainyrich.admin.firm.description", "Consolidated AUM, advisor roster, and household status breakdown."),
|
|
27
|
+
children: /* @__PURE__ */ y(c, {})
|
|
28
|
+
}) : B ? L.isError ? /* @__PURE__ */ y(l, {
|
|
29
|
+
title: F("brainyrich.admin.firm.title", "Firm supervision"),
|
|
30
|
+
description: F("brainyrich.admin.firm.description", "Consolidated AUM, advisor roster, and household status breakdown."),
|
|
31
|
+
children: /* @__PURE__ */ y(s, { onRetry: () => L.refetch() })
|
|
32
|
+
}) : /* @__PURE__ */ y(l, {
|
|
33
|
+
title: F("brainyrich.admin.firm.title", "Firm supervision"),
|
|
34
|
+
description: F("brainyrich.admin.firm.description", "Consolidated AUM, advisor roster, and household status breakdown."),
|
|
35
|
+
children: /* @__PURE__ */ b("div", {
|
|
24
36
|
className: "space-y-6",
|
|
25
|
-
children: [/* @__PURE__ */
|
|
37
|
+
children: [/* @__PURE__ */ y(r, { children: /* @__PURE__ */ b("div", {
|
|
26
38
|
className: "grid gap-4 md:grid-cols-2 xl:grid-cols-4",
|
|
27
39
|
children: [
|
|
28
|
-
/* @__PURE__ */
|
|
29
|
-
label:
|
|
30
|
-
value:
|
|
31
|
-
icon: /* @__PURE__ */
|
|
40
|
+
/* @__PURE__ */ y(i, {
|
|
41
|
+
label: F("brainyrich.admin.firm.kpis.totalAum", "Firm AUM"),
|
|
42
|
+
value: z ? d(z.totalAum, z.currency) : "—",
|
|
43
|
+
icon: /* @__PURE__ */ y(h, {
|
|
32
44
|
className: "size-4",
|
|
33
45
|
"aria-hidden": "true"
|
|
34
46
|
}),
|
|
35
47
|
glow: !0
|
|
36
48
|
}),
|
|
37
|
-
/* @__PURE__ */
|
|
38
|
-
label:
|
|
39
|
-
value:
|
|
40
|
-
icon: /* @__PURE__ */ _
|
|
49
|
+
/* @__PURE__ */ y(i, {
|
|
50
|
+
label: F("brainyrich.admin.firm.kpis.advisors", "Advisors"),
|
|
51
|
+
value: z ? String(z.totalAdvisors) : "—",
|
|
52
|
+
icon: /* @__PURE__ */ y(_, {
|
|
41
53
|
className: "size-4",
|
|
42
54
|
"aria-hidden": "true"
|
|
43
55
|
})
|
|
44
56
|
}),
|
|
45
|
-
/* @__PURE__ */
|
|
46
|
-
label:
|
|
47
|
-
value:
|
|
48
|
-
icon: /* @__PURE__ */
|
|
57
|
+
/* @__PURE__ */ y(i, {
|
|
58
|
+
label: F("brainyrich.admin.firm.kpis.households", "Households"),
|
|
59
|
+
value: z ? String(z.totalHouseholds) : "—",
|
|
60
|
+
icon: /* @__PURE__ */ y(m, {
|
|
49
61
|
className: "size-4",
|
|
50
62
|
"aria-hidden": "true"
|
|
51
63
|
})
|
|
52
64
|
}),
|
|
53
|
-
/* @__PURE__ */
|
|
54
|
-
label:
|
|
55
|
-
value:
|
|
65
|
+
/* @__PURE__ */ y(i, {
|
|
66
|
+
label: F("brainyrich.admin.firm.kpis.asOf", "As of"),
|
|
67
|
+
value: z ? u(z.asOf) : "—"
|
|
56
68
|
})
|
|
57
69
|
]
|
|
58
|
-
}) }), /* @__PURE__ */
|
|
70
|
+
}) }), /* @__PURE__ */ b("div", {
|
|
59
71
|
className: "grid gap-6 lg:grid-cols-3",
|
|
60
|
-
children: [/* @__PURE__ */
|
|
72
|
+
children: [/* @__PURE__ */ y(r, {
|
|
61
73
|
className: "lg:col-span-2",
|
|
62
|
-
children: /* @__PURE__ */
|
|
63
|
-
icon: /* @__PURE__ */
|
|
74
|
+
children: /* @__PURE__ */ b(S, { children: [/* @__PURE__ */ b(T, { children: [/* @__PURE__ */ y(E, { children: F("brainyrich.admin.firm.byAdvisor.title", "AUM by advisor") }), /* @__PURE__ */ y(w, { children: F("brainyrich.admin.firm.byAdvisor.description", "Sorted by AUM, largest book first.") })] }), /* @__PURE__ */ y(C, { children: !z || z.byAdvisor.length === 0 ? /* @__PURE__ */ y(o, {
|
|
75
|
+
icon: /* @__PURE__ */ y(m, {
|
|
64
76
|
className: "size-8",
|
|
65
77
|
"aria-hidden": "true"
|
|
66
78
|
}),
|
|
67
|
-
title:
|
|
68
|
-
}) : /* @__PURE__ */
|
|
69
|
-
|
|
70
|
-
/* @__PURE__ */
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
79
|
+
title: F("brainyrich.admin.firm.byAdvisor.empty", "No advisor books yet")
|
|
80
|
+
}) : /* @__PURE__ */ b("div", {
|
|
81
|
+
className: "space-y-6",
|
|
82
|
+
children: [P(z.byAdvisor, z.totalAum, z.currency).length > 0 ? /* @__PURE__ */ b("div", {
|
|
83
|
+
className: "space-y-2",
|
|
84
|
+
children: [
|
|
85
|
+
/* @__PURE__ */ y("p", {
|
|
86
|
+
className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
87
|
+
children: F("brainyrich.admin.firm.byAdvisor.shareLabel", "Share of firm AUM")
|
|
88
|
+
}),
|
|
89
|
+
/* @__PURE__ */ y(a, { data: P(z.byAdvisor, z.totalAum, z.currency) }),
|
|
90
|
+
z.byAdvisor.length > N ? /* @__PURE__ */ b("p", {
|
|
91
|
+
className: "text-xs text-text-secondary",
|
|
92
|
+
children: [
|
|
93
|
+
"Showing the ",
|
|
94
|
+
N,
|
|
95
|
+
" largest books — every advisor is listed below."
|
|
96
|
+
]
|
|
97
|
+
}) : null
|
|
98
|
+
]
|
|
99
|
+
}) : null, /* @__PURE__ */ b(D, { children: [/* @__PURE__ */ y(j, { children: /* @__PURE__ */ b(M, { children: [
|
|
100
|
+
/* @__PURE__ */ y(A, { children: "Advisor" }),
|
|
101
|
+
/* @__PURE__ */ y(A, { children: "Role" }),
|
|
102
|
+
/* @__PURE__ */ y(A, { children: "Households" }),
|
|
103
|
+
/* @__PURE__ */ y(A, {
|
|
104
|
+
className: "text-right",
|
|
105
|
+
children: "AUM"
|
|
106
|
+
})
|
|
107
|
+
] }) }), /* @__PURE__ */ y(O, { children: z.byAdvisor.map((e) => /* @__PURE__ */ b(M, { children: [
|
|
108
|
+
/* @__PURE__ */ y(k, {
|
|
109
|
+
className: "font-medium",
|
|
110
|
+
children: e.displayName ?? e.email ?? e.advisorId
|
|
111
|
+
}),
|
|
112
|
+
/* @__PURE__ */ y(k, { children: /* @__PURE__ */ y(x, {
|
|
113
|
+
variant: e.role === "FIRM_ADMIN" ? "default" : "secondary",
|
|
114
|
+
children: e.role ?? "—"
|
|
115
|
+
}) }),
|
|
116
|
+
/* @__PURE__ */ y(k, { children: e.householdCount }),
|
|
117
|
+
/* @__PURE__ */ y(k, {
|
|
118
|
+
className: "text-right font-medium",
|
|
119
|
+
children: d(e.aum, z.currency)
|
|
120
|
+
})
|
|
121
|
+
] }, e.advisorId)) })] })]
|
|
122
|
+
}) })] })
|
|
123
|
+
}), /* @__PURE__ */ y(r, { children: /* @__PURE__ */ b(S, {
|
|
92
124
|
className: "h-full",
|
|
93
|
-
children: [/* @__PURE__ */
|
|
94
|
-
icon: /* @__PURE__ */
|
|
125
|
+
children: [/* @__PURE__ */ b(T, { children: [/* @__PURE__ */ y(E, { children: F("brainyrich.admin.firm.byStatus.title", "Households by status") }), /* @__PURE__ */ y(w, { children: F("brainyrich.admin.firm.byStatus.description", "Count and AUM grouped by household lifecycle status.") })] }), /* @__PURE__ */ y(C, { children: !z || z.byHouseholdStatus.length === 0 ? /* @__PURE__ */ y(o, {
|
|
126
|
+
icon: /* @__PURE__ */ y(m, {
|
|
95
127
|
className: "size-8",
|
|
96
128
|
"aria-hidden": "true"
|
|
97
129
|
}),
|
|
98
|
-
title:
|
|
99
|
-
}) : /* @__PURE__ */
|
|
130
|
+
title: F("brainyrich.admin.firm.byStatus.empty", "No household data")
|
|
131
|
+
}) : /* @__PURE__ */ y("div", {
|
|
100
132
|
className: "space-y-3",
|
|
101
|
-
children:
|
|
133
|
+
children: z.byHouseholdStatus.map((e) => /* @__PURE__ */ b("div", {
|
|
102
134
|
className: "flex items-center justify-between gap-3 rounded-lg border border-border-subtle p-3",
|
|
103
|
-
children: [/* @__PURE__ */
|
|
135
|
+
children: [/* @__PURE__ */ b("div", {
|
|
104
136
|
className: "flex items-center gap-2",
|
|
105
|
-
children: [/* @__PURE__ */
|
|
106
|
-
variant:
|
|
137
|
+
children: [/* @__PURE__ */ y(x, {
|
|
138
|
+
variant: p(e.status),
|
|
107
139
|
children: e.status
|
|
108
|
-
}), /* @__PURE__ */
|
|
140
|
+
}), /* @__PURE__ */ y("span", {
|
|
109
141
|
className: "text-sm text-text-secondary",
|
|
110
142
|
children: e.count
|
|
111
143
|
})]
|
|
112
|
-
}), /* @__PURE__ */
|
|
144
|
+
}), /* @__PURE__ */ y("span", {
|
|
113
145
|
className: "text-sm font-medium text-text-primary",
|
|
114
|
-
children:
|
|
146
|
+
children: d(e.aum, z.currency)
|
|
115
147
|
})]
|
|
116
148
|
}, e.status))
|
|
117
149
|
}) })]
|
|
118
150
|
}) })]
|
|
119
151
|
})]
|
|
120
152
|
})
|
|
121
|
-
}) : /* @__PURE__ */
|
|
122
|
-
title:
|
|
123
|
-
description:
|
|
124
|
-
children: /* @__PURE__ */
|
|
125
|
-
icon: /* @__PURE__ */
|
|
153
|
+
}) : /* @__PURE__ */ y(l, {
|
|
154
|
+
title: F("brainyrich.admin.firm.title", "Firm supervision"),
|
|
155
|
+
description: F("brainyrich.admin.firm.description", "Consolidated AUM, advisor roster, and household status breakdown."),
|
|
156
|
+
children: /* @__PURE__ */ y(o, {
|
|
157
|
+
icon: /* @__PURE__ */ y(g, {
|
|
126
158
|
className: "size-8",
|
|
127
159
|
"aria-hidden": "true"
|
|
128
160
|
}),
|
|
129
|
-
title:
|
|
130
|
-
description:
|
|
161
|
+
title: F("brainyrich.admin.firm.notAdmin", "Firm admin access required"),
|
|
162
|
+
description: F("brainyrich.admin.firm.notAdminDescription", "This dashboard is only available to firm admins.")
|
|
131
163
|
})
|
|
132
164
|
});
|
|
133
165
|
}
|
|
134
166
|
//#endregion
|
|
135
|
-
export {
|
|
167
|
+
export { F as AdminFirmPage };
|
|
136
168
|
|
|
137
169
|
//# sourceMappingURL=AdminFirmPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminFirmPage.js","names":[],"sources":["../../../src/brainyrich/pages/AdminFirmPage.tsx"],"sourcesContent":["/**\n * AdminFirmPage — firm supervision dashboard (BOFF-3188).\n *\n * A FIRM_ADMIN-only view that surfaces consolidated firm AUM, advisor\n * supervision, and a household status breakdown. This is the BrainyRich-\n * specific vertical admin page called out in the product specs; the\n * underlying `braAdminFirmSummary` query reuses the same FIRM_ADMIN gate\n * and cached `BraHousehold.aum` rollup as the public `braFirmReport`.\n */\nimport {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\nimport { Building2, Landmark, ShieldAlert, Users } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport { useMyAdvisorProfile, useAdminFirmSummary } from '../hooks/useBrainyRichApi';\nimport {\n SectionShell,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatDate,\n statusBadgeVariant,\n} from './_shared';\nimport { StatTile, FadeIn } from '../components/viz';\n\ntype Translate = (\n key: string,\n fallback: string,\n params?: Record<string, string | number>\n) => string;\n\nexport function AdminFirmPage() {\n const { t } = useI18n();\n const translate: Translate = (key, fallback, params) => tWithFallback(t, key, fallback, params);\n\n const myProfileQuery = useMyAdvisorProfile();\n const summaryQuery = useAdminFirmSummary();\n\n const myProfile = myProfileQuery.data;\n const summary = summaryQuery.data;\n const isFirmAdmin = myProfile?.role === 'FIRM_ADMIN';\n\n if (myProfileQuery.isLoading || summaryQuery.isLoading) {\n return (\n <SectionShell\n title={translate('brainyrich.admin.firm.title', 'Firm supervision')}\n description={translate(\n 'brainyrich.admin.firm.description',\n 'Consolidated AUM, advisor roster, and household status breakdown.'\n )}\n >\n <LoadingState />\n </SectionShell>\n );\n }\n\n if (!isFirmAdmin) {\n return (\n <SectionShell\n title={translate('brainyrich.admin.firm.title', 'Firm supervision')}\n description={translate(\n 'brainyrich.admin.firm.description',\n 'Consolidated AUM, advisor roster, and household status breakdown.'\n )}\n >\n <EmptyState\n icon={<ShieldAlert className=\"size-8\" aria-hidden=\"true\" />}\n title={translate('brainyrich.admin.firm.notAdmin', 'Firm admin access required')}\n description={translate(\n 'brainyrich.admin.firm.notAdminDescription',\n 'This dashboard is only available to firm admins.'\n )}\n />\n </SectionShell>\n );\n }\n\n if (summaryQuery.isError) {\n return (\n <SectionShell\n title={translate('brainyrich.admin.firm.title', 'Firm supervision')}\n description={translate(\n 'brainyrich.admin.firm.description',\n 'Consolidated AUM, advisor roster, and household status breakdown.'\n )}\n >\n <ErrorState onRetry={() => summaryQuery.refetch()} />\n </SectionShell>\n );\n }\n\n return (\n <SectionShell\n title={translate('brainyrich.admin.firm.title', 'Firm supervision')}\n description={translate(\n 'brainyrich.admin.firm.description',\n 'Consolidated AUM, advisor roster, and household status breakdown.'\n )}\n >\n <div className=\"space-y-6\">\n <FadeIn>\n <div className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <StatTile\n label={translate('brainyrich.admin.firm.kpis.totalAum', 'Firm AUM')}\n value={summary ? formatMoney(summary.totalAum, summary.currency) : '—'}\n icon={<Landmark className=\"size-4\" aria-hidden=\"true\" />}\n glow\n />\n <StatTile\n label={translate('brainyrich.admin.firm.kpis.advisors', 'Advisors')}\n value={summary ? String(summary.totalAdvisors) : '—'}\n icon={<Users className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label={translate('brainyrich.admin.firm.kpis.households', 'Households')}\n value={summary ? String(summary.totalHouseholds) : '—'}\n icon={<Building2 className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label={translate('brainyrich.admin.firm.kpis.asOf', 'As of')}\n value={summary ? formatDate(summary.asOf) : '—'}\n />\n </div>\n </FadeIn>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <FadeIn className=\"lg:col-span-2\">\n <Card>\n <CardHeader>\n <CardTitle>\n {translate('brainyrich.admin.firm.byAdvisor.title', 'AUM by advisor')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.admin.firm.byAdvisor.description',\n 'Sorted by AUM, largest book first.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {!summary || summary.byAdvisor.length === 0 ? (\n <EmptyState\n icon={<Building2 className=\"size-8\" aria-hidden=\"true\" />}\n title={translate(\n 'brainyrich.admin.firm.byAdvisor.empty',\n 'No advisor books yet'\n )}\n />\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Advisor</TableHead>\n <TableHead>Role</TableHead>\n <TableHead>Households</TableHead>\n <TableHead className=\"text-right\">AUM</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {summary.byAdvisor.map((row) => (\n <TableRow key={row.advisorId}>\n <TableCell className=\"font-medium\">\n {row.displayName ?? row.email ?? row.advisorId}\n </TableCell>\n <TableCell>\n <Badge variant={row.role === 'FIRM_ADMIN' ? 'default' : 'secondary'}>\n {row.role ?? '—'}\n </Badge>\n </TableCell>\n <TableCell>{row.householdCount}</TableCell>\n <TableCell className=\"text-right font-medium\">\n {formatMoney(row.aum, summary.currency)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </CardContent>\n </Card>\n </FadeIn>\n\n <FadeIn>\n <Card className=\"h-full\">\n <CardHeader>\n <CardTitle>\n {translate('brainyrich.admin.firm.byStatus.title', 'Households by status')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.admin.firm.byStatus.description',\n 'Count and AUM grouped by household lifecycle status.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {!summary || summary.byHouseholdStatus.length === 0 ? (\n <EmptyState\n icon={<Building2 className=\"size-8\" aria-hidden=\"true\" />}\n title={translate('brainyrich.admin.firm.byStatus.empty', 'No household data')}\n />\n ) : (\n <div className=\"space-y-3\">\n {summary.byHouseholdStatus.map((row) => (\n <div\n key={row.status}\n className=\"flex items-center justify-between gap-3 rounded-lg border border-border-subtle p-3\"\n >\n <div className=\"flex items-center gap-2\">\n <Badge variant={statusBadgeVariant(row.status)}>{row.status}</Badge>\n <span className=\"text-sm text-text-secondary\">{row.count}</span>\n </div>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatMoney(row.aum, summary.currency)}\n </span>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n </div>\n </SectionShell>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdminFirmPage.js","names":[],"sources":["../../../src/brainyrich/pages/AdminFirmPage.tsx"],"sourcesContent":["/**\n * AdminFirmPage — firm supervision dashboard (BOFF-3188).\n *\n * A FIRM_ADMIN-only view that surfaces consolidated firm AUM, advisor\n * supervision, and a household status breakdown. This is the BrainyRich-\n * specific vertical admin page called out in the product specs; the\n * underlying `braAdminFirmSummary` query reuses the same FIRM_ADMIN gate\n * and cached `BraHousehold.aum` rollup as the public `braFirmReport`.\n */\nimport {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\nimport { Building2, Landmark, ShieldAlert, Users } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport { useMyAdvisorProfile, useAdminFirmSummary } from '../hooks/useBrainyRichApi';\nimport {\n AllocationBars,\n SectionShell,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatDate,\n formatPct,\n statusBadgeVariant,\n type AllocationDatum,\n} from './_shared';\nimport { StatTile, FadeIn } from '../components/viz';\n\n/** Advisor books as a share of firm AUM — same rollup the table below lists. */\nconst MAX_CHARTED_ADVISORS = 8;\n\ninterface AdvisorBookRow {\n advisorId: string;\n aum: number;\n displayName?: string | null;\n email?: string | null;\n}\n\nfunction advisorShareBars(\n byAdvisor: readonly AdvisorBookRow[],\n totalAum: number,\n currency: string\n): AllocationDatum[] {\n if (totalAum <= 0) return [];\n return byAdvisor.slice(0, MAX_CHARTED_ADVISORS).map((row) => {\n const share = (row.aum / totalAum) * 100;\n return {\n label: row.displayName ?? row.email ?? row.advisorId,\n value: share,\n tone: 'accent' as const,\n caption: `${formatMoney(row.aum, currency)} · ${formatPct(share)}`,\n };\n });\n}\n\ntype Translate = (\n key: string,\n fallback: string,\n params?: Record<string, string | number>\n) => string;\n\nexport function AdminFirmPage() {\n const { t } = useI18n();\n const translate: Translate = (key, fallback, params) => tWithFallback(t, key, fallback, params);\n\n const myProfileQuery = useMyAdvisorProfile();\n const summaryQuery = useAdminFirmSummary();\n\n const myProfile = myProfileQuery.data;\n const summary = summaryQuery.data;\n const isFirmAdmin = myProfile?.role === 'FIRM_ADMIN';\n\n if (myProfileQuery.isLoading || summaryQuery.isLoading) {\n return (\n <SectionShell\n title={translate('brainyrich.admin.firm.title', 'Firm supervision')}\n description={translate(\n 'brainyrich.admin.firm.description',\n 'Consolidated AUM, advisor roster, and household status breakdown.'\n )}\n >\n <LoadingState />\n </SectionShell>\n );\n }\n\n if (!isFirmAdmin) {\n return (\n <SectionShell\n title={translate('brainyrich.admin.firm.title', 'Firm supervision')}\n description={translate(\n 'brainyrich.admin.firm.description',\n 'Consolidated AUM, advisor roster, and household status breakdown.'\n )}\n >\n <EmptyState\n icon={<ShieldAlert className=\"size-8\" aria-hidden=\"true\" />}\n title={translate('brainyrich.admin.firm.notAdmin', 'Firm admin access required')}\n description={translate(\n 'brainyrich.admin.firm.notAdminDescription',\n 'This dashboard is only available to firm admins.'\n )}\n />\n </SectionShell>\n );\n }\n\n if (summaryQuery.isError) {\n return (\n <SectionShell\n title={translate('brainyrich.admin.firm.title', 'Firm supervision')}\n description={translate(\n 'brainyrich.admin.firm.description',\n 'Consolidated AUM, advisor roster, and household status breakdown.'\n )}\n >\n <ErrorState onRetry={() => summaryQuery.refetch()} />\n </SectionShell>\n );\n }\n\n return (\n <SectionShell\n title={translate('brainyrich.admin.firm.title', 'Firm supervision')}\n description={translate(\n 'brainyrich.admin.firm.description',\n 'Consolidated AUM, advisor roster, and household status breakdown.'\n )}\n >\n <div className=\"space-y-6\">\n <FadeIn>\n <div className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-4\">\n <StatTile\n label={translate('brainyrich.admin.firm.kpis.totalAum', 'Firm AUM')}\n value={summary ? formatMoney(summary.totalAum, summary.currency) : '—'}\n icon={<Landmark className=\"size-4\" aria-hidden=\"true\" />}\n glow\n />\n <StatTile\n label={translate('brainyrich.admin.firm.kpis.advisors', 'Advisors')}\n value={summary ? String(summary.totalAdvisors) : '—'}\n icon={<Users className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label={translate('brainyrich.admin.firm.kpis.households', 'Households')}\n value={summary ? String(summary.totalHouseholds) : '—'}\n icon={<Building2 className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label={translate('brainyrich.admin.firm.kpis.asOf', 'As of')}\n value={summary ? formatDate(summary.asOf) : '—'}\n />\n </div>\n </FadeIn>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <FadeIn className=\"lg:col-span-2\">\n <Card>\n <CardHeader>\n <CardTitle>\n {translate('brainyrich.admin.firm.byAdvisor.title', 'AUM by advisor')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.admin.firm.byAdvisor.description',\n 'Sorted by AUM, largest book first.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {!summary || summary.byAdvisor.length === 0 ? (\n <EmptyState\n icon={<Building2 className=\"size-8\" aria-hidden=\"true\" />}\n title={translate(\n 'brainyrich.admin.firm.byAdvisor.empty',\n 'No advisor books yet'\n )}\n />\n ) : (\n <div className=\"space-y-6\">\n {advisorShareBars(summary.byAdvisor, summary.totalAum, summary.currency)\n .length > 0 ? (\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate(\n 'brainyrich.admin.firm.byAdvisor.shareLabel',\n 'Share of firm AUM'\n )}\n </p>\n <AllocationBars\n data={advisorShareBars(\n summary.byAdvisor,\n summary.totalAum,\n summary.currency\n )}\n />\n {summary.byAdvisor.length > MAX_CHARTED_ADVISORS ? (\n <p className=\"text-xs text-text-secondary\">\n Showing the {MAX_CHARTED_ADVISORS} largest books — every advisor is\n listed below.\n </p>\n ) : null}\n </div>\n ) : null}\n\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Advisor</TableHead>\n <TableHead>Role</TableHead>\n <TableHead>Households</TableHead>\n <TableHead className=\"text-right\">AUM</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {summary.byAdvisor.map((row) => (\n <TableRow key={row.advisorId}>\n <TableCell className=\"font-medium\">\n {row.displayName ?? row.email ?? row.advisorId}\n </TableCell>\n <TableCell>\n <Badge variant={row.role === 'FIRM_ADMIN' ? 'default' : 'secondary'}>\n {row.role ?? '—'}\n </Badge>\n </TableCell>\n <TableCell>{row.householdCount}</TableCell>\n <TableCell className=\"text-right font-medium\">\n {formatMoney(row.aum, summary.currency)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n </CardContent>\n </Card>\n </FadeIn>\n\n <FadeIn>\n <Card className=\"h-full\">\n <CardHeader>\n <CardTitle>\n {translate('brainyrich.admin.firm.byStatus.title', 'Households by status')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.admin.firm.byStatus.description',\n 'Count and AUM grouped by household lifecycle status.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {!summary || summary.byHouseholdStatus.length === 0 ? (\n <EmptyState\n icon={<Building2 className=\"size-8\" aria-hidden=\"true\" />}\n title={translate('brainyrich.admin.firm.byStatus.empty', 'No household data')}\n />\n ) : (\n <div className=\"space-y-3\">\n {summary.byHouseholdStatus.map((row) => (\n <div\n key={row.status}\n className=\"flex items-center justify-between gap-3 rounded-lg border border-border-subtle p-3\"\n >\n <div className=\"flex items-center gap-2\">\n <Badge variant={statusBadgeVariant(row.status)}>{row.status}</Badge>\n <span className=\"text-sm text-text-secondary\">{row.count}</span>\n </div>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatMoney(row.aum, summary.currency)}\n </span>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </FadeIn>\n </div>\n </div>\n </SectionShell>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiAssistantPage.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/AiAssistantPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AiAssistantPage.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/AiAssistantPage.tsx"],"names":[],"mappings":"AAuKA,wBAAgB,eAAe,4CAqY9B"}
|