@burdenoff/microfe-brainyrich 2026.819.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/_virtual/_rolldown/runtime.js +1 -1
- package/dist/brainyrich/BrainyRichRoot.d.ts +0 -1
- package/dist/brainyrich/BrainyRichRoot.js.map +1 -1
- package/dist/brainyrich/BrainyRichRoutes.js.map +1 -1
- package/dist/brainyrich/components/ActorName.js.map +1 -1
- package/dist/brainyrich/components/ConfirmDialog.d.ts +0 -1
- package/dist/brainyrich/components/ConfirmDialog.js.map +1 -1
- package/dist/brainyrich/components/LoadMore.js.map +1 -1
- package/dist/brainyrich/components/notify.js.map +1 -1
- package/dist/brainyrich/components/pickers.js.map +1 -1
- package/dist/brainyrich/components/reuse/CommentThread.js.map +1 -1
- 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/components/reuse/TagField.js.map +1 -1
- package/dist/brainyrich/components/reuse/transport.js.map +1 -1
- package/dist/brainyrich/components/viz.d.ts +0 -1
- package/dist/brainyrich/components/viz.js.map +1 -1
- package/dist/brainyrich/hooks/useBrainyRichAnalytics.js.map +1 -1
- package/dist/brainyrich/hooks/useBrainyRichApi.d.ts +176 -1
- 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/AccountsPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/AccountsPage.js +367 -363
- 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/AnalyticsPage.js.map +1 -1
- package/dist/brainyrich/pages/DashboardPage.js.map +1 -1
- package/dist/brainyrich/pages/FamilyPage.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/GoalsPage.js.map +1 -1
- package/dist/brainyrich/pages/InvestmentsPage.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/ReportsPage.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/TaxPage.js.map +1 -1
- package/dist/brainyrich/pages/_shared.d.ts +21 -1
- 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/brainyrich/providers/BrainyRichProvider.d.ts +0 -1
- package/dist/brainyrich/providers/BrainyRichProvider.js.map +1 -1
- package/dist/brainyrich/services/createSandboxAssistantTransport.js.map +1 -1
- package/dist/brainyrich/types/bra.d.ts.map +1 -1
- package/dist/brainyrich/types/index.d.ts +0 -1
- package/dist/brainyrich/utils/cn.d.ts +0 -1
- package/dist/brainyrich/utils/i18n.d.ts +0 -1
- package/dist/brainyrich/utils/i18n.js.map +1 -1
- package/dist/brainyrich/utils/nativeControls.d.ts +0 -1
- package/dist/brainyrich/utils/nativeControls.js.map +1 -1
- package/dist/brainyrich/utils/navigation.js.map +1 -1
- package/dist/brainyrich/utils/pageContext.js.map +1 -1
- package/dist/dev/main.d.ts +0 -1
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -1
- package/dist/node_modules/d3-array/src/ascending.js.map +1 -1
- package/dist/node_modules/d3-array/src/bisect.js.map +1 -1
- package/dist/node_modules/d3-array/src/bisector.js.map +1 -1
- package/dist/node_modules/d3-array/src/descending.js.map +1 -1
- package/dist/node_modules/d3-array/src/max.js.map +1 -1
- package/dist/node_modules/d3-array/src/min.js.map +1 -1
- package/dist/node_modules/d3-array/src/number.js.map +1 -1
- package/dist/node_modules/d3-array/src/quantile.js.map +1 -1
- package/dist/node_modules/d3-array/src/quickselect.js.map +1 -1
- package/dist/node_modules/d3-array/src/range.js.map +1 -1
- package/dist/node_modules/d3-array/src/sort.js.map +1 -1
- package/dist/node_modules/d3-array/src/ticks.js.map +1 -1
- package/dist/node_modules/d3-color/src/color.js.map +1 -1
- package/dist/node_modules/d3-color/src/define.js.map +1 -1
- package/dist/node_modules/d3-format/src/defaultLocale.js.map +1 -1
- package/dist/node_modules/d3-format/src/exponent.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatDecimal.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatGroup.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatNumerals.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatPrefixAuto.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatRounded.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatSpecifier.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatTrim.js.map +1 -1
- package/dist/node_modules/d3-format/src/formatTypes.js.map +1 -1
- package/dist/node_modules/d3-format/src/identity.js.map +1 -1
- package/dist/node_modules/d3-format/src/locale.js.map +1 -1
- package/dist/node_modules/d3-format/src/precisionFixed.js.map +1 -1
- package/dist/node_modules/d3-format/src/precisionPrefix.js.map +1 -1
- package/dist/node_modules/d3-format/src/precisionRound.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/array.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/basis.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/basisClosed.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/color.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/date.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/number.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/numberArray.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/object.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/piecewise.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/rgb.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/round.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/string.js.map +1 -1
- package/dist/node_modules/d3-interpolate/src/value.js.map +1 -1
- package/dist/node_modules/d3-path/src/path.js.map +1 -1
- package/dist/node_modules/d3-scale/src/band.js.map +1 -1
- package/dist/node_modules/d3-scale/src/constant.js.map +1 -1
- package/dist/node_modules/d3-scale/src/continuous.js.map +1 -1
- package/dist/node_modules/d3-scale/src/diverging.js.map +1 -1
- package/dist/node_modules/d3-scale/src/identity.js.map +1 -1
- package/dist/node_modules/d3-scale/src/init.js.map +1 -1
- package/dist/node_modules/d3-scale/src/linear.js.map +1 -1
- package/dist/node_modules/d3-scale/src/log.js.map +1 -1
- package/dist/node_modules/d3-scale/src/nice.js.map +1 -1
- package/dist/node_modules/d3-scale/src/number.js.map +1 -1
- package/dist/node_modules/d3-scale/src/ordinal.js.map +1 -1
- package/dist/node_modules/d3-scale/src/pow.js.map +1 -1
- package/dist/node_modules/d3-scale/src/quantile.js.map +1 -1
- package/dist/node_modules/d3-scale/src/quantize.js.map +1 -1
- package/dist/node_modules/d3-scale/src/radial.js.map +1 -1
- package/dist/node_modules/d3-scale/src/sequential.js.map +1 -1
- package/dist/node_modules/d3-scale/src/sequentialQuantile.js.map +1 -1
- package/dist/node_modules/d3-scale/src/symlog.js.map +1 -1
- package/dist/node_modules/d3-scale/src/threshold.js.map +1 -1
- package/dist/node_modules/d3-scale/src/tickFormat.js.map +1 -1
- package/dist/node_modules/d3-scale/src/time.js.map +1 -1
- package/dist/node_modules/d3-scale/src/utcTime.js.map +1 -1
- package/dist/node_modules/d3-shape/src/area.js.map +1 -1
- package/dist/node_modules/d3-shape/src/array.js.map +1 -1
- package/dist/node_modules/d3-shape/src/constant.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/basis.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/basisClosed.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/basisOpen.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/bump.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/linear.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/linearClosed.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/monotone.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/natural.js.map +1 -1
- package/dist/node_modules/d3-shape/src/curve/step.js.map +1 -1
- package/dist/node_modules/d3-shape/src/line.js.map +1 -1
- package/dist/node_modules/d3-shape/src/noop.js.map +1 -1
- package/dist/node_modules/d3-shape/src/offset/expand.js.map +1 -1
- package/dist/node_modules/d3-shape/src/offset/none.js.map +1 -1
- package/dist/node_modules/d3-shape/src/offset/silhouette.js.map +1 -1
- package/dist/node_modules/d3-shape/src/offset/wiggle.js.map +1 -1
- package/dist/node_modules/d3-shape/src/order/none.js.map +1 -1
- package/dist/node_modules/d3-shape/src/path.js.map +1 -1
- package/dist/node_modules/d3-shape/src/point.js.map +1 -1
- package/dist/node_modules/d3-shape/src/stack.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/circle.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/cross.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/diamond.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/square.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/star.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/triangle.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol/wye.js.map +1 -1
- package/dist/node_modules/d3-shape/src/symbol.js.map +1 -1
- package/dist/node_modules/d3-time/src/day.js.map +1 -1
- package/dist/node_modules/d3-time/src/hour.js.map +1 -1
- package/dist/node_modules/d3-time/src/interval.js.map +1 -1
- package/dist/node_modules/d3-time/src/millisecond.js.map +1 -1
- package/dist/node_modules/d3-time/src/minute.js.map +1 -1
- package/dist/node_modules/d3-time/src/month.js.map +1 -1
- package/dist/node_modules/d3-time/src/second.js.map +1 -1
- package/dist/node_modules/d3-time/src/ticks.js.map +1 -1
- package/dist/node_modules/d3-time/src/week.js.map +1 -1
- package/dist/node_modules/d3-time/src/year.js.map +1 -1
- package/dist/node_modules/d3-time-format/src/defaultLocale.js.map +1 -1
- package/dist/node_modules/d3-time-format/src/locale.js.map +1 -1
- package/dist/node_modules/decimal.js-light/decimal.js.map +1 -1
- package/dist/node_modules/eventemitter3/index.js.map +1 -1
- package/dist/node_modules/fast-equals/dist/es/index.js.map +1 -1
- package/dist/node_modules/internmap/src/index.js.map +1 -1
- package/dist/node_modules/lodash/_DataView.js.map +1 -1
- package/dist/node_modules/lodash/_Hash.js.map +1 -1
- package/dist/node_modules/lodash/_ListCache.js.map +1 -1
- package/dist/node_modules/lodash/_Map.js.map +1 -1
- package/dist/node_modules/lodash/_MapCache.js.map +1 -1
- package/dist/node_modules/lodash/_Promise.js.map +1 -1
- package/dist/node_modules/lodash/_Set.js.map +1 -1
- package/dist/node_modules/lodash/_SetCache.js.map +1 -1
- package/dist/node_modules/lodash/_Stack.js +2 -1
- package/dist/node_modules/lodash/_Stack.js.map +1 -1
- package/dist/node_modules/lodash/_Symbol.js.map +1 -1
- package/dist/node_modules/lodash/_Uint8Array.js.map +1 -1
- package/dist/node_modules/lodash/_WeakMap.js.map +1 -1
- package/dist/node_modules/lodash/_apply.js.map +1 -1
- package/dist/node_modules/lodash/_arrayEvery.js.map +1 -1
- package/dist/node_modules/lodash/_arrayFilter.js.map +1 -1
- package/dist/node_modules/lodash/_arrayIncludes.js.map +1 -1
- package/dist/node_modules/lodash/_arrayIncludesWith.js.map +1 -1
- package/dist/node_modules/lodash/_arrayLikeKeys.js.map +1 -1
- package/dist/node_modules/lodash/_arrayMap.js.map +1 -1
- package/dist/node_modules/lodash/_arrayPush.js.map +1 -1
- package/dist/node_modules/lodash/_arraySome.js.map +1 -1
- package/dist/node_modules/lodash/_asciiToArray.js.map +1 -1
- package/dist/node_modules/lodash/_assocIndexOf.js.map +1 -1
- package/dist/node_modules/lodash/_baseAssignValue.js.map +1 -1
- package/dist/node_modules/lodash/_baseEach.js.map +1 -1
- package/dist/node_modules/lodash/_baseEvery.js.map +1 -1
- package/dist/node_modules/lodash/_baseExtremum.js.map +1 -1
- package/dist/node_modules/lodash/_baseFindIndex.js.map +1 -1
- package/dist/node_modules/lodash/_baseFlatten.js.map +1 -1
- package/dist/node_modules/lodash/_baseFor.js.map +1 -1
- package/dist/node_modules/lodash/_baseForOwn.js.map +1 -1
- package/dist/node_modules/lodash/_baseGet.js.map +1 -1
- package/dist/node_modules/lodash/_baseGetAllKeys.js.map +1 -1
- package/dist/node_modules/lodash/_baseGetTag.js.map +1 -1
- package/dist/node_modules/lodash/_baseGt.js.map +1 -1
- package/dist/node_modules/lodash/_baseHasIn.js.map +1 -1
- package/dist/node_modules/lodash/_baseIndexOf.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsArguments.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsEqual.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsEqualDeep.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsMatch.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsNaN.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsNative.js.map +1 -1
- package/dist/node_modules/lodash/_baseIsTypedArray.js.map +1 -1
- package/dist/node_modules/lodash/_baseIteratee.js.map +1 -1
- package/dist/node_modules/lodash/_baseKeys.js.map +1 -1
- package/dist/node_modules/lodash/_baseLt.js.map +1 -1
- package/dist/node_modules/lodash/_baseMap.js.map +1 -1
- package/dist/node_modules/lodash/_baseMatches.js.map +1 -1
- package/dist/node_modules/lodash/_baseMatchesProperty.js.map +1 -1
- package/dist/node_modules/lodash/_baseOrderBy.js.map +1 -1
- package/dist/node_modules/lodash/_baseProperty.js.map +1 -1
- package/dist/node_modules/lodash/_basePropertyDeep.js.map +1 -1
- package/dist/node_modules/lodash/_baseRange.js.map +1 -1
- package/dist/node_modules/lodash/_baseRest.js.map +1 -1
- package/dist/node_modules/lodash/_baseSetToString.js.map +1 -1
- package/dist/node_modules/lodash/_baseSlice.js.map +1 -1
- package/dist/node_modules/lodash/_baseSome.js.map +1 -1
- package/dist/node_modules/lodash/_baseSortBy.js.map +1 -1
- package/dist/node_modules/lodash/_baseTimes.js.map +1 -1
- package/dist/node_modules/lodash/_baseToString.js.map +1 -1
- package/dist/node_modules/lodash/_baseTrim.js.map +1 -1
- package/dist/node_modules/lodash/_baseUnary.js.map +1 -1
- package/dist/node_modules/lodash/_baseUniq.js.map +1 -1
- package/dist/node_modules/lodash/_cacheHas.js.map +1 -1
- package/dist/node_modules/lodash/_castPath.js.map +1 -1
- package/dist/node_modules/lodash/_castSlice.js.map +1 -1
- package/dist/node_modules/lodash/_compareAscending.js.map +1 -1
- package/dist/node_modules/lodash/_compareMultiple.js.map +1 -1
- package/dist/node_modules/lodash/_coreJsData.js.map +1 -1
- package/dist/node_modules/lodash/_createBaseEach.js.map +1 -1
- package/dist/node_modules/lodash/_createBaseFor.js.map +1 -1
- package/dist/node_modules/lodash/_createCaseFirst.js.map +1 -1
- package/dist/node_modules/lodash/_createFind.js.map +1 -1
- package/dist/node_modules/lodash/_createRange.js.map +1 -1
- package/dist/node_modules/lodash/_createSet.js.map +1 -1
- package/dist/node_modules/lodash/_defineProperty.js.map +1 -1
- package/dist/node_modules/lodash/_equalArrays.js.map +1 -1
- package/dist/node_modules/lodash/_equalByTag.js.map +1 -1
- package/dist/node_modules/lodash/_equalObjects.js.map +1 -1
- package/dist/node_modules/lodash/_freeGlobal.js.map +1 -1
- package/dist/node_modules/lodash/_getAllKeys.js.map +1 -1
- package/dist/node_modules/lodash/_getMapData.js.map +1 -1
- package/dist/node_modules/lodash/_getMatchData.js.map +1 -1
- package/dist/node_modules/lodash/_getNative.js.map +1 -1
- package/dist/node_modules/lodash/_getPrototype.js.map +1 -1
- package/dist/node_modules/lodash/_getRawTag.js.map +1 -1
- package/dist/node_modules/lodash/_getSymbols.js.map +1 -1
- package/dist/node_modules/lodash/_getTag.js.map +1 -1
- package/dist/node_modules/lodash/_getValue.js.map +1 -1
- package/dist/node_modules/lodash/_hasPath.js.map +1 -1
- package/dist/node_modules/lodash/_hasUnicode.js.map +1 -1
- package/dist/node_modules/lodash/_hashClear.js.map +1 -1
- package/dist/node_modules/lodash/_hashDelete.js.map +1 -1
- package/dist/node_modules/lodash/_hashGet.js.map +1 -1
- package/dist/node_modules/lodash/_hashHas.js.map +1 -1
- package/dist/node_modules/lodash/_hashSet.js.map +1 -1
- package/dist/node_modules/lodash/_isFlattenable.js.map +1 -1
- package/dist/node_modules/lodash/_isIndex.js.map +1 -1
- package/dist/node_modules/lodash/_isIterateeCall.js.map +1 -1
- package/dist/node_modules/lodash/_isKey.js.map +1 -1
- package/dist/node_modules/lodash/_isKeyable.js.map +1 -1
- package/dist/node_modules/lodash/_isMasked.js.map +1 -1
- package/dist/node_modules/lodash/_isPrototype.js.map +1 -1
- package/dist/node_modules/lodash/_isStrictComparable.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheClear.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheDelete.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheGet.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheHas.js.map +1 -1
- package/dist/node_modules/lodash/_listCacheSet.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheClear.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheDelete.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheGet.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheHas.js.map +1 -1
- package/dist/node_modules/lodash/_mapCacheSet.js.map +1 -1
- package/dist/node_modules/lodash/_mapToArray.js.map +1 -1
- package/dist/node_modules/lodash/_matchesStrictComparable.js.map +1 -1
- package/dist/node_modules/lodash/_memoizeCapped.js.map +1 -1
- package/dist/node_modules/lodash/_nativeCreate.js.map +1 -1
- package/dist/node_modules/lodash/_nativeKeys.js.map +1 -1
- package/dist/node_modules/lodash/_nodeUtil.js.map +1 -1
- package/dist/node_modules/lodash/_objectToString.js.map +1 -1
- package/dist/node_modules/lodash/_overArg.js.map +1 -1
- package/dist/node_modules/lodash/_overRest.js.map +1 -1
- package/dist/node_modules/lodash/_root.js.map +1 -1
- package/dist/node_modules/lodash/_setCacheAdd.js.map +1 -1
- package/dist/node_modules/lodash/_setCacheHas.js.map +1 -1
- package/dist/node_modules/lodash/_setToArray.js.map +1 -1
- package/dist/node_modules/lodash/_setToString.js.map +1 -1
- package/dist/node_modules/lodash/_shortOut.js.map +1 -1
- package/dist/node_modules/lodash/_stackClear.js.map +1 -1
- package/dist/node_modules/lodash/_stackDelete.js.map +1 -1
- package/dist/node_modules/lodash/_stackGet.js.map +1 -1
- package/dist/node_modules/lodash/_stackHas.js.map +1 -1
- package/dist/node_modules/lodash/_stackSet.js.map +1 -1
- package/dist/node_modules/lodash/_strictIndexOf.js.map +1 -1
- package/dist/node_modules/lodash/_stringToArray.js.map +1 -1
- package/dist/node_modules/lodash/_stringToPath.js.map +1 -1
- package/dist/node_modules/lodash/_toKey.js.map +1 -1
- package/dist/node_modules/lodash/_toSource.js.map +1 -1
- package/dist/node_modules/lodash/_trimmedEndIndex.js.map +1 -1
- package/dist/node_modules/lodash/_unicodeToArray.js.map +1 -1
- package/dist/node_modules/lodash/constant.js.map +1 -1
- package/dist/node_modules/lodash/debounce.js.map +1 -1
- package/dist/node_modules/lodash/eq.js.map +1 -1
- package/dist/node_modules/lodash/every.js.map +1 -1
- package/dist/node_modules/lodash/find.js.map +1 -1
- package/dist/node_modules/lodash/findIndex.js.map +1 -1
- package/dist/node_modules/lodash/flatMap.js.map +1 -1
- package/dist/node_modules/lodash/get.js.map +1 -1
- package/dist/node_modules/lodash/hasIn.js.map +1 -1
- package/dist/node_modules/lodash/identity.js.map +1 -1
- package/dist/node_modules/lodash/isArguments.js.map +1 -1
- package/dist/node_modules/lodash/isArray.js.map +1 -1
- package/dist/node_modules/lodash/isArrayLike.js.map +1 -1
- package/dist/node_modules/lodash/isBoolean.js.map +1 -1
- package/dist/node_modules/lodash/isBuffer.js.map +1 -1
- package/dist/node_modules/lodash/isEqual.js.map +1 -1
- package/dist/node_modules/lodash/isFunction.js.map +1 -1
- package/dist/node_modules/lodash/isLength.js.map +1 -1
- package/dist/node_modules/lodash/isNaN.js.map +1 -1
- package/dist/node_modules/lodash/isNil.js.map +1 -1
- package/dist/node_modules/lodash/isNumber.js.map +1 -1
- package/dist/node_modules/lodash/isObject.js.map +1 -1
- package/dist/node_modules/lodash/isObjectLike.js.map +1 -1
- package/dist/node_modules/lodash/isPlainObject.js.map +1 -1
- package/dist/node_modules/lodash/isString.js.map +1 -1
- package/dist/node_modules/lodash/isSymbol.js.map +1 -1
- package/dist/node_modules/lodash/isTypedArray.js.map +1 -1
- package/dist/node_modules/lodash/keys.js.map +1 -1
- package/dist/node_modules/lodash/last.js.map +1 -1
- package/dist/node_modules/lodash/map.js.map +1 -1
- package/dist/node_modules/lodash/mapValues.js.map +1 -1
- package/dist/node_modules/lodash/max.js.map +1 -1
- package/dist/node_modules/lodash/maxBy.js.map +1 -1
- package/dist/node_modules/lodash/memoize.js.map +1 -1
- package/dist/node_modules/lodash/min.js.map +1 -1
- package/dist/node_modules/lodash/minBy.js.map +1 -1
- package/dist/node_modules/lodash/noop.js.map +1 -1
- package/dist/node_modules/lodash/now.js.map +1 -1
- package/dist/node_modules/lodash/property.js.map +1 -1
- package/dist/node_modules/lodash/range.js.map +1 -1
- package/dist/node_modules/lodash/some.js.map +1 -1
- package/dist/node_modules/lodash/sortBy.js.map +1 -1
- package/dist/node_modules/lodash/stubArray.js.map +1 -1
- package/dist/node_modules/lodash/stubFalse.js.map +1 -1
- package/dist/node_modules/lodash/throttle.js.map +1 -1
- package/dist/node_modules/lodash/toFinite.js.map +1 -1
- package/dist/node_modules/lodash/toInteger.js.map +1 -1
- package/dist/node_modules/lodash/toNumber.js.map +1 -1
- package/dist/node_modules/lodash/toString.js.map +1 -1
- package/dist/node_modules/lodash/uniqBy.js.map +1 -1
- package/dist/node_modules/lodash/upperFirst.js.map +1 -1
- package/dist/node_modules/object-assign/index.js.map +1 -1
- package/dist/node_modules/prop-types/checkPropTypes.js.map +1 -1
- package/dist/node_modules/prop-types/factoryWithThrowingShims.js.map +1 -1
- package/dist/node_modules/prop-types/factoryWithTypeCheckers.js.map +1 -1
- package/dist/node_modules/prop-types/index.js.map +1 -1
- package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js.map +1 -1
- package/dist/node_modules/prop-types/lib/has.js.map +1 -1
- package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js.map +1 -1
- package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js.map +1 -1
- package/dist/node_modules/prop-types/node_modules/react-is/index.js.map +1 -1
- package/dist/node_modules/react-is/cjs/react-is.development.js.map +1 -1
- package/dist/node_modules/react-is/cjs/react-is.production.min.js.map +1 -1
- package/dist/node_modules/react-is/index.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/Animate.js +2 -2
- package/dist/node_modules/react-smooth/es6/Animate.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/AnimateManager.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/configUpdate.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/easing.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/setRafTimeout.js.map +1 -1
- package/dist/node_modules/react-smooth/es6/util.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/Area.js +13 -13
- package/dist/node_modules/recharts/es6/cartesian/Area.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/Bar.js +9 -9
- package/dist/node_modules/recharts/es6/cartesian/Bar.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/Brush.js +12 -12
- package/dist/node_modules/recharts/es6/cartesian/Brush.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js +7 -7
- package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js +4 -4
- package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js +3 -3
- package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js +3 -3
- package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js +4 -4
- package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/XAxis.js +3 -3
- package/dist/node_modules/recharts/es6/cartesian/XAxis.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/YAxis.js +3 -3
- package/dist/node_modules/recharts/es6/cartesian/YAxis.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/getEquidistantTicks.js.map +1 -1
- package/dist/node_modules/recharts/es6/cartesian/getTicks.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js +1 -1
- package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/AreaChart.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/BarChart.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/PieChart.js.map +1 -1
- package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js +22 -22
- package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Cell.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Cursor.js +1 -1
- package/dist/node_modules/recharts/es6/component/Cursor.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js +11 -11
- package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js +6 -6
- package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Label.js +14 -14
- package/dist/node_modules/recharts/es6/component/Label.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/LabelList.js +6 -6
- package/dist/node_modules/recharts/es6/component/LabelList.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Legend.js +5 -5
- package/dist/node_modules/recharts/es6/component/Legend.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js +3 -3
- package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Text.js +2 -2
- package/dist/node_modules/recharts/es6/component/Text.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/Tooltip.js +3 -3
- package/dist/node_modules/recharts/es6/component/Tooltip.js.map +1 -1
- package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js +2 -2
- package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js.map +1 -1
- package/dist/node_modules/recharts/es6/container/Layer.js +2 -2
- package/dist/node_modules/recharts/es6/container/Layer.js.map +1 -1
- package/dist/node_modules/recharts/es6/container/Surface.js +2 -2
- package/dist/node_modules/recharts/es6/container/Surface.js.map +1 -1
- package/dist/node_modules/recharts/es6/context/chartLayoutContext.js +2 -2
- package/dist/node_modules/recharts/es6/context/chartLayoutContext.js.map +1 -1
- package/dist/node_modules/recharts/es6/polar/Pie.js +13 -13
- package/dist/node_modules/recharts/es6/polar/Pie.js.map +1 -1
- package/dist/node_modules/recharts/es6/polar/PolarAngleAxis.js +8 -8
- package/dist/node_modules/recharts/es6/polar/PolarAngleAxis.js.map +1 -1
- package/dist/node_modules/recharts/es6/polar/PolarRadiusAxis.js +6 -6
- package/dist/node_modules/recharts/es6/polar/PolarRadiusAxis.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Cross.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Cross.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Curve.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Curve.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Dot.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Dot.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Polygon.js +4 -4
- package/dist/node_modules/recharts/es6/shape/Polygon.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Rectangle.js +4 -4
- package/dist/node_modules/recharts/es6/shape/Rectangle.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Sector.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Sector.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Symbols.js +1 -1
- package/dist/node_modules/recharts/es6/shape/Symbols.js.map +1 -1
- package/dist/node_modules/recharts/es6/shape/Trapezoid.js +4 -4
- package/dist/node_modules/recharts/es6/shape/Trapezoid.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js +9 -9
- package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/BarUtils.js +1 -1
- package/dist/node_modules/recharts/es6/util/BarUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/CartesianUtils.js +1 -1
- package/dist/node_modules/recharts/es6/util/CartesianUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ChartUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/CssPrefixUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/DOMUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/DataUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/DetectReferenceElementsDomain.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/Events.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/Global.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/IfOverflowMatches.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/LogUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/PolarUtils.js +1 -1
- package/dist/node_modules/recharts/es6/util/PolarUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ReactUtils.js +1 -1
- package/dist/node_modules/recharts/es6/util/ReactUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js +1 -1
- package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/ShallowEqual.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/TickUtils.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/calculateViewBox.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/cursor/getCursorPoints.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/cursor/getCursorRectangle.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/getEveryNthWithCondition.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/getLegendProps.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/isDomainSpecifiedByUser.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/payload/getUniqPayload.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/tooltip/translate.js.map +1 -1
- package/dist/node_modules/recharts/es6/util/types.js +1 -1
- package/dist/node_modules/recharts/es6/util/types.js.map +1 -1
- package/dist/node_modules/recharts-scale/es6/getNiceTickValues.js.map +1 -1
- package/dist/node_modules/recharts-scale/es6/util/arithmetic.js.map +1 -1
- package/dist/node_modules/recharts-scale/es6/util/utils.js.map +1 -1
- package/dist/node_modules/sonner/dist/index.js.map +1 -1
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1 -1
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -1
- package/dist/node_modules/tiny-invariant/dist/esm/tiny-invariant.js.map +1 -1
- package/dist/stories/LoadMore.stories.d.ts +0 -1
- package/package.json +15 -7
|
@@ -1,90 +1,102 @@
|
|
|
1
1
|
import { tWithFallback as e } from "../utils/i18n.js";
|
|
2
2
|
import { useAdvisors as t, useEnsureAdvisorProfile as n, useFirmReport as r, useMyAdvisorProfile as i, useSetAdvisorRole as a } from "../hooks/useBrainyRichApi.js";
|
|
3
3
|
import { FadeIn as o, StatTile as s } from "../components/viz.js";
|
|
4
|
-
import {
|
|
5
|
-
import { useState as
|
|
6
|
-
import { Building2 as
|
|
7
|
-
import { useI18n as
|
|
8
|
-
import { jsx as
|
|
9
|
-
import { Badge as
|
|
4
|
+
import { AllocationBars as c, EmptyState as l, ErrorState as u, LoadingState as d, SectionShell as f, formatDate as p, formatMoney as m, formatPct as h } from "./_shared.js";
|
|
5
|
+
import { useState as g } from "react";
|
|
6
|
+
import { Building2 as _, PlusCircle as v, ShieldCheck as y, UserPlus as b, Users as x } from "lucide-react";
|
|
7
|
+
import { useI18n as S } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
8
|
+
import { jsx as C, jsxs as w } from "react/jsx-runtime";
|
|
9
|
+
import { Badge as T, Button as E, Card as D, CardContent as O, CardDescription as k, CardHeader as A, CardTitle as j, Input as M, Label as N, Select as P, SelectContent as F, SelectItem as I, SelectTrigger as L, SelectValue as R, Table as z, TableBody as B, TableCell as V, TableHead as H, TableHeader as U, TableRow as W } from "@burdenoff/fe-libs/ui";
|
|
10
10
|
//#region src/brainyrich/pages/FirmPage.tsx
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return
|
|
11
|
+
var G = 8;
|
|
12
|
+
function K(e, t, n) {
|
|
13
|
+
return t <= 0 ? [] : e.slice(0, G).map((e) => {
|
|
14
|
+
let r = e.aum / t * 100;
|
|
15
|
+
return {
|
|
16
|
+
label: e.displayName ?? e.email ?? e.advisorId,
|
|
17
|
+
value: r,
|
|
18
|
+
tone: "accent",
|
|
19
|
+
caption: `${m(e.aum, n)} · ${h(r)}`
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function q() {
|
|
24
|
+
let { t } = S(), r = (n, r, i) => e(t, n, r, i), a = i(), s = n(), c = a.data, u = c?.role === "FIRM_ADMIN", [p, m] = g(""), [h, v] = g("");
|
|
25
|
+
return a.isLoading ? /* @__PURE__ */ C(f, {
|
|
14
26
|
title: r("brainyrich.firm.title", "Firm"),
|
|
15
27
|
description: r("brainyrich.firm.description", "Firm roster and firm-wide AUM reporting."),
|
|
16
|
-
children: /* @__PURE__ */
|
|
17
|
-
}) :
|
|
28
|
+
children: /* @__PURE__ */ C(d, {})
|
|
29
|
+
}) : c ? /* @__PURE__ */ w(f, {
|
|
18
30
|
title: r("brainyrich.firm.title", "Firm"),
|
|
19
31
|
description: r("brainyrich.firm.description", "Firm roster and firm-wide AUM reporting."),
|
|
20
|
-
children: [/* @__PURE__ */
|
|
32
|
+
children: [/* @__PURE__ */ C(o, { children: /* @__PURE__ */ C(D, { children: /* @__PURE__ */ C(O, {
|
|
21
33
|
className: "flex flex-wrap items-center justify-between gap-3 py-4",
|
|
22
|
-
children: /* @__PURE__ */
|
|
34
|
+
children: /* @__PURE__ */ w("div", {
|
|
23
35
|
className: "flex items-center gap-2",
|
|
24
36
|
children: [
|
|
25
|
-
/* @__PURE__ */
|
|
37
|
+
/* @__PURE__ */ C(y, {
|
|
26
38
|
className: "size-4 text-status-success-text",
|
|
27
39
|
"aria-hidden": "true"
|
|
28
40
|
}),
|
|
29
|
-
/* @__PURE__ */
|
|
41
|
+
/* @__PURE__ */ C("span", {
|
|
30
42
|
className: "text-sm text-text-secondary",
|
|
31
43
|
children: r("brainyrich.firm.you", "You are on the firm roster as")
|
|
32
44
|
}),
|
|
33
|
-
/* @__PURE__ */
|
|
34
|
-
variant:
|
|
35
|
-
children:
|
|
45
|
+
/* @__PURE__ */ C(T, {
|
|
46
|
+
variant: u ? "default" : "secondary",
|
|
47
|
+
children: c.role
|
|
36
48
|
})
|
|
37
49
|
]
|
|
38
50
|
})
|
|
39
|
-
}) }) }),
|
|
40
|
-
icon: /* @__PURE__ */ x
|
|
51
|
+
}) }) }), u ? /* @__PURE__ */ C(J, { translate: r }) : /* @__PURE__ */ C(o, { children: /* @__PURE__ */ C(l, {
|
|
52
|
+
icon: /* @__PURE__ */ C(x, {
|
|
41
53
|
className: "size-8",
|
|
42
54
|
"aria-hidden": "true"
|
|
43
55
|
}),
|
|
44
56
|
title: r("brainyrich.firm.notAdmin", "Firm-wide roster and AUM reporting are visible to firm admins only.")
|
|
45
57
|
}) })]
|
|
46
|
-
}) : /* @__PURE__ */
|
|
58
|
+
}) : /* @__PURE__ */ C(f, {
|
|
47
59
|
title: r("brainyrich.firm.title", "Firm"),
|
|
48
60
|
description: r("brainyrich.firm.description", "Firm roster and firm-wide AUM reporting."),
|
|
49
|
-
children: /* @__PURE__ */
|
|
61
|
+
children: /* @__PURE__ */ C(o, { children: /* @__PURE__ */ w(D, { children: [/* @__PURE__ */ w(A, { children: [/* @__PURE__ */ w(j, {
|
|
50
62
|
className: "flex items-center gap-2",
|
|
51
|
-
children: [/* @__PURE__ */
|
|
63
|
+
children: [/* @__PURE__ */ C(_, {
|
|
52
64
|
className: "size-4",
|
|
53
65
|
"aria-hidden": "true"
|
|
54
66
|
}), r("brainyrich.firm.join.title", "Join the firm roster")]
|
|
55
|
-
}), /* @__PURE__ */
|
|
67
|
+
}), /* @__PURE__ */ C(k, { children: r("brainyrich.firm.join.description", "You're not on this workspace's BrainyRich firm roster yet. The first advisor to register becomes the firm admin automatically; anyone after that is invited by an existing admin.") })] }), /* @__PURE__ */ w(O, {
|
|
56
68
|
className: "space-y-4",
|
|
57
|
-
children: [/* @__PURE__ */
|
|
69
|
+
children: [/* @__PURE__ */ w("div", {
|
|
58
70
|
className: "grid gap-4 sm:grid-cols-2",
|
|
59
|
-
children: [/* @__PURE__ */
|
|
71
|
+
children: [/* @__PURE__ */ w("div", {
|
|
60
72
|
className: "space-y-1.5",
|
|
61
|
-
children: [/* @__PURE__ */
|
|
73
|
+
children: [/* @__PURE__ */ C(N, {
|
|
62
74
|
htmlFor: "firm-display-name",
|
|
63
75
|
children: r("brainyrich.firm.fields.displayName", "Display name")
|
|
64
|
-
}), /* @__PURE__ */
|
|
76
|
+
}), /* @__PURE__ */ C(M, {
|
|
65
77
|
id: "firm-display-name",
|
|
66
78
|
value: p,
|
|
67
|
-
onChange: (e) =>
|
|
79
|
+
onChange: (e) => m(e.target.value)
|
|
68
80
|
})]
|
|
69
|
-
}), /* @__PURE__ */
|
|
81
|
+
}), /* @__PURE__ */ w("div", {
|
|
70
82
|
className: "space-y-1.5",
|
|
71
|
-
children: [/* @__PURE__ */
|
|
83
|
+
children: [/* @__PURE__ */ C(N, {
|
|
72
84
|
htmlFor: "firm-email",
|
|
73
85
|
children: r("brainyrich.firm.fields.email", "Email")
|
|
74
|
-
}), /* @__PURE__ */
|
|
86
|
+
}), /* @__PURE__ */ C(M, {
|
|
75
87
|
id: "firm-email",
|
|
76
88
|
type: "email",
|
|
77
|
-
value:
|
|
78
|
-
onChange: (e) =>
|
|
89
|
+
value: h,
|
|
90
|
+
onChange: (e) => v(e.target.value)
|
|
79
91
|
})]
|
|
80
92
|
})]
|
|
81
|
-
}), /* @__PURE__ */
|
|
93
|
+
}), /* @__PURE__ */ w(E, {
|
|
82
94
|
disabled: s.isPending,
|
|
83
95
|
onClick: () => s.mutate({
|
|
84
96
|
displayName: p || void 0,
|
|
85
|
-
email:
|
|
97
|
+
email: h || void 0
|
|
86
98
|
}),
|
|
87
|
-
children: [/* @__PURE__ */
|
|
99
|
+
children: [/* @__PURE__ */ C(b, {
|
|
88
100
|
className: "size-4",
|
|
89
101
|
"aria-hidden": "true"
|
|
90
102
|
}), s.isPending ? "Registering…" : "Register on firm roster"]
|
|
@@ -92,155 +104,175 @@ function U() {
|
|
|
92
104
|
})] }) })
|
|
93
105
|
});
|
|
94
106
|
}
|
|
95
|
-
function
|
|
96
|
-
let i = r(),
|
|
97
|
-
return /* @__PURE__ */
|
|
107
|
+
function J({ translate: e }) {
|
|
108
|
+
let i = r(), f = t(), h = a(), [y, b] = g(""), [S, q] = g("ADVISOR"), J = n(), Y = i.data;
|
|
109
|
+
return /* @__PURE__ */ w("div", {
|
|
98
110
|
className: "space-y-6",
|
|
99
111
|
children: [
|
|
100
|
-
/* @__PURE__ */
|
|
112
|
+
/* @__PURE__ */ C(o, { children: /* @__PURE__ */ w("div", {
|
|
101
113
|
className: "grid gap-4 md:grid-cols-2 xl:grid-cols-4",
|
|
102
114
|
children: [
|
|
103
|
-
/* @__PURE__ */
|
|
115
|
+
/* @__PURE__ */ C(s, {
|
|
104
116
|
label: e("brainyrich.firm.kpis.totalAum", "Firm AUM"),
|
|
105
|
-
value:
|
|
117
|
+
value: Y ? m(Y.totalAum, Y.currency) : "—",
|
|
106
118
|
glow: !0
|
|
107
119
|
}),
|
|
108
|
-
/* @__PURE__ */
|
|
120
|
+
/* @__PURE__ */ C(s, {
|
|
109
121
|
label: e("brainyrich.firm.kpis.advisors", "Advisors"),
|
|
110
|
-
value:
|
|
122
|
+
value: Y ? String(Y.totalAdvisors) : "—"
|
|
111
123
|
}),
|
|
112
|
-
/* @__PURE__ */
|
|
124
|
+
/* @__PURE__ */ C(s, {
|
|
113
125
|
label: e("brainyrich.firm.kpis.households", "Households"),
|
|
114
|
-
value:
|
|
126
|
+
value: Y ? String(Y.totalHouseholds) : "—"
|
|
115
127
|
}),
|
|
116
|
-
/* @__PURE__ */
|
|
128
|
+
/* @__PURE__ */ C(s, {
|
|
117
129
|
label: e("brainyrich.firm.kpis.asOf", "As of"),
|
|
118
|
-
value:
|
|
130
|
+
value: Y ? p(Y.asOf) : "—"
|
|
119
131
|
})
|
|
120
132
|
]
|
|
121
133
|
}) }),
|
|
122
|
-
/* @__PURE__ */
|
|
123
|
-
icon: /* @__PURE__ */
|
|
134
|
+
/* @__PURE__ */ w(D, { children: [/* @__PURE__ */ w(A, { children: [/* @__PURE__ */ C(j, { children: e("brainyrich.firm.byAdvisor.title", "AUM by advisor") }), /* @__PURE__ */ C(k, { children: e("brainyrich.firm.byAdvisor.description", "Sorted by AUM, largest book first — a real rollup of BraHousehold.aum per advisor.") })] }), /* @__PURE__ */ C(O, { children: i.isLoading ? /* @__PURE__ */ C(d, {}) : i.isError ? /* @__PURE__ */ C(u, { onRetry: () => i.refetch() }) : !Y || Y.byAdvisor.length === 0 ? /* @__PURE__ */ C(l, {
|
|
135
|
+
icon: /* @__PURE__ */ C(_, {
|
|
124
136
|
className: "size-8",
|
|
125
137
|
"aria-hidden": "true"
|
|
126
138
|
}),
|
|
127
139
|
title: e("brainyrich.firm.byAdvisor.empty", "No advisor books yet")
|
|
128
|
-
}) : /* @__PURE__ */
|
|
129
|
-
|
|
130
|
-
/* @__PURE__ */
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
140
|
+
}) : /* @__PURE__ */ w("div", {
|
|
141
|
+
className: "space-y-6",
|
|
142
|
+
children: [K(Y.byAdvisor, Y.totalAum, Y.currency).length > 0 ? /* @__PURE__ */ w("div", {
|
|
143
|
+
className: "space-y-2",
|
|
144
|
+
children: [
|
|
145
|
+
/* @__PURE__ */ C("p", {
|
|
146
|
+
className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
|
|
147
|
+
children: e("brainyrich.firm.byAdvisor.shareLabel", "Share of firm AUM")
|
|
148
|
+
}),
|
|
149
|
+
/* @__PURE__ */ C(c, { data: K(Y.byAdvisor, Y.totalAum, Y.currency) }),
|
|
150
|
+
Y.byAdvisor.length > G ? /* @__PURE__ */ w("p", {
|
|
151
|
+
className: "text-xs text-text-secondary",
|
|
152
|
+
children: [
|
|
153
|
+
"Showing the ",
|
|
154
|
+
G,
|
|
155
|
+
" largest books — every advisor is listed below."
|
|
156
|
+
]
|
|
157
|
+
}) : null
|
|
158
|
+
]
|
|
159
|
+
}) : null, /* @__PURE__ */ w(z, { children: [/* @__PURE__ */ C(U, { children: /* @__PURE__ */ w(W, { children: [
|
|
160
|
+
/* @__PURE__ */ C(H, { children: "Advisor" }),
|
|
161
|
+
/* @__PURE__ */ C(H, { children: "Role" }),
|
|
162
|
+
/* @__PURE__ */ C(H, { children: "Households" }),
|
|
163
|
+
/* @__PURE__ */ C(H, {
|
|
164
|
+
className: "text-right",
|
|
165
|
+
children: "AUM"
|
|
166
|
+
})
|
|
167
|
+
] }) }), /* @__PURE__ */ C(B, { children: Y.byAdvisor.map((e) => /* @__PURE__ */ w(W, { children: [
|
|
168
|
+
/* @__PURE__ */ C(V, {
|
|
169
|
+
className: "font-medium",
|
|
170
|
+
children: e.displayName ?? e.email ?? e.advisorId
|
|
171
|
+
}),
|
|
172
|
+
/* @__PURE__ */ C(V, { children: /* @__PURE__ */ C(T, {
|
|
173
|
+
variant: e.role === "FIRM_ADMIN" ? "default" : "secondary",
|
|
174
|
+
children: e.role ?? "—"
|
|
175
|
+
}) }),
|
|
176
|
+
/* @__PURE__ */ C(V, { children: e.householdCount }),
|
|
177
|
+
/* @__PURE__ */ C(V, {
|
|
178
|
+
className: "text-right font-medium",
|
|
179
|
+
children: m(e.aum, Y.currency)
|
|
180
|
+
})
|
|
181
|
+
] }, e.advisorId)) })] })]
|
|
182
|
+
}) })] }),
|
|
183
|
+
/* @__PURE__ */ w(D, { children: [/* @__PURE__ */ C(A, {
|
|
152
184
|
className: "flex flex-row items-center justify-between gap-4",
|
|
153
|
-
children: /* @__PURE__ */
|
|
154
|
-
}), /* @__PURE__ */
|
|
185
|
+
children: /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C(j, { children: e("brainyrich.firm.roster.title", "Firm Roster") }), /* @__PURE__ */ C(k, { children: e("brainyrich.firm.roster.description", "Every advisor on the firm roster, with the right to change roles.") })] })
|
|
186
|
+
}), /* @__PURE__ */ w(O, {
|
|
155
187
|
className: "space-y-4",
|
|
156
|
-
children: [/* @__PURE__ */
|
|
188
|
+
children: [/* @__PURE__ */ w("div", {
|
|
157
189
|
className: "flex flex-wrap items-end gap-3 rounded-lg border border-border-subtle bg-bg-sunken p-3",
|
|
158
190
|
children: [
|
|
159
|
-
/* @__PURE__ */
|
|
191
|
+
/* @__PURE__ */ w("div", {
|
|
160
192
|
className: "space-y-1.5",
|
|
161
|
-
children: [/* @__PURE__ */
|
|
193
|
+
children: [/* @__PURE__ */ C(N, {
|
|
162
194
|
htmlFor: "invite-user-id",
|
|
163
195
|
children: e("brainyrich.firm.roster.inviteUserId", "User ID to invite")
|
|
164
|
-
}), /* @__PURE__ */
|
|
196
|
+
}), /* @__PURE__ */ C(M, {
|
|
165
197
|
id: "invite-user-id",
|
|
166
|
-
value:
|
|
198
|
+
value: y,
|
|
167
199
|
onChange: (e) => b(e.target.value),
|
|
168
200
|
className: "w-64",
|
|
169
201
|
placeholder: "actor id"
|
|
170
202
|
})]
|
|
171
203
|
}),
|
|
172
|
-
/* @__PURE__ */
|
|
204
|
+
/* @__PURE__ */ w("div", {
|
|
173
205
|
className: "space-y-1.5",
|
|
174
|
-
children: [/* @__PURE__ */
|
|
175
|
-
value:
|
|
176
|
-
onValueChange: (e) =>
|
|
177
|
-
children: [/* @__PURE__ */
|
|
206
|
+
children: [/* @__PURE__ */ C(N, { children: e("brainyrich.firm.roster.inviteRole", "Role") }), /* @__PURE__ */ w(P, {
|
|
207
|
+
value: S,
|
|
208
|
+
onValueChange: (e) => q(e),
|
|
209
|
+
children: [/* @__PURE__ */ C(L, {
|
|
178
210
|
className: "w-40",
|
|
179
|
-
children: /* @__PURE__ */
|
|
180
|
-
}), /* @__PURE__ */
|
|
211
|
+
children: /* @__PURE__ */ C(R, {})
|
|
212
|
+
}), /* @__PURE__ */ w(F, { children: [/* @__PURE__ */ C(I, {
|
|
181
213
|
value: "ADVISOR",
|
|
182
214
|
children: "Advisor"
|
|
183
|
-
}), /* @__PURE__ */
|
|
215
|
+
}), /* @__PURE__ */ C(I, {
|
|
184
216
|
value: "FIRM_ADMIN",
|
|
185
217
|
children: "Firm Admin"
|
|
186
218
|
})] })]
|
|
187
219
|
})]
|
|
188
220
|
}),
|
|
189
|
-
/* @__PURE__ */
|
|
190
|
-
disabled: !
|
|
191
|
-
onClick: () =>
|
|
192
|
-
userId:
|
|
193
|
-
role:
|
|
221
|
+
/* @__PURE__ */ w(E, {
|
|
222
|
+
disabled: !y.trim() || J.isPending,
|
|
223
|
+
onClick: () => J.mutate({
|
|
224
|
+
userId: y.trim(),
|
|
225
|
+
role: S
|
|
194
226
|
}, { onSuccess: () => b("") }),
|
|
195
|
-
children: [/* @__PURE__ */
|
|
227
|
+
children: [/* @__PURE__ */ C(v, {
|
|
196
228
|
className: "size-4",
|
|
197
229
|
"aria-hidden": "true"
|
|
198
230
|
}), e("brainyrich.firm.roster.invite", "Invite")]
|
|
199
231
|
})
|
|
200
232
|
]
|
|
201
|
-
}),
|
|
202
|
-
icon: /* @__PURE__ */ x
|
|
233
|
+
}), f.isLoading ? /* @__PURE__ */ C(d, {}) : f.isError ? /* @__PURE__ */ C(u, { onRetry: () => f.refetch() }) : f.data.length === 0 ? /* @__PURE__ */ C(l, {
|
|
234
|
+
icon: /* @__PURE__ */ C(x, {
|
|
203
235
|
className: "size-8",
|
|
204
236
|
"aria-hidden": "true"
|
|
205
237
|
}),
|
|
206
238
|
title: e("brainyrich.firm.roster.empty", "No advisors yet")
|
|
207
|
-
}) : /* @__PURE__ */
|
|
208
|
-
/* @__PURE__ */
|
|
209
|
-
/* @__PURE__ */
|
|
210
|
-
/* @__PURE__ */
|
|
211
|
-
/* @__PURE__ */
|
|
212
|
-
/* @__PURE__ */
|
|
239
|
+
}) : /* @__PURE__ */ w(z, { children: [/* @__PURE__ */ C(U, { children: /* @__PURE__ */ w(W, { children: [
|
|
240
|
+
/* @__PURE__ */ C(H, { children: "Name" }),
|
|
241
|
+
/* @__PURE__ */ C(H, { children: "Email" }),
|
|
242
|
+
/* @__PURE__ */ C(H, { children: "Status" }),
|
|
243
|
+
/* @__PURE__ */ C(H, { children: "Role" }),
|
|
244
|
+
/* @__PURE__ */ C(H, {
|
|
213
245
|
className: "text-right",
|
|
214
246
|
children: "Actions"
|
|
215
247
|
})
|
|
216
|
-
] }) }), /* @__PURE__ */
|
|
217
|
-
/* @__PURE__ */
|
|
248
|
+
] }) }), /* @__PURE__ */ C(B, { children: f.data.map((e) => /* @__PURE__ */ w(W, { children: [
|
|
249
|
+
/* @__PURE__ */ C(V, {
|
|
218
250
|
className: "font-medium",
|
|
219
251
|
children: e.displayName ?? e.userId
|
|
220
252
|
}),
|
|
221
|
-
/* @__PURE__ */
|
|
222
|
-
/* @__PURE__ */
|
|
253
|
+
/* @__PURE__ */ C(V, { children: e.email ?? "—" }),
|
|
254
|
+
/* @__PURE__ */ C(V, { children: /* @__PURE__ */ C(T, {
|
|
223
255
|
variant: e.status === "ACTIVE" ? "default" : "secondary",
|
|
224
256
|
children: e.status
|
|
225
257
|
}) }),
|
|
226
|
-
/* @__PURE__ */
|
|
258
|
+
/* @__PURE__ */ C(V, { children: /* @__PURE__ */ w(P, {
|
|
227
259
|
value: e.role,
|
|
228
|
-
onValueChange: (t) =>
|
|
260
|
+
onValueChange: (t) => h.mutate({
|
|
229
261
|
userId: e.userId,
|
|
230
262
|
role: t
|
|
231
263
|
}),
|
|
232
|
-
children: [/* @__PURE__ */
|
|
264
|
+
children: [/* @__PURE__ */ C(L, {
|
|
233
265
|
className: "w-40",
|
|
234
|
-
children: /* @__PURE__ */
|
|
235
|
-
}), /* @__PURE__ */
|
|
266
|
+
children: /* @__PURE__ */ C(R, {})
|
|
267
|
+
}), /* @__PURE__ */ w(F, { children: [/* @__PURE__ */ C(I, {
|
|
236
268
|
value: "ADVISOR",
|
|
237
269
|
children: "Advisor"
|
|
238
|
-
}), /* @__PURE__ */
|
|
270
|
+
}), /* @__PURE__ */ C(I, {
|
|
239
271
|
value: "FIRM_ADMIN",
|
|
240
272
|
children: "Firm Admin"
|
|
241
273
|
})] })]
|
|
242
274
|
}) }),
|
|
243
|
-
/* @__PURE__ */
|
|
275
|
+
/* @__PURE__ */ C(V, {
|
|
244
276
|
className: "text-right text-xs text-text-secondary",
|
|
245
277
|
children: e.invitedById ? `Invited by ${e.invitedById}` : "Self-registered"
|
|
246
278
|
})
|
|
@@ -250,6 +282,6 @@ function W({ translate: e }) {
|
|
|
250
282
|
});
|
|
251
283
|
}
|
|
252
284
|
//#endregion
|
|
253
|
-
export {
|
|
285
|
+
export { q as FirmPage };
|
|
254
286
|
|
|
255
287
|
//# sourceMappingURL=FirmPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirmPage.js","names":[],"sources":["../../../src/brainyrich/pages/FirmPage.tsx"],"sourcesContent":["/**\n * FirmPage — firm roster + firm-wide reporting (BOFF-4247).\n *\n * `braFirmReport` / `braListAdvisors` are FIRM_ADMIN-only server-side (see\n * firm.gql) — the domain data (BraAdvisor.role) is the only authorization\n * fact, there is no separate platform-RBAC role for it. This page therefore\n * always renders the calling actor's own roster status first, and only\n * attempts the firm-wide views when that status is FIRM_ADMIN (or when the\n * actor hasn't registered a roster row yet, in which case it offers\n * self-registration — the very first advisor in a workspace becomes\n * FIRM_ADMIN automatically).\n */\nimport { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\nimport { Building2, PlusCircle, ShieldCheck, UserPlus, Users } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport {\n useMyAdvisorProfile,\n useEnsureAdvisorProfile,\n useAdvisors,\n useSetAdvisorRole,\n useFirmReport,\n} from '../hooks/useBrainyRichApi';\nimport type { BraAdvisor, BraAdvisorRole } from '../types/bra';\nimport {\n SectionShell,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatDate,\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 FirmPage() {\n const { t } = useI18n();\n const translate: Translate = (key, fallback, params) => tWithFallback(t, key, fallback, params);\n\n const myProfileQuery = useMyAdvisorProfile();\n const ensureProfile = useEnsureAdvisorProfile();\n const myProfile = myProfileQuery.data;\n const isFirmAdmin = myProfile?.role === 'FIRM_ADMIN';\n\n const [displayName, setDisplayName] = useState('');\n const [email, setEmail] = useState('');\n\n if (myProfileQuery.isLoading) {\n return (\n <SectionShell\n title={translate('brainyrich.firm.title', 'Firm')}\n description={translate(\n 'brainyrich.firm.description',\n 'Firm roster and firm-wide AUM reporting.'\n )}\n >\n <LoadingState />\n </SectionShell>\n );\n }\n\n if (!myProfile) {\n return (\n <SectionShell\n title={translate('brainyrich.firm.title', 'Firm')}\n description={translate(\n 'brainyrich.firm.description',\n 'Firm roster and firm-wide AUM reporting.'\n )}\n >\n <FadeIn>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Building2 className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.firm.join.title', 'Join the firm roster')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.firm.join.description',\n \"You're not on this workspace's BrainyRich firm roster yet. The first advisor to register becomes the firm admin automatically; anyone after that is invited by an existing admin.\"\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"firm-display-name\">\n {translate('brainyrich.firm.fields.displayName', 'Display name')}\n </Label>\n <Input\n id=\"firm-display-name\"\n value={displayName}\n onChange={(e) => setDisplayName(e.target.value)}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"firm-email\">\n {translate('brainyrich.firm.fields.email', 'Email')}\n </Label>\n <Input\n id=\"firm-email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n />\n </div>\n </div>\n <Button\n disabled={ensureProfile.isPending}\n onClick={() =>\n ensureProfile.mutate({\n displayName: displayName || undefined,\n email: email || undefined,\n })\n }\n >\n <UserPlus className=\"size-4\" aria-hidden=\"true\" />\n {ensureProfile.isPending ? 'Registering…' : 'Register on firm roster'}\n </Button>\n </CardContent>\n </Card>\n </FadeIn>\n </SectionShell>\n );\n }\n\n return (\n <SectionShell\n title={translate('brainyrich.firm.title', 'Firm')}\n description={translate(\n 'brainyrich.firm.description',\n 'Firm roster and firm-wide AUM reporting.'\n )}\n >\n <FadeIn>\n <Card>\n <CardContent className=\"flex flex-wrap items-center justify-between gap-3 py-4\">\n <div className=\"flex items-center gap-2\">\n <ShieldCheck className=\"size-4 text-status-success-text\" aria-hidden=\"true\" />\n <span className=\"text-sm text-text-secondary\">\n {translate('brainyrich.firm.you', 'You are on the firm roster as')}\n </span>\n <Badge variant={isFirmAdmin ? 'default' : 'secondary'}>{myProfile.role}</Badge>\n </div>\n </CardContent>\n </Card>\n </FadeIn>\n\n {isFirmAdmin ? (\n <FirmAdminView translate={translate} />\n ) : (\n <FadeIn>\n <EmptyState\n icon={<Users className=\"size-8\" aria-hidden=\"true\" />}\n title={translate(\n 'brainyrich.firm.notAdmin',\n 'Firm-wide roster and AUM reporting are visible to firm admins only.'\n )}\n />\n </FadeIn>\n )}\n </SectionShell>\n );\n}\n\nfunction FirmAdminView({ translate }: { translate: Translate }) {\n const firmReportQuery = useFirmReport();\n const advisorsQuery = useAdvisors();\n const setRole = useSetAdvisorRole();\n const [inviteUserId, setInviteUserId] = useState('');\n const [inviteRole, setInviteRole] = useState<BraAdvisorRole>('ADVISOR');\n const ensureProfile = useEnsureAdvisorProfile();\n\n const report = firmReportQuery.data;\n\n return (\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.firm.kpis.totalAum', 'Firm AUM')}\n value={report ? formatMoney(report.totalAum, report.currency) : '—'}\n glow\n />\n <StatTile\n label={translate('brainyrich.firm.kpis.advisors', 'Advisors')}\n value={report ? String(report.totalAdvisors) : '—'}\n />\n <StatTile\n label={translate('brainyrich.firm.kpis.households', 'Households')}\n value={report ? String(report.totalHouseholds) : '—'}\n />\n <StatTile\n label={translate('brainyrich.firm.kpis.asOf', 'As of')}\n value={report ? formatDate(report.asOf) : '—'}\n />\n </div>\n </FadeIn>\n\n <Card>\n <CardHeader>\n <CardTitle>{translate('brainyrich.firm.byAdvisor.title', 'AUM by advisor')}</CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.firm.byAdvisor.description',\n 'Sorted by AUM, largest book first — a real rollup of BraHousehold.aum per advisor.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {firmReportQuery.isLoading ? (\n <LoadingState />\n ) : firmReportQuery.isError ? (\n <ErrorState onRetry={() => firmReportQuery.refetch()} />\n ) : !report || report.byAdvisor.length === 0 ? (\n <EmptyState\n icon={<Building2 className=\"size-8\" aria-hidden=\"true\" />}\n title={translate('brainyrich.firm.byAdvisor.empty', 'No advisor books yet')}\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 {report.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, report.currency)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between gap-4\">\n <div>\n <CardTitle>{translate('brainyrich.firm.roster.title', 'Firm Roster')}</CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.firm.roster.description',\n 'Every advisor on the firm roster, with the right to change roles.'\n )}\n </CardDescription>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex flex-wrap items-end gap-3 rounded-lg border border-border-subtle bg-bg-sunken p-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"invite-user-id\">\n {translate('brainyrich.firm.roster.inviteUserId', 'User ID to invite')}\n </Label>\n <Input\n id=\"invite-user-id\"\n value={inviteUserId}\n onChange={(e) => setInviteUserId(e.target.value)}\n className=\"w-64\"\n placeholder=\"actor id\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label>{translate('brainyrich.firm.roster.inviteRole', 'Role')}</Label>\n <Select value={inviteRole} onValueChange={(v) => setInviteRole(v as BraAdvisorRole)}>\n <SelectTrigger className=\"w-40\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ADVISOR\">Advisor</SelectItem>\n <SelectItem value=\"FIRM_ADMIN\">Firm Admin</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <Button\n disabled={!inviteUserId.trim() || ensureProfile.isPending}\n onClick={() =>\n ensureProfile.mutate(\n { userId: inviteUserId.trim(), role: inviteRole },\n { onSuccess: () => setInviteUserId('') }\n )\n }\n >\n <PlusCircle className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.firm.roster.invite', 'Invite')}\n </Button>\n </div>\n\n {advisorsQuery.isLoading ? (\n <LoadingState />\n ) : advisorsQuery.isError ? (\n <ErrorState onRetry={() => advisorsQuery.refetch()} />\n ) : advisorsQuery.data.length === 0 ? (\n <EmptyState\n icon={<Users className=\"size-8\" aria-hidden=\"true\" />}\n title={translate('brainyrich.firm.roster.empty', 'No advisors yet')}\n />\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Email</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Role</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {advisorsQuery.data.map((advisor: BraAdvisor) => (\n <TableRow key={advisor.id}>\n <TableCell className=\"font-medium\">\n {advisor.displayName ?? advisor.userId}\n </TableCell>\n <TableCell>{advisor.email ?? '—'}</TableCell>\n <TableCell>\n <Badge variant={advisor.status === 'ACTIVE' ? 'default' : 'secondary'}>\n {advisor.status}\n </Badge>\n </TableCell>\n <TableCell>\n <Select\n value={advisor.role}\n onValueChange={(v) =>\n setRole.mutate({ userId: advisor.userId, role: v as BraAdvisorRole })\n }\n >\n <SelectTrigger className=\"w-40\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ADVISOR\">Advisor</SelectItem>\n <SelectItem value=\"FIRM_ADMIN\">Firm Admin</SelectItem>\n </SelectContent>\n </Select>\n </TableCell>\n <TableCell className=\"text-right text-xs text-text-secondary\">\n {advisor.invitedById\n ? `Invited by ${advisor.invitedById}`\n : 'Self-registered'}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FirmPage.js","names":[],"sources":["../../../src/brainyrich/pages/FirmPage.tsx"],"sourcesContent":["/**\n * FirmPage — firm roster + firm-wide reporting (BOFF-4247).\n *\n * `braFirmReport` / `braListAdvisors` are FIRM_ADMIN-only server-side (see\n * firm.gql) — the domain data (BraAdvisor.role) is the only authorization\n * fact, there is no separate platform-RBAC role for it. This page therefore\n * always renders the calling actor's own roster status first, and only\n * attempts the firm-wide views when that status is FIRM_ADMIN (or when the\n * actor hasn't registered a roster row yet, in which case it offers\n * self-registration — the very first advisor in a workspace becomes\n * FIRM_ADMIN automatically).\n */\nimport { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\nimport { Building2, PlusCircle, ShieldCheck, UserPlus, Users } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport {\n useMyAdvisorProfile,\n useEnsureAdvisorProfile,\n useAdvisors,\n useSetAdvisorRole,\n useFirmReport,\n} from '../hooks/useBrainyRichApi';\nimport type { BraAdvisor, BraAdvisorRole } from '../types/bra';\nimport {\n AllocationBars,\n SectionShell,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatDate,\n formatPct,\n type AllocationDatum,\n} from './_shared';\nimport { StatTile, FadeIn } from '../components/viz';\n\n/** Largest books charted as a share of firm AUM; the table below lists them all. */\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 FirmPage() {\n const { t } = useI18n();\n const translate: Translate = (key, fallback, params) => tWithFallback(t, key, fallback, params);\n\n const myProfileQuery = useMyAdvisorProfile();\n const ensureProfile = useEnsureAdvisorProfile();\n const myProfile = myProfileQuery.data;\n const isFirmAdmin = myProfile?.role === 'FIRM_ADMIN';\n\n const [displayName, setDisplayName] = useState('');\n const [email, setEmail] = useState('');\n\n if (myProfileQuery.isLoading) {\n return (\n <SectionShell\n title={translate('brainyrich.firm.title', 'Firm')}\n description={translate(\n 'brainyrich.firm.description',\n 'Firm roster and firm-wide AUM reporting.'\n )}\n >\n <LoadingState />\n </SectionShell>\n );\n }\n\n if (!myProfile) {\n return (\n <SectionShell\n title={translate('brainyrich.firm.title', 'Firm')}\n description={translate(\n 'brainyrich.firm.description',\n 'Firm roster and firm-wide AUM reporting.'\n )}\n >\n <FadeIn>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Building2 className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.firm.join.title', 'Join the firm roster')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.firm.join.description',\n \"You're not on this workspace's BrainyRich firm roster yet. The first advisor to register becomes the firm admin automatically; anyone after that is invited by an existing admin.\"\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"firm-display-name\">\n {translate('brainyrich.firm.fields.displayName', 'Display name')}\n </Label>\n <Input\n id=\"firm-display-name\"\n value={displayName}\n onChange={(e) => setDisplayName(e.target.value)}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"firm-email\">\n {translate('brainyrich.firm.fields.email', 'Email')}\n </Label>\n <Input\n id=\"firm-email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n />\n </div>\n </div>\n <Button\n disabled={ensureProfile.isPending}\n onClick={() =>\n ensureProfile.mutate({\n displayName: displayName || undefined,\n email: email || undefined,\n })\n }\n >\n <UserPlus className=\"size-4\" aria-hidden=\"true\" />\n {ensureProfile.isPending ? 'Registering…' : 'Register on firm roster'}\n </Button>\n </CardContent>\n </Card>\n </FadeIn>\n </SectionShell>\n );\n }\n\n return (\n <SectionShell\n title={translate('brainyrich.firm.title', 'Firm')}\n description={translate(\n 'brainyrich.firm.description',\n 'Firm roster and firm-wide AUM reporting.'\n )}\n >\n <FadeIn>\n <Card>\n <CardContent className=\"flex flex-wrap items-center justify-between gap-3 py-4\">\n <div className=\"flex items-center gap-2\">\n <ShieldCheck className=\"size-4 text-status-success-text\" aria-hidden=\"true\" />\n <span className=\"text-sm text-text-secondary\">\n {translate('brainyrich.firm.you', 'You are on the firm roster as')}\n </span>\n <Badge variant={isFirmAdmin ? 'default' : 'secondary'}>{myProfile.role}</Badge>\n </div>\n </CardContent>\n </Card>\n </FadeIn>\n\n {isFirmAdmin ? (\n <FirmAdminView translate={translate} />\n ) : (\n <FadeIn>\n <EmptyState\n icon={<Users className=\"size-8\" aria-hidden=\"true\" />}\n title={translate(\n 'brainyrich.firm.notAdmin',\n 'Firm-wide roster and AUM reporting are visible to firm admins only.'\n )}\n />\n </FadeIn>\n )}\n </SectionShell>\n );\n}\n\nfunction FirmAdminView({ translate }: { translate: Translate }) {\n const firmReportQuery = useFirmReport();\n const advisorsQuery = useAdvisors();\n const setRole = useSetAdvisorRole();\n const [inviteUserId, setInviteUserId] = useState('');\n const [inviteRole, setInviteRole] = useState<BraAdvisorRole>('ADVISOR');\n const ensureProfile = useEnsureAdvisorProfile();\n\n const report = firmReportQuery.data;\n\n return (\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.firm.kpis.totalAum', 'Firm AUM')}\n value={report ? formatMoney(report.totalAum, report.currency) : '—'}\n glow\n />\n <StatTile\n label={translate('brainyrich.firm.kpis.advisors', 'Advisors')}\n value={report ? String(report.totalAdvisors) : '—'}\n />\n <StatTile\n label={translate('brainyrich.firm.kpis.households', 'Households')}\n value={report ? String(report.totalHouseholds) : '—'}\n />\n <StatTile\n label={translate('brainyrich.firm.kpis.asOf', 'As of')}\n value={report ? formatDate(report.asOf) : '—'}\n />\n </div>\n </FadeIn>\n\n <Card>\n <CardHeader>\n <CardTitle>{translate('brainyrich.firm.byAdvisor.title', 'AUM by advisor')}</CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.firm.byAdvisor.description',\n 'Sorted by AUM, largest book first — a real rollup of BraHousehold.aum per advisor.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {firmReportQuery.isLoading ? (\n <LoadingState />\n ) : firmReportQuery.isError ? (\n <ErrorState onRetry={() => firmReportQuery.refetch()} />\n ) : !report || report.byAdvisor.length === 0 ? (\n <EmptyState\n icon={<Building2 className=\"size-8\" aria-hidden=\"true\" />}\n title={translate('brainyrich.firm.byAdvisor.empty', 'No advisor books yet')}\n />\n ) : (\n <div className=\"space-y-6\">\n {advisorShareBars(report.byAdvisor, report.totalAum, report.currency).length > 0 ? (\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n {translate('brainyrich.firm.byAdvisor.shareLabel', 'Share of firm AUM')}\n </p>\n <AllocationBars\n data={advisorShareBars(report.byAdvisor, report.totalAum, report.currency)}\n />\n {report.byAdvisor.length > MAX_CHARTED_ADVISORS ? (\n <p className=\"text-xs text-text-secondary\">\n Showing the {MAX_CHARTED_ADVISORS} largest books — every advisor is listed\n 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 {report.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, report.currency)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between gap-4\">\n <div>\n <CardTitle>{translate('brainyrich.firm.roster.title', 'Firm Roster')}</CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.firm.roster.description',\n 'Every advisor on the firm roster, with the right to change roles.'\n )}\n </CardDescription>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex flex-wrap items-end gap-3 rounded-lg border border-border-subtle bg-bg-sunken p-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"invite-user-id\">\n {translate('brainyrich.firm.roster.inviteUserId', 'User ID to invite')}\n </Label>\n <Input\n id=\"invite-user-id\"\n value={inviteUserId}\n onChange={(e) => setInviteUserId(e.target.value)}\n className=\"w-64\"\n placeholder=\"actor id\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label>{translate('brainyrich.firm.roster.inviteRole', 'Role')}</Label>\n <Select value={inviteRole} onValueChange={(v) => setInviteRole(v as BraAdvisorRole)}>\n <SelectTrigger className=\"w-40\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ADVISOR\">Advisor</SelectItem>\n <SelectItem value=\"FIRM_ADMIN\">Firm Admin</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <Button\n disabled={!inviteUserId.trim() || ensureProfile.isPending}\n onClick={() =>\n ensureProfile.mutate(\n { userId: inviteUserId.trim(), role: inviteRole },\n { onSuccess: () => setInviteUserId('') }\n )\n }\n >\n <PlusCircle className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.firm.roster.invite', 'Invite')}\n </Button>\n </div>\n\n {advisorsQuery.isLoading ? (\n <LoadingState />\n ) : advisorsQuery.isError ? (\n <ErrorState onRetry={() => advisorsQuery.refetch()} />\n ) : advisorsQuery.data.length === 0 ? (\n <EmptyState\n icon={<Users className=\"size-8\" aria-hidden=\"true\" />}\n title={translate('brainyrich.firm.roster.empty', 'No advisors yet')}\n />\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Email</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Role</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {advisorsQuery.data.map((advisor: BraAdvisor) => (\n <TableRow key={advisor.id}>\n <TableCell className=\"font-medium\">\n {advisor.displayName ?? advisor.userId}\n </TableCell>\n <TableCell>{advisor.email ?? '—'}</TableCell>\n <TableCell>\n <Badge variant={advisor.status === 'ACTIVE' ? 'default' : 'secondary'}>\n {advisor.status}\n </Badge>\n </TableCell>\n <TableCell>\n <Select\n value={advisor.role}\n onValueChange={(v) =>\n setRole.mutate({ userId: advisor.userId, role: v as BraAdvisorRole })\n }\n >\n <SelectTrigger className=\"w-40\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ADVISOR\">Advisor</SelectItem>\n <SelectItem value=\"FIRM_ADMIN\">Firm Admin</SelectItem>\n </SelectContent>\n </Select>\n </TableCell>\n <TableCell className=\"text-right text-xs text-text-secondary\">\n {advisor.invitedById\n ? `Invited by ${advisor.invitedById}`\n : 'Self-registered'}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|