@mx-cartographer/experiences 9.4.3 → 9.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/core/constants/Investments.d.ts +3 -0
  3. package/dist/core/constants/Investments.es.js +34 -11
  4. package/dist/core/constants/Investments.es.js.map +1 -1
  5. package/dist/core/stores/HoldingStore.d.ts +3 -0
  6. package/dist/core/stores/HoldingStore.es.js +39 -29
  7. package/dist/core/stores/HoldingStore.es.js.map +1 -1
  8. package/dist/core/utils/InvestmentUtil.d.ts +4 -0
  9. package/dist/core/utils/InvestmentUtil.es.js +71 -58
  10. package/dist/core/utils/InvestmentUtil.es.js.map +1 -1
  11. package/dist/insights-v2/blocks/ChartBlocks/BarchartBlock/layout.es.js +1 -1
  12. package/dist/insights-v2/blocks/ChartBlocks/BarchartBlock/layout.es.js.map +1 -1
  13. package/dist/insights-v2/blocks/ChartBlocks/BarchartBlock/utils.es.js +20 -19
  14. package/dist/insights-v2/blocks/ChartBlocks/BarchartBlock/utils.es.js.map +1 -1
  15. package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/DoubleBarChartBlock.d.ts +8 -0
  16. package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/DoubleBarChartBlock.es.js +24 -0
  17. package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/DoubleBarChartBlock.es.js.map +1 -0
  18. package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/comparisonUtils.d.ts +9 -0
  19. package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/comparisonUtils.es.js +43 -0
  20. package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/comparisonUtils.es.js.map +1 -0
  21. package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/index.d.ts +1 -1
  22. package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/layout.es.js +1 -1
  23. package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/layout.es.js.map +1 -1
  24. package/dist/insights-v2/{blocks/ChartBlocks/DoubleBarChartBlock → components/chartblocks}/ChartLegend.d.ts +1 -1
  25. package/dist/insights-v2/{blocks/ChartBlocks/DoubleBarChartBlock → components/chartblocks}/ChartLegend.es.js +12 -12
  26. package/dist/insights-v2/components/chartblocks/ChartLegend.es.js.map +1 -0
  27. package/dist/insights-v2/{blocks/ChartBlocks/DoubleBarChartBlock → components/chartblocks}/CustomDoubleBar.d.ts +1 -1
  28. package/dist/insights-v2/components/chartblocks/CustomDoubleBar.es.js.map +1 -0
  29. package/dist/insights-v2/components/chartblocks/DoubleBarChart.d.ts +17 -0
  30. package/dist/insights-v2/components/chartblocks/DoubleBarChart.es.js +118 -0
  31. package/dist/insights-v2/components/chartblocks/DoubleBarChart.es.js.map +1 -0
  32. package/dist/insights-v2/index.es.js +1 -1
  33. package/dist/insights-v2/mappings/blocks.es.js +1 -1
  34. package/dist/investments/InvestmentsWidget.es.js +100 -66
  35. package/dist/investments/InvestmentsWidget.es.js.map +1 -1
  36. package/dist/investments/components/allocation/util/createInvestementsAllocationData.es.js +50 -59
  37. package/dist/investments/components/allocation/util/createInvestementsAllocationData.es.js.map +1 -1
  38. package/package.json +8 -1
  39. package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/ChartLegend.es.js.map +0 -1
  40. package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/CustomDoubleBar.es.js.map +0 -1
  41. package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/DoubleBarChart.d.ts +0 -2
  42. package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/DoubleBarChart.es.js +0 -125
  43. package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/DoubleBarChart.es.js.map +0 -1
  44. /package/dist/insights-v2/{blocks/ChartBlocks/DoubleBarChartBlock → components/chartblocks}/CustomDoubleBar.es.js +0 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ ## [9.4.5] - 08-27-2026
2
+
3
+ - **ADDED** - Transaction History action block (part 1): chart-to-drilldown wiring. `BarchartBlock` and `DoubleBarChartBlock` now invoke `openChartDrilldown` on a bar click, forwarding the clicked column (`chartBarIndex`) and sub-series (`tabIndex`) to the shared insights-v2 action drawer so a tapped bar opens the matching transaction history slice (WEC-1701)
4
+ - **CHANGED** - Decoupled `DoubleBarChart` into a pure, prop-driven presentational component (`bars`/`colors`/`legends`/`onBarClick`); the card block `DoubleBarChartBlock` now owns data shaping (`buildComparisonSeries`) and palette resolution and injects the click behavior, keeping the chart reusable across the card and the drill-down (WEC-1701)
5
+ - **ADDED** - `./insights-v2` package export so consumers can import the module and its blocks directly (WEC-1701)
6
+ - **FIXED** - Date-only strings (e.g. `2026-03-01`) were parsed as UTC midnight and rolled the month label back a month in negative-offset timezones (EST/CST/MST/PST); `comparisonUtils` and `BarchartBlock/utils` now wrap date strings with `parseISO` before formatting, so North-American users see the correct month and `comparisonUtils.test.ts` no longer fails outside UTC/IST (WEC-1701)
7
+ - **FIXED** - Double-bar aria labels read the main and comparison bars identically (same month + amount template); each series now carries its localized name (`localized_label`, falling back to the stable `label` key) through a `_3{}` copy slot so screen-reader users can distinguish the two bars, without synthesizing copy in the client (WEC-1701)
8
+ - **FIXED** - `buildComparisonSeries` now drops rows with an unparseable date and sorts columns via `parseISO`, so malformed wire data can't produce a `NaN` comparator that scrambles column order (and the `chartBarIndex` forwarded to the drill-down) (WEC-1701)
9
+ - **CHANGED** - `ChartLegend` (insights-v2) now uses a data-driven key (`label ?? index`) instead of the array index
10
+ - **NOTE** - First of a multi-part delivery of the Transaction History action block; this part lands the reusable double-bar chart, the drill-down click contract shared by both chart cards, and the `./insights-v2` export that later parts build on
11
+
12
+ ## [9.4.4] - 08-26-2026
13
+
14
+ - **CHANGED** - Investments widget now disables (not hides) the Allocation and Analysis tabs, with an explanatory tooltip, when the selected accounts have no data to render; the active tab resets to Overview if it becomes disabled
15
+ - **FIXED** - The Analysis tab now stays disabled for partially-enriched holdings whose style weights fall outside the render band, so it no longer enables onto an all-zero grid
16
+
1
17
  ## [9.4.3] - 08-26-2026
2
18
 
3
19
  - **ADDED** - Pass category_guid and main_class_guid when creating repeating transactions (MEW-4051)
@@ -2,6 +2,9 @@ export declare enum AnalysisType {
2
2
  Stocks = "stocks",
3
3
  Bonds = "bonds"
4
4
  }
5
+ export declare const ALLOCATION_KEYS: readonly ["allocations_cash", "allocations_convertible", "allocations_foreign_bond", "allocations_foreign_stock", "allocations_other", "allocations_preferred", "allocations_us_bond", "allocations_us_stock", "allocations_unknown"];
6
+ export type AllocationKey = (typeof ALLOCATION_KEYS)[number];
7
+ export declare const STYLE_WEIGHT_KEYS: readonly ["large_core_weight", "large_growth_weight", "large_value_weight", "mid_core_weight", "mid_growth_weight", "mid_value_weight", "small_core_weight", "small_growth_weight", "small_value_weight", "unknown_weight"];
5
8
  export declare const EquityClassificationTypes: {
6
9
  UNKNOWN: number;
7
10
  LARGE_VALUE: number;
@@ -1,6 +1,27 @@
1
- var I = /* @__PURE__ */ (function(E) {
2
- return E.Stocks = "stocks", E.Bonds = "bonds", E;
3
- })({}), L = {
1
+ var E = /* @__PURE__ */ (function(_) {
2
+ return _.Stocks = "stocks", _.Bonds = "bonds", _;
3
+ })({}), o = [
4
+ "allocations_cash",
5
+ "allocations_convertible",
6
+ "allocations_foreign_bond",
7
+ "allocations_foreign_stock",
8
+ "allocations_other",
9
+ "allocations_preferred",
10
+ "allocations_us_bond",
11
+ "allocations_us_stock",
12
+ "allocations_unknown"
13
+ ], a = [
14
+ "large_core_weight",
15
+ "large_growth_weight",
16
+ "large_value_weight",
17
+ "mid_core_weight",
18
+ "mid_growth_weight",
19
+ "mid_value_weight",
20
+ "small_core_weight",
21
+ "small_growth_weight",
22
+ "small_value_weight",
23
+ "unknown_weight"
24
+ ], i = {
4
25
  UNKNOWN: 0,
5
26
  LARGE_VALUE: 1,
6
27
  LARGE_CORE: 2,
@@ -11,7 +32,7 @@ var I = /* @__PURE__ */ (function(E) {
11
32
  SMALL_VALUE: 7,
12
33
  SMALL_CORE: 8,
13
34
  SMALL_GROWTH: 9
14
- }, M = {
35
+ }, I = {
15
36
  0: "UNKNOWN",
16
37
  1: "LARGE_VALUE",
17
38
  2: "LARGE_CORE",
@@ -22,7 +43,7 @@ var I = /* @__PURE__ */ (function(E) {
22
43
  7: "SMALL_VALUE",
23
44
  8: "SMALL_CORE",
24
45
  9: "SMALL_GROWTH"
25
- }, _ = {
46
+ }, L = {
26
47
  UNKNOWN: 0,
27
48
  HIGH_LIMITED: 1,
28
49
  HIGH_MODERATE: 2,
@@ -33,7 +54,7 @@ var I = /* @__PURE__ */ (function(E) {
33
54
  LOW_LIMITED: 7,
34
55
  LOW_MODERATE: 8,
35
56
  LOW_EXTENSIVE: 9
36
- }, O = {
57
+ }, t = {
37
58
  0: "UNKNOWN",
38
59
  1: "HIGH_LIMITED",
39
60
  2: "HIGH_MODERATE",
@@ -46,11 +67,13 @@ var I = /* @__PURE__ */ (function(E) {
46
67
  9: "LOW_EXTENSIVE"
47
68
  };
48
69
  export {
49
- I as AnalysisType,
50
- L as EquityClassificationTypes,
51
- M as EquityClassificationValues,
52
- _ as FixedIncomeClassificationTypes,
53
- O as FixedIncomeClassificationValues
70
+ o as ALLOCATION_KEYS,
71
+ E as AnalysisType,
72
+ i as EquityClassificationTypes,
73
+ I as EquityClassificationValues,
74
+ L as FixedIncomeClassificationTypes,
75
+ t as FixedIncomeClassificationValues,
76
+ a as STYLE_WEIGHT_KEYS
54
77
  };
55
78
 
56
79
  //# sourceMappingURL=Investments.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Investments.es.js","names":[],"sources":["../../../src/core/constants/Investments.ts"],"sourcesContent":["export enum AnalysisType {\n Stocks = 'stocks',\n Bonds = 'bonds',\n}\n\nexport const EquityClassificationTypes = {\n UNKNOWN: 0,\n LARGE_VALUE: 1,\n LARGE_CORE: 2,\n LARGE_GROWTH: 3,\n MID_VALUE: 4,\n MID_CORE: 5,\n MID_GROWTH: 6,\n SMALL_VALUE: 7,\n SMALL_CORE: 8,\n SMALL_GROWTH: 9,\n}\n\nexport const EquityClassificationValues = {\n 0: 'UNKNOWN',\n 1: 'LARGE_VALUE',\n 2: 'LARGE_CORE',\n 3: 'LARGE_GROWTH',\n 4: 'MID_VALUE',\n 5: 'MID_CORE',\n 6: 'MID_GROWTH',\n 7: 'SMALL_VALUE',\n 8: 'SMALL_CORE',\n 9: 'SMALL_GROWTH',\n}\n\nexport const FixedIncomeClassificationTypes = {\n UNKNOWN: 0,\n HIGH_LIMITED: 1,\n HIGH_MODERATE: 2,\n HIGH_EXTENSIVE: 3,\n MEDIUM_LIMITED: 4,\n MEDIUM_MODERATE: 5,\n MEDIUM_EXTENSIVE: 6,\n LOW_LIMITED: 7,\n LOW_MODERATE: 8,\n LOW_EXTENSIVE: 9,\n}\n\nexport const FixedIncomeClassificationValues = {\n 0: 'UNKNOWN',\n 1: 'HIGH_LIMITED',\n 2: 'HIGH_MODERATE',\n 3: 'HIGH_EXTENSIVE',\n 4: 'MEDIUM_LIMITED',\n 5: 'MEDIUM_MODERATE',\n 6: 'MEDIUM_EXTENSIVE',\n 7: 'LOW_LIMITED',\n 8: 'LOW_MODERATE',\n 9: 'LOW_EXTENSIVE',\n}\n"],"mappings":"AAAA,IAAY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,SAAA,UACA,EAAA,QAAA;AACF,GAAA,CAAA,CAAA,GAEa,IAA4B;AAAA,EACvC,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAChB,GAEa,IAA6B;AAAA,EACxC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,GAEa,IAAiC;AAAA,EAC5C,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,eAAe;AACjB,GAEa,IAAkC;AAAA,EAC7C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL"}
1
+ {"version":3,"file":"Investments.es.js","names":[],"sources":["../../../src/core/constants/Investments.ts"],"sourcesContent":["import type { Holding } from '../types/Holding'\n\nexport enum AnalysisType {\n Stocks = 'stocks',\n Bonds = 'bonds',\n}\n\n// The nine Morningstar allocation weights on a holding. Order is significant:\n// it maps positionally to the `allocations_list` copy display names.\nexport const ALLOCATION_KEYS = [\n 'allocations_cash',\n 'allocations_convertible',\n 'allocations_foreign_bond',\n 'allocations_foreign_stock',\n 'allocations_other',\n 'allocations_preferred',\n 'allocations_us_bond',\n 'allocations_us_stock',\n 'allocations_unknown',\n] as const satisfies readonly (keyof Holding)[]\n\nexport type AllocationKey = (typeof ALLOCATION_KEYS)[number]\n\n// The ten style-box weights (equity + fixed-income share the same buckets).\nexport const STYLE_WEIGHT_KEYS = [\n 'large_core_weight',\n 'large_growth_weight',\n 'large_value_weight',\n 'mid_core_weight',\n 'mid_growth_weight',\n 'mid_value_weight',\n 'small_core_weight',\n 'small_growth_weight',\n 'small_value_weight',\n 'unknown_weight',\n] as const satisfies readonly (keyof Holding)[]\n\nexport const EquityClassificationTypes = {\n UNKNOWN: 0,\n LARGE_VALUE: 1,\n LARGE_CORE: 2,\n LARGE_GROWTH: 3,\n MID_VALUE: 4,\n MID_CORE: 5,\n MID_GROWTH: 6,\n SMALL_VALUE: 7,\n SMALL_CORE: 8,\n SMALL_GROWTH: 9,\n}\n\nexport const EquityClassificationValues = {\n 0: 'UNKNOWN',\n 1: 'LARGE_VALUE',\n 2: 'LARGE_CORE',\n 3: 'LARGE_GROWTH',\n 4: 'MID_VALUE',\n 5: 'MID_CORE',\n 6: 'MID_GROWTH',\n 7: 'SMALL_VALUE',\n 8: 'SMALL_CORE',\n 9: 'SMALL_GROWTH',\n}\n\nexport const FixedIncomeClassificationTypes = {\n UNKNOWN: 0,\n HIGH_LIMITED: 1,\n HIGH_MODERATE: 2,\n HIGH_EXTENSIVE: 3,\n MEDIUM_LIMITED: 4,\n MEDIUM_MODERATE: 5,\n MEDIUM_EXTENSIVE: 6,\n LOW_LIMITED: 7,\n LOW_MODERATE: 8,\n LOW_EXTENSIVE: 9,\n}\n\nexport const FixedIncomeClassificationValues = {\n 0: 'UNKNOWN',\n 1: 'HIGH_LIMITED',\n 2: 'HIGH_MODERATE',\n 3: 'HIGH_EXTENSIVE',\n 4: 'MEDIUM_LIMITED',\n 5: 'MEDIUM_MODERATE',\n 6: 'MEDIUM_EXTENSIVE',\n 7: 'LOW_LIMITED',\n 8: 'LOW_MODERATE',\n 9: 'LOW_EXTENSIVE',\n}\n"],"mappings":"AAEA,IAAY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,SAAA,UACA,EAAA,QAAA;AACF,GAAA,CAAA,CAAA,GAIa,IAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKa,IAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEa,IAA4B;AAAA,EACvC,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAChB,GAEa,IAA6B;AAAA,EACxC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,GAEa,IAAiC;AAAA,EAC5C,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,eAAe;AACjB,GAEa,IAAkC;AAAA,EAC7C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL"}
@@ -15,6 +15,9 @@ export declare class HoldingStore {
15
15
  [x: string]: number;
16
16
  };
17
17
  get visibleHoldings(): Holding[];
18
+ get hasAllocationData(): boolean;
19
+ get hasAnalysisData(): boolean;
20
+ get selectedInvestmentAccounts(): import('..').DetailedAccount[];
18
21
  setHoldings: (holdings: Holding[]) => void;
19
22
  setShowConnectionsWidget: (value: boolean) => void;
20
23
  loadHoldings: () => Promise<void>;
@@ -1,60 +1,70 @@
1
- import { HoldingApi as e } from "../api/HoldingApi.es.js";
1
+ import { HoldingApi as o } from "../api/HoldingApi.es.js";
2
2
  import { AnalysisType as n } from "../constants/Investments.es.js";
3
- import { analysisChartData as a, analysisDetailsData as r, mapDataToPercentageGrid as l } from "../utils/InvestmentUtil.es.js";
4
- import { makeAutoObservable as d, runInAction as h } from "mobx";
5
- var y = class {
3
+ import { analysisChartData as a, analysisDetailsData as l, holdingHasAllocationData as r, holdingHasStyleData as d, mapDataToPercentageGrid as h } from "../utils/InvestmentUtil.es.js";
4
+ import { makeAutoObservable as c, runInAction as g } from "mobx";
5
+ var m = class {
6
6
  analysisType = n.Stocks;
7
- api = new e("/", "");
7
+ api = new o("/", "");
8
8
  holdings = [];
9
9
  holdingsLoaded = !1;
10
10
  globalStore;
11
11
  showConnectionsWidget = !1;
12
- constructor(i) {
13
- this.globalStore = i, this.api = new e(i.endpoint, i.sessionToken, i.onError), d(this);
12
+ constructor(s) {
13
+ this.globalStore = s, this.api = new o(s.endpoint, s.sessionToken, s.onError), c(this);
14
14
  }
15
15
  get analysisChartData() {
16
- return l(a(this.visibleHoldings), this.analysisType);
16
+ return h(a(this.visibleHoldings), this.analysisType);
17
17
  }
18
18
  get analysisDetails() {
19
- return r(this.visibleHoldings)[this.analysisType] || {};
19
+ return l(this.visibleHoldings)[this.analysisType] || {};
20
20
  }
21
21
  get visibleHoldings() {
22
- return this.holdings.filter((i) => this.globalStore.globalUiStore.selectedAccountGuids.includes(i.account_guid));
22
+ return this.holdings.filter((s) => this.globalStore.globalUiStore.selectedAccountGuids.includes(s.account_guid));
23
23
  }
24
- setHoldings = (i) => {
25
- this.holdings = i, this.holdingsLoaded = !0;
24
+ get hasAllocationData() {
25
+ return this.visibleHoldings.some(r) ? !0 : this.selectedInvestmentAccounts.some((s) => (s.cash_balance ?? 0) > 0);
26
+ }
27
+ get hasAnalysisData() {
28
+ return this.visibleHoldings.some(d);
29
+ }
30
+ get selectedInvestmentAccounts() {
31
+ const { selectedAccountGuids: s } = this.globalStore.globalUiStore;
32
+ return this.globalStore.accountStore.visibleInvestmentAccounts.filter((t) => s.includes(t.guid));
33
+ }
34
+ setHoldings = (s) => {
35
+ this.holdings = s, this.holdingsLoaded = !0;
26
36
  };
27
- setShowConnectionsWidget = (i) => {
28
- this.showConnectionsWidget = i;
37
+ setShowConnectionsWidget = (s) => {
38
+ this.showConnectionsWidget = s;
29
39
  };
30
40
  loadHoldings = async () => {
31
41
  try {
32
- const i = await this.api.getHoldings();
33
- this.setHoldings(i);
34
- } catch (i) {
35
- console.error("Error occurred while getting holdings:", i), this.globalStore.captureException(i, { store: "HoldingStore" });
42
+ const s = await this.api.getHoldings();
43
+ this.setHoldings(s);
44
+ } catch (s) {
45
+ console.error("Error occurred while getting holdings:", s), this.globalStore.captureException(s, { store: "HoldingStore" });
36
46
  }
37
47
  };
38
- setAnalysisType = (i) => {
39
- this.analysisType = i;
48
+ setAnalysisType = (s) => {
49
+ this.analysisType = s;
40
50
  };
41
- updateHoldings = async (i) => {
51
+ updateHoldings = async (s) => {
42
52
  this.holdingsLoaded = !1;
43
53
  try {
44
- const s = await this.api.updateHoldings(i), o = this.holdings.findIndex(({ guid: t }) => t === i.guid);
45
- if (o >= 0) {
46
- const t = [...this.holdings];
47
- t[o] = s, h(() => {
48
- this.holdings = t, this.holdingsLoaded = !0;
54
+ const t = await this.api.updateHoldings(s), e = this.holdings.findIndex(({ guid: i }) => i === s.guid);
55
+ if (e >= 0) {
56
+ const i = [...this.holdings];
57
+ i[e] = t, g(() => {
58
+ this.holdings = i, this.holdingsLoaded = !0;
49
59
  });
50
60
  }
51
- } catch (s) {
52
- console.error("Error occurred while updating holding:", s), this.globalStore.captureException(s, { store: "HoldingStore" });
61
+ } catch (t) {
62
+ console.error("Error occurred while updating holding:", t), this.globalStore.captureException(t, { store: "HoldingStore" });
53
63
  }
54
64
  };
55
65
  };
56
66
  export {
57
- y as HoldingStore
67
+ m as HoldingStore
58
68
  };
59
69
 
60
70
  //# sourceMappingURL=HoldingStore.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HoldingStore.es.js","names":[],"sources":["../../../src/core/stores/HoldingStore.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { HoldingApi } from '../api'\nimport { AnalysisType } from '../constants/Investments'\nimport { type Holding } from '../types'\nimport {\n analysisChartData,\n analysisDetailsData,\n mapDataToPercentageGrid,\n} from '../utils/InvestmentUtil'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class HoldingStore {\n analysisType: AnalysisType = AnalysisType.Stocks\n api = new HoldingApi('/', '')\n holdings: Holding[] = []\n holdingsLoaded = false\n globalStore: GlobalStore\n showConnectionsWidget = false\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new HoldingApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n get analysisChartData() {\n return mapDataToPercentageGrid(analysisChartData(this.visibleHoldings), this.analysisType)\n }\n\n get analysisDetails() {\n return analysisDetailsData(this.visibleHoldings)[this.analysisType] || {}\n }\n\n get visibleHoldings() {\n return this.holdings.filter((holding) =>\n this.globalStore.globalUiStore.selectedAccountGuids.includes(holding.account_guid),\n )\n }\n\n setHoldings = (holdings: Holding[]) => {\n this.holdings = holdings\n this.holdingsLoaded = true\n }\n\n setShowConnectionsWidget = (value: boolean) => {\n this.showConnectionsWidget = value\n }\n\n loadHoldings = async () => {\n try {\n const holdings = await this.api.getHoldings()\n this.setHoldings(holdings)\n } catch (error) {\n console.error('Error occurred while getting holdings:', error)\n this.globalStore.captureException(error, { store: 'HoldingStore' })\n }\n }\n\n setAnalysisType = (analysisType: AnalysisType) => {\n this.analysisType = analysisType\n }\n\n updateHoldings = async (holding: Holding) => {\n this.holdingsLoaded = false\n try {\n const updatedHolding = await this.api.updateHoldings(holding)\n const updatedIndex = this.holdings.findIndex(({ guid }) => guid === holding.guid)\n\n if (updatedIndex >= 0) {\n const holdings = [...this.holdings]\n holdings[updatedIndex] = updatedHolding\n\n runInAction(() => {\n this.holdings = holdings\n this.holdingsLoaded = true\n })\n }\n } catch (error) {\n console.error('Error occurred while updating holding:', error)\n this.globalStore.captureException(error, { store: 'HoldingStore' })\n }\n }\n}\n"],"mappings":";;;;AAaA,IAAa,IAAb,MAA0B;AAAA,EACxB,eAA6B,EAAa;AAAA,EAC1C,MAAM,IAAI,EAAW,KAAK,EAAE;AAAA,EAC5B,WAAsB,CAAC;AAAA,EACvB,iBAAiB;AAAA,EACjB;AAAA,EACA,wBAAwB;AAAA,EAExB,YAAY,GAA0B;AACpC,SAAK,cAAc,GACnB,KAAK,MAAM,IAAI,EAAW,EAAY,UAAU,EAAY,cAAc,EAAY,OAAO,GAE7F,EAAmB,IAAI;AAAA,EACzB;AAAA,EAEA,IAAI,oBAAoB;AACtB,WAAO,EAAwB,EAAkB,KAAK,eAAe,GAAG,KAAK,YAAY;AAAA,EAC3F;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO,EAAoB,KAAK,eAAe,EAAE,KAAK,YAAA,KAAiB,CAAC;AAAA,EAC1E;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO,KAAK,SAAS,OAAA,CAAQ,MAC3B,KAAK,YAAY,cAAc,qBAAqB,SAAS,EAAQ,YAAY,CACnF;AAAA,EACF;AAAA,EAEA,cAAA,CAAe,MAAwB;AACrC,SAAK,WAAW,GAChB,KAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,2BAAA,CAA4B,MAAmB;AAC7C,SAAK,wBAAwB;AAAA,EAC/B;AAAA,EAEA,eAAe,YAAY;AACzB,QAAI;AACF,YAAM,IAAW,MAAM,KAAK,IAAI,YAAY;AAC5C,WAAK,YAAY,CAAQ;AAAA,IAC3B,SAAS,GAAO;AACd,cAAQ,MAAM,0CAA0C,CAAK,GAC7D,KAAK,YAAY,iBAAiB,GAAO,EAAE,OAAO,eAAe,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,kBAAA,CAAmB,MAA+B;AAChD,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,iBAAiB,OAAO,MAAqB;AAC3C,SAAK,iBAAiB;AACtB,QAAI;AACF,YAAM,IAAiB,MAAM,KAAK,IAAI,eAAe,CAAO,GACtD,IAAe,KAAK,SAAS,UAAA,CAAW,EAAE,MAAA,EAAA,MAAW,MAAS,EAAQ,IAAI;AAEhF,UAAI,KAAgB,GAAG;AACrB,cAAM,IAAW,CAAC,GAAG,KAAK,QAAQ;AAClC,QAAA,EAAS,CAAA,IAAgB,GAEzB,EAAA,MAAkB;AAChB,eAAK,WAAW,GAChB,KAAK,iBAAiB;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,IACF,SAAS,GAAO;AACd,cAAQ,MAAM,0CAA0C,CAAK,GAC7D,KAAK,YAAY,iBAAiB,GAAO,EAAE,OAAO,eAAe,CAAC;AAAA,IACpE;AAAA,EACF;AACF"}
1
+ {"version":3,"file":"HoldingStore.es.js","names":[],"sources":["../../../src/core/stores/HoldingStore.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from 'mobx'\n\nimport { HoldingApi } from '../api'\nimport { AnalysisType } from '../constants/Investments'\nimport { type Holding } from '../types'\nimport {\n analysisChartData,\n analysisDetailsData,\n holdingHasAllocationData,\n holdingHasStyleData,\n mapDataToPercentageGrid,\n} from '../utils/InvestmentUtil'\n\nimport { GlobalStore } from './GlobalStore'\n\nexport class HoldingStore {\n analysisType: AnalysisType = AnalysisType.Stocks\n api = new HoldingApi('/', '')\n holdings: Holding[] = []\n holdingsLoaded = false\n globalStore: GlobalStore\n showConnectionsWidget = false\n\n constructor(globalStore: GlobalStore) {\n this.globalStore = globalStore\n this.api = new HoldingApi(globalStore.endpoint, globalStore.sessionToken, globalStore.onError)\n\n makeAutoObservable(this)\n }\n\n get analysisChartData() {\n return mapDataToPercentageGrid(analysisChartData(this.visibleHoldings), this.analysisType)\n }\n\n get analysisDetails() {\n return analysisDetailsData(this.visibleHoldings)[this.analysisType] || {}\n }\n\n get visibleHoldings() {\n return this.holdings.filter((holding) =>\n this.globalStore.globalUiStore.selectedAccountGuids.includes(holding.account_guid),\n )\n }\n\n // Cash counts because a cash balance renders as a synthetic donut slice.\n get hasAllocationData() {\n if (this.visibleHoldings.some(holdingHasAllocationData)) return true\n\n return this.selectedInvestmentAccounts.some((account) => (account.cash_balance ?? 0) > 0)\n }\n\n get hasAnalysisData() {\n return this.visibleHoldings.some(holdingHasStyleData)\n }\n\n get selectedInvestmentAccounts() {\n const { selectedAccountGuids } = this.globalStore.globalUiStore\n return this.globalStore.accountStore.visibleInvestmentAccounts.filter((account) =>\n selectedAccountGuids.includes(account.guid),\n )\n }\n\n setHoldings = (holdings: Holding[]) => {\n this.holdings = holdings\n this.holdingsLoaded = true\n }\n\n setShowConnectionsWidget = (value: boolean) => {\n this.showConnectionsWidget = value\n }\n\n loadHoldings = async () => {\n try {\n const holdings = await this.api.getHoldings()\n this.setHoldings(holdings)\n } catch (error) {\n console.error('Error occurred while getting holdings:', error)\n this.globalStore.captureException(error, { store: 'HoldingStore' })\n }\n }\n\n setAnalysisType = (analysisType: AnalysisType) => {\n this.analysisType = analysisType\n }\n\n updateHoldings = async (holding: Holding) => {\n this.holdingsLoaded = false\n try {\n const updatedHolding = await this.api.updateHoldings(holding)\n const updatedIndex = this.holdings.findIndex(({ guid }) => guid === holding.guid)\n\n if (updatedIndex >= 0) {\n const holdings = [...this.holdings]\n holdings[updatedIndex] = updatedHolding\n\n runInAction(() => {\n this.holdings = holdings\n this.holdingsLoaded = true\n })\n }\n } catch (error) {\n console.error('Error occurred while updating holding:', error)\n this.globalStore.captureException(error, { store: 'HoldingStore' })\n }\n }\n}\n"],"mappings":";;;;AAeA,IAAa,IAAb,MAA0B;AAAA,EACxB,eAA6B,EAAa;AAAA,EAC1C,MAAM,IAAI,EAAW,KAAK,EAAE;AAAA,EAC5B,WAAsB,CAAC;AAAA,EACvB,iBAAiB;AAAA,EACjB;AAAA,EACA,wBAAwB;AAAA,EAExB,YAAY,GAA0B;AACpC,SAAK,cAAc,GACnB,KAAK,MAAM,IAAI,EAAW,EAAY,UAAU,EAAY,cAAc,EAAY,OAAO,GAE7F,EAAmB,IAAI;AAAA,EACzB;AAAA,EAEA,IAAI,oBAAoB;AACtB,WAAO,EAAwB,EAAkB,KAAK,eAAe,GAAG,KAAK,YAAY;AAAA,EAC3F;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO,EAAoB,KAAK,eAAe,EAAE,KAAK,YAAA,KAAiB,CAAC;AAAA,EAC1E;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO,KAAK,SAAS,OAAA,CAAQ,MAC3B,KAAK,YAAY,cAAc,qBAAqB,SAAS,EAAQ,YAAY,CACnF;AAAA,EACF;AAAA,EAGA,IAAI,oBAAoB;AACtB,WAAI,KAAK,gBAAgB,KAAK,CAAwB,IAAU,KAEzD,KAAK,2BAA2B,KAAA,CAAM,OAAa,EAAQ,gBAAgB,KAAK,CAAC;AAAA,EAC1F;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO,KAAK,gBAAgB,KAAK,CAAmB;AAAA,EACtD;AAAA,EAEA,IAAI,6BAA6B;AAC/B,UAAM,EAAE,sBAAA,EAAA,IAAyB,KAAK,YAAY;AAClD,WAAO,KAAK,YAAY,aAAa,0BAA0B,OAAA,CAAQ,MACrE,EAAqB,SAAS,EAAQ,IAAI,CAC5C;AAAA,EACF;AAAA,EAEA,cAAA,CAAe,MAAwB;AACrC,SAAK,WAAW,GAChB,KAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,2BAAA,CAA4B,MAAmB;AAC7C,SAAK,wBAAwB;AAAA,EAC/B;AAAA,EAEA,eAAe,YAAY;AACzB,QAAI;AACF,YAAM,IAAW,MAAM,KAAK,IAAI,YAAY;AAC5C,WAAK,YAAY,CAAQ;AAAA,IAC3B,SAAS,GAAO;AACd,cAAQ,MAAM,0CAA0C,CAAK,GAC7D,KAAK,YAAY,iBAAiB,GAAO,EAAE,OAAO,eAAe,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,kBAAA,CAAmB,MAA+B;AAChD,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,iBAAiB,OAAO,MAAqB;AAC3C,SAAK,iBAAiB;AACtB,QAAI;AACF,YAAM,IAAiB,MAAM,KAAK,IAAI,eAAe,CAAO,GACtD,IAAe,KAAK,SAAS,UAAA,CAAW,EAAE,MAAA,EAAA,MAAW,MAAS,EAAQ,IAAI;AAEhF,UAAI,KAAgB,GAAG;AACrB,cAAM,IAAW,CAAC,GAAG,KAAK,QAAQ;AAClC,QAAA,EAAS,CAAA,IAAgB,GAEzB,EAAA,MAAkB;AAChB,eAAK,WAAW,GAChB,KAAK,iBAAiB;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,IACF,SAAS,GAAO;AACd,cAAQ,MAAM,0CAA0C,CAAK,GAC7D,KAAK,YAAY,iBAAiB,GAAO,EAAE,OAAO,eAAe,CAAC;AAAA,IACpE;AAAA,EACF;AACF"}
@@ -1,6 +1,10 @@
1
1
  import { Holding } from '../types';
2
2
  import { AnalysisType } from '../constants/Investments';
3
3
  type WeightMap = Record<string, number>;
4
+ export declare const isMeaningfulNumber: (value: unknown) => boolean;
5
+ export declare const isValidClassification: (value: unknown) => boolean;
6
+ export declare const holdingHasStyleData: (holding: Holding) => boolean;
7
+ export declare const holdingHasAllocationData: (holding: Holding) => boolean;
4
8
  export declare const createGroups: (classificationObj: Record<number, string>, groupSize?: number) => string[][];
5
9
  export declare const bondGroups: string[][];
6
10
  export declare const stockGroups: string[][];
@@ -1,80 +1,93 @@
1
- import { AnalysisType as V, EquityClassificationTypes as b, EquityClassificationValues as m, FixedIncomeClassificationTypes as L, FixedIncomeClassificationValues as f } from "../constants/Investments.es.js";
2
- import x from "numeral";
3
- var d = (e, a = 3) => {
4
- const r = Object.keys(e).map(Number).filter((t) => t !== 0).sort((t, i) => t - i), s = [];
5
- for (let t = 0; t < r.length; t += a) s.push(r.slice(t, t + a).map((i) => e[i]));
1
+ import { ALLOCATION_KEYS as V, AnalysisType as k, EquityClassificationTypes as A, EquityClassificationValues as m, FixedIncomeClassificationTypes as G, FixedIncomeClassificationValues as f, STYLE_WEIGHT_KEYS as T } from "../constants/Investments.es.js";
2
+ import W from "numeral";
3
+ var S = 80, x = 120, h = (e) => e > S && e < x, C = (e) => {
4
+ const t = Number(e);
5
+ return Number.isFinite(t) && t !== 0;
6
+ }, d = (e) => {
7
+ const t = Number(e);
8
+ return Number.isFinite(t) && t >= 1 && t <= 9;
9
+ }, F = (e) => {
10
+ const t = T.reduce((r, s) => r + (Number(e[s]) || 0), 0);
11
+ return h(t) || t === 0 && (d(e.equity_classification) || d(e.fixed_income_classification));
12
+ }, q = (e) => V.some((t) => C(e[t])), E = (e, t = 3) => {
13
+ const r = Object.keys(e).map(Number).filter((a) => a !== 0).sort((a, i) => a - i), s = [];
14
+ for (let a = 0; a < r.length; a += t) s.push(r.slice(a, a + t).map((i) => e[i]));
6
15
  return s;
7
- }, A = d(f), G = d(m), D = (e) => {
8
- const a = p(e, k), r = p(e, w), s = (t, i) => {
9
- const c = t.reduce((o, n) => o + O(n), 0), u = t.reduce((o, n) => {
10
- const l = i(n);
11
- return Object.keys(l).forEach((_) => o[_] = (o[_] || 0) + l[_]), o;
16
+ }, I = E(f), D = E(m), K = (e) => {
17
+ const t = p(e, w), r = p(e, y), s = (a, i) => {
18
+ const o = a.reduce((n, c) => n + N(c), 0), u = a.reduce((n, c) => {
19
+ const l = i(c);
20
+ return Object.keys(l).forEach((_) => n[_] = (n[_] || 0) + l[_]), n;
12
21
  }, {});
13
- return Object.fromEntries(Object.entries(u).map(([o, n]) => [o, n / c * 100]));
22
+ return Object.fromEntries(Object.entries(u).map(([n, c]) => [n, c / o * 100]));
14
23
  };
15
24
  return {
16
- stocks: s(a, y),
17
- bonds: s(r, h)
25
+ stocks: s(t, L),
26
+ bonds: s(r, b)
18
27
  };
19
- }, N = (e) => {
20
- const a = e.filter((t) => !isNaN(t.equity_classification)), r = e.filter((t) => !isNaN(t.fixed_income_classification)), s = (t, i, c) => t.reduce((u, o) => {
21
- const n = i(o);
22
- return Object.keys(c).forEach((l) => {
23
- u[l] = (u[l] || 0) + (n[l] || 0);
28
+ }, U = (e) => {
29
+ const t = e.filter((a) => !isNaN(a.equity_classification)), r = e.filter((a) => !isNaN(a.fixed_income_classification)), s = (a, i, o) => a.reduce((u, n) => {
30
+ const c = i(n);
31
+ return Object.keys(o).forEach((l) => {
32
+ u[l] = (u[l] || 0) + (c[l] || 0);
24
33
  }), u;
25
34
  }, {});
26
35
  return {
27
- stocks: s(a, y, b),
28
- bonds: s(r, h, L)
36
+ stocks: s(t, L, A),
37
+ bonds: s(r, b, G)
29
38
  };
30
- }, C = (e, a) => Object.fromEntries(Object.entries(e).map(([r, s]) => [r, s * a / 100])), h = (e) => E(e, w, f), w = (e) => {
31
- const a = e.fixed_income_classification;
32
- return { [f[a]]: 100 };
33
- }, y = (e) => E(e, k, m), k = (e) => {
34
- const { large_core_weight: a, large_growth_weight: r, large_value_weight: s, mid_core_weight: t, mid_growth_weight: i, mid_value_weight: c, small_core_weight: u, small_growth_weight: o, small_value_weight: n, unknown_weight: l, equity_classification: _ } = e, v = {
35
- LARGE_CORE: a ?? 0,
39
+ }, H = (e, t) => Object.fromEntries(Object.entries(e).map(([r, s]) => [r, s * t / 100])), b = (e) => O(e, y, f), y = (e) => {
40
+ const t = e.fixed_income_classification;
41
+ return { [f[t]]: 100 };
42
+ }, L = (e) => O(e, w, m), w = (e) => {
43
+ const { large_core_weight: t, large_growth_weight: r, large_value_weight: s, mid_core_weight: a, mid_growth_weight: i, mid_value_weight: o, small_core_weight: u, small_growth_weight: n, small_value_weight: c, unknown_weight: l, equity_classification: _ } = e, g = {
44
+ LARGE_CORE: t ?? 0,
36
45
  LARGE_GROWTH: r ?? 0,
37
46
  LARGE_VALUE: s ?? 0,
38
- MID_CORE: t ?? 0,
47
+ MID_CORE: a ?? 0,
39
48
  MID_GROWTH: i ?? 0,
40
- MID_VALUE: c ?? 0,
49
+ MID_VALUE: o ?? 0,
41
50
  SMALL_CORE: u ?? 0,
42
- SMALL_GROWTH: o ?? 0,
43
- SMALL_VALUE: n ?? 0,
51
+ SMALL_GROWTH: n ?? 0,
52
+ SMALL_VALUE: c ?? 0,
44
53
  UNKNOWN: l ?? 0
45
54
  };
46
- return g(v) === 0 && _ !== void 0 ? { [m[_]]: 100 } : v;
47
- }, E = (e, a, r) => {
48
- const s = a(e), t = O(e), i = C(s, t);
49
- if (g(i) === 0) {
50
- const c = String(e.equity_classification ?? e.fixed_income_classification);
51
- if (c in r) return { [r[c]]: t };
52
- console.error(`Invalid classification key: ${c}`);
55
+ return v(g) === 0 && _ !== void 0 ? { [m[_]]: 100 } : g;
56
+ }, O = (e, t, r) => {
57
+ const s = t(e), a = N(e), i = H(s, a);
58
+ if (v(i) === 0) {
59
+ const o = String(e.equity_classification ?? e.fixed_income_classification);
60
+ if (o in r) return { [r[o]]: a };
61
+ console.error(`Invalid classification key: ${o}`);
53
62
  }
54
63
  return i;
55
- }, I = (e) => e.split("_").map((a) => a.charAt(0).toUpperCase() + a.slice(1).toLowerCase()).join(" "), W = (e) => e >= 1 ? `${x(e).format("0")}%` : "< 1%", O = (e) => e.calculated_market_value ?? e.market_value, p = (e, a) => e.filter((r) => {
56
- const s = a(r), t = g(s);
57
- return t > 80 && t < 120;
58
- }), M = (e, a) => {
59
- const r = a === V.Stocks ? G : A, s = e[a];
60
- return !s || Object.keys(s).length === 0 ? r.map((t) => t.map(() => "0%")) : r.map((t) => t.map((i) => W(s[i] ?? 0)));
61
- }, g = (e) => Object.values(e).reduce((a, r) => a + r, 0);
64
+ }, Y = (e) => e.split("_").map((t) => t.charAt(0).toUpperCase() + t.slice(1).toLowerCase()).join(" "), j = (e) => e >= 1 ? `${W(e).format("0")}%` : "< 1%", N = (e) => e.calculated_market_value ?? e.market_value, p = (e, t) => e.filter((r) => {
65
+ const s = t(r);
66
+ return h(v(s));
67
+ }), B = (e, t) => {
68
+ const r = t === k.Stocks ? D : I, s = e[t];
69
+ return !s || Object.keys(s).length === 0 ? r.map((a) => a.map(() => "0%")) : r.map((a) => a.map((i) => j(s[i] ?? 0)));
70
+ }, v = (e) => Object.values(e).reduce((t, r) => t + r, 0);
62
71
  export {
63
- D as analysisChartData,
64
- N as analysisDetailsData,
65
- A as bondGroups,
66
- C as calculateWeightedValue,
67
- d as createGroups,
68
- w as extractBondWeight,
69
- k as extractStockWeight,
70
- E as extractValueFromWeight,
71
- I as formatKey,
72
- W as formatPercent,
73
- O as getHoldingValue,
72
+ K as analysisChartData,
73
+ U as analysisDetailsData,
74
+ I as bondGroups,
75
+ H as calculateWeightedValue,
76
+ E as createGroups,
77
+ y as extractBondWeight,
78
+ w as extractStockWeight,
79
+ O as extractValueFromWeight,
80
+ Y as formatKey,
81
+ j as formatPercent,
82
+ N as getHoldingValue,
74
83
  p as getValidHoldings,
75
- M as mapDataToPercentageGrid,
76
- G as stockGroups,
77
- g as sumValues
84
+ q as holdingHasAllocationData,
85
+ F as holdingHasStyleData,
86
+ C as isMeaningfulNumber,
87
+ d as isValidClassification,
88
+ B as mapDataToPercentageGrid,
89
+ D as stockGroups,
90
+ v as sumValues
78
91
  };
79
92
 
80
93
  //# sourceMappingURL=InvestmentUtil.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InvestmentUtil.es.js","names":[],"sources":["../../../src/core/utils/InvestmentUtil.ts"],"sourcesContent":["import numeral from 'numeral'\n\nimport type { Holding } from '../types'\n\nimport {\n AnalysisType,\n EquityClassificationTypes,\n EquityClassificationValues,\n FixedIncomeClassificationTypes,\n FixedIncomeClassificationValues,\n} from '../constants/Investments'\n\ntype WeightMap = Record<string, number>\n\nexport const createGroups = (classificationObj: Record<number, string>, groupSize = 3) => {\n const keys = Object.keys(classificationObj)\n .map(Number)\n .filter((k) => k !== 0)\n .sort((a, b) => a - b)\n\n const groups = []\n for (let i = 0; i < keys.length; i += groupSize) {\n groups.push(keys.slice(i, i + groupSize).map((key) => classificationObj[key]))\n }\n return groups\n}\n\nexport const bondGroups = createGroups(FixedIncomeClassificationValues)\nexport const stockGroups = createGroups(EquityClassificationValues)\n\nexport const analysisChartData = (holdings: Holding[]) => {\n const stocks = getValidHoldings(holdings, extractStockWeight)\n const bonds = getValidHoldings(holdings, extractBondWeight)\n\n const processGroupData = (group: Holding[], extractValueFn: (holding: Holding) => WeightMap) => {\n const totalValue = group.reduce((acc, holding) => acc + getHoldingValue(holding), 0)\n const groupValues = group.reduce((acc, holding) => {\n const value = extractValueFn(holding)\n Object.keys(value).forEach((key) => (acc[key] = (acc[key] || 0) + value[key]))\n return acc\n }, {} as WeightMap)\n\n return Object.fromEntries(\n Object.entries(groupValues).map(([key, value]) => [key, (value / totalValue) * 100]),\n )\n }\n\n const data = {\n stocks: processGroupData(stocks, extractStockValueFromWeight),\n bonds: processGroupData(bonds, extractBondValueFromWeight),\n }\n\n return data\n}\n\nexport const analysisDetailsData = (holdings: Holding[]) => {\n const stocks = holdings.filter((holding) => !isNaN(holding.equity_classification))\n const bonds = holdings.filter((holding) => !isNaN(holding.fixed_income_classification))\n\n const aggregateValues = (\n holdings: Holding[],\n extractValueFn: (holding: Holding) => WeightMap,\n classificationTypes: Record<string, number>,\n ) => {\n return holdings.reduce((acc, holding) => {\n const values = extractValueFn(holding)\n Object.keys(classificationTypes).forEach((sector) => {\n acc[sector] = (acc[sector] || 0) + (values[sector] || 0)\n })\n return acc\n }, {} as WeightMap)\n }\n\n return {\n stocks: aggregateValues(stocks, extractStockValueFromWeight, EquityClassificationTypes),\n bonds: aggregateValues(bonds, extractBondValueFromWeight, FixedIncomeClassificationTypes),\n }\n}\n\nexport const calculateWeightedValue = (weights: WeightMap, value: number): WeightMap => {\n return Object.fromEntries(\n Object.entries(weights).map(([key, weight]) => [key, (weight * value) / 100]),\n )\n}\n\nconst extractBondValueFromWeight = (bond: Holding) =>\n extractValueFromWeight(bond, extractBondWeight, FixedIncomeClassificationValues)\n\nexport const extractBondWeight = (bond: Holding): WeightMap => {\n const classificationKey = bond.fixed_income_classification\n return {\n [FixedIncomeClassificationValues[\n classificationKey as keyof typeof FixedIncomeClassificationValues\n ]]: 100,\n }\n}\n\nconst extractStockValueFromWeight = (stock: Holding) =>\n extractValueFromWeight(stock, extractStockWeight, EquityClassificationValues)\n\nexport const extractStockWeight = (stock: Holding): WeightMap => {\n const {\n large_core_weight,\n large_growth_weight,\n large_value_weight,\n mid_core_weight,\n mid_growth_weight,\n mid_value_weight,\n small_core_weight,\n small_growth_weight,\n small_value_weight,\n unknown_weight,\n equity_classification,\n } = stock\n\n const data: WeightMap = {\n LARGE_CORE: large_core_weight ?? 0,\n LARGE_GROWTH: large_growth_weight ?? 0,\n LARGE_VALUE: large_value_weight ?? 0,\n MID_CORE: mid_core_weight ?? 0,\n MID_GROWTH: mid_growth_weight ?? 0,\n MID_VALUE: mid_value_weight ?? 0,\n SMALL_CORE: small_core_weight ?? 0,\n SMALL_GROWTH: small_growth_weight ?? 0,\n SMALL_VALUE: small_value_weight ?? 0,\n UNKNOWN: unknown_weight ?? 0,\n }\n\n if (sumValues(data) === 0 && equity_classification !== undefined) {\n const key =\n EquityClassificationValues[equity_classification as keyof typeof EquityClassificationValues]\n return { [key]: 100 }\n }\n\n return data\n}\n\nexport const extractValueFromWeight = (\n holding: Holding,\n extractWeightFn: (h: Holding) => WeightMap,\n classificationValues: Record<string, string>,\n): WeightMap => {\n const weights = extractWeightFn(holding)\n const value = getHoldingValue(holding)\n const weightedValues = calculateWeightedValue(weights, value)\n\n if (sumValues(weightedValues) === 0) {\n const classificationKey = String(\n holding.equity_classification ?? holding.fixed_income_classification,\n )\n\n if (classificationKey in classificationValues) {\n return { [classificationValues[classificationKey]]: value }\n } else {\n console.error(`Invalid classification key: ${classificationKey}`)\n }\n }\n\n return weightedValues\n}\n\nexport const formatKey = (key: string): string =>\n key\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ')\n\nexport const formatPercent = (value: number): string =>\n value >= 1 ? `${numeral(value).format('0')}%` : '< 1%'\n\nexport const getHoldingValue = (holding: Holding): number =>\n holding.calculated_market_value ?? holding.market_value\n\nexport const getValidHoldings = (\n holdings: Holding[],\n extractWeightFn: (holding: Holding) => WeightMap,\n): Holding[] => {\n return holdings.filter((holding) => {\n const weight = extractWeightFn(holding)\n const total = sumValues(weight)\n return total > 80 && total < 120\n })\n}\n\nexport const mapDataToPercentageGrid = (\n data: Record<AnalysisType, Record<string, number>>,\n analysisType: AnalysisType,\n): string[][] => {\n const groups = analysisType === AnalysisType.Stocks ? stockGroups : bondGroups\n\n const selected = data[analysisType]\n if (!selected || Object.keys(selected).length === 0)\n return groups.map((group) => group.map(() => '0%'))\n\n return groups.map((group) => group.map((key) => formatPercent(selected[key] ?? 0)))\n}\n\nexport const sumValues = (obj: WeightMap): number =>\n Object.values(obj).reduce((acc, val) => acc + val, 0)\n"],"mappings":";;AAcA,IAAa,IAAA,CAAgB,GAA2C,IAAY,MAAM;AACxF,QAAM,IAAO,OAAO,KAAK,CAAiB,EACvC,IAAI,MAAM,EACV,OAAA,CAAQ,MAAM,MAAM,CAAC,EACrB,KAAA,CAAM,GAAG,MAAM,IAAI,CAAC,GAEjB,IAAS,CAAC;AAChB,WAAS,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK,EACpC,CAAA,EAAO,KAAK,EAAK,MAAM,GAAG,IAAI,CAAS,EAAE,IAAA,CAAK,MAAQ,EAAkB,CAAA,CAAI,CAAC;AAE/E,SAAO;AACT,GAEa,IAAa,EAAa,CAA+B,GACzD,IAAc,EAAa,CAA0B,GAErD,IAAA,CAAqB,MAAwB;AACxD,QAAM,IAAS,EAAiB,GAAU,CAAkB,GACtD,IAAQ,EAAiB,GAAU,CAAiB,GAEpD,IAAA,CAAoB,GAAkB,MAAoD;AAC9F,UAAM,IAAa,EAAM,OAAA,CAAQ,GAAK,MAAY,IAAM,EAAgB,CAAO,GAAG,CAAC,GAC7E,IAAc,EAAM,OAAA,CAAQ,GAAK,MAAY;AACjD,YAAM,IAAQ,EAAe,CAAO;AACpC,oBAAO,KAAK,CAAK,EAAE,QAAA,CAAS,MAAS,EAAI,CAAA,KAAQ,EAAI,CAAA,KAAQ,KAAK,EAAM,CAAA,CAAK,GACtE;AAAA,IACT,GAAG,CAAC,CAAc;AAElB,WAAO,OAAO,YACZ,OAAO,QAAQ,CAAW,EAAE,IAAA,CAAK,CAAC,GAAK,CAAA,MAAW,CAAC,GAAM,IAAQ,IAAc,GAAG,CAAC,CACrF;AAAA,EACF;AAOA,SAAO;AAAA,IAJL,QAAQ,EAAiB,GAAQ,CAA2B;AAAA,IAC5D,OAAO,EAAiB,GAAO,CAA0B;AAAA,EAGpD;AACT,GAEa,IAAA,CAAuB,MAAwB;AAC1D,QAAM,IAAS,EAAS,OAAA,CAAQ,MAAY,CAAC,MAAM,EAAQ,qBAAqB,CAAC,GAC3E,IAAQ,EAAS,OAAA,CAAQ,MAAY,CAAC,MAAM,EAAQ,2BAA2B,CAAC,GAEhF,IAAA,CACJ,GACA,GACA,MAEO,EAAS,OAAA,CAAQ,GAAK,MAAY;AACvC,UAAM,IAAS,EAAe,CAAO;AACrC,kBAAO,KAAK,CAAmB,EAAE,QAAA,CAAS,MAAW;AACnD,MAAA,EAAI,CAAA,KAAW,EAAI,CAAA,KAAW,MAAM,EAAO,CAAA,KAAW;AAAA,IACxD,CAAC,GACM;AAAA,EACT,GAAG,CAAC,CAAc;AAGpB,SAAO;AAAA,IACL,QAAQ,EAAgB,GAAQ,GAA6B,CAAyB;AAAA,IACtF,OAAO,EAAgB,GAAO,GAA4B,CAA8B;AAAA,EAC1F;AACF,GAEa,IAAA,CAA0B,GAAoB,MAClD,OAAO,YACZ,OAAO,QAAQ,CAAO,EAAE,IAAA,CAAK,CAAC,GAAK,CAAA,MAAY,CAAC,GAAM,IAAS,IAAS,GAAG,CAAC,CAC9E,GAGI,IAAA,CAA8B,MAClC,EAAuB,GAAM,GAAmB,CAA+B,GAEpE,IAAA,CAAqB,MAA6B;AAC7D,QAAM,IAAoB,EAAK;AAC/B,SAAO,EAAA,CACJ,EACC,CAAA,CAAA,GACE,IACN;AACF,GAEM,IAAA,CAA+B,MACnC,EAAuB,GAAO,GAAoB,CAA0B,GAEjE,IAAA,CAAsB,MAA8B;AAC/D,QAAM,EACJ,mBAAA,GACA,qBAAA,GACA,oBAAA,GACA,iBAAA,GACA,mBAAA,GACA,kBAAA,GACA,mBAAA,GACA,qBAAA,GACA,oBAAA,GACA,gBAAA,GACA,uBAAA,EAAA,IACE,GAEE,IAAkB;AAAA,IACtB,YAAY,KAAqB;AAAA,IACjC,cAAc,KAAuB;AAAA,IACrC,aAAa,KAAsB;AAAA,IACnC,UAAU,KAAmB;AAAA,IAC7B,YAAY,KAAqB;AAAA,IACjC,WAAW,KAAoB;AAAA,IAC/B,YAAY,KAAqB;AAAA,IACjC,cAAc,KAAuB;AAAA,IACrC,aAAa,KAAsB;AAAA,IACnC,SAAS,KAAkB;AAAA,EAC7B;AAEA,SAAI,EAAU,CAAI,MAAM,KAAK,MAA0B,SAG9C,EAAA,CADL,EAA2B,CAAA,CAAA,GACb,IAAI,IAGf;AACT,GAEa,IAAA,CACX,GACA,GACA,MACc;AACd,QAAM,IAAU,EAAgB,CAAO,GACjC,IAAQ,EAAgB,CAAO,GAC/B,IAAiB,EAAuB,GAAS,CAAK;AAE5D,MAAI,EAAU,CAAc,MAAM,GAAG;AACnC,UAAM,IAAoB,OACxB,EAAQ,yBAAyB,EAAQ,2BAC3C;AAEA,QAAI,KAAqB,EACvB,QAAO,EAAA,CAAG,EAAqB,CAAA,CAAA,GAAqB,EAAM;AAE1D,YAAQ,MAAM,+BAA+B,CAAA,EAAmB;AAAA,EAEpE;AAEA,SAAO;AACT,GAEa,IAAA,CAAa,MACxB,EACG,MAAM,GAAG,EACT,IAAA,CAAK,MAAS,EAAK,OAAO,CAAC,EAAE,YAAY,IAAI,EAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACxE,KAAK,GAAG,GAEA,IAAA,CAAiB,MAC5B,KAAS,IAAI,GAAG,EAAQ,CAAK,EAAE,OAAO,GAAG,CAAA,MAAO,QAErC,IAAA,CAAmB,MAC9B,EAAQ,2BAA2B,EAAQ,cAEhC,IAAA,CACX,GACA,MAEO,EAAS,OAAA,CAAQ,MAAY;AAClC,QAAM,IAAS,EAAgB,CAAO,GAChC,IAAQ,EAAU,CAAM;AAC9B,SAAO,IAAQ,MAAM,IAAQ;AAC/B,CAAC,GAGU,IAAA,CACX,GACA,MACe;AACf,QAAM,IAAS,MAAiB,EAAa,SAAS,IAAc,GAE9D,IAAW,EAAK,CAAA;AACtB,SAAI,CAAC,KAAY,OAAO,KAAK,CAAQ,EAAE,WAAW,IACzC,EAAO,IAAA,CAAK,MAAU,EAAM,IAAA,MAAU,IAAI,CAAC,IAE7C,EAAO,IAAA,CAAK,MAAU,EAAM,IAAA,CAAK,MAAQ,EAAc,EAAS,CAAA,KAAQ,CAAC,CAAC,CAAC;AACpF,GAEa,IAAA,CAAa,MACxB,OAAO,OAAO,CAAG,EAAE,OAAA,CAAQ,GAAK,MAAQ,IAAM,GAAK,CAAC"}
1
+ {"version":3,"file":"InvestmentUtil.es.js","names":[],"sources":["../../../src/core/utils/InvestmentUtil.ts"],"sourcesContent":["import numeral from 'numeral'\n\nimport type { Holding } from '../types'\n\nimport {\n ALLOCATION_KEYS,\n AnalysisType,\n EquityClassificationTypes,\n EquityClassificationValues,\n FixedIncomeClassificationTypes,\n FixedIncomeClassificationValues,\n STYLE_WEIGHT_KEYS,\n} from '../constants/Investments'\n\ntype WeightMap = Record<string, number>\n\n// The render band getValidHoldings keeps; the analysis gate reuses it so the\n// tab never enables onto an all-zero grid.\nconst STYLE_WEIGHT_MIN = 80\nconst STYLE_WEIGHT_MAX = 120\nconst isInStyleWeightBand = (total: number): boolean =>\n total > STYLE_WEIGHT_MIN && total < STYLE_WEIGHT_MAX\n\n// Coerces so a stringified number counts; null/\"\"/\"0\"/NaN/0 all mean \"no data\".\nexport const isMeaningfulNumber = (value: unknown): boolean => {\n const n = Number(value)\n return Number.isFinite(n) && n !== 0\n}\n\n// Classification 0 is UNKNOWN; only 1..9 represent real data.\nexport const isValidClassification = (value: unknown): boolean => {\n const n = Number(value)\n return Number.isFinite(n) && n >= 1 && n <= 9\n}\n\n// Classification only counts when style weights sum to 0, matching\n// extractWeight's fallback — otherwise a partial (out-of-band) total that\n// getValidHoldings drops would wrongly enable the tab onto an empty grid.\nexport const holdingHasStyleData = (holding: Holding): boolean => {\n const styleTotal = STYLE_WEIGHT_KEYS.reduce((sum, key) => sum + (Number(holding[key]) || 0), 0)\n return (\n isInStyleWeightBand(styleTotal) ||\n (styleTotal === 0 &&\n (isValidClassification(holding.equity_classification) ||\n isValidClassification(holding.fixed_income_classification)))\n )\n}\n\nexport const holdingHasAllocationData = (holding: Holding): boolean =>\n ALLOCATION_KEYS.some((key) => isMeaningfulNumber(holding[key]))\n\nexport const createGroups = (classificationObj: Record<number, string>, groupSize = 3) => {\n const keys = Object.keys(classificationObj)\n .map(Number)\n .filter((k) => k !== 0)\n .sort((a, b) => a - b)\n\n const groups = []\n for (let i = 0; i < keys.length; i += groupSize) {\n groups.push(keys.slice(i, i + groupSize).map((key) => classificationObj[key]))\n }\n return groups\n}\n\nexport const bondGroups = createGroups(FixedIncomeClassificationValues)\nexport const stockGroups = createGroups(EquityClassificationValues)\n\nexport const analysisChartData = (holdings: Holding[]) => {\n const stocks = getValidHoldings(holdings, extractStockWeight)\n const bonds = getValidHoldings(holdings, extractBondWeight)\n\n const processGroupData = (group: Holding[], extractValueFn: (holding: Holding) => WeightMap) => {\n const totalValue = group.reduce((acc, holding) => acc + getHoldingValue(holding), 0)\n const groupValues = group.reduce((acc, holding) => {\n const value = extractValueFn(holding)\n Object.keys(value).forEach((key) => (acc[key] = (acc[key] || 0) + value[key]))\n return acc\n }, {} as WeightMap)\n\n return Object.fromEntries(\n Object.entries(groupValues).map(([key, value]) => [key, (value / totalValue) * 100]),\n )\n }\n\n const data = {\n stocks: processGroupData(stocks, extractStockValueFromWeight),\n bonds: processGroupData(bonds, extractBondValueFromWeight),\n }\n\n return data\n}\n\nexport const analysisDetailsData = (holdings: Holding[]) => {\n const stocks = holdings.filter((holding) => !isNaN(holding.equity_classification))\n const bonds = holdings.filter((holding) => !isNaN(holding.fixed_income_classification))\n\n const aggregateValues = (\n holdings: Holding[],\n extractValueFn: (holding: Holding) => WeightMap,\n classificationTypes: Record<string, number>,\n ) => {\n return holdings.reduce((acc, holding) => {\n const values = extractValueFn(holding)\n Object.keys(classificationTypes).forEach((sector) => {\n acc[sector] = (acc[sector] || 0) + (values[sector] || 0)\n })\n return acc\n }, {} as WeightMap)\n }\n\n return {\n stocks: aggregateValues(stocks, extractStockValueFromWeight, EquityClassificationTypes),\n bonds: aggregateValues(bonds, extractBondValueFromWeight, FixedIncomeClassificationTypes),\n }\n}\n\nexport const calculateWeightedValue = (weights: WeightMap, value: number): WeightMap => {\n return Object.fromEntries(\n Object.entries(weights).map(([key, weight]) => [key, (weight * value) / 100]),\n )\n}\n\nconst extractBondValueFromWeight = (bond: Holding) =>\n extractValueFromWeight(bond, extractBondWeight, FixedIncomeClassificationValues)\n\nexport const extractBondWeight = (bond: Holding): WeightMap => {\n const classificationKey = bond.fixed_income_classification\n return {\n [FixedIncomeClassificationValues[\n classificationKey as keyof typeof FixedIncomeClassificationValues\n ]]: 100,\n }\n}\n\nconst extractStockValueFromWeight = (stock: Holding) =>\n extractValueFromWeight(stock, extractStockWeight, EquityClassificationValues)\n\nexport const extractStockWeight = (stock: Holding): WeightMap => {\n const {\n large_core_weight,\n large_growth_weight,\n large_value_weight,\n mid_core_weight,\n mid_growth_weight,\n mid_value_weight,\n small_core_weight,\n small_growth_weight,\n small_value_weight,\n unknown_weight,\n equity_classification,\n } = stock\n\n const data: WeightMap = {\n LARGE_CORE: large_core_weight ?? 0,\n LARGE_GROWTH: large_growth_weight ?? 0,\n LARGE_VALUE: large_value_weight ?? 0,\n MID_CORE: mid_core_weight ?? 0,\n MID_GROWTH: mid_growth_weight ?? 0,\n MID_VALUE: mid_value_weight ?? 0,\n SMALL_CORE: small_core_weight ?? 0,\n SMALL_GROWTH: small_growth_weight ?? 0,\n SMALL_VALUE: small_value_weight ?? 0,\n UNKNOWN: unknown_weight ?? 0,\n }\n\n if (sumValues(data) === 0 && equity_classification !== undefined) {\n const key =\n EquityClassificationValues[equity_classification as keyof typeof EquityClassificationValues]\n return { [key]: 100 }\n }\n\n return data\n}\n\nexport const extractValueFromWeight = (\n holding: Holding,\n extractWeightFn: (h: Holding) => WeightMap,\n classificationValues: Record<string, string>,\n): WeightMap => {\n const weights = extractWeightFn(holding)\n const value = getHoldingValue(holding)\n const weightedValues = calculateWeightedValue(weights, value)\n\n if (sumValues(weightedValues) === 0) {\n const classificationKey = String(\n holding.equity_classification ?? holding.fixed_income_classification,\n )\n\n if (classificationKey in classificationValues) {\n return { [classificationValues[classificationKey]]: value }\n } else {\n console.error(`Invalid classification key: ${classificationKey}`)\n }\n }\n\n return weightedValues\n}\n\nexport const formatKey = (key: string): string =>\n key\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ')\n\nexport const formatPercent = (value: number): string =>\n value >= 1 ? `${numeral(value).format('0')}%` : '< 1%'\n\nexport const getHoldingValue = (holding: Holding): number =>\n holding.calculated_market_value ?? holding.market_value\n\nexport const getValidHoldings = (\n holdings: Holding[],\n extractWeightFn: (holding: Holding) => WeightMap,\n): Holding[] => {\n return holdings.filter((holding) => {\n const weight = extractWeightFn(holding)\n return isInStyleWeightBand(sumValues(weight))\n })\n}\n\nexport const mapDataToPercentageGrid = (\n data: Record<AnalysisType, Record<string, number>>,\n analysisType: AnalysisType,\n): string[][] => {\n const groups = analysisType === AnalysisType.Stocks ? stockGroups : bondGroups\n\n const selected = data[analysisType]\n if (!selected || Object.keys(selected).length === 0)\n return groups.map((group) => group.map(() => '0%'))\n\n return groups.map((group) => group.map((key) => formatPercent(selected[key] ?? 0)))\n}\n\nexport const sumValues = (obj: WeightMap): number =>\n Object.values(obj).reduce((acc, val) => acc + val, 0)\n"],"mappings":";;AAkBA,IAAM,IAAmB,IACnB,IAAmB,KACnB,IAAA,CAAuB,MAC3B,IAAQ,KAAoB,IAAQ,GAGzB,IAAA,CAAsB,MAA4B;AAC7D,QAAM,IAAI,OAAO,CAAK;AACtB,SAAO,OAAO,SAAS,CAAC,KAAK,MAAM;AACrC,GAGa,IAAA,CAAyB,MAA4B;AAChE,QAAM,IAAI,OAAO,CAAK;AACtB,SAAO,OAAO,SAAS,CAAC,KAAK,KAAK,KAAK,KAAK;AAC9C,GAKa,IAAA,CAAuB,MAA8B;AAChE,QAAM,IAAa,EAAkB,OAAA,CAAQ,GAAK,MAAQ,KAAO,OAAO,EAAQ,CAAA,CAAI,KAAK,IAAI,CAAC;AAC9F,SACE,EAAoB,CAAU,KAC7B,MAAe,MACb,EAAsB,EAAQ,qBAAqB,KAClD,EAAsB,EAAQ,2BAA2B;AAEjE,GAEa,IAAA,CAA4B,MACvC,EAAgB,KAAA,CAAM,MAAQ,EAAmB,EAAQ,CAAA,CAAI,CAAC,GAEnD,IAAA,CAAgB,GAA2C,IAAY,MAAM;AACxF,QAAM,IAAO,OAAO,KAAK,CAAiB,EACvC,IAAI,MAAM,EACV,OAAA,CAAQ,MAAM,MAAM,CAAC,EACrB,KAAA,CAAM,GAAG,MAAM,IAAI,CAAC,GAEjB,IAAS,CAAC;AAChB,WAAS,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK,EACpC,CAAA,EAAO,KAAK,EAAK,MAAM,GAAG,IAAI,CAAS,EAAE,IAAA,CAAK,MAAQ,EAAkB,CAAA,CAAI,CAAC;AAE/E,SAAO;AACT,GAEa,IAAa,EAAa,CAA+B,GACzD,IAAc,EAAa,CAA0B,GAErD,IAAA,CAAqB,MAAwB;AACxD,QAAM,IAAS,EAAiB,GAAU,CAAkB,GACtD,IAAQ,EAAiB,GAAU,CAAiB,GAEpD,IAAA,CAAoB,GAAkB,MAAoD;AAC9F,UAAM,IAAa,EAAM,OAAA,CAAQ,GAAK,MAAY,IAAM,EAAgB,CAAO,GAAG,CAAC,GAC7E,IAAc,EAAM,OAAA,CAAQ,GAAK,MAAY;AACjD,YAAM,IAAQ,EAAe,CAAO;AACpC,oBAAO,KAAK,CAAK,EAAE,QAAA,CAAS,MAAS,EAAI,CAAA,KAAQ,EAAI,CAAA,KAAQ,KAAK,EAAM,CAAA,CAAK,GACtE;AAAA,IACT,GAAG,CAAC,CAAc;AAElB,WAAO,OAAO,YACZ,OAAO,QAAQ,CAAW,EAAE,IAAA,CAAK,CAAC,GAAK,CAAA,MAAW,CAAC,GAAM,IAAQ,IAAc,GAAG,CAAC,CACrF;AAAA,EACF;AAOA,SAAO;AAAA,IAJL,QAAQ,EAAiB,GAAQ,CAA2B;AAAA,IAC5D,OAAO,EAAiB,GAAO,CAA0B;AAAA,EAGpD;AACT,GAEa,IAAA,CAAuB,MAAwB;AAC1D,QAAM,IAAS,EAAS,OAAA,CAAQ,MAAY,CAAC,MAAM,EAAQ,qBAAqB,CAAC,GAC3E,IAAQ,EAAS,OAAA,CAAQ,MAAY,CAAC,MAAM,EAAQ,2BAA2B,CAAC,GAEhF,IAAA,CACJ,GACA,GACA,MAEO,EAAS,OAAA,CAAQ,GAAK,MAAY;AACvC,UAAM,IAAS,EAAe,CAAO;AACrC,kBAAO,KAAK,CAAmB,EAAE,QAAA,CAAS,MAAW;AACnD,MAAA,EAAI,CAAA,KAAW,EAAI,CAAA,KAAW,MAAM,EAAO,CAAA,KAAW;AAAA,IACxD,CAAC,GACM;AAAA,EACT,GAAG,CAAC,CAAc;AAGpB,SAAO;AAAA,IACL,QAAQ,EAAgB,GAAQ,GAA6B,CAAyB;AAAA,IACtF,OAAO,EAAgB,GAAO,GAA4B,CAA8B;AAAA,EAC1F;AACF,GAEa,IAAA,CAA0B,GAAoB,MAClD,OAAO,YACZ,OAAO,QAAQ,CAAO,EAAE,IAAA,CAAK,CAAC,GAAK,CAAA,MAAY,CAAC,GAAM,IAAS,IAAS,GAAG,CAAC,CAC9E,GAGI,IAAA,CAA8B,MAClC,EAAuB,GAAM,GAAmB,CAA+B,GAEpE,IAAA,CAAqB,MAA6B;AAC7D,QAAM,IAAoB,EAAK;AAC/B,SAAO,EAAA,CACJ,EACC,CAAA,CAAA,GACE,IACN;AACF,GAEM,IAAA,CAA+B,MACnC,EAAuB,GAAO,GAAoB,CAA0B,GAEjE,IAAA,CAAsB,MAA8B;AAC/D,QAAM,EACJ,mBAAA,GACA,qBAAA,GACA,oBAAA,GACA,iBAAA,GACA,mBAAA,GACA,kBAAA,GACA,mBAAA,GACA,qBAAA,GACA,oBAAA,GACA,gBAAA,GACA,uBAAA,EAAA,IACE,GAEE,IAAkB;AAAA,IACtB,YAAY,KAAqB;AAAA,IACjC,cAAc,KAAuB;AAAA,IACrC,aAAa,KAAsB;AAAA,IACnC,UAAU,KAAmB;AAAA,IAC7B,YAAY,KAAqB;AAAA,IACjC,WAAW,KAAoB;AAAA,IAC/B,YAAY,KAAqB;AAAA,IACjC,cAAc,KAAuB;AAAA,IACrC,aAAa,KAAsB;AAAA,IACnC,SAAS,KAAkB;AAAA,EAC7B;AAEA,SAAI,EAAU,CAAI,MAAM,KAAK,MAA0B,SAG9C,EAAA,CADL,EAA2B,CAAA,CAAA,GACb,IAAI,IAGf;AACT,GAEa,IAAA,CACX,GACA,GACA,MACc;AACd,QAAM,IAAU,EAAgB,CAAO,GACjC,IAAQ,EAAgB,CAAO,GAC/B,IAAiB,EAAuB,GAAS,CAAK;AAE5D,MAAI,EAAU,CAAc,MAAM,GAAG;AACnC,UAAM,IAAoB,OACxB,EAAQ,yBAAyB,EAAQ,2BAC3C;AAEA,QAAI,KAAqB,EACvB,QAAO,EAAA,CAAG,EAAqB,CAAA,CAAA,GAAqB,EAAM;AAE1D,YAAQ,MAAM,+BAA+B,CAAA,EAAmB;AAAA,EAEpE;AAEA,SAAO;AACT,GAEa,IAAA,CAAa,MACxB,EACG,MAAM,GAAG,EACT,IAAA,CAAK,MAAS,EAAK,OAAO,CAAC,EAAE,YAAY,IAAI,EAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACxE,KAAK,GAAG,GAEA,IAAA,CAAiB,MAC5B,KAAS,IAAI,GAAG,EAAQ,CAAK,EAAE,OAAO,GAAG,CAAA,MAAO,QAErC,IAAA,CAAmB,MAC9B,EAAQ,2BAA2B,EAAQ,cAEhC,IAAA,CACX,GACA,MAEO,EAAS,OAAA,CAAQ,MAAY;AAClC,QAAM,IAAS,EAAgB,CAAO;AACtC,SAAO,EAAoB,EAAU,CAAM,CAAC;AAC9C,CAAC,GAGU,IAAA,CACX,GACA,MACe;AACf,QAAM,IAAS,MAAiB,EAAa,SAAS,IAAc,GAE9D,IAAW,EAAK,CAAA;AACtB,SAAI,CAAC,KAAY,OAAO,KAAK,CAAQ,EAAE,WAAW,IACzC,EAAO,IAAA,CAAK,MAAU,EAAM,IAAA,MAAU,IAAI,CAAC,IAE7C,EAAO,IAAA,CAAK,MAAU,EAAM,IAAA,CAAK,MAAQ,EAAc,EAAS,CAAA,KAAQ,CAAC,CAAC,CAAC;AACpF,GAEa,IAAA,CAAa,MACxB,OAAO,OAAO,CAAG,EAAE,OAAA,CAAQ,GAAK,MAAQ,IAAM,GAAK,CAAC"}
@@ -1,6 +1,6 @@
1
1
  var o = (a) => ({
2
2
  SavingsAccountBalancesSummary: { color: a.palette.success.main },
3
- MonthlySpendComparison: { color: a.palette.chart.chart5 }
3
+ MonthlySpendComparison: { color: a.palette.chart.chart2 }
4
4
  });
5
5
  export {
6
6
  o as getLayoutConfig
@@ -1 +1 @@
1
- {"version":3,"file":"layout.es.js","names":[],"sources":["../../../../../src/insights-v2/blocks/ChartBlocks/BarchartBlock/layout.ts"],"sourcesContent":["import { type Theme } from '@mui/material/styles'\nexport const getLayoutConfig = (theme: Theme) => {\n return {\n SavingsAccountBalancesSummary: {\n color: theme.palette.success.main,\n },\n MonthlySpendComparison: {\n color: theme.palette.chart.chart5,\n },\n }\n}\n"],"mappings":"AACA,IAAa,IAAA,CAAmB,OACvB;AAAA,EACL,+BAA+B,EAC7B,OAAO,EAAM,QAAQ,QAAQ,KAC/B;AAAA,EACA,wBAAwB,EACtB,OAAO,EAAM,QAAQ,MAAM,OAC7B;AACF"}
1
+ {"version":3,"file":"layout.es.js","names":[],"sources":["../../../../../src/insights-v2/blocks/ChartBlocks/BarchartBlock/layout.ts"],"sourcesContent":["import { type Theme } from '@mui/material/styles'\nexport const getLayoutConfig = (theme: Theme) => {\n return {\n SavingsAccountBalancesSummary: {\n color: theme.palette.success.main,\n },\n MonthlySpendComparison: {\n color: theme.palette.chart.chart2,\n },\n }\n}\n"],"mappings":"AACA,IAAa,IAAA,CAAmB,OACvB;AAAA,EACL,+BAA+B,EAC7B,OAAO,EAAM,QAAQ,QAAQ,KAC/B;AAAA,EACA,wBAAwB,EACtB,OAAO,EAAM,QAAQ,MAAM,OAC7B;AACF"}
@@ -1,34 +1,35 @@
1
- import { buildDynamicCopy as m } from "../../../../core/utils/Localization.es.js";
1
+ import { buildDynamicCopy as n } from "../../../../core/utils/Localization.es.js";
2
2
  import { DATE_FORMATS_INTL as i, formatDate as u } from "../../../../core/constants/DateFormats.es.js";
3
3
  import { getCategoryColor as C } from "../../../../core/utils/CategoryUtil.es.js";
4
- import { formatCurrency as n } from "../../../../core/utils/NumberFormatting.es.js";
5
- import { getLayoutConfig as A } from "./layout.es.js";
6
- var p = {
4
+ import { formatCurrency as m } from "../../../../core/utils/NumberFormatting.es.js";
5
+ import { getLayoutConfig as p } from "./layout.es.js";
6
+ import { parseISO as A } from "date-fns/parseISO";
7
+ var O = {
7
8
  CATEGORY_COLOR: "CategoryColor",
8
9
  SAVINGS_ACCOUNT_BALANCES_SUMMARY: "SavingsAccountBalancesSummary",
9
10
  MONTHLY_SPEND_COMPARISON: "MonthlySpendComparison"
10
- }, y = (a) => a ? a.data ? a.data.map((t) => {
11
+ }, l = (t) => t ? t.data ? t.data.map((o) => {
11
12
  const r = {};
12
- return a.names?.map((o, e) => {
13
- r[o] = t[e];
13
+ return t.names?.map((a, e) => {
14
+ r[a] = o[e];
14
15
  }), r;
15
- }) : [] : [], S = (a, t) => a.map((r) => {
16
- const o = u(r.date, i.MONTH_SHORT);
16
+ }) : [] : [], y = (t, o) => [...t].sort((r, a) => new Date(r.date).getTime() - new Date(a.date).getTime()).map((r) => {
17
+ const a = u(A(r.date), i.MONTH_SHORT);
17
18
  return {
18
- ariaLabel: m(t, o, n(r.amount, "0.00")),
19
- label: o,
19
+ ariaLabel: n(o, a, m(r.amount, "0.00")),
20
+ label: a,
20
21
  value: r.amount,
21
- formattedAmount: n(r.amount, "0,0")
22
+ formattedAmount: m(r.amount, "0,0")
22
23
  };
23
- }), R = (a, t, r) => {
24
- const { variant: o } = a, e = A(r);
25
- return o === p.CATEGORY_COLOR && t.category_guid ? { color: C(t.category_guid, r) } : { color: e[o]?.color ?? r.palette.primary.main };
24
+ }), s = (t, o, r) => {
25
+ const { variant: a } = t, e = p(r);
26
+ return a === O.CATEGORY_COLOR && o.category_guid ? { color: C(o.category_guid, r) } : { color: e[a]?.color ?? r.palette.primary.main };
26
27
  };
27
28
  export {
28
- p as BAR_CHART_VARIANTS,
29
- R as barChartVariant,
30
- S as buildChartData,
31
- y as buildDataSeries
29
+ O as BAR_CHART_VARIANTS,
30
+ s as barChartVariant,
31
+ y as buildChartData,
32
+ l as buildDataSeries
32
33
  };
33
34
 
34
35
  //# sourceMappingURL=utils.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.es.js","names":[],"sources":["../../../../../src/insights-v2/blocks/ChartBlocks/BarchartBlock/utils.ts"],"sourcesContent":["import { type Theme } from '@mui/material/styles'\n\nimport { getCategoryColor } from '../../../../core/utils/CategoryUtil'\nimport { buildDynamicCopy } from '../../../../core/utils/Localization'\nimport { formatCurrency } from '../../../../core/utils/NumberFormatting'\nimport { DATE_FORMATS_INTL, formatDate } from '../../../../core/constants'\nimport type { DataSeries, InstanceSlot } from '../../../../core'\nimport type { InsightsInstanceSlotData } from '../../../../core/types/InsightsInstanceSlotData'\nimport { getLayoutConfig } from './layout'\n\nexport const BAR_CHART_VARIANTS = {\n CATEGORY_COLOR: 'CategoryColor',\n SAVINGS_ACCOUNT_BALANCES_SUMMARY: 'SavingsAccountBalancesSummary',\n MONTHLY_SPEND_COMPARISON: 'MonthlySpendComparison',\n}\n\nexport const buildDataSeries = (data: DataSeries | undefined) => {\n if (!data) {\n return []\n }\n\n if (data.data) {\n return data.data.map((d) => {\n const item: any = {}\n\n data.names?.map((name, index) => {\n item[name] = d[index]\n })\n return item\n })\n } else {\n return []\n }\n}\n\nexport const buildChartData = (dataSeries: any[], ariaLabel: string) => {\n const data = dataSeries.map((total) => {\n const label = formatDate(total.date, DATE_FORMATS_INTL.MONTH_SHORT)\n\n return {\n ariaLabel: buildDynamicCopy(ariaLabel, label, formatCurrency(total.amount, '0.00')) as string,\n label,\n value: total.amount,\n formattedAmount: formatCurrency(total.amount, '0,0'),\n }\n })\n\n return data\n}\n\nexport const barChartVariant = (\n instanceSlot: InstanceSlot,\n instanceSlotData: InsightsInstanceSlotData,\n theme: Theme,\n) => {\n const { variant } = instanceSlot\n const barChartLayout = getLayoutConfig(theme)\n if (variant === BAR_CHART_VARIANTS.CATEGORY_COLOR && instanceSlotData.category_guid) {\n const categoryColor = getCategoryColor(instanceSlotData.category_guid, theme)\n return {\n color: categoryColor,\n }\n }\n return {\n color:\n barChartLayout[variant as keyof typeof barChartLayout]?.color ?? theme.palette.primary.main,\n }\n}\n"],"mappings":";;;;;AAUA,IAAa,IAAqB;AAAA,EAChC,gBAAgB;AAAA,EAChB,kCAAkC;AAAA,EAClC,0BAA0B;AAC5B,GAEa,IAAA,CAAmB,MACzB,IAID,EAAK,OACA,EAAK,KAAK,IAAA,CAAK,MAAM;AAC1B,QAAM,IAAY,CAAC;AAEnB,SAAA,EAAK,OAAO,IAAA,CAAK,GAAM,MAAU;AAC/B,IAAA,EAAK,CAAA,IAAQ,EAAE,CAAA;AAAA,EACjB,CAAC,GACM;AACT,CAAC,IAEM,CAAC,IAbD,CAAC,GAiBC,IAAA,CAAkB,GAAmB,MACnC,EAAW,IAAA,CAAK,MAAU;AACrC,QAAM,IAAQ,EAAW,EAAM,MAAM,EAAkB,WAAW;AAElE,SAAO;AAAA,IACL,WAAW,EAAiB,GAAW,GAAO,EAAe,EAAM,QAAQ,MAAM,CAAC;AAAA,IAClF,OAAA;AAAA,IACA,OAAO,EAAM;AAAA,IACb,iBAAiB,EAAe,EAAM,QAAQ,KAAK;AAAA,EACrD;AACF,CAEO,GAGI,IAAA,CACX,GACA,GACA,MACG;AACH,QAAM,EAAE,SAAA,EAAA,IAAY,GACd,IAAiB,EAAgB,CAAK;AAC5C,SAAI,MAAY,EAAmB,kBAAkB,EAAiB,gBAE7D,EACL,OAFoB,EAAiB,EAAiB,eAAe,CAE9D,EACT,IAEK,EACL,OACE,EAAe,CAAA,GAAyC,SAAS,EAAM,QAAQ,QAAQ,KAC3F;AACF"}
1
+ {"version":3,"file":"utils.es.js","names":[],"sources":["../../../../../src/insights-v2/blocks/ChartBlocks/BarchartBlock/utils.ts"],"sourcesContent":["import { type Theme } from '@mui/material/styles'\n\nimport { parseISO } from 'date-fns/parseISO'\n\nimport { getCategoryColor } from '../../../../core/utils/CategoryUtil'\nimport { buildDynamicCopy } from '../../../../core/utils/Localization'\nimport { formatCurrency } from '../../../../core/utils/NumberFormatting'\nimport { DATE_FORMATS_INTL, formatDate } from '../../../../core/constants'\nimport type { DataSeries, InstanceSlot } from '../../../../core'\nimport type { InsightsInstanceSlotData } from '../../../../core/types/InsightsInstanceSlotData'\nimport { getLayoutConfig } from './layout'\n\nexport const BAR_CHART_VARIANTS = {\n CATEGORY_COLOR: 'CategoryColor',\n SAVINGS_ACCOUNT_BALANCES_SUMMARY: 'SavingsAccountBalancesSummary',\n MONTHLY_SPEND_COMPARISON: 'MonthlySpendComparison',\n}\n\nexport const buildDataSeries = (data: DataSeries | undefined) => {\n if (!data) {\n return []\n }\n\n if (data.data) {\n return data.data.map((d) => {\n const item: any = {}\n\n data.names?.map((name, index) => {\n item[name] = d[index]\n })\n return item\n })\n } else {\n return []\n }\n}\n\nexport const buildChartData = (dataSeries: any[], ariaLabel: string) => {\n // Bars render oldest→newest (Jan→Dec, left→right, per Figma). The single-bar backend sends\n // data_series newest-first, so normalize date-ascending here — the single source of truth for both\n // the card (BarchartBlock) and the drill-down. This keeps their bar/tab indices aligned, which the\n // card relies on when it forwards a clicked bar index straight to the drill-down (openChartDrilldown).\n const data = [...dataSeries]\n .sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime())\n .map((total) => {\n const label = formatDate(parseISO(total.date), DATE_FORMATS_INTL.MONTH_SHORT)\n\n return {\n ariaLabel: buildDynamicCopy(\n ariaLabel,\n label,\n formatCurrency(total.amount, '0.00'),\n ) as string,\n label,\n value: total.amount,\n formattedAmount: formatCurrency(total.amount, '0,0'),\n }\n })\n\n return data\n}\n\nexport const barChartVariant = (\n instanceSlot: InstanceSlot,\n instanceSlotData: InsightsInstanceSlotData,\n theme: Theme,\n) => {\n const { variant } = instanceSlot\n const barChartLayout = getLayoutConfig(theme)\n if (variant === BAR_CHART_VARIANTS.CATEGORY_COLOR && instanceSlotData.category_guid) {\n const categoryColor = getCategoryColor(instanceSlotData.category_guid, theme)\n return {\n color: categoryColor,\n }\n }\n return {\n color:\n barChartLayout[variant as keyof typeof barChartLayout]?.color ?? theme.palette.primary.main,\n }\n}\n"],"mappings":";;;;;;AAYA,IAAa,IAAqB;AAAA,EAChC,gBAAgB;AAAA,EAChB,kCAAkC;AAAA,EAClC,0BAA0B;AAC5B,GAEa,IAAA,CAAmB,MACzB,IAID,EAAK,OACA,EAAK,KAAK,IAAA,CAAK,MAAM;AAC1B,QAAM,IAAY,CAAC;AAEnB,SAAA,EAAK,OAAO,IAAA,CAAK,GAAM,MAAU;AAC/B,IAAA,EAAK,CAAA,IAAQ,EAAE,CAAA;AAAA,EACjB,CAAC,GACM;AACT,CAAC,IAEM,CAAC,IAbD,CAAC,GAiBC,IAAA,CAAkB,GAAmB,MAKnC,CAAC,GAAG,CAAU,EACxB,KAAA,CAAM,GAAG,MAAM,IAAI,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,EACtE,IAAA,CAAK,MAAU;AACd,QAAM,IAAQ,EAAW,EAAS,EAAM,IAAI,GAAG,EAAkB,WAAW;AAE5E,SAAO;AAAA,IACL,WAAW,EACT,GACA,GACA,EAAe,EAAM,QAAQ,MAAM,CACrC;AAAA,IACA,OAAA;AAAA,IACA,OAAO,EAAM;AAAA,IACb,iBAAiB,EAAe,EAAM,QAAQ,KAAK;AAAA,EACrD;AACF,CAEK,GAGI,IAAA,CACX,GACA,GACA,MACG;AACH,QAAM,EAAE,SAAA,EAAA,IAAY,GACd,IAAiB,EAAgB,CAAK;AAC5C,SAAI,MAAY,EAAmB,kBAAkB,EAAiB,gBAE7D,EACL,OAFoB,EAAiB,EAAiB,eAAe,CAE9D,EACT,IAEK,EACL,OACE,EAAe,CAAA,GAAyC,SAAS,EAAM,QAAQ,QAAQ,KAC3F;AACF"}
@@ -0,0 +1,8 @@
1
+ import { BlockProps } from '../../types';
2
+ /**
3
+ * Card block for the double-bar chart. Mirrors BarchartBlock: it builds the shaped series
4
+ * (buildComparisonSeries) and resolves the card palette (getLayoutConfig), then renders the reusable
5
+ * DoubleBarChart and injects the card click behavior \u2014 open the shared drawer scoped to this beat
6
+ * (chartBarIndex = clicked column, tabIndex = clicked sub-series).
7
+ */
8
+ export declare const DoubleBarChartBlock: ({ payload: { instance_slot, instance_slot_data, widget_type }, beatGuid, }: BlockProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,24 @@
1
+ import { useInsightsV2Store as h } from "../../../../common/context/hooks.es.js";
2
+ import { DoubleBarChart as u } from "../../../components/chartblocks/DoubleBarChart.es.js";
3
+ import { buildComparisonSeries as b } from "./comparisonUtils.es.js";
4
+ import { getLayoutConfig as C } from "./layout.es.js";
5
+ import { jsx as B } from "react/jsx-runtime";
6
+ import { useTheme as g } from "@mui/material/styles";
7
+ var L = ({ payload: { instance_slot: o, instance_slot_data: r, widget_type: t }, beatGuid: a = "" }) => {
8
+ const e = g(), { openChartDrilldown: i } = h(), { variant: n } = o, { ariaLabel: s = "", data_series: m, legends: l } = r, c = b(m, s), p = C(e, n)?.color ?? [];
9
+ return /* @__PURE__ */ B(u, {
10
+ bars: c,
11
+ colors: p,
12
+ isMini: t === "mini",
13
+ legends: l,
14
+ onBarClick: (d, f) => i(a, {
15
+ chartBarIndex: d,
16
+ tabIndex: f
17
+ })
18
+ });
19
+ };
20
+ export {
21
+ L as DoubleBarChartBlock
22
+ };
23
+
24
+ //# sourceMappingURL=DoubleBarChartBlock.es.js.map