@burdenoff/microfe-brainyrich 2026.825.1 → 2026.828.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 +179 -1
- package/dist/brainyrich/hooks/useBrainyRichApi.d.ts.map +1 -1
- package/dist/brainyrich/hooks/useBrainyRichApi.js +101 -83
- package/dist/brainyrich/hooks/useBrainyRichApi.js.map +1 -1
- package/dist/brainyrich/pages/AccountsPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/AccountsPage.js +159 -148
- package/dist/brainyrich/pages/AccountsPage.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/dist/generated/global-operations.d.ts +31 -1
- package/dist/generated/global-operations.d.ts.map +1 -1
- package/dist/generated/wspace-operations.d.ts +31 -1
- package/dist/generated/wspace-operations.d.ts.map +1 -1
- package/dist/test/setup.d.ts +1 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/package.json +11 -2
|
@@ -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"}
|