@embeddable.com/remarkable-pro 0.0.2 → 0.0.4

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 (65) hide show
  1. package/README.md +68 -17
  2. package/dist/BarChartDefaultHorizontalPro.js +4 -4
  3. package/dist/BarChartDefaultPro.js +4 -4
  4. package/dist/BarChartGroupedHorizontalPro.js +4 -4
  5. package/dist/BarChartGroupedPro.js +4 -4
  6. package/dist/BarChartStackedHorizontalPro.js +4 -4
  7. package/dist/BarChartStackedPro.js +4 -4
  8. package/dist/{ChartCard-CsKQOusx.js → ChartCard-C7c2rTst.js} +3 -3
  9. package/dist/{ChartCard-CsKQOusx.js.map → ChartCard-C7c2rTst.js.map} +1 -1
  10. package/dist/{Color.type.emb-9H0O-uuD.js → Color.type.emb-CSPAaucR.js} +2 -2
  11. package/dist/{Color.type.emb-9H0O-uuD.js.map → Color.type.emb-CSPAaucR.js.map} +1 -1
  12. package/dist/ColorEditor.js +2 -2
  13. package/dist/{ComparisonPeriod.type.emb-C3XjaFoD.js → ComparisonPeriod.type.emb-DOpJ1iWj.js} +2 -2
  14. package/dist/{ComparisonPeriod.type.emb-C3XjaFoD.js.map → ComparisonPeriod.type.emb-DOpJ1iWj.js.map} +1 -1
  15. package/dist/ComparisonPeriodSelectFieldPro.js +4 -4
  16. package/dist/DateRangeSelectFieldPro.js +3 -3
  17. package/dist/DonutChartPro.js +3 -3
  18. package/dist/DonutLabelChartPro.js +3 -3
  19. package/dist/{EditorCard-BMEwnQuU.js → EditorCard-BtlvgP9q.js} +3 -3
  20. package/dist/{EditorCard-BMEwnQuU.js.map → EditorCard-BtlvgP9q.js.map} +1 -1
  21. package/dist/HeatMapPro.js +5 -5
  22. package/dist/KpiChartNumberComparisonPro.js +6 -6
  23. package/dist/KpiChartNumberPro.js +4 -4
  24. package/dist/LineChartComparisonDefaultPro.js +7 -7
  25. package/dist/LineChartDefaultPro.js +5 -5
  26. package/dist/LineChartGroupedPro.js +4 -4
  27. package/dist/MultiSelectFieldPro.js +3 -3
  28. package/dist/PieChartPro.js +3 -3
  29. package/dist/PivotTablePro.js +128 -69
  30. package/dist/PivotTablePro.js.map +1 -1
  31. package/dist/SingleSelectFieldPro.js +3 -3
  32. package/dist/TableChartPaginated.js +4 -4
  33. package/dist/{bars.utils-BU_k5fia.js → bars.utils-JRnFN04m.js} +4 -4
  34. package/dist/{bars.utils-BU_k5fia.js.map → bars.utils-JRnFN04m.js.map} +1 -1
  35. package/dist/{charts.utils-rO92wRxO.js → charts.utils-DAkS2VK1.js} +4 -4
  36. package/dist/{charts.utils-rO92wRxO.js.map → charts.utils-DAkS2VK1.js.map} +1 -1
  37. package/dist/{component.constants-uP1WYyUb.js → component.constants-h6et83ck.js} +2 -2
  38. package/dist/{component.constants-uP1WYyUb.js.map → component.constants-h6et83ck.js.map} +1 -1
  39. package/dist/components/charts/tables/PivotTablePro/PivotPro.utils.d.ts +4 -1
  40. package/dist/components/charts/tables/PivotTablePro/PivotPro.utils.d.ts.map +1 -1
  41. package/dist/components/charts/tables/PivotTablePro/index.d.ts.map +1 -1
  42. package/dist/embeddable-components.json +16 -16
  43. package/dist/{formatter.utils-CeEdL8uQ.js → formatter.utils-DXzI4Hz_.js} +2 -2
  44. package/dist/{formatter.utils-CeEdL8uQ.js.map → formatter.utils-DXzI4Hz_.js.map} +1 -1
  45. package/dist/{index-DLFOG9Ar.js → index-B4S34Z5S.js} +6 -6
  46. package/dist/{index-DLFOG9Ar.js.map → index-B4S34Z5S.js.map} +1 -1
  47. package/dist/{index-DedIqjbn.js → index-BR6dp5RX.js} +6 -7
  48. package/dist/{index-DedIqjbn.js.map → index-BR6dp5RX.js.map} +1 -1
  49. package/dist/{index-B8bT85NR.js → index-C8O2asSv.js} +5 -5
  50. package/dist/{index-B8bT85NR.js.map → index-C8O2asSv.js.map} +1 -1
  51. package/dist/{index-Brb617sy.js → index-CWYH2gE2.js} +5 -5
  52. package/dist/{index-Brb617sy.js.map → index-CWYH2gE2.js.map} +1 -1
  53. package/dist/{index-BWpUwKTH.js → index-Czj-HZH9.js} +5 -5
  54. package/dist/{index-BWpUwKTH.js.map → index-Czj-HZH9.js.map} +1 -1
  55. package/dist/{index-DrosyYQD.js → index-DF-AuKua.js} +4 -4
  56. package/dist/{index-DrosyYQD.js.map → index-DF-AuKua.js.map} +1 -1
  57. package/dist/{index-Dwl9clc9.js → index-QOVQo6ZK.js} +5 -5
  58. package/dist/{index-Dwl9clc9.js.map → index-QOVQo6ZK.js.map} +1 -1
  59. package/dist/index.js +13 -13
  60. package/dist/{pies.utils-Dap7Duqb.js → pies.utils-Bl8jquyV.js} +5 -5
  61. package/dist/{pies.utils-Dap7Duqb.js.map → pies.utils-Bl8jquyV.js.map} +1 -1
  62. package/dist/remarkable-pro.css +1 -446
  63. package/dist/{timeRange.utils-J3a4XL64.js → timeRange.utils-CslTQiVA.js} +2 -2
  64. package/dist/{timeRange.utils-J3a4XL64.js.map → timeRange.utils-CslTQiVA.js.map} +1 -1
  65. package/package.json +4 -6
@@ -1,93 +1,152 @@
1
- import { j as u, n as x, l as y } from "./index-DedIqjbn.js";
2
- import { useTheme as A, defineComponent as M } from "@embeddable.com/react";
3
- import { a as S, r as W, i as N, v as j, E as c, k as r, z as d, F as G, G as k, d as B, c as h, H as I } from "./component.constants-uP1WYyUb.js";
4
- import { C as E } from "./ChartCard-CsKQOusx.js";
5
- import { useRef as O } from "react";
6
- import { u as p } from "./charts.fillGaps.hooks-YayOXVmt.js";
7
- import { g as w } from "./formatter.utils-CeEdL8uQ.js";
8
- const V = (e, o) => {
9
- const t = w(o);
10
- return e.measures.map((s) => {
11
- var n, a;
1
+ import { j as A, n as x, l as G } from "./index-BR6dp5RX.js";
2
+ import { useTheme as N, defineComponent as j } from "@embeddable.com/react";
3
+ import { a as O, r as k, i as E, v as I, E as F, k as v, z as y, F as V, G as q, d as z, c as D, H } from "./component.constants-h6et83ck.js";
4
+ import { C as L } from "./ChartCard-C7c2rTst.js";
5
+ import { useMemo as _, useRef as J } from "react";
6
+ import { u as M } from "./charts.fillGaps.hooks-YayOXVmt.js";
7
+ import { g as W } from "./formatter.utils-DXzI4Hz_.js";
8
+ const K = (e, t) => {
9
+ const n = W(t);
10
+ return e.measures.map((o) => {
11
+ var s, a;
12
12
  return {
13
- key: s.name,
14
- label: t.dimensionOrMeasureTitle(s),
15
- showAsPercentage: !!((n = s.inputs) != null && n.showAsPercentage),
16
- percentageDecimalPlaces: ((a = s.inputs) == null ? void 0 : a.decimalPlaces) ?? 1,
17
- accessor: (i) => i[s.name] == null ? e.displayNullAs : t.data(s, i[s.name])
13
+ key: o.name,
14
+ label: n.dimensionOrMeasureTitle(o),
15
+ showAsPercentage: !!((s = o.inputs) != null && s.showAsPercentage),
16
+ percentageDecimalPlaces: ((a = o.inputs) == null ? void 0 : a.decimalPlaces) ?? 1,
17
+ accessor: (r) => r[o.name] == null ? e.displayNullAs : n.data(o, r[o.name])
18
18
  };
19
19
  });
20
- }, b = (e, o) => {
21
- const t = w(o);
20
+ }, S = (e, t) => {
21
+ const n = W(t);
22
22
  return {
23
23
  key: e.dimension.name,
24
- label: t.dimensionOrMeasureTitle(e.dimension),
25
- formatValue: (s) => t.data(e.dimension, s)
24
+ label: n.dimensionOrMeasureTitle(e.dimension),
25
+ formatValue: (o) => n.data(e.dimension, o)
26
26
  };
27
- }, z = (e) => e.filter((o) => {
28
- var t;
29
- return (t = o.inputs) == null ? void 0 : t.showColumnTotal;
30
- }).map((o) => o.name), H = (e) => e.filter((o) => {
31
- var t;
32
- return (t = o.inputs) == null ? void 0 : t.showRowTotal;
33
- }).map((o) => o.name), L = (e) => {
34
- const o = A();
35
- S(o);
36
- const { description: t, title: s } = W(e), { measures: n, rowDimension: a, columnDimension: i, displayNullAs: m, columnWidth: T, firstColumnWidth: f } = e, g = p({
27
+ }, Q = (e) => e.filter((t) => {
28
+ var n;
29
+ return (n = t.inputs) == null ? void 0 : n.showColumnTotal;
30
+ }).map((t) => t.name), U = (e) => e.filter((t) => {
31
+ var n;
32
+ return (n = t.inputs) == null ? void 0 : n.showRowTotal;
33
+ }).map((t) => t.name);
34
+ function X(e) {
35
+ let t = 0, n = 0;
36
+ for (let o = 0; o < e.length - 1; o++) {
37
+ const s = e[o], a = e[o + 1];
38
+ s == null || a == null || (s < a ? t++ : s > a && n++);
39
+ }
40
+ return t > n ? "asc" : n > t ? "desc" : "equal";
41
+ }
42
+ function C(e) {
43
+ let t = 0, n = 0;
44
+ for (let o = 0; o < e.length - 1; o++) {
45
+ const s = e[o], a = e[o + 1];
46
+ s == null || a == null || (s < a ? t++ : s > a && n++);
47
+ }
48
+ return t > 0 && n > 0;
49
+ }
50
+ const Y = (e) => (t, n) => e === "asc" ? t < n ? -1 : t > n ? 1 : 0 : e === "desc" ? t > n ? -1 : t < n ? 1 : 0 : 0, Z = (e, t, n, o, s, a) => {
51
+ const r = e.data ?? [], c = r[0];
52
+ if (!c) return [];
53
+ const b = () => a.reduce((l, i) => (l[i.name] = void 0, l), {}), f = (l, i, d) => {
54
+ if (!C(l))
55
+ return r;
56
+ const h = X(l), p = [...l].sort(Y(h)).map((m) => {
57
+ const u = r.find(
58
+ (w) => w[i.name] === m && w[d.name] === c[d.name]
59
+ );
60
+ return u || {
61
+ ...c,
62
+ [i.name]: m,
63
+ ...b()
64
+ };
65
+ }), T = r.filter(
66
+ (m) => !p.some(
67
+ (u) => u[i.name] === m[i.name] && u[d.name] === m[d.name]
68
+ )
69
+ );
70
+ return [...p, ...T];
71
+ };
72
+ return C(t) ? f(t, o, s) : C(n) ? f(n, s, o) : r;
73
+ }, $ = (e) => {
74
+ var R;
75
+ const t = N();
76
+ O(t);
77
+ const { description: n, title: o } = k(e), { measures: s, rowDimension: a, columnDimension: r, displayNullAs: c, columnWidth: b, firstColumnWidth: f } = e, l = Array.from(
78
+ new Set((e.results.data ?? []).filter(Boolean).map((g) => g[r.name]))
79
+ ), i = Array.from(
80
+ new Set((e.results.data ?? []).filter(Boolean).map((g) => g[a.name]))
81
+ ), d = M({
37
82
  results: e.results,
38
- dimension: i
39
- }), l = p({
40
- results: g,
83
+ dimension: r
84
+ }), h = M({
85
+ results: d,
41
86
  dimension: a
42
- }), v = O(null), D = V({ measures: n, displayNullAs: m }, o), P = b({ dimension: a }, o), C = b({ dimension: i }, o), F = z(n), R = H(n);
43
- return /* @__PURE__ */ u.jsx(
44
- E,
87
+ }), P = _(() => Z(
88
+ h,
89
+ l,
90
+ i,
91
+ r,
92
+ a,
93
+ s
94
+ ), [
95
+ h,
96
+ l,
97
+ i,
98
+ r,
99
+ a,
100
+ s
101
+ ]), p = J(null), T = K({ measures: s, displayNullAs: c }, t), m = S({ dimension: a }, t), u = S({ dimension: r }, t), w = Q(s), B = U(s);
102
+ return /* @__PURE__ */ A.jsx(
103
+ L,
45
104
  {
46
- ref: v,
47
- title: s,
48
- subtitle: t,
105
+ ref: p,
106
+ title: o,
107
+ subtitle: n,
49
108
  data: e.results,
50
- dimensionsAndMeasures: [a, i, ...n],
51
- errorMessage: l == null ? void 0 : l.error,
52
- children: /* @__PURE__ */ u.jsx(
109
+ dimensionsAndMeasures: [a, r, ...s],
110
+ errorMessage: (R = e.results) == null ? void 0 : R.error,
111
+ children: /* @__PURE__ */ A.jsx(
53
112
  x,
54
113
  {
55
114
  firstColumnWidth: f,
56
- columnWidth: T,
57
- totalLabel: N.t("charts.pivotTable.total"),
58
- data: l.data ?? [],
59
- measures: D,
60
- rowDimension: P,
61
- columnDimension: C,
62
- columnTotalsFor: F,
63
- rowTotalsFor: R
115
+ columnWidth: b,
116
+ totalLabel: E.t("charts.pivotTable.total"),
117
+ data: P,
118
+ measures: T,
119
+ rowDimension: m,
120
+ columnDimension: u,
121
+ columnTotalsFor: w,
122
+ rowTotalsFor: B
64
123
  }
65
124
  )
66
125
  }
67
126
  );
68
- }, _ = {
127
+ }, ee = {
69
128
  name: "PivotTablePro",
70
129
  label: "Pivot Table",
71
130
  category: "Table Charts",
72
131
  inputs: [
73
- j,
132
+ I,
74
133
  {
75
- ...c,
134
+ ...F,
76
135
  label: "Measures To Display",
77
136
  inputs: [
78
- ...c.inputs,
137
+ ...F.inputs,
79
138
  {
80
- ...r,
139
+ ...v,
81
140
  name: "showColumnTotal",
82
141
  label: "Show Column Total"
83
142
  },
84
143
  {
85
- ...r,
144
+ ...v,
86
145
  name: "showRowTotal",
87
146
  label: "Show Row Total"
88
147
  },
89
148
  {
90
- ...r,
149
+ ...v,
91
150
  name: "showAsPercentage",
92
151
  label: "Show As Percentage",
93
152
  description: "If turned on, other measures may be ignored",
@@ -96,36 +155,36 @@ const V = (e, o) => {
96
155
  ]
97
156
  },
98
157
  {
99
- ...d,
158
+ ...y,
100
159
  label: "Row Dimension",
101
160
  name: "rowDimension"
102
161
  },
103
162
  {
104
- ...d,
163
+ ...y,
105
164
  label: "Column Dimension",
106
165
  name: "columnDimension"
107
166
  },
108
- G,
109
- k,
110
- { ...B, name: "displayNullAs", label: "Display Null As" },
167
+ V,
168
+ q,
169
+ { ...z, name: "displayNullAs", label: "Display Null As" },
111
170
  {
112
- ...h,
171
+ ...D,
113
172
  name: "firstColumnWidth",
114
173
  label: "First Column Width",
115
174
  description: "Set the width in px (e.g. 200)"
116
175
  },
117
176
  {
118
- ...h,
177
+ ...D,
119
178
  name: "columnWidth",
120
179
  label: "Column Width",
121
180
  description: "Set the width in px (e.g. 200)"
122
181
  },
123
- I
182
+ H
124
183
  ]
125
- }, Z = M(L, _, {
184
+ }, ie = j($, ee, {
126
185
  props: (e) => ({
127
186
  ...e,
128
- results: y({
187
+ results: G({
129
188
  from: e.dataset,
130
189
  select: [e.rowDimension, e.columnDimension, ...e.measures],
131
190
  limit: e.maxResults,
@@ -134,7 +193,7 @@ const V = (e, o) => {
134
193
  })
135
194
  });
136
195
  export {
137
- Z as default,
138
- _ as meta
196
+ ie as default,
197
+ ee as meta
139
198
  };
140
199
  //# sourceMappingURL=PivotTablePro.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PivotTablePro.js","sources":["../src/components/charts/tables/PivotTablePro/PivotPro.utils.ts","../src/components/charts/tables/PivotTablePro/index.tsx","../src/components/charts/tables/PivotTablePro/PivotTablePro.emb.ts"],"sourcesContent":["import { Dimension, Measure } from '@embeddable.com/core';\nimport { Theme } from '../../../../theme/theme.types';\nimport { PivotTableProps } from '@embeddable.com/remarkable-ui';\nimport { getThemeFormatter } from '../../../../theme/formatter/formatter.utils';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const getPivotMeasures = (\n props: { measures: Measure[]; displayNullAs?: string },\n theme: Theme,\n): PivotTableProps<any>['measures'] => {\n const themeFormatter = getThemeFormatter(theme);\n\n return props.measures.map((measure) => {\n return {\n key: measure.name,\n label: themeFormatter.dimensionOrMeasureTitle(measure),\n showAsPercentage: Boolean(measure.inputs?.showAsPercentage),\n percentageDecimalPlaces: measure.inputs?.decimalPlaces ?? 1,\n accessor: (row) => {\n const value = row[measure.name];\n\n return value == null\n ? props.displayNullAs\n : themeFormatter.data(measure, row[measure.name]);\n },\n };\n });\n};\n\nexport const getPivotDimension = (\n props: { dimension: Dimension },\n theme: Theme,\n): PivotTableProps<any>['rowDimension' | 'columnDimension'] => {\n const themeFormatter = getThemeFormatter(theme);\n\n return {\n key: props.dimension.name,\n label: themeFormatter.dimensionOrMeasureTitle(props.dimension),\n formatValue: (value: string) => themeFormatter.data(props.dimension, value),\n };\n};\n\nexport const getPivotColumnTotalsFor = (\n measures: Measure[],\n): PivotTableProps<any>['columnTotalsFor'] | undefined => {\n return measures.filter((m) => m.inputs?.showColumnTotal).map((m) => m.name);\n};\n\nexport const getPivotRowTotalsFor = (\n measures: Measure[],\n): PivotTableProps<any>['rowTotalsFor'] | undefined => {\n return measures.filter((m) => m.inputs?.showRowTotal).map((m) => m.name);\n};\n","import { useTheme } from '@embeddable.com/react';\nimport { Theme } from '../../../../theme/theme.types';\nimport { i18n, i18nSetup } from '../../../../theme/i18n/i18n';\nimport { ChartCard } from '../../shared/ChartCard/ChartCard';\nimport { resolveI18nProps } from '../../../component.utils';\nimport { DataResponse, Dimension, Measure } from '@embeddable.com/core';\nimport { PivotTable } from '@embeddable.com/remarkable-ui';\nimport { useRef } from 'react';\nimport { useFillGaps } from '../../charts.fillGaps.hooks';\nimport {\n getPivotColumnTotalsFor,\n getPivotDimension,\n getPivotMeasures,\n getPivotRowTotalsFor,\n} from './PivotPro.utils';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype PivotTableProProps = {\n title: string;\n description: string;\n results: DataResponse;\n measures: Measure[];\n rowDimension: Dimension;\n columnDimension: Dimension;\n displayNullAs?: string;\n columnWidth?: number;\n firstColumnWidth?: number;\n};\n\nconst PivotTablePro = (props: PivotTableProProps) => {\n const theme = useTheme() as Theme;\n i18nSetup(theme);\n\n const { description, title } = resolveI18nProps(props);\n const { measures, rowDimension, columnDimension, displayNullAs, columnWidth, firstColumnWidth } =\n props;\n\n // Fill gaps for the column dimension\n const resultsColumnDimensionFillGaps = useFillGaps({\n results: props.results,\n dimension: columnDimension,\n });\n\n // Fill gaps for the row dimension\n const results = useFillGaps({\n results: resultsColumnDimensionFillGaps,\n dimension: rowDimension,\n });\n\n const cardContentRef = useRef<HTMLDivElement>(null);\n\n const pivotMeasures = getPivotMeasures({ measures, displayNullAs }, theme);\n const pivotRowDimension = getPivotDimension({ dimension: rowDimension }, theme);\n const pivotColumnDimension = getPivotDimension({ dimension: columnDimension }, theme);\n const pivotColumnTotalsFor = getPivotColumnTotalsFor(measures);\n const pivotRowTotalsFor = getPivotRowTotalsFor(measures);\n\n return (\n <ChartCard\n ref={cardContentRef}\n title={title}\n subtitle={description}\n data={props.results}\n dimensionsAndMeasures={[rowDimension, columnDimension, ...measures]}\n errorMessage={results?.error}\n >\n <PivotTable\n firstColumnWidth={firstColumnWidth}\n columnWidth={columnWidth}\n totalLabel={i18n.t('charts.pivotTable.total')}\n data={results.data ?? []}\n measures={pivotMeasures}\n rowDimension={pivotRowDimension}\n columnDimension={pivotColumnDimension}\n columnTotalsFor={pivotColumnTotalsFor}\n rowTotalsFor={pivotRowTotalsFor}\n />\n </ChartCard>\n );\n};\n\nexport default PivotTablePro;\n","import { loadData } from '@embeddable.com/core';\nimport { defineComponent, EmbeddedComponentMeta, Inputs } from '@embeddable.com/react';\nimport PivotTablePro from './index';\nimport {\n dataset,\n description,\n title,\n maxResults,\n measures,\n subInputGenericBoolean,\n genericString,\n dimensionWithDateBounds,\n genericNumber,\n} from '../../../component.constants';\n\nexport const meta = {\n name: 'PivotTablePro',\n label: 'Pivot Table',\n category: 'Table Charts',\n inputs: [\n dataset,\n {\n ...measures,\n label: 'Measures To Display',\n inputs: [\n ...measures.inputs,\n {\n ...subInputGenericBoolean,\n name: 'showColumnTotal',\n label: 'Show Column Total',\n },\n {\n ...subInputGenericBoolean,\n name: 'showRowTotal',\n label: 'Show Row Total',\n },\n {\n ...subInputGenericBoolean,\n name: 'showAsPercentage',\n label: 'Show As Percentage',\n description: 'If turned on, other measures may be ignored',\n defaultValue: false,\n },\n ],\n },\n {\n ...dimensionWithDateBounds,\n label: 'Row Dimension',\n name: 'rowDimension',\n },\n {\n ...dimensionWithDateBounds,\n label: 'Column Dimension',\n name: 'columnDimension',\n },\n title,\n description,\n { ...genericString, name: 'displayNullAs', label: 'Display Null As' },\n {\n ...genericNumber,\n name: 'firstColumnWidth',\n label: 'First Column Width',\n description: 'Set the width in px (e.g. 200)',\n },\n {\n ...genericNumber,\n name: 'columnWidth',\n label: 'Column Width',\n description: 'Set the width in px (e.g. 200)',\n },\n\n maxResults,\n ],\n} as const satisfies EmbeddedComponentMeta;\n\nexport default defineComponent(PivotTablePro, meta, {\n props: (inputs: Inputs<typeof meta>) => {\n return {\n ...inputs,\n\n results: loadData({\n from: inputs.dataset,\n select: [inputs.rowDimension, inputs.columnDimension, ...inputs.measures],\n limit: inputs.maxResults,\n countRows: true,\n }),\n };\n },\n});\n"],"names":["getPivotMeasures","props","theme","themeFormatter","getThemeFormatter","measure","_a","_b","row","getPivotDimension","value","getPivotColumnTotalsFor","measures","m","getPivotRowTotalsFor","PivotTablePro","useTheme","i18nSetup","description","title","resolveI18nProps","rowDimension","columnDimension","displayNullAs","columnWidth","firstColumnWidth","resultsColumnDimensionFillGaps","useFillGaps","results","cardContentRef","useRef","pivotMeasures","pivotRowDimension","pivotColumnDimension","pivotColumnTotalsFor","pivotRowTotalsFor","jsx","ChartCard","PivotTable","i18n","meta","dataset","subInputGenericBoolean","dimensionWithDateBounds","genericString","genericNumber","maxResults","PivotTablePro_emb","defineComponent","inputs","loadData"],"mappings":"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"}
1
+ {"version":3,"file":"PivotTablePro.js","sources":["../src/components/charts/tables/PivotTablePro/PivotPro.utils.ts","../src/components/charts/tables/PivotTablePro/index.tsx","../src/components/charts/tables/PivotTablePro/PivotTablePro.emb.ts"],"sourcesContent":["import { DataResponse, Dimension, Measure } from '@embeddable.com/core';\nimport { Theme } from '../../../../theme/theme.types';\nimport { PivotTableProps } from '@embeddable.com/remarkable-ui';\nimport { getThemeFormatter } from '../../../../theme/formatter/formatter.utils';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport const getPivotMeasures = (\n props: { measures: Measure[]; displayNullAs?: string },\n theme: Theme,\n): PivotTableProps<any>['measures'] => {\n const themeFormatter = getThemeFormatter(theme);\n\n return props.measures.map((measure) => {\n return {\n key: measure.name,\n label: themeFormatter.dimensionOrMeasureTitle(measure),\n showAsPercentage: Boolean(measure.inputs?.showAsPercentage),\n percentageDecimalPlaces: measure.inputs?.decimalPlaces ?? 1,\n accessor: (row) => {\n const value = row[measure.name];\n\n return value == null\n ? props.displayNullAs\n : themeFormatter.data(measure, row[measure.name]);\n },\n };\n });\n};\n\nexport const getPivotDimension = (\n props: { dimension: Dimension },\n theme: Theme,\n): PivotTableProps<any>['rowDimension' | 'columnDimension'] => {\n const themeFormatter = getThemeFormatter(theme);\n\n return {\n key: props.dimension.name,\n label: themeFormatter.dimensionOrMeasureTitle(props.dimension),\n formatValue: (value: string) => themeFormatter.data(props.dimension, value),\n };\n};\n\nexport const getPivotColumnTotalsFor = (\n measures: Measure[],\n): PivotTableProps<any>['columnTotalsFor'] | undefined => {\n return measures.filter((m) => m.inputs?.showColumnTotal).map((m) => m.name);\n};\n\nexport const getPivotRowTotalsFor = (\n measures: Measure[],\n): PivotTableProps<any>['rowTotalsFor'] | undefined => {\n return measures.filter((m) => m.inputs?.showRowTotal).map((m) => m.name);\n};\n\ntype Order = 'asc' | 'desc' | 'equal';\n\nfunction predominantOrder(arr: (string | number | boolean)[]): Order {\n let asc = 0;\n let desc = 0;\n\n for (let i = 0; i < arr.length - 1; i++) {\n const a = arr[i];\n const b = arr[i + 1];\n\n if (a == null || b == null) continue;\n\n if (a < b) asc++;\n else if (a > b) desc++;\n }\n\n if (asc > desc) return 'asc';\n if (desc > asc) return 'desc';\n return 'equal';\n}\n\nfunction isOrderMixed(arr: (string | number | boolean)[]): boolean {\n let asc = 0;\n let desc = 0;\n\n for (let i = 0; i < arr.length - 1; i++) {\n const a = arr[i];\n const b = arr[i + 1];\n\n if (a == null || b == null) continue;\n\n if (a < b) asc++;\n else if (a > b) desc++;\n }\n\n return asc > 0 && desc > 0;\n}\n\nconst getSortComparator = (order: Order) => {\n return <T>(a: T, b: T) => {\n if (order === 'asc') {\n return a < b ? -1 : a > b ? 1 : 0;\n }\n if (order === 'desc') {\n return a > b ? -1 : a < b ? 1 : 0;\n }\n return 0;\n };\n};\n\nexport const getPivotTableRows = (\n results: DataResponse,\n columnOrder: (string | number | boolean)[],\n rowOrder: (string | number | boolean)[],\n columnDimension: Dimension,\n rowDimension: Dimension,\n measures: Measure[],\n) => {\n const data = results.data ?? [];\n const firstRow = data[0];\n\n if (!firstRow) return [];\n\n const buildEmptyMeasures = () =>\n measures.reduce<Record<string, unknown>>((acc, measure) => {\n acc[measure.name] = undefined;\n return acc;\n }, {});\n\n const reorderByAxis = (\n axisOrder: (string | number | boolean)[],\n axisDimension: Dimension,\n fixedDimension: Dimension,\n ) => {\n if (!isOrderMixed(axisOrder)) {\n return data;\n }\n\n const order = predominantOrder(axisOrder);\n const sortedAxisOrder = [...axisOrder].sort(getSortComparator(order));\n\n // “Leader” rows: one per value in the axis order, at the fixed dimension’s first value\n const leaderRows = sortedAxisOrder.map((value) => {\n const existing = data.find(\n (x) =>\n x[axisDimension.name] === value &&\n x[fixedDimension.name] === firstRow[fixedDimension.name],\n );\n\n if (existing) return existing;\n\n return {\n ...firstRow,\n [axisDimension.name]: value,\n ...buildEmptyMeasures(),\n };\n });\n\n // Remove rows that are already covered by leaderRows (same [axis, fixed] tuple)\n const restResults = data.filter(\n (resultRow) =>\n !leaderRows.some(\n (leaderRow) =>\n leaderRow[axisDimension.name] === resultRow[axisDimension.name] &&\n leaderRow[fixedDimension.name] === resultRow[fixedDimension.name],\n ),\n );\n\n return [...leaderRows, ...restResults];\n };\n\n // Preserve original behavior: fix columns if mixed, otherwise rows if mixed\n if (isOrderMixed(columnOrder)) {\n return reorderByAxis(columnOrder, columnDimension, rowDimension);\n }\n\n if (isOrderMixed(rowOrder)) {\n return reorderByAxis(rowOrder, rowDimension, columnDimension);\n }\n\n return data;\n};\n","import { useTheme } from '@embeddable.com/react';\nimport { Theme } from '../../../../theme/theme.types';\nimport { i18n, i18nSetup } from '../../../../theme/i18n/i18n';\nimport { ChartCard } from '../../shared/ChartCard/ChartCard';\nimport { resolveI18nProps } from '../../../component.utils';\nimport { DataResponse, Dimension, Measure } from '@embeddable.com/core';\nimport { PivotTable } from '@embeddable.com/remarkable-ui';\nimport { useMemo, useRef } from 'react';\nimport { useFillGaps } from '../../charts.fillGaps.hooks';\nimport {\n getPivotColumnTotalsFor,\n getPivotDimension,\n getPivotMeasures,\n getPivotRowTotalsFor,\n getPivotTableRows,\n} from './PivotPro.utils';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype PivotTableProProps = {\n title: string;\n description: string;\n results: DataResponse;\n measures: Measure[];\n rowDimension: Dimension;\n columnDimension: Dimension;\n displayNullAs?: string;\n columnWidth?: number;\n firstColumnWidth?: number;\n};\n\nconst PivotTablePro = (props: PivotTableProProps) => {\n const theme = useTheme() as Theme;\n i18nSetup(theme);\n\n const { description, title } = resolveI18nProps(props);\n const { measures, rowDimension, columnDimension, displayNullAs, columnWidth, firstColumnWidth } =\n props;\n\n const colOrder = Array.from(\n new Set((props.results.data ?? []).filter(Boolean).map((d) => d[columnDimension.name])),\n );\n\n const rowOrder = Array.from(\n new Set((props.results.data ?? []).filter(Boolean).map((d) => d[rowDimension.name])),\n );\n\n // Fill gaps for the column dimension\n const resultsColumnDimensionFillGaps = useFillGaps({\n results: props.results,\n dimension: columnDimension,\n });\n\n // Fill gaps for the row dimension\n const resultsRowColumnDimensionFillGaps = useFillGaps({\n results: resultsColumnDimensionFillGaps,\n dimension: rowDimension,\n });\n\n const results = useMemo(() => {\n return getPivotTableRows(\n resultsRowColumnDimensionFillGaps,\n colOrder,\n rowOrder,\n columnDimension,\n rowDimension,\n measures,\n );\n }, [\n resultsRowColumnDimensionFillGaps,\n colOrder,\n rowOrder,\n columnDimension,\n rowDimension,\n measures,\n ]);\n\n const cardContentRef = useRef<HTMLDivElement>(null);\n\n const pivotMeasures = getPivotMeasures({ measures, displayNullAs }, theme);\n const pivotRowDimension = getPivotDimension({ dimension: rowDimension }, theme);\n const pivotColumnDimension = getPivotDimension({ dimension: columnDimension }, theme);\n const pivotColumnTotalsFor = getPivotColumnTotalsFor(measures);\n const pivotRowTotalsFor = getPivotRowTotalsFor(measures);\n return (\n <ChartCard\n ref={cardContentRef}\n title={title}\n subtitle={description}\n data={props.results}\n dimensionsAndMeasures={[rowDimension, columnDimension, ...measures]}\n errorMessage={props.results?.error}\n >\n <PivotTable\n firstColumnWidth={firstColumnWidth}\n columnWidth={columnWidth}\n totalLabel={i18n.t('charts.pivotTable.total')}\n data={results}\n measures={pivotMeasures}\n rowDimension={pivotRowDimension}\n columnDimension={pivotColumnDimension}\n columnTotalsFor={pivotColumnTotalsFor}\n rowTotalsFor={pivotRowTotalsFor}\n />\n </ChartCard>\n );\n};\n\nexport default PivotTablePro;\n","import { loadData } from '@embeddable.com/core';\nimport { defineComponent, EmbeddedComponentMeta, Inputs } from '@embeddable.com/react';\nimport PivotTablePro from './index';\nimport {\n dataset,\n description,\n title,\n maxResults,\n measures,\n subInputGenericBoolean,\n genericString,\n dimensionWithDateBounds,\n genericNumber,\n} from '../../../component.constants';\n\nexport const meta = {\n name: 'PivotTablePro',\n label: 'Pivot Table',\n category: 'Table Charts',\n inputs: [\n dataset,\n {\n ...measures,\n label: 'Measures To Display',\n inputs: [\n ...measures.inputs,\n {\n ...subInputGenericBoolean,\n name: 'showColumnTotal',\n label: 'Show Column Total',\n },\n {\n ...subInputGenericBoolean,\n name: 'showRowTotal',\n label: 'Show Row Total',\n },\n {\n ...subInputGenericBoolean,\n name: 'showAsPercentage',\n label: 'Show As Percentage',\n description: 'If turned on, other measures may be ignored',\n defaultValue: false,\n },\n ],\n },\n {\n ...dimensionWithDateBounds,\n label: 'Row Dimension',\n name: 'rowDimension',\n },\n {\n ...dimensionWithDateBounds,\n label: 'Column Dimension',\n name: 'columnDimension',\n },\n title,\n description,\n { ...genericString, name: 'displayNullAs', label: 'Display Null As' },\n {\n ...genericNumber,\n name: 'firstColumnWidth',\n label: 'First Column Width',\n description: 'Set the width in px (e.g. 200)',\n },\n {\n ...genericNumber,\n name: 'columnWidth',\n label: 'Column Width',\n description: 'Set the width in px (e.g. 200)',\n },\n\n maxResults,\n ],\n} as const satisfies EmbeddedComponentMeta;\n\nexport default defineComponent(PivotTablePro, meta, {\n props: (inputs: Inputs<typeof meta>) => {\n return {\n ...inputs,\n\n results: loadData({\n from: inputs.dataset,\n select: [inputs.rowDimension, inputs.columnDimension, ...inputs.measures],\n limit: inputs.maxResults,\n countRows: true,\n }),\n };\n },\n});\n"],"names":["getPivotMeasures","props","theme","themeFormatter","getThemeFormatter","measure","_a","_b","row","getPivotDimension","value","getPivotColumnTotalsFor","measures","m","getPivotRowTotalsFor","predominantOrder","arr","asc","desc","i","a","b","isOrderMixed","getSortComparator","order","getPivotTableRows","results","columnOrder","rowOrder","columnDimension","rowDimension","data","firstRow","buildEmptyMeasures","acc","reorderByAxis","axisOrder","axisDimension","fixedDimension","leaderRows","existing","x","restResults","resultRow","leaderRow","PivotTablePro","useTheme","i18nSetup","description","title","resolveI18nProps","displayNullAs","columnWidth","firstColumnWidth","colOrder","d","resultsColumnDimensionFillGaps","useFillGaps","resultsRowColumnDimensionFillGaps","useMemo","cardContentRef","useRef","pivotMeasures","pivotRowDimension","pivotColumnDimension","pivotColumnTotalsFor","pivotRowTotalsFor","jsx","ChartCard","PivotTable","i18n","meta","dataset","subInputGenericBoolean","dimensionWithDateBounds","genericString","genericNumber","maxResults","PivotTablePro_emb","defineComponent","inputs","loadData"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { defineComponent as i } from "@embeddable.com/react";
2
- import { V as n, l as r } from "./index-DedIqjbn.js";
3
- import { v as s, w as d, F as m, G as c, _ as p } from "./component.constants-uP1WYyUb.js";
4
- import { M as u, S as g } from "./index-Dwl9clc9.js";
2
+ import { V as n, l as r } from "./index-BR6dp5RX.js";
3
+ import { v as s, w as d, F as m, G as c, _ as p } from "./component.constants-h6et83ck.js";
4
+ import { M as u, S as g } from "./index-QOVQo6ZK.js";
5
5
  const f = {
6
6
  name: "SingleSelectFieldPro",
7
7
  label: "Single Select Field",
@@ -1,9 +1,9 @@
1
- import { T as I, h as r, u as W, o as G, p as q, j as y, q as B, r as U, V as _, l as P, m as J } from "./index-DedIqjbn.js";
1
+ import { T as I, h as r, u as W, o as G, p as q, j as y, q as B, r as U, V as _, l as P, m as J } from "./index-BR6dp5RX.js";
2
2
  import { useTheme as K, defineComponent as Q } from "@embeddable.com/react";
3
- import { a as X, r as Y, i as Z, v as $, C as T, s as O, e as ee, F as ne, G as ae, g as te, d as ie, H as se, x as oe } from "./component.constants-uP1WYyUb.js";
4
- import { C as le } from "./ChartCard-CsKQOusx.js";
3
+ import { a as X, r as Y, i as Z, v as $, C as T, s as O, e as ee, F as ne, G as ae, g as te, d as ie, H as se, x as oe } from "./component.constants-h6et83ck.js";
4
+ import { C as le } from "./ChartCard-C7c2rTst.js";
5
5
  import { useState as S, useRef as re, useCallback as ce, useEffect as g } from "react";
6
- import { g as de } from "./formatter.utils-CeEdL8uQ.js";
6
+ import { g as de } from "./formatter.utils-DXzI4Hz_.js";
7
7
  const me = (n) => {
8
8
  var a;
9
9
  const e = (a = n.inputs) == null ? void 0 : a.align;
@@ -1,7 +1,7 @@
1
- import { r as F, g as P } from "./charts.utils-rO92wRxO.js";
2
- import { g as h } from "./formatter.utils-CeEdL8uQ.js";
1
+ import { r as F, g as P } from "./charts.utils-DAkS2VK1.js";
2
+ import { g as h } from "./formatter.utils-DXzI4Hz_.js";
3
3
  import { g as p, a as g } from "./object.utils-D_Zzon-H.js";
4
- import { g as T, a as v } from "./index-DedIqjbn.js";
4
+ import { g as T, a as v } from "./index-BR6dp5RX.js";
5
5
  const B = (l, c) => {
6
6
  var b;
7
7
  const m = h(c), { data: o = [], dimension: i, groupDimension: d, measure: t } = l, r = [...new Set(o.map((n) => n[i.name]).filter((n) => n != null))].sort(), a = `${d.name}${(b = d.inputs) != null && b.granularity ? `.${d.inputs.granularity}` : ""}`, e = [...new Set(o.map((n) => n[a]))].filter((n) => n != null), s = p(c), u = v(), C = e.map((n, k) => {
@@ -142,4 +142,4 @@ export {
142
142
  B as b,
143
143
  L as g
144
144
  };
145
- //# sourceMappingURL=bars.utils-BU_k5fia.js.map
145
+ //# sourceMappingURL=bars.utils-JRnFN04m.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bars.utils-BU_k5fia.js","sources":["../src/components/charts/bars/bars.utils.ts"],"sourcesContent":["import { DataResponse, Dimension, Measure } from '@embeddable.com/core';\nimport { Theme } from '../../../theme/theme.types';\nimport { remarkableTheme } from '../../../theme/theme.constants';\nimport { ChartData, ChartOptions } from 'chart.js';\nimport { getThemeFormatter } from '../../../theme/formatter/formatter.utils';\nimport { groupTailAsOther } from '../charts.utils';\nimport { getColor } from '../../../theme/styles/styles.utils';\nimport { getChartColors, getChartContrastColors } from '@embeddable.com/remarkable-ui';\nimport { getObjectStableKey } from '../../../utils.ts/object.utils';\nimport { Context } from 'chartjs-plugin-datalabels';\n\nexport const getBarStackedChartProData = (\n props: {\n data: DataResponse['data'];\n dimension: Dimension;\n groupDimension: Dimension;\n measure: Measure;\n },\n theme: Theme,\n): ChartData<'bar'> => {\n const themeFormatter = getThemeFormatter(theme);\n const { data = [], dimension, groupDimension, measure } = props;\n\n const axis = [...new Set(data.map((d) => d[dimension.name]).filter((d) => d != null))].sort();\n const groupDimensionName = `${groupDimension.name}${groupDimension.inputs?.granularity ? `.${groupDimension.inputs.granularity}` : ''}`;\n const groupBy = [...new Set(data.map((d) => d[groupDimensionName]))].filter((d) => d != null);\n\n const themeKey = getObjectStableKey(theme);\n const chartContrastColors = getChartContrastColors();\n const datasets = groupBy.map((groupByItem, index) => {\n const backgroundColor = getColor(\n `${themeKey}.charts.backgroundColors`,\n `${groupDimension.name}.${groupByItem}`,\n theme.charts.backgroundColors ?? chartContrastColors,\n index,\n );\n\n const borderColor = getColor(\n `${themeKey}.charts.borderColors`,\n `${groupDimension.name}.${groupByItem}`,\n theme.charts.borderColors ?? chartContrastColors,\n index,\n );\n\n return {\n label: themeFormatter.data(groupDimension, groupByItem),\n rawLabel: groupByItem,\n backgroundColor,\n borderColor,\n data: axis.map((axisItem) => {\n const record = data.find(\n (d) => d[groupDimensionName] === groupByItem && d[dimension.name] === axisItem,\n );\n return record ? Number(record[measure.name]) : 0;\n }),\n };\n });\n\n return {\n labels: axis,\n datasets,\n };\n};\n\nexport const getBarChartProData = (\n props: {\n data: DataResponse['data'];\n dimension: Dimension;\n measures: Measure[];\n maxItems?: number;\n },\n theme: Theme = remarkableTheme,\n): ChartData<'bar'> => {\n if (!props.data) {\n return {\n labels: [],\n datasets: [{ data: [] }],\n };\n }\n\n const themeFormatter = getThemeFormatter(theme);\n const themeKey = getObjectStableKey(theme);\n const groupedData = groupTailAsOther(props.data, props.dimension, props.measures, props.maxItems);\n const chartColors = getChartColors();\n\n return {\n labels: groupedData.map((item) => {\n return item[props.dimension.name];\n }),\n datasets: props.measures.map((measure, index) => {\n const backgroundColor = getColor(\n `${themeKey}.charts.backgroundColors`,\n measure.name,\n theme.charts.backgroundColors ?? chartColors,\n index,\n );\n\n const borderColor = getColor(\n `${themeKey}.charts.borderColors`,\n measure.name,\n theme.charts.borderColors ?? chartColors,\n index,\n );\n\n return {\n label: themeFormatter.dimensionOrMeasureTitle(measure),\n data: groupedData.map((item) => item[measure.name] ?? 0),\n backgroundColor,\n borderColor,\n };\n }),\n };\n};\n\nconst getBarChartProDatalabelTotalFormatter = (\n context: Context,\n formatter: (value: number) => string,\n) => {\n const { datasets } = context.chart.data;\n const i = context.dataIndex;\n\n const total = datasets.reduce((sum, ds) => {\n const val = ds.data[i] as number;\n return sum + (val || 0);\n }, 0);\n\n return formatter(total);\n};\n\nexport const getBarChartProOptions = (\n options: {\n onBarClicked: (args: {\n axisDimensionValue: string | null;\n groupingDimensionValue: string | null;\n }) => void;\n measures: Measure[];\n dimension: Dimension;\n horizontal: boolean;\n data: ChartData<'bar'>;\n },\n theme: Theme,\n): Partial<ChartOptions<'bar'>> => {\n const { onBarClicked, measures, dimension, horizontal, data } = options;\n\n const themeFormatter = getThemeFormatter(theme);\n return {\n plugins: {\n legend: { position: theme.charts.legendPosition ?? 'bottom' },\n datalabels: {\n labels: {\n total: {\n formatter: (_value: string | number, context: Context) =>\n getBarChartProDatalabelTotalFormatter(context, (value: number) =>\n themeFormatter.data(measures[0]!, value),\n ),\n },\n value: {\n formatter: (value: string | number, context) => {\n const measure = measures[context.datasetIndex % measures.length]!;\n return themeFormatter.data(measure, value);\n },\n },\n },\n },\n tooltip: {\n callbacks: {\n title: (context) => {\n const label = context[0]?.label;\n return themeFormatter.data(dimension, label);\n },\n label: (context) => {\n const measure = measures[context.datasetIndex % measures.length]!;\n const raw = context.raw as number;\n return `${themeFormatter.data(dimension, context.dataset.label) || ''}: ${themeFormatter.data(measure, raw)}`;\n },\n },\n },\n },\n scales: {\n x: {\n ticks: {\n callback: (value) => {\n if (horizontal) {\n return themeFormatter.data(measures[0]!, value);\n }\n\n if (!data || !data.labels) return undefined;\n\n const label = data.labels[Number(value)] as string;\n\n return themeFormatter.data(dimension, label);\n },\n },\n },\n y: {\n ticks: {\n callback: (value) => {\n if (!horizontal) {\n return themeFormatter.data(measures[0]!, value);\n }\n if (!data || !data.labels) return undefined;\n const label = data.labels[Number(value)] as string;\n return themeFormatter.data(dimension, label);\n },\n },\n },\n },\n onClick: (_event, elements, chart) => {\n const element = elements[0];\n const axisDimensionValue = (element ? chart.data.labels![element.index] : null) as\n | string\n | null;\n const groupingDimensionValue = (\n element\n ? (chart.data.datasets[element.datasetIndex] as { rawLabel?: string | null })?.rawLabel\n : null\n ) as string | null;\n\n onBarClicked({\n axisDimensionValue,\n groupingDimensionValue,\n });\n },\n };\n};\n"],"names":["getBarStackedChartProData","props","theme","themeFormatter","getThemeFormatter","data","dimension","groupDimension","measure","axis","d","groupDimensionName","_a","groupBy","themeKey","getObjectStableKey","chartContrastColors","getChartContrastColors","datasets","groupByItem","index","backgroundColor","getColor","borderColor","axisItem","record","getBarChartProData","remarkableTheme","groupedData","groupTailAsOther","chartColors","getChartColors","item","getBarChartProDatalabelTotalFormatter","context","formatter","i","total","sum","ds","val","getBarChartProOptions","options","onBarClicked","measures","horizontal","_value","value","label","raw","_event","elements","chart","element","axisDimensionValue","groupingDimensionValue"],"mappings":"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"}
1
+ {"version":3,"file":"bars.utils-JRnFN04m.js","sources":["../src/components/charts/bars/bars.utils.ts"],"sourcesContent":["import { DataResponse, Dimension, Measure } from '@embeddable.com/core';\nimport { Theme } from '../../../theme/theme.types';\nimport { remarkableTheme } from '../../../theme/theme.constants';\nimport { ChartData, ChartOptions } from 'chart.js';\nimport { getThemeFormatter } from '../../../theme/formatter/formatter.utils';\nimport { groupTailAsOther } from '../charts.utils';\nimport { getColor } from '../../../theme/styles/styles.utils';\nimport { getChartColors, getChartContrastColors } from '@embeddable.com/remarkable-ui';\nimport { getObjectStableKey } from '../../../utils.ts/object.utils';\nimport { Context } from 'chartjs-plugin-datalabels';\n\nexport const getBarStackedChartProData = (\n props: {\n data: DataResponse['data'];\n dimension: Dimension;\n groupDimension: Dimension;\n measure: Measure;\n },\n theme: Theme,\n): ChartData<'bar'> => {\n const themeFormatter = getThemeFormatter(theme);\n const { data = [], dimension, groupDimension, measure } = props;\n\n const axis = [...new Set(data.map((d) => d[dimension.name]).filter((d) => d != null))].sort();\n const groupDimensionName = `${groupDimension.name}${groupDimension.inputs?.granularity ? `.${groupDimension.inputs.granularity}` : ''}`;\n const groupBy = [...new Set(data.map((d) => d[groupDimensionName]))].filter((d) => d != null);\n\n const themeKey = getObjectStableKey(theme);\n const chartContrastColors = getChartContrastColors();\n const datasets = groupBy.map((groupByItem, index) => {\n const backgroundColor = getColor(\n `${themeKey}.charts.backgroundColors`,\n `${groupDimension.name}.${groupByItem}`,\n theme.charts.backgroundColors ?? chartContrastColors,\n index,\n );\n\n const borderColor = getColor(\n `${themeKey}.charts.borderColors`,\n `${groupDimension.name}.${groupByItem}`,\n theme.charts.borderColors ?? chartContrastColors,\n index,\n );\n\n return {\n label: themeFormatter.data(groupDimension, groupByItem),\n rawLabel: groupByItem,\n backgroundColor,\n borderColor,\n data: axis.map((axisItem) => {\n const record = data.find(\n (d) => d[groupDimensionName] === groupByItem && d[dimension.name] === axisItem,\n );\n return record ? Number(record[measure.name]) : 0;\n }),\n };\n });\n\n return {\n labels: axis,\n datasets,\n };\n};\n\nexport const getBarChartProData = (\n props: {\n data: DataResponse['data'];\n dimension: Dimension;\n measures: Measure[];\n maxItems?: number;\n },\n theme: Theme = remarkableTheme,\n): ChartData<'bar'> => {\n if (!props.data) {\n return {\n labels: [],\n datasets: [{ data: [] }],\n };\n }\n\n const themeFormatter = getThemeFormatter(theme);\n const themeKey = getObjectStableKey(theme);\n const groupedData = groupTailAsOther(props.data, props.dimension, props.measures, props.maxItems);\n const chartColors = getChartColors();\n\n return {\n labels: groupedData.map((item) => {\n return item[props.dimension.name];\n }),\n datasets: props.measures.map((measure, index) => {\n const backgroundColor = getColor(\n `${themeKey}.charts.backgroundColors`,\n measure.name,\n theme.charts.backgroundColors ?? chartColors,\n index,\n );\n\n const borderColor = getColor(\n `${themeKey}.charts.borderColors`,\n measure.name,\n theme.charts.borderColors ?? chartColors,\n index,\n );\n\n return {\n label: themeFormatter.dimensionOrMeasureTitle(measure),\n data: groupedData.map((item) => item[measure.name] ?? 0),\n backgroundColor,\n borderColor,\n };\n }),\n };\n};\n\nconst getBarChartProDatalabelTotalFormatter = (\n context: Context,\n formatter: (value: number) => string,\n) => {\n const { datasets } = context.chart.data;\n const i = context.dataIndex;\n\n const total = datasets.reduce((sum, ds) => {\n const val = ds.data[i] as number;\n return sum + (val || 0);\n }, 0);\n\n return formatter(total);\n};\n\nexport const getBarChartProOptions = (\n options: {\n onBarClicked: (args: {\n axisDimensionValue: string | null;\n groupingDimensionValue: string | null;\n }) => void;\n measures: Measure[];\n dimension: Dimension;\n horizontal: boolean;\n data: ChartData<'bar'>;\n },\n theme: Theme,\n): Partial<ChartOptions<'bar'>> => {\n const { onBarClicked, measures, dimension, horizontal, data } = options;\n\n const themeFormatter = getThemeFormatter(theme);\n return {\n plugins: {\n legend: { position: theme.charts.legendPosition ?? 'bottom' },\n datalabels: {\n labels: {\n total: {\n formatter: (_value: string | number, context: Context) =>\n getBarChartProDatalabelTotalFormatter(context, (value: number) =>\n themeFormatter.data(measures[0]!, value),\n ),\n },\n value: {\n formatter: (value: string | number, context) => {\n const measure = measures[context.datasetIndex % measures.length]!;\n return themeFormatter.data(measure, value);\n },\n },\n },\n },\n tooltip: {\n callbacks: {\n title: (context) => {\n const label = context[0]?.label;\n return themeFormatter.data(dimension, label);\n },\n label: (context) => {\n const measure = measures[context.datasetIndex % measures.length]!;\n const raw = context.raw as number;\n return `${themeFormatter.data(dimension, context.dataset.label) || ''}: ${themeFormatter.data(measure, raw)}`;\n },\n },\n },\n },\n scales: {\n x: {\n ticks: {\n callback: (value) => {\n if (horizontal) {\n return themeFormatter.data(measures[0]!, value);\n }\n\n if (!data || !data.labels) return undefined;\n\n const label = data.labels[Number(value)] as string;\n\n return themeFormatter.data(dimension, label);\n },\n },\n },\n y: {\n ticks: {\n callback: (value) => {\n if (!horizontal) {\n return themeFormatter.data(measures[0]!, value);\n }\n if (!data || !data.labels) return undefined;\n const label = data.labels[Number(value)] as string;\n return themeFormatter.data(dimension, label);\n },\n },\n },\n },\n onClick: (_event, elements, chart) => {\n const element = elements[0];\n const axisDimensionValue = (element ? chart.data.labels![element.index] : null) as\n | string\n | null;\n const groupingDimensionValue = (\n element\n ? (chart.data.datasets[element.datasetIndex] as { rawLabel?: string | null })?.rawLabel\n : null\n ) as string | null;\n\n onBarClicked({\n axisDimensionValue,\n groupingDimensionValue,\n });\n },\n };\n};\n"],"names":["getBarStackedChartProData","props","theme","themeFormatter","getThemeFormatter","data","dimension","groupDimension","measure","axis","d","groupDimensionName","_a","groupBy","themeKey","getObjectStableKey","chartContrastColors","getChartContrastColors","datasets","groupByItem","index","backgroundColor","getColor","borderColor","axisItem","record","getBarChartProData","remarkableTheme","groupedData","groupTailAsOther","chartColors","getChartColors","item","getBarChartProDatalabelTotalFormatter","context","formatter","i","total","sum","ds","val","getBarChartProOptions","options","onBarClicked","measures","horizontal","_value","value","label","raw","_event","elements","chart","element","axisDimensionValue","groupingDimensionValue"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { E as is } from "./index-DedIqjbn.js";
2
- import { a as ni, i as cn } from "./component.constants-uP1WYyUb.js";
1
+ import { E as is } from "./index-BR6dp5RX.js";
2
+ import { a as ni, i as cn } from "./component.constants-h6et83ck.js";
3
3
  import { d as Ee, u as ai, g as ss } from "./utc-B2gCnkBk.js";
4
4
  import { i as ii, q as si } from "./quarterOfYear-wgcl4CRi.js";
5
- import { g as os } from "./formatter.utils-CeEdL8uQ.js";
5
+ import { g as os } from "./formatter.utils-DXzI4Hz_.js";
6
6
  var fs = {
7
7
  "--em-core-border-radius--000": "0px",
8
8
  "--em-core-border-radius--050": "2px",
@@ -17211,4 +17211,4 @@ export {
17211
17211
  zm as g,
17212
17212
  Hm as r
17213
17213
  };
17214
- //# sourceMappingURL=charts.utils-rO92wRxO.js.map
17214
+ //# sourceMappingURL=charts.utils-DAkS2VK1.js.map