@hitachivantara/uikit-react-viz 5.12.4 → 5.12.6

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.
@@ -45,8 +45,6 @@ const HvBoxplot = react.forwardRef(
45
45
  legend,
46
46
  measures,
47
47
  groupBy,
48
- splitBy,
49
- sortBy,
50
48
  tooltip,
51
49
  width,
52
50
  height,
@@ -9,12 +9,10 @@ const useBoxplot = ({
9
9
  filters
10
10
  }) => {
11
11
  const measuresFields = react.useMemo(() => {
12
- if (measures == null) {
12
+ if (measures == null)
13
13
  return {};
14
- }
15
- if (typeof measures === "string") {
14
+ if (typeof measures === "string")
16
15
  return { [measures]: void 0 };
17
- }
18
16
  if (Array.isArray(measures)) {
19
17
  return measures.reduce(
20
18
  (acc, value) => {
@@ -5,39 +5,36 @@ const arquero = require("arquero");
5
5
  const index = require("../utils/index.cjs");
6
6
  const useBoxplotData = ({
7
7
  data,
8
- groupBy,
8
+ groupBy: groupByProp,
9
9
  measures,
10
- filters
10
+ filters: filtersProp
11
11
  }) => {
12
12
  const chartData = react.useMemo(() => {
13
- let tableData;
14
- if (data instanceof arquero.internal.ColumnTable) {
15
- tableData = data;
16
- } else if (Array.isArray(data)) {
17
- tableData = arquero.from(data);
18
- } else {
19
- tableData = arquero.table(data);
20
- }
21
- if (filters) {
13
+ const { data: processedData } = index.processTableData(data);
14
+ let tableData = processedData;
15
+ if (filtersProp) {
16
+ const filters = (Array.isArray(filtersProp) ? filtersProp : [filtersProp]).map((filter) => ({
17
+ ...filter,
18
+ field: index.normalizeColumnName(filter.field)
19
+ // normalize
20
+ }));
22
21
  tableData = tableData.filter(
23
- arquero.escape(
24
- (row) => index.getHvArqueroCombinedFilters(
25
- row,
26
- Array.isArray(filters) ? filters : [filters]
27
- )
28
- )
22
+ arquero.escape((row) => index.getHvArqueroCombinedFilters(row, filters))
29
23
  );
30
24
  }
31
- const uniqueGroupBy = new Set(tableData.array(groupBy || ""));
25
+ const normalizedGroupBy = index.normalizeColumnName(groupByProp || "");
26
+ const uniqueGroupBy = new Set(
27
+ tableData.array(normalizedGroupBy)
28
+ );
32
29
  const results = {};
33
30
  uniqueGroupBy.forEach((group) => {
34
31
  results[group] = {};
35
32
  Object.keys(measures).forEach((measure) => {
36
- results[group][measure] = tableData.params({ group, groupBy }).filter((d, $) => d[$.groupBy] === $.group).array(measure);
33
+ results[group][measure] = tableData.params({ group, groupBy: normalizedGroupBy }).filter((d, $) => d[$.groupBy] === $.group).array(index.normalizeColumnName(measure));
37
34
  });
38
35
  });
39
36
  return results;
40
- }, [data, filters, groupBy, measures]);
37
+ }, [data, filtersProp, groupByProp, measures]);
41
38
  return chartData;
42
39
  };
43
40
  exports.useBoxplotData = useBoxplotData;
@@ -47,10 +47,6 @@ const HvTreemapChart = react.forwardRef(
47
47
  });
48
48
  const option = useOption.useOption({
49
49
  option: {
50
- title: {
51
- text: name,
52
- left: "center"
53
- },
54
50
  series: [
55
51
  {
56
52
  name,
@@ -10,66 +10,82 @@ const useData = ({
10
10
  measures,
11
11
  sortBy,
12
12
  splitBy,
13
- filters,
13
+ filters: filtersProp,
14
14
  delta
15
15
  }) => {
16
16
  const groupByKey = index.getGroupKey(groupBy);
17
17
  const chartData = react.useMemo(() => {
18
- let tableData;
19
- if (data instanceof arquero.internal.ColumnTable) {
20
- tableData = data;
21
- } else if (Array.isArray(data)) {
22
- tableData = arquero.from(data);
23
- } else {
24
- tableData = arquero.table(data);
25
- }
26
- if (filters) {
18
+ const { data: processedData, mapping } = index.processTableData(data);
19
+ let tableData = processedData;
20
+ if (filtersProp) {
21
+ const filters = (Array.isArray(filtersProp) ? filtersProp : [filtersProp]).map((filter) => ({
22
+ ...filter,
23
+ field: index.normalizeColumnName(filter.field)
24
+ // normalize
25
+ }));
27
26
  tableData = tableData.filter(
28
- arquero.escape(
29
- (row) => index.getHvArqueroCombinedFilters(
30
- row,
31
- Array.isArray(filters) ? filters : [filters]
32
- )
33
- )
27
+ arquero.escape((row) => index.getHvArqueroCombinedFilters(row, filters))
34
28
  );
35
29
  }
36
- const groupByFields = groupBy ? Array.isArray(groupBy) ? groupBy : [groupBy] : [];
37
- const splitByFields = Array.isArray(splitBy) ? splitBy : splitBy != null ? [splitBy] : [];
38
- const measuresFields = measures == null ? {} : typeof measures === "string" ? { [measures]: getAgFunc("sum", measures) } : Array.isArray(measures) ? measures.reduce((acc, value) => {
39
- let field;
40
- let agFunction;
41
- if (typeof value === "string") {
42
- field = value;
43
- agFunction = "sum";
44
- } else {
45
- field = value.field;
46
- agFunction = value.agg ?? "sum";
47
- }
48
- return {
49
- ...acc,
50
- [field]: getAgFunc(agFunction, field)
51
- };
52
- }, {}) : {
53
- [measures.field]: getAgFunc(
30
+ const groupByFields = (groupBy ? Array.isArray(groupBy) ? groupBy : [groupBy] : []).map((value) => index.normalizeColumnName(value));
31
+ const splitByFields = (Array.isArray(splitBy) ? splitBy : splitBy != null ? [splitBy] : []).map((value) => index.normalizeColumnName(value));
32
+ let measuresFields = {};
33
+ if (typeof measures === "string") {
34
+ const normalizedMeasure = index.normalizeColumnName(measures);
35
+ measuresFields[normalizedMeasure] = getAgFunc("sum", normalizedMeasure);
36
+ } else if (Array.isArray(measures)) {
37
+ measuresFields = measures.reduce(
38
+ (acc, value) => {
39
+ let field;
40
+ let agFunction;
41
+ if (typeof value === "string") {
42
+ field = index.normalizeColumnName(value);
43
+ agFunction = "sum";
44
+ } else {
45
+ field = index.normalizeColumnName(value.field);
46
+ agFunction = value.agg ?? "sum";
47
+ }
48
+ return {
49
+ ...acc,
50
+ [field]: getAgFunc(agFunction, field)
51
+ };
52
+ },
53
+ {}
54
+ );
55
+ } else if (measures != null) {
56
+ const normalizedMeasure = index.normalizeColumnName(measures.field);
57
+ measuresFields[normalizedMeasure] = getAgFunc(
54
58
  measures.agg ?? "sum",
55
- measures.field
56
- )
57
- };
58
- const sortByFields = sortBy == null ? {} : typeof sortBy === "string" ? { [sortBy]: "asc" } : Array.isArray(sortBy) ? sortBy.reduce((acc, value) => {
59
- let field;
60
- let orderFunction;
61
- if (typeof value === "string") {
62
- field = value;
63
- orderFunction = "asc";
64
- } else {
65
- field = value.field;
66
- orderFunction = value.order ?? "asc";
67
- }
68
- return {
69
- ...acc,
70
- [field]: orderFunction
71
- };
72
- }, {}) : { [sortBy.field]: sortBy.order ?? "asc" };
59
+ normalizedMeasure
60
+ );
61
+ }
62
+ let sortByFields = {};
63
+ if (typeof sortBy === "string") {
64
+ const normalizedSort = index.normalizeColumnName(sortBy);
65
+ sortByFields[normalizedSort] = "asc";
66
+ } else if (Array.isArray(sortBy)) {
67
+ sortByFields = sortBy.reduce(
68
+ (acc, value) => {
69
+ let field;
70
+ let orderFunction;
71
+ if (typeof value === "string") {
72
+ field = index.normalizeColumnName(value);
73
+ orderFunction = "asc";
74
+ } else {
75
+ field = index.normalizeColumnName(value.field);
76
+ orderFunction = value.order ?? "asc";
77
+ }
78
+ return {
79
+ ...acc,
80
+ [field]: orderFunction
81
+ };
82
+ },
83
+ {}
84
+ );
85
+ } else if (sortBy != null) {
86
+ const normalizedSort = index.normalizeColumnName(sortBy.field);
87
+ sortByFields[normalizedSort] = sortBy.order ?? "asc";
88
+ }
73
89
  const allFields = [
74
90
  ...groupByFields,
75
91
  ...splitByFields,
@@ -78,9 +94,11 @@ const useData = ({
78
94
  if (delta) {
79
95
  const deltaExpression = Object.keys(measuresFields).reduce(
80
96
  (acc, curr) => {
97
+ const normalizedMeasure = index.normalizeColumnName(curr);
98
+ const normalizedDelta = index.normalizeColumnName(delta);
81
99
  return {
82
100
  ...acc,
83
- [curr]: `d => d.${curr} - d.${delta}`
101
+ [normalizedMeasure]: `d => d.${normalizedMeasure} - d.${normalizedDelta}`
84
102
  };
85
103
  },
86
104
  {}
@@ -108,11 +126,29 @@ const useData = ({
108
126
  ...Object.keys(sortByFields).filter((key) => allFields.includes(key)).map((key) => sortByFields[key] === "desc" ? arquero.desc(key) : key)
109
127
  );
110
128
  }
129
+ const reversedMapping = {};
130
+ for (const column of tableData.columnNames()) {
131
+ if (mapping[column] != null) {
132
+ reversedMapping[column] = mapping[column];
133
+ } else {
134
+ reversedMapping[column] = column;
135
+ }
136
+ }
137
+ tableData = tableData.select(reversedMapping);
111
138
  if (groupByFields.length > 1) {
112
139
  tableData = tableData.select(arquero.not(...groupByFields));
113
140
  }
114
141
  return tableData;
115
- }, [data, groupBy, splitBy, measures, sortBy, delta, filters, groupByKey]);
142
+ }, [
143
+ data,
144
+ filtersProp,
145
+ groupBy,
146
+ splitBy,
147
+ measures,
148
+ sortBy,
149
+ delta,
150
+ groupByKey
151
+ ]);
116
152
  return chartData;
117
153
  };
118
154
  exports.useData = useData;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const arquero = require("arquero");
3
4
  const getAxisType = (type) => {
4
5
  switch (type) {
5
6
  case "categorical":
@@ -154,13 +155,39 @@ const getFilterFunction = (operation, field, value) => {
154
155
  const getHvArqueroCombinedFilters = (row, filters) => {
155
156
  return filters.every((filter) => {
156
157
  const { field, operation, value } = filter;
157
- const filterFunction = getFilterFunction(operation, field, value);
158
+ const filterFunction = Object.hasOwn(row, field) ? getFilterFunction(operation, field, value) : () => true;
158
159
  return filterFunction(row);
159
160
  });
160
161
  };
162
+ const normalizeColumnName = (string) => {
163
+ return string.replace(/[^a-zA-Z0-9]/g, "__");
164
+ };
165
+ const processTableData = (data) => {
166
+ let tableData;
167
+ if (data instanceof arquero.internal.ColumnTable) {
168
+ tableData = data;
169
+ } else if (Array.isArray(data)) {
170
+ tableData = arquero.from(data);
171
+ } else {
172
+ tableData = arquero.table(data);
173
+ }
174
+ const nameMapping = {};
175
+ const reversedNameMapping = {};
176
+ for (const column of tableData.columnNames()) {
177
+ const normalizedName = normalizeColumnName(column);
178
+ nameMapping[column] = normalizedName;
179
+ reversedNameMapping[normalizedName] = column;
180
+ }
181
+ return {
182
+ data: tableData.select(nameMapping),
183
+ mapping: reversedNameMapping
184
+ };
185
+ };
161
186
  exports.getAxisType = getAxisType;
162
187
  exports.getFilterFunction = getFilterFunction;
163
188
  exports.getGroupKey = getGroupKey;
164
189
  exports.getHvArqueroCombinedFilters = getHvArqueroCombinedFilters;
165
190
  exports.getLegendIcon = getLegendIcon;
166
191
  exports.getMeasure = getMeasure;
192
+ exports.normalizeColumnName = normalizeColumnName;
193
+ exports.processTableData = processTableData;
@@ -24,8 +24,6 @@ const HvBoxplot = forwardRef(
24
24
  legend,
25
25
  measures,
26
26
  groupBy,
27
- splitBy,
28
- sortBy,
29
27
  tooltip,
30
28
  width,
31
29
  height,
@@ -1 +1 @@
1
- {"version":3,"file":"Boxplot.js","sources":["../../../src/Boxplot/Boxplot.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport ReactECharts from \"echarts-for-react/lib/core\";\nimport { BoxplotChart } from \"echarts/charts\";\nimport { TooltipComponent, VisualMapComponent } from \"echarts/components\";\nimport * as echarts from \"echarts/core\";\nimport { Arrayable, ExtractNames } from \"@hitachivantara/uikit-react-core\";\n\nimport { HvBaseChart } from \"../BaseChart\";\nimport {\n useGrid,\n useLegend,\n useOption,\n useTooltip,\n useXAxis,\n useYAxis,\n} from \"../hooks\";\nimport { HvBoxplotMeasure, HvChartTooltip } from \"../types\";\nimport { HvAxisChartCommonProps, HvChartCommonProps } from \"../types/common\";\nimport { useClasses } from \"./Boxplot.styles\";\nimport { useBoxplot } from \"./useBoxplot\";\n\n// Register chart components\necharts.use([BoxplotChart, TooltipComponent, VisualMapComponent]);\n\nexport type HvBoxplotClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvBoxplotProps\n extends HvAxisChartCommonProps,\n Omit<HvChartCommonProps, \"groupBy\"> {\n /** The name of the heatmap */\n name?: string;\n /** Columns to measure on the chart. */\n measures: Arrayable<HvBoxplotMeasure>;\n /** Columns to use to group the data. */\n groupBy?: string;\n /** The tooltip options. */\n tooltip?: Omit<HvChartTooltip, \"type\" | \"valueFormatter\" | \"titleFormatter\">;\n /** A Jss Object used to override or extend the styles applied to the component. */\n classes?: HvBoxplotClasses;\n}\n\n/**\n * A Boxplot chart visually summarizes the distribution of a dataset by depicting key statistical measures such as the median, quartiles, and outliers.\n */\nexport const HvBoxplot = forwardRef<ReactECharts, HvBoxplotProps>(\n (props, ref) => {\n const {\n name,\n data,\n xAxis,\n yAxis,\n grid,\n legend,\n measures,\n groupBy,\n splitBy,\n sortBy,\n tooltip,\n width,\n height,\n filters,\n classes: classesProp,\n onOptionChange,\n ...others\n } = props;\n\n const { classes } = useClasses(classesProp);\n\n const chartTooltip = useTooltip({\n component: (params) => {\n const title = params?.title;\n const upper = params?.value?.[5];\n const q3 = params?.value?.[4];\n const median = params?.value?.[3];\n const q1 = params?.value?.[2];\n const lower = params?.value?.[1];\n\n return `\n <div class=\"${classes.tooltipRoot}\">\n <div class=\"${classes.tooltipContainer}\">\n <div>\n <p class=\"${classes.tooltipText}\">${title}</p>\n <p class=\"${classes.tooltipText}\">Upper: ${upper}</p>\n <p class=\"${classes.tooltipText}\">Q3: ${q3}</p>\n <p class=\"${classes.tooltipText}\">Median: ${median}</p>\n <p class=\"${classes.tooltipText}\">Q1: ${q1}</p>\n <p class=\"${classes.tooltipText}\">Lower: ${lower}</p>\n </div>\n </div>\n </div>`;\n },\n ...tooltip,\n });\n\n const chartGrid = useGrid({ ...grid });\n\n const chartLegend = useLegend({\n ...legend,\n icon: \"square\",\n });\n\n const chartXAxis = useXAxis({\n ...xAxis,\n });\n\n const chartYAxis = useYAxis({\n axes: Array.isArray(yAxis) || yAxis == null ? yAxis : [yAxis],\n defaultType: \"continuous\",\n ...yAxis,\n });\n\n const chartBoxplot = useBoxplot({ data, groupBy, measures, filters });\n\n const chartOption = useOption({\n option: {\n ...chartBoxplot,\n ...chartGrid,\n ...chartLegend,\n ...chartTooltip,\n ...chartXAxis,\n ...chartYAxis,\n },\n });\n\n return (\n <HvBaseChart\n ref={ref}\n option={chartOption}\n width={width}\n height={height}\n {...others}\n />\n );\n },\n);\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAsBA,QAAQ,IAAI,CAAC,cAAc,kBAAkB,kBAAkB,CAAC;AAsBzD,MAAM,YAAY;AAAA,EACvB,CAAC,OAAO,QAAQ;AACR,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,GAAG;AAAA,IACD,IAAA;AAEJ,UAAM,EAAE,QAAA,IAAY,WAAW,WAAW;AAE1C,UAAM,eAAe,WAAW;AAAA,MAC9B,WAAW,CAAC,WAAW;AACrB,cAAM,QAAQ,QAAQ;AAChB,cAAA,QAAQ,QAAQ,QAAQ,CAAC;AACzB,cAAA,KAAK,QAAQ,QAAQ,CAAC;AACtB,cAAA,SAAS,QAAQ,QAAQ,CAAC;AAC1B,cAAA,KAAK,QAAQ,QAAQ,CAAC;AACtB,cAAA,QAAQ,QAAQ,QAAQ,CAAC;AAExB,eAAA;AAAA,wBACS,QAAQ,WAAW;AAAA,0BACjB,QAAQ,gBAAgB;AAAA;AAAA,0BAExB,QAAQ,WAAW,KAAK,KAAK;AAAA,0BAC7B,QAAQ,WAAW,YAAY,KAAK;AAAA,0BACpC,QAAQ,WAAW,SAAS,EAAE;AAAA,0BAC9B,QAAQ,WAAW,aAAa,MAAM;AAAA,0BACtC,QAAQ,WAAW,SAAS,EAAE;AAAA,0BAC9B,QAAQ,WAAW,YAAY,KAAK;AAAA;AAAA;AAAA;AAAA,MAIxD;AAAA,MACA,GAAG;AAAA,IAAA,CACJ;AAED,UAAM,YAAY,QAAQ,EAAE,GAAG,KAAM,CAAA;AAErC,UAAM,cAAc,UAAU;AAAA,MAC5B,GAAG;AAAA,MACH,MAAM;AAAA,IAAA,CACP;AAED,UAAM,aAAa,SAAS;AAAA,MAC1B,GAAG;AAAA,IAAA,CACJ;AAED,UAAM,aAAa,SAAS;AAAA,MAC1B,MAAM,MAAM,QAAQ,KAAK,KAAK,SAAS,OAAO,QAAQ,CAAC,KAAK;AAAA,MAC5D,aAAa;AAAA,MACb,GAAG;AAAA,IAAA,CACJ;AAED,UAAM,eAAe,WAAW,EAAE,MAAM,SAAS,UAAU,SAAS;AAEpE,UAAM,cAAc,UAAU;AAAA,MAC5B,QAAQ;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,IAAA,CACD;AAGC,WAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACC,GAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;"}
1
+ {"version":3,"file":"Boxplot.js","sources":["../../../src/Boxplot/Boxplot.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport ReactECharts from \"echarts-for-react/lib/core\";\nimport { BoxplotChart } from \"echarts/charts\";\nimport { TooltipComponent, VisualMapComponent } from \"echarts/components\";\nimport * as echarts from \"echarts/core\";\nimport { Arrayable, ExtractNames } from \"@hitachivantara/uikit-react-core\";\n\nimport { HvBaseChart } from \"../BaseChart\";\nimport {\n useGrid,\n useLegend,\n useOption,\n useTooltip,\n useXAxis,\n useYAxis,\n} from \"../hooks\";\nimport { HvBoxplotMeasure, HvChartTooltip } from \"../types\";\nimport { HvAxisChartCommonProps, HvChartCommonProps } from \"../types/common\";\nimport { useClasses } from \"./Boxplot.styles\";\nimport { useBoxplot } from \"./useBoxplot\";\n\n// Register chart components\necharts.use([BoxplotChart, TooltipComponent, VisualMapComponent]);\n\nexport type HvBoxplotClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvBoxplotProps\n extends Omit<\n HvAxisChartCommonProps,\n \"splitBy\" | \"horizontalRangeSlider\" | \"seriesNameFormatter\" | \"stack\"\n >,\n Omit<HvChartCommonProps, \"groupBy\" | \"sortBy\"> {\n /** The name of the heatmap */\n name?: string;\n /** Columns to measure on the chart. */\n measures: Arrayable<HvBoxplotMeasure>;\n /** Columns to use to group the data. */\n groupBy?: string;\n /** The tooltip options. */\n tooltip?: Omit<HvChartTooltip, \"type\" | \"valueFormatter\" | \"titleFormatter\">;\n /** A Jss Object used to override or extend the styles applied to the component. */\n classes?: HvBoxplotClasses;\n}\n\n/**\n * A Boxplot chart visually summarizes the distribution of a dataset by depicting key statistical measures such as the median, quartiles, and outliers.\n */\nexport const HvBoxplot = forwardRef<ReactECharts, HvBoxplotProps>(\n (props, ref) => {\n const {\n name,\n data,\n xAxis,\n yAxis,\n grid,\n legend,\n measures,\n groupBy,\n tooltip,\n width,\n height,\n filters,\n classes: classesProp,\n onOptionChange,\n ...others\n } = props;\n\n const { classes } = useClasses(classesProp);\n\n const chartTooltip = useTooltip({\n component: (params) => {\n const title = params?.title;\n const upper = params?.value?.[5];\n const q3 = params?.value?.[4];\n const median = params?.value?.[3];\n const q1 = params?.value?.[2];\n const lower = params?.value?.[1];\n\n return `\n <div class=\"${classes.tooltipRoot}\">\n <div class=\"${classes.tooltipContainer}\">\n <div>\n <p class=\"${classes.tooltipText}\">${title}</p>\n <p class=\"${classes.tooltipText}\">Upper: ${upper}</p>\n <p class=\"${classes.tooltipText}\">Q3: ${q3}</p>\n <p class=\"${classes.tooltipText}\">Median: ${median}</p>\n <p class=\"${classes.tooltipText}\">Q1: ${q1}</p>\n <p class=\"${classes.tooltipText}\">Lower: ${lower}</p>\n </div>\n </div>\n </div>`;\n },\n ...tooltip,\n });\n\n const chartGrid = useGrid({ ...grid });\n\n const chartLegend = useLegend({\n ...legend,\n icon: \"square\",\n });\n\n const chartXAxis = useXAxis({\n ...xAxis,\n });\n\n const chartYAxis = useYAxis({\n axes: Array.isArray(yAxis) || yAxis == null ? yAxis : [yAxis],\n defaultType: \"continuous\",\n ...yAxis,\n });\n\n const chartBoxplot = useBoxplot({ data, groupBy, measures, filters });\n\n const chartOption = useOption({\n option: {\n ...chartBoxplot,\n ...chartGrid,\n ...chartLegend,\n ...chartTooltip,\n ...chartXAxis,\n ...chartYAxis,\n },\n });\n\n return (\n <HvBaseChart\n ref={ref}\n option={chartOption}\n width={width}\n height={height}\n {...others}\n />\n );\n },\n);\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAsBA,QAAQ,IAAI,CAAC,cAAc,kBAAkB,kBAAkB,CAAC;AAyBzD,MAAM,YAAY;AAAA,EACvB,CAAC,OAAO,QAAQ;AACR,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,GAAG;AAAA,IACD,IAAA;AAEJ,UAAM,EAAE,QAAA,IAAY,WAAW,WAAW;AAE1C,UAAM,eAAe,WAAW;AAAA,MAC9B,WAAW,CAAC,WAAW;AACrB,cAAM,QAAQ,QAAQ;AAChB,cAAA,QAAQ,QAAQ,QAAQ,CAAC;AACzB,cAAA,KAAK,QAAQ,QAAQ,CAAC;AACtB,cAAA,SAAS,QAAQ,QAAQ,CAAC;AAC1B,cAAA,KAAK,QAAQ,QAAQ,CAAC;AACtB,cAAA,QAAQ,QAAQ,QAAQ,CAAC;AAExB,eAAA;AAAA,wBACS,QAAQ,WAAW;AAAA,0BACjB,QAAQ,gBAAgB;AAAA;AAAA,0BAExB,QAAQ,WAAW,KAAK,KAAK;AAAA,0BAC7B,QAAQ,WAAW,YAAY,KAAK;AAAA,0BACpC,QAAQ,WAAW,SAAS,EAAE;AAAA,0BAC9B,QAAQ,WAAW,aAAa,MAAM;AAAA,0BACtC,QAAQ,WAAW,SAAS,EAAE;AAAA,0BAC9B,QAAQ,WAAW,YAAY,KAAK;AAAA;AAAA;AAAA;AAAA,MAIxD;AAAA,MACA,GAAG;AAAA,IAAA,CACJ;AAED,UAAM,YAAY,QAAQ,EAAE,GAAG,KAAM,CAAA;AAErC,UAAM,cAAc,UAAU;AAAA,MAC5B,GAAG;AAAA,MACH,MAAM;AAAA,IAAA,CACP;AAED,UAAM,aAAa,SAAS;AAAA,MAC1B,GAAG;AAAA,IAAA,CACJ;AAED,UAAM,aAAa,SAAS;AAAA,MAC1B,MAAM,MAAM,QAAQ,KAAK,KAAK,SAAS,OAAO,QAAQ,CAAC,KAAK;AAAA,MAC5D,aAAa;AAAA,MACb,GAAG;AAAA,IAAA,CACJ;AAED,UAAM,eAAe,WAAW,EAAE,MAAM,SAAS,UAAU,SAAS;AAEpE,UAAM,cAAc,UAAU;AAAA,MAC5B,QAAQ;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,IAAA,CACD;AAGC,WAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACC,GAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;"}
@@ -7,12 +7,10 @@ const useBoxplot = ({
7
7
  filters
8
8
  }) => {
9
9
  const measuresFields = useMemo(() => {
10
- if (measures == null) {
10
+ if (measures == null)
11
11
  return {};
12
- }
13
- if (typeof measures === "string") {
12
+ if (typeof measures === "string")
14
13
  return { [measures]: void 0 };
15
- }
16
14
  if (Array.isArray(measures)) {
17
15
  return measures.reduce(
18
16
  (acc, value) => {
@@ -1 +1 @@
1
- {"version":3,"file":"useBoxplot.js","sources":["../../../src/Boxplot/useBoxplot.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { Arrayable } from \"@hitachivantara/uikit-react-core\";\n\nimport { HvBoxplotMeasure, HvChartData, HvChartFilter } from \"../types\";\nimport { useBoxplotData } from \"./useBoxplotData\";\n\ninterface HvDataHookProps {\n data: HvChartData;\n groupBy?: string;\n measures: Arrayable<HvBoxplotMeasure>;\n filters?: Arrayable<HvChartFilter>;\n}\n\nexport const useBoxplot = ({\n data,\n groupBy,\n measures,\n filters,\n}: HvDataHookProps) => {\n const measuresFields = useMemo(() => {\n if (measures == null) {\n return {};\n }\n if (typeof measures === \"string\") {\n return { [measures]: undefined };\n }\n if (Array.isArray(measures)) {\n return measures.reduce<{ [key: string]: string | undefined }>(\n (acc, value) => {\n let field: string | undefined;\n if (typeof value === \"string\") {\n field = value;\n } else {\n field = value.field;\n }\n\n return {\n ...acc,\n [field]: typeof value === \"string\" ? undefined : value.yAxis,\n };\n },\n {},\n );\n }\n return { [measures.field]: measures.yAxis };\n }, [measures]);\n\n const chartData = useBoxplotData({\n data,\n groupBy,\n measures: measuresFields,\n filters,\n });\n\n const boxplotData = useMemo(() => {\n const setData = {};\n Object.keys(measuresFields).forEach((m) => {\n setData[m] = [];\n Object.keys(chartData).forEach((key) => {\n setData[m].push(chartData[key][m]);\n });\n });\n\n const sources: any[] = [];\n const transforms: any[] = [];\n const series: any[] = [];\n\n Object.keys(measuresFields).forEach((m, index) => {\n sources.push({\n source: setData[m],\n id: m,\n });\n transforms.push({\n fromDatasetId: m,\n transform: {\n type: \"boxplot\",\n config: {\n itemNameFormatter: (params) => Object.keys(chartData)[params.value],\n },\n },\n });\n series.push({\n name: m,\n type: \"boxplot\",\n datasetIndex: Object.keys(measuresFields).length + index,\n yAxisId: measuresFields[m],\n });\n });\n\n const datasets = {\n dataset: [...sources, ...transforms],\n series,\n };\n\n return datasets;\n }, [chartData, measuresFields]);\n\n return boxplotData;\n};\n"],"names":[],"mappings":";;AAaO,MAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAuB;AACf,QAAA,iBAAiB,QAAQ,MAAM;AACnC,QAAI,YAAY,MAAM;AACpB,aAAO;IACT;AACI,QAAA,OAAO,aAAa,UAAU;AAChC,aAAO,EAAE,CAAC,QAAQ,GAAG;IACvB;AACI,QAAA,MAAM,QAAQ,QAAQ,GAAG;AAC3B,aAAO,SAAS;AAAA,QACd,CAAC,KAAK,UAAU;AACV,cAAA;AACA,cAAA,OAAO,UAAU,UAAU;AACrB,oBAAA;AAAA,UAAA,OACH;AACL,oBAAQ,MAAM;AAAA,UAChB;AAEO,iBAAA;AAAA,YACL,GAAG;AAAA,YACH,CAAC,KAAK,GAAG,OAAO,UAAU,WAAW,SAAY,MAAM;AAAA,UAAA;AAAA,QAE3D;AAAA,QACA,CAAC;AAAA,MAAA;AAAA,IAEL;AACA,WAAO,EAAE,CAAC,SAAS,KAAK,GAAG,SAAS,MAAM;AAAA,EAAA,GACzC,CAAC,QAAQ,CAAC;AAEb,QAAM,YAAY,eAAe;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EAAA,CACD;AAEK,QAAA,cAAc,QAAQ,MAAM;AAChC,UAAM,UAAU,CAAA;AAChB,WAAO,KAAK,cAAc,EAAE,QAAQ,CAAC,MAAM;AACjC,cAAA,CAAC,IAAI;AACb,aAAO,KAAK,SAAS,EAAE,QAAQ,CAAC,QAAQ;AACtC,gBAAQ,CAAC,EAAE,KAAK,UAAU,GAAG,EAAE,CAAC,CAAC;AAAA,MAAA,CAClC;AAAA,IAAA,CACF;AAED,UAAM,UAAiB,CAAA;AACvB,UAAM,aAAoB,CAAA;AAC1B,UAAM,SAAgB,CAAA;AAEtB,WAAO,KAAK,cAAc,EAAE,QAAQ,CAAC,GAAG,UAAU;AAChD,cAAQ,KAAK;AAAA,QACX,QAAQ,QAAQ,CAAC;AAAA,QACjB,IAAI;AAAA,MAAA,CACL;AACD,iBAAW,KAAK;AAAA,QACd,eAAe;AAAA,QACf,WAAW;AAAA,UACT,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,mBAAmB,CAAC,WAAW,OAAO,KAAK,SAAS,EAAE,OAAO,KAAK;AAAA,UACpE;AAAA,QACF;AAAA,MAAA,CACD;AACD,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,cAAc,OAAO,KAAK,cAAc,EAAE,SAAS;AAAA,QACnD,SAAS,eAAe,CAAC;AAAA,MAAA,CAC1B;AAAA,IAAA,CACF;AAED,UAAM,WAAW;AAAA,MACf,SAAS,CAAC,GAAG,SAAS,GAAG,UAAU;AAAA,MACnC;AAAA,IAAA;AAGK,WAAA;AAAA,EAAA,GACN,CAAC,WAAW,cAAc,CAAC;AAEvB,SAAA;AACT;"}
1
+ {"version":3,"file":"useBoxplot.js","sources":["../../../src/Boxplot/useBoxplot.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { Arrayable } from \"@hitachivantara/uikit-react-core\";\n\nimport { HvBoxplotMeasure, HvChartData, HvChartFilter } from \"../types\";\nimport { useBoxplotData } from \"./useBoxplotData\";\n\ninterface HvDataHookProps {\n data: HvChartData;\n groupBy?: string;\n measures: Arrayable<HvBoxplotMeasure>;\n filters?: Arrayable<HvChartFilter>;\n}\n\nexport const useBoxplot = ({\n data,\n groupBy,\n measures,\n filters,\n}: HvDataHookProps) => {\n const measuresFields = useMemo(() => {\n if (measures == null) return {};\n if (typeof measures === \"string\") return { [measures]: undefined };\n if (Array.isArray(measures)) {\n return measures.reduce<{ [key: string]: string | undefined }>(\n (acc, value) => {\n let field: string | undefined;\n if (typeof value === \"string\") {\n field = value;\n } else {\n field = value.field;\n }\n return {\n ...acc,\n [field]: typeof value === \"string\" ? undefined : value.yAxis,\n };\n },\n {},\n );\n }\n return { [measures.field]: measures.yAxis };\n }, [measures]);\n\n const chartData = useBoxplotData({\n data,\n groupBy,\n measures: measuresFields,\n filters,\n });\n\n const boxplotData = useMemo(() => {\n const setData = {};\n Object.keys(measuresFields).forEach((m) => {\n setData[m] = [];\n Object.keys(chartData).forEach((key) => {\n setData[m].push(chartData[key][m]);\n });\n });\n\n const sources: any[] = [];\n const transforms: any[] = [];\n const series: any[] = [];\n\n Object.keys(measuresFields).forEach((m, index) => {\n sources.push({\n source: setData[m],\n id: m,\n });\n transforms.push({\n fromDatasetId: m,\n transform: {\n type: \"boxplot\",\n config: {\n itemNameFormatter: (params) => Object.keys(chartData)[params.value],\n },\n },\n });\n series.push({\n name: m,\n type: \"boxplot\",\n datasetIndex: Object.keys(measuresFields).length + index,\n yAxisId: measuresFields[m],\n });\n });\n\n const datasets = {\n dataset: [...sources, ...transforms],\n series,\n };\n\n return datasets;\n }, [chartData, measuresFields]);\n\n return boxplotData;\n};\n"],"names":[],"mappings":";;AAaO,MAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAuB;AACf,QAAA,iBAAiB,QAAQ,MAAM;AACnC,QAAI,YAAY;AAAM,aAAO;AAC7B,QAAI,OAAO,aAAa;AAAU,aAAO,EAAE,CAAC,QAAQ,GAAG;AACnD,QAAA,MAAM,QAAQ,QAAQ,GAAG;AAC3B,aAAO,SAAS;AAAA,QACd,CAAC,KAAK,UAAU;AACV,cAAA;AACA,cAAA,OAAO,UAAU,UAAU;AACrB,oBAAA;AAAA,UAAA,OACH;AACL,oBAAQ,MAAM;AAAA,UAChB;AACO,iBAAA;AAAA,YACL,GAAG;AAAA,YACH,CAAC,KAAK,GAAG,OAAO,UAAU,WAAW,SAAY,MAAM;AAAA,UAAA;AAAA,QAE3D;AAAA,QACA,CAAC;AAAA,MAAA;AAAA,IAEL;AACA,WAAO,EAAE,CAAC,SAAS,KAAK,GAAG,SAAS,MAAM;AAAA,EAAA,GACzC,CAAC,QAAQ,CAAC;AAEb,QAAM,YAAY,eAAe;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EAAA,CACD;AAEK,QAAA,cAAc,QAAQ,MAAM;AAChC,UAAM,UAAU,CAAA;AAChB,WAAO,KAAK,cAAc,EAAE,QAAQ,CAAC,MAAM;AACjC,cAAA,CAAC,IAAI;AACb,aAAO,KAAK,SAAS,EAAE,QAAQ,CAAC,QAAQ;AACtC,gBAAQ,CAAC,EAAE,KAAK,UAAU,GAAG,EAAE,CAAC,CAAC;AAAA,MAAA,CAClC;AAAA,IAAA,CACF;AAED,UAAM,UAAiB,CAAA;AACvB,UAAM,aAAoB,CAAA;AAC1B,UAAM,SAAgB,CAAA;AAEtB,WAAO,KAAK,cAAc,EAAE,QAAQ,CAAC,GAAG,UAAU;AAChD,cAAQ,KAAK;AAAA,QACX,QAAQ,QAAQ,CAAC;AAAA,QACjB,IAAI;AAAA,MAAA,CACL;AACD,iBAAW,KAAK;AAAA,QACd,eAAe;AAAA,QACf,WAAW;AAAA,UACT,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,mBAAmB,CAAC,WAAW,OAAO,KAAK,SAAS,EAAE,OAAO,KAAK;AAAA,UACpE;AAAA,QACF;AAAA,MAAA,CACD;AACD,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,cAAc,OAAO,KAAK,cAAc,EAAE,SAAS;AAAA,QACnD,SAAS,eAAe,CAAC;AAAA,MAAA,CAC1B;AAAA,IAAA,CACF;AAED,UAAM,WAAW;AAAA,MACf,SAAS,CAAC,GAAG,SAAS,GAAG,UAAU;AAAA,MACnC;AAAA,IAAA;AAGK,WAAA;AAAA,EAAA,GACN,CAAC,WAAW,cAAc,CAAC;AAEvB,SAAA;AACT;"}
@@ -1,41 +1,38 @@
1
1
  import { useMemo } from "react";
2
- import { internal, from, table, escape } from "arquero";
3
- import { getHvArqueroCombinedFilters } from "../utils/index.js";
2
+ import { escape } from "arquero";
3
+ import { processTableData, normalizeColumnName, getHvArqueroCombinedFilters } from "../utils/index.js";
4
4
  const useBoxplotData = ({
5
5
  data,
6
- groupBy,
6
+ groupBy: groupByProp,
7
7
  measures,
8
- filters
8
+ filters: filtersProp
9
9
  }) => {
10
10
  const chartData = useMemo(() => {
11
- let tableData;
12
- if (data instanceof internal.ColumnTable) {
13
- tableData = data;
14
- } else if (Array.isArray(data)) {
15
- tableData = from(data);
16
- } else {
17
- tableData = table(data);
18
- }
19
- if (filters) {
11
+ const { data: processedData } = processTableData(data);
12
+ let tableData = processedData;
13
+ if (filtersProp) {
14
+ const filters = (Array.isArray(filtersProp) ? filtersProp : [filtersProp]).map((filter) => ({
15
+ ...filter,
16
+ field: normalizeColumnName(filter.field)
17
+ // normalize
18
+ }));
20
19
  tableData = tableData.filter(
21
- escape(
22
- (row) => getHvArqueroCombinedFilters(
23
- row,
24
- Array.isArray(filters) ? filters : [filters]
25
- )
26
- )
20
+ escape((row) => getHvArqueroCombinedFilters(row, filters))
27
21
  );
28
22
  }
29
- const uniqueGroupBy = new Set(tableData.array(groupBy || ""));
23
+ const normalizedGroupBy = normalizeColumnName(groupByProp || "");
24
+ const uniqueGroupBy = new Set(
25
+ tableData.array(normalizedGroupBy)
26
+ );
30
27
  const results = {};
31
28
  uniqueGroupBy.forEach((group) => {
32
29
  results[group] = {};
33
30
  Object.keys(measures).forEach((measure) => {
34
- results[group][measure] = tableData.params({ group, groupBy }).filter((d, $) => d[$.groupBy] === $.group).array(measure);
31
+ results[group][measure] = tableData.params({ group, groupBy: normalizedGroupBy }).filter((d, $) => d[$.groupBy] === $.group).array(normalizeColumnName(measure));
35
32
  });
36
33
  });
37
34
  return results;
38
- }, [data, filters, groupBy, measures]);
35
+ }, [data, filtersProp, groupByProp, measures]);
39
36
  return chartData;
40
37
  };
41
38
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"useBoxplotData.js","sources":["../../../src/Boxplot/useBoxplotData.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { escape, from, internal, table } from \"arquero\";\nimport type ColumnTable from \"arquero/dist/types/table/column-table\";\nimport { Arrayable } from \"@hitachivantara/uikit-react-core\";\n\nimport { HvChartData, HvChartFilter } from \"../types\";\nimport { getHvArqueroCombinedFilters } from \"../utils\";\n\ninterface HvDataHookProps {\n data: HvChartData;\n groupBy?: string;\n measures: { [key: string]: string | undefined };\n filters?: Arrayable<HvChartFilter>;\n}\n\nexport const useBoxplotData = ({\n data,\n groupBy,\n measures,\n filters,\n}: HvDataHookProps) => {\n const chartData = useMemo(() => {\n let tableData: ColumnTable;\n if (data instanceof internal.ColumnTable) {\n tableData = data;\n } else if (Array.isArray(data)) {\n tableData = from(data);\n } else {\n tableData = table(data);\n }\n\n // Filter data right away\n if (filters) {\n tableData = tableData.filter(\n escape((row) =>\n getHvArqueroCombinedFilters(\n row,\n Array.isArray(filters) ? filters : [filters],\n ),\n ),\n );\n }\n\n const uniqueGroupBy = new Set(tableData.array(groupBy || \"\") as string[]);\n\n const results = {};\n uniqueGroupBy.forEach((group) => {\n results[group] = {};\n Object.keys(measures).forEach((measure) => {\n results[group][measure] = tableData\n .params({ group, groupBy })\n .filter((d, $) => d[$.groupBy] === $.group)\n .array(measure);\n });\n });\n\n return results;\n }, [data, filters, groupBy, measures]);\n\n return chartData;\n};\n"],"names":[],"mappings":";;;AAeO,MAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAuB;AACf,QAAA,YAAY,QAAQ,MAAM;AAC1B,QAAA;AACA,QAAA,gBAAgB,SAAS,aAAa;AAC5B,kBAAA;AAAA,IACH,WAAA,MAAM,QAAQ,IAAI,GAAG;AAC9B,kBAAY,KAAK,IAAI;AAAA,IAAA,OAChB;AACL,kBAAY,MAAM,IAAI;AAAA,IACxB;AAGA,QAAI,SAAS;AACX,kBAAY,UAAU;AAAA,QACpB;AAAA,UAAO,CAAC,QACN;AAAA,YACE;AAAA,YACA,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAAA,UAC7C;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ;AAEA,UAAM,gBAAgB,IAAI,IAAI,UAAU,MAAM,WAAW,EAAE,CAAa;AAExE,UAAM,UAAU,CAAA;AACF,kBAAA,QAAQ,CAAC,UAAU;AACvB,cAAA,KAAK,IAAI;AACjB,aAAO,KAAK,QAAQ,EAAE,QAAQ,CAAC,YAAY;AACjC,gBAAA,KAAK,EAAE,OAAO,IAAI,UACvB,OAAO,EAAE,OAAO,QAAS,CAAA,EACzB,OAAO,CAAC,GAAG,MAAM,EAAE,EAAE,OAAO,MAAM,EAAE,KAAK,EACzC,MAAM,OAAO;AAAA,MAAA,CACjB;AAAA,IAAA,CACF;AAEM,WAAA;AAAA,KACN,CAAC,MAAM,SAAS,SAAS,QAAQ,CAAC;AAE9B,SAAA;AACT;"}
1
+ {"version":3,"file":"useBoxplotData.js","sources":["../../../src/Boxplot/useBoxplotData.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { escape } from \"arquero\";\nimport { Arrayable } from \"@hitachivantara/uikit-react-core\";\n\nimport { HvChartData, HvChartFilter } from \"../types\";\nimport {\n getHvArqueroCombinedFilters,\n normalizeColumnName,\n processTableData,\n} from \"../utils\";\n\ninterface HvDataHookProps {\n data: HvChartData;\n groupBy?: string;\n measures: { [key: string]: string | undefined };\n filters?: Arrayable<HvChartFilter>;\n}\n\nexport const useBoxplotData = ({\n data,\n groupBy: groupByProp,\n measures,\n filters: filtersProp,\n}: HvDataHookProps) => {\n const chartData = useMemo(() => {\n // Converting data to arquero table data and normalizing the columns name\n const { data: processedData } = processTableData(data);\n let tableData = processedData;\n\n // Filter data right away\n if (filtersProp) {\n const filters = (\n Array.isArray(filtersProp) ? filtersProp : [filtersProp]\n ).map((filter) => ({\n ...filter,\n field: normalizeColumnName(filter.field), // normalize\n }));\n\n tableData = tableData.filter(\n escape((row) => getHvArqueroCombinedFilters(row, filters)),\n );\n }\n\n const normalizedGroupBy = normalizeColumnName(groupByProp || \"\"); // normalize\n const uniqueGroupBy = new Set(\n tableData.array(normalizedGroupBy) as string[],\n );\n\n const results = {};\n uniqueGroupBy.forEach((group) => {\n results[group] = {};\n Object.keys(measures).forEach((measure) => {\n results[group][measure] = tableData\n .params({ group, groupBy: normalizedGroupBy })\n .filter((d, $) => d[$.groupBy] === $.group)\n .array(normalizeColumnName(measure)); // normalize\n });\n });\n\n return results;\n }, [data, filtersProp, groupByProp, measures]);\n\n return chartData;\n};\n"],"names":[],"mappings":";;;AAkBO,MAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,SAAS;AACX,MAAuB;AACf,QAAA,YAAY,QAAQ,MAAM;AAE9B,UAAM,EAAE,MAAM,cAAc,IAAI,iBAAiB,IAAI;AACrD,QAAI,YAAY;AAGhB,QAAI,aAAa;AACT,YAAA,WACJ,MAAM,QAAQ,WAAW,IAAI,cAAc,CAAC,WAAW,GACvD,IAAI,CAAC,YAAY;AAAA,QACjB,GAAG;AAAA,QACH,OAAO,oBAAoB,OAAO,KAAK;AAAA;AAAA,MACvC,EAAA;AAEF,kBAAY,UAAU;AAAA,QACpB,OAAO,CAAC,QAAQ,4BAA4B,KAAK,OAAO,CAAC;AAAA,MAAA;AAAA,IAE7D;AAEM,UAAA,oBAAoB,oBAAoB,eAAe,EAAE;AAC/D,UAAM,gBAAgB,IAAI;AAAA,MACxB,UAAU,MAAM,iBAAiB;AAAA,IAAA;AAGnC,UAAM,UAAU,CAAA;AACF,kBAAA,QAAQ,CAAC,UAAU;AACvB,cAAA,KAAK,IAAI;AACjB,aAAO,KAAK,QAAQ,EAAE,QAAQ,CAAC,YAAY;AACjC,gBAAA,KAAK,EAAE,OAAO,IAAI,UACvB,OAAO,EAAE,OAAO,SAAS,kBAAkB,CAAC,EAC5C,OAAO,CAAC,GAAG,MAAM,EAAE,EAAE,OAAO,MAAM,EAAE,KAAK,EACzC,MAAM,oBAAoB,OAAO,CAAC;AAAA,MAAA,CACtC;AAAA,IAAA,CACF;AAEM,WAAA;AAAA,KACN,CAAC,MAAM,aAAa,aAAa,QAAQ,CAAC;AAEtC,SAAA;AACT;"}
@@ -26,10 +26,6 @@ const HvTreemapChart = forwardRef(
26
26
  });
27
27
  const option = useOption({
28
28
  option: {
29
- title: {
30
- text: name,
31
- left: "center"
32
- },
33
29
  series: [
34
30
  {
35
31
  name,
@@ -1 +1 @@
1
- {"version":3,"file":"Treemap.js","sources":["../../../src/Treemap/Treemap.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport ReactECharts from \"echarts-for-react/lib/core\";\nimport { TreemapChart } from \"echarts/charts\";\nimport { TooltipComponent } from \"echarts/components\";\nimport * as echarts from \"echarts/core\";\n\nimport { HvBaseChart } from \"../BaseChart\";\nimport { HvChartTooltipClasses, useOption, useTooltip } from \"../hooks\";\nimport { HvChartTooltip } from \"../types\";\nimport { HvChartCommonProps } from \"../types/common\";\n\n// Register chart components\necharts.use([TreemapChart, TooltipComponent]);\n\nexport type HvTreemapData = {\n [propName: string]:\n | string\n | number\n | number[]\n | HvTreemapData[]\n | undefined\n | null;\n children?: HvTreemapData[];\n name?: string;\n value?: number[];\n};\n\nexport interface HvTreemapChartClasses extends HvChartTooltipClasses {}\n\nexport interface HvTreemapChartProps\n extends Omit<\n HvChartCommonProps,\n \"data\" | \"groupBy\" | \"sortBy\" | \"grid\" | \"legend\" | \"tooltip\" | \"filters\"\n > {\n /** The name of the treemap */\n name?: string;\n /** The data to use on the treemap */\n data?: HvTreemapData[];\n /** The tooltip options. */\n tooltip?: Omit<HvChartTooltip, \"type\">;\n /** A Jss Object used to override or extend the styles applied to the component. */\n classes?: HvTreemapChartClasses;\n}\n\n/**\n * A tree map chart visually represents hierarchical data using nested rectangles, with each rectangle's size proportional to the value it represents.\n */\nexport const HvTreemapChart = forwardRef<ReactECharts, HvTreemapChartProps>(\n (props, ref) => {\n const {\n name,\n data,\n classes,\n width,\n height,\n tooltip,\n onOptionChange,\n ...others\n } = props;\n\n const chartTooltip = useTooltip({\n ...tooltip,\n type: \"single\",\n classes,\n });\n\n const option = useOption({\n option: {\n title: {\n text: name,\n left: \"center\",\n },\n series: [\n {\n name,\n type: \"treemap\",\n data,\n },\n ],\n ...chartTooltip,\n },\n onOptionChange,\n });\n\n return (\n <HvBaseChart\n ref={ref}\n option={option}\n width={width}\n height={height}\n {...others}\n />\n );\n },\n);\n"],"names":[],"mappings":";;;;;;;;AAYA,QAAQ,IAAI,CAAC,cAAc,gBAAgB,CAAC;AAmCrC,MAAM,iBAAiB;AAAA,EAC5B,CAAC,OAAO,QAAQ;AACR,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACD,IAAA;AAEJ,UAAM,eAAe,WAAW;AAAA,MAC9B,GAAG;AAAA,MACH,MAAM;AAAA,MACN;AAAA,IAAA,CACD;AAED,UAAM,SAAS,UAAU;AAAA,MACvB,QAAQ;AAAA,QACN,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,UACN;AAAA,YACE;AAAA,YACA,MAAM;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,QACA,GAAG;AAAA,MACL;AAAA,MACA;AAAA,IAAA,CACD;AAGC,WAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;"}
1
+ {"version":3,"file":"Treemap.js","sources":["../../../src/Treemap/Treemap.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport ReactECharts from \"echarts-for-react/lib/core\";\nimport { TreemapChart } from \"echarts/charts\";\nimport { TooltipComponent } from \"echarts/components\";\nimport * as echarts from \"echarts/core\";\n\nimport { HvBaseChart } from \"../BaseChart\";\nimport { HvChartTooltipClasses, useOption, useTooltip } from \"../hooks\";\nimport { HvChartTooltip } from \"../types\";\nimport { HvChartCommonProps } from \"../types/common\";\n\n// Register chart components\necharts.use([TreemapChart, TooltipComponent]);\n\nexport type HvTreemapData = {\n [propName: string]:\n | string\n | number\n | number[]\n | HvTreemapData[]\n | undefined\n | null;\n children?: HvTreemapData[];\n name?: string;\n value?: number[];\n};\n\nexport interface HvTreemapChartClasses extends HvChartTooltipClasses {}\n\nexport interface HvTreemapChartProps\n extends Omit<\n HvChartCommonProps,\n \"data\" | \"groupBy\" | \"sortBy\" | \"grid\" | \"legend\" | \"tooltip\" | \"filters\"\n > {\n /** The name of the treemap */\n name?: string;\n /** The data to use on the treemap */\n data?: HvTreemapData[];\n /** The tooltip options. */\n tooltip?: Omit<HvChartTooltip, \"type\">;\n /** A Jss Object used to override or extend the styles applied to the component. */\n classes?: HvTreemapChartClasses;\n}\n\n/**\n * A tree map chart visually represents hierarchical data using nested rectangles, with each rectangle's size proportional to the value it represents.\n */\nexport const HvTreemapChart = forwardRef<ReactECharts, HvTreemapChartProps>(\n (props, ref) => {\n const {\n name,\n data,\n classes,\n width,\n height,\n tooltip,\n onOptionChange,\n ...others\n } = props;\n\n const chartTooltip = useTooltip({\n ...tooltip,\n type: \"single\",\n classes,\n });\n\n const option = useOption({\n option: {\n series: [\n {\n name,\n type: \"treemap\",\n data,\n },\n ],\n ...chartTooltip,\n },\n onOptionChange,\n });\n\n return (\n <HvBaseChart\n ref={ref}\n option={option}\n width={width}\n height={height}\n {...others}\n />\n );\n },\n);\n"],"names":[],"mappings":";;;;;;;;AAYA,QAAQ,IAAI,CAAC,cAAc,gBAAgB,CAAC;AAmCrC,MAAM,iBAAiB;AAAA,EAC5B,CAAC,OAAO,QAAQ;AACR,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACD,IAAA;AAEJ,UAAM,eAAe,WAAW;AAAA,MAC9B,GAAG;AAAA,MACH,MAAM;AAAA,MACN;AAAA,IAAA,CACD;AAED,UAAM,SAAS,UAAU;AAAA,MACvB,QAAQ;AAAA,QACN,QAAQ;AAAA,UACN;AAAA,YACE;AAAA,YACA,MAAM;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,QACA,GAAG;AAAA,MACL;AAAA,MACA;AAAA,IAAA,CACD;AAGC,WAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;"}
@@ -1,6 +1,6 @@
1
1
  import { useMemo } from "react";
2
- import { internal, from, table, escape, desc, not } from "arquero";
3
- import { getGroupKey, getHvArqueroCombinedFilters } from "../utils/index.js";
2
+ import { escape, desc, not } from "arquero";
3
+ import { getGroupKey, processTableData, normalizeColumnName, getHvArqueroCombinedFilters } from "../utils/index.js";
4
4
  const getAgFunc = (func, field) => func === "count" ? "count()" : `${func}(d["${field}"])`;
5
5
  const useData = ({
6
6
  data,
@@ -8,66 +8,82 @@ const useData = ({
8
8
  measures,
9
9
  sortBy,
10
10
  splitBy,
11
- filters,
11
+ filters: filtersProp,
12
12
  delta
13
13
  }) => {
14
14
  const groupByKey = getGroupKey(groupBy);
15
15
  const chartData = useMemo(() => {
16
- let tableData;
17
- if (data instanceof internal.ColumnTable) {
18
- tableData = data;
19
- } else if (Array.isArray(data)) {
20
- tableData = from(data);
21
- } else {
22
- tableData = table(data);
23
- }
24
- if (filters) {
16
+ const { data: processedData, mapping } = processTableData(data);
17
+ let tableData = processedData;
18
+ if (filtersProp) {
19
+ const filters = (Array.isArray(filtersProp) ? filtersProp : [filtersProp]).map((filter) => ({
20
+ ...filter,
21
+ field: normalizeColumnName(filter.field)
22
+ // normalize
23
+ }));
25
24
  tableData = tableData.filter(
26
- escape(
27
- (row) => getHvArqueroCombinedFilters(
28
- row,
29
- Array.isArray(filters) ? filters : [filters]
30
- )
31
- )
25
+ escape((row) => getHvArqueroCombinedFilters(row, filters))
32
26
  );
33
27
  }
34
- const groupByFields = groupBy ? Array.isArray(groupBy) ? groupBy : [groupBy] : [];
35
- const splitByFields = Array.isArray(splitBy) ? splitBy : splitBy != null ? [splitBy] : [];
36
- const measuresFields = measures == null ? {} : typeof measures === "string" ? { [measures]: getAgFunc("sum", measures) } : Array.isArray(measures) ? measures.reduce((acc, value) => {
37
- let field;
38
- let agFunction;
39
- if (typeof value === "string") {
40
- field = value;
41
- agFunction = "sum";
42
- } else {
43
- field = value.field;
44
- agFunction = value.agg ?? "sum";
45
- }
46
- return {
47
- ...acc,
48
- [field]: getAgFunc(agFunction, field)
49
- };
50
- }, {}) : {
51
- [measures.field]: getAgFunc(
28
+ const groupByFields = (groupBy ? Array.isArray(groupBy) ? groupBy : [groupBy] : []).map((value) => normalizeColumnName(value));
29
+ const splitByFields = (Array.isArray(splitBy) ? splitBy : splitBy != null ? [splitBy] : []).map((value) => normalizeColumnName(value));
30
+ let measuresFields = {};
31
+ if (typeof measures === "string") {
32
+ const normalizedMeasure = normalizeColumnName(measures);
33
+ measuresFields[normalizedMeasure] = getAgFunc("sum", normalizedMeasure);
34
+ } else if (Array.isArray(measures)) {
35
+ measuresFields = measures.reduce(
36
+ (acc, value) => {
37
+ let field;
38
+ let agFunction;
39
+ if (typeof value === "string") {
40
+ field = normalizeColumnName(value);
41
+ agFunction = "sum";
42
+ } else {
43
+ field = normalizeColumnName(value.field);
44
+ agFunction = value.agg ?? "sum";
45
+ }
46
+ return {
47
+ ...acc,
48
+ [field]: getAgFunc(agFunction, field)
49
+ };
50
+ },
51
+ {}
52
+ );
53
+ } else if (measures != null) {
54
+ const normalizedMeasure = normalizeColumnName(measures.field);
55
+ measuresFields[normalizedMeasure] = getAgFunc(
52
56
  measures.agg ?? "sum",
53
- measures.field
54
- )
55
- };
56
- const sortByFields = sortBy == null ? {} : typeof sortBy === "string" ? { [sortBy]: "asc" } : Array.isArray(sortBy) ? sortBy.reduce((acc, value) => {
57
- let field;
58
- let orderFunction;
59
- if (typeof value === "string") {
60
- field = value;
61
- orderFunction = "asc";
62
- } else {
63
- field = value.field;
64
- orderFunction = value.order ?? "asc";
65
- }
66
- return {
67
- ...acc,
68
- [field]: orderFunction
69
- };
70
- }, {}) : { [sortBy.field]: sortBy.order ?? "asc" };
57
+ normalizedMeasure
58
+ );
59
+ }
60
+ let sortByFields = {};
61
+ if (typeof sortBy === "string") {
62
+ const normalizedSort = normalizeColumnName(sortBy);
63
+ sortByFields[normalizedSort] = "asc";
64
+ } else if (Array.isArray(sortBy)) {
65
+ sortByFields = sortBy.reduce(
66
+ (acc, value) => {
67
+ let field;
68
+ let orderFunction;
69
+ if (typeof value === "string") {
70
+ field = normalizeColumnName(value);
71
+ orderFunction = "asc";
72
+ } else {
73
+ field = normalizeColumnName(value.field);
74
+ orderFunction = value.order ?? "asc";
75
+ }
76
+ return {
77
+ ...acc,
78
+ [field]: orderFunction
79
+ };
80
+ },
81
+ {}
82
+ );
83
+ } else if (sortBy != null) {
84
+ const normalizedSort = normalizeColumnName(sortBy.field);
85
+ sortByFields[normalizedSort] = sortBy.order ?? "asc";
86
+ }
71
87
  const allFields = [
72
88
  ...groupByFields,
73
89
  ...splitByFields,
@@ -76,9 +92,11 @@ const useData = ({
76
92
  if (delta) {
77
93
  const deltaExpression = Object.keys(measuresFields).reduce(
78
94
  (acc, curr) => {
95
+ const normalizedMeasure = normalizeColumnName(curr);
96
+ const normalizedDelta = normalizeColumnName(delta);
79
97
  return {
80
98
  ...acc,
81
- [curr]: `d => d.${curr} - d.${delta}`
99
+ [normalizedMeasure]: `d => d.${normalizedMeasure} - d.${normalizedDelta}`
82
100
  };
83
101
  },
84
102
  {}
@@ -106,11 +124,29 @@ const useData = ({
106
124
  ...Object.keys(sortByFields).filter((key) => allFields.includes(key)).map((key) => sortByFields[key] === "desc" ? desc(key) : key)
107
125
  );
108
126
  }
127
+ const reversedMapping = {};
128
+ for (const column of tableData.columnNames()) {
129
+ if (mapping[column] != null) {
130
+ reversedMapping[column] = mapping[column];
131
+ } else {
132
+ reversedMapping[column] = column;
133
+ }
134
+ }
135
+ tableData = tableData.select(reversedMapping);
109
136
  if (groupByFields.length > 1) {
110
137
  tableData = tableData.select(not(...groupByFields));
111
138
  }
112
139
  return tableData;
113
- }, [data, groupBy, splitBy, measures, sortBy, delta, filters, groupByKey]);
140
+ }, [
141
+ data,
142
+ filtersProp,
143
+ groupBy,
144
+ splitBy,
145
+ measures,
146
+ sortBy,
147
+ delta,
148
+ groupByKey
149
+ ]);
114
150
  return chartData;
115
151
  };
116
152
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"useData.js","sources":["../../../src/hooks/useData.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { desc, escape, from, internal, not, table } from \"arquero\";\nimport type ColumnTable from \"arquero/dist/types/table/column-table\";\nimport { Arrayable } from \"@hitachivantara/uikit-react-core\";\n\nimport {\n HvBarChartMeasures,\n HvChartAggregation,\n HvChartData,\n HvChartOrder,\n HvDonutChartMeasure,\n HvLineChartMeasures,\n HvScatterPlotMeasure,\n} from \"../types\";\nimport { HvAxisChartCommonProps, HvChartCommonProps } from \"../types/common\";\nimport { getGroupKey, getHvArqueroCombinedFilters } from \"../utils\";\n\nconst getAgFunc = (func: HvChartAggregation, field: string) =>\n func === \"count\" ? \"count()\" : `${func}(d[\"${field}\"])`;\n\ninterface HvDataHookProps {\n data: HvChartData;\n groupBy: HvChartCommonProps[\"groupBy\"];\n measures:\n | Arrayable<HvLineChartMeasures | HvBarChartMeasures | HvScatterPlotMeasure>\n | HvDonutChartMeasure;\n splitBy?: HvAxisChartCommonProps[\"splitBy\"];\n sortBy?: HvChartCommonProps[\"sortBy\"];\n filters?: HvChartCommonProps[\"filters\"];\n delta?: string;\n}\n\nexport const useData = ({\n data,\n groupBy,\n measures,\n sortBy,\n splitBy,\n filters,\n delta,\n}: HvDataHookProps): internal.ColumnTable => {\n const groupByKey = getGroupKey(groupBy);\n\n const chartData = useMemo<ColumnTable>(() => {\n let tableData: ColumnTable;\n if (data instanceof internal.ColumnTable) {\n tableData = data;\n } else if (Array.isArray(data)) {\n tableData = from(data);\n } else {\n tableData = table(data);\n }\n\n // Filter data right away\n if (filters) {\n tableData = tableData.filter(\n escape((row) =>\n getHvArqueroCombinedFilters(\n row,\n Array.isArray(filters) ? filters : [filters],\n ),\n ),\n );\n }\n\n const groupByFields = groupBy\n ? Array.isArray(groupBy)\n ? groupBy\n : [groupBy]\n : [];\n\n const splitByFields = Array.isArray(splitBy)\n ? splitBy\n : splitBy != null\n ? [splitBy]\n : [];\n\n const measuresFields: { [key: string]: string } =\n measures == null\n ? {}\n : typeof measures === \"string\"\n ? { [measures]: getAgFunc(\"sum\", measures) }\n : Array.isArray(measures)\n ? measures.reduce<{ [key: string]: string }>((acc, value) => {\n let field: string;\n let agFunction: HvChartAggregation;\n if (typeof value === \"string\") {\n field = value;\n agFunction = \"sum\";\n } else {\n field = value.field;\n agFunction = value.agg ?? \"sum\";\n }\n\n return {\n ...acc,\n [field]: getAgFunc(agFunction, field),\n };\n }, {})\n : {\n [measures.field]: getAgFunc(\n measures.agg ?? \"sum\",\n measures.field,\n ),\n };\n\n const sortByFields: { [key: string]: HvChartOrder } =\n sortBy == null\n ? {}\n : typeof sortBy === \"string\"\n ? { [sortBy]: \"asc\" }\n : Array.isArray(sortBy)\n ? sortBy.reduce<{ [key: string]: HvChartOrder }>((acc, value) => {\n let field: string;\n let orderFunction: HvChartOrder;\n if (typeof value === \"string\") {\n field = value;\n orderFunction = \"asc\";\n } else {\n field = value.field;\n orderFunction = value.order ?? \"asc\";\n }\n\n return {\n ...acc,\n [field]: orderFunction,\n };\n }, {})\n : { [sortBy.field]: sortBy.order ?? \"asc\" };\n\n const allFields = [\n ...groupByFields,\n ...splitByFields,\n ...Object.keys(measuresFields),\n ];\n\n // --- Confusion matrix ---\n // Recalculate the measures columns according to the delta column\n if (delta) {\n const deltaExpression = Object.keys(measuresFields).reduce(\n (acc, curr) => {\n return {\n ...acc,\n [curr]: `d => d.${curr} - d.${delta}`,\n };\n },\n {},\n );\n\n tableData = tableData.derive(deltaExpression);\n }\n\n // remove unneeded fields\n tableData = tableData.select(...allFields);\n\n // group by groupBy fields\n if (groupByFields.length > 0) {\n tableData = tableData.groupby(groupByFields);\n }\n\n if (splitByFields.length > 0) {\n // pivot by splitBy fields\n tableData = tableData.pivot(splitByFields, measuresFields);\n } else {\n // if there is no splitBy fields, just aggregate measures fields\n tableData = tableData.rollup(measuresFields);\n }\n\n // if grouped by multiple fields, create a new joint field\n // as the line chart doesn't implement hierarchical axis label grouping\n if (groupByFields.length > 1) {\n const expression = `d => ${groupByFields\n .map((field) => `d.${field}`)\n .join(\" + '_' + \")}`;\n\n tableData = tableData.derive(\n { [groupByKey]: expression },\n { after: groupByFields[groupByFields.length - 1] },\n );\n }\n\n // sort by sortBy fields\n if (Object.keys(sortByFields).length > 0) {\n tableData = tableData.orderby(\n ...Object.keys(sortByFields)\n // only sort by fields that are in the table, ignore the rest\n .filter((key) => allFields.includes(key))\n .map((key) => (sortByFields[key] === \"desc\" ? desc(key) : key)),\n );\n }\n\n // if a derived field was created, remove the original fields\n if (groupByFields.length > 1) {\n tableData = tableData.select(not(...groupByFields));\n }\n\n return tableData;\n }, [data, groupBy, splitBy, measures, sortBy, delta, filters, groupByKey]);\n\n return chartData;\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useData.js","sources":["../../../src/hooks/useData.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { desc, escape, internal, not } from \"arquero\";\nimport type ColumnTable from \"arquero/dist/types/table/column-table\";\nimport { Arrayable } from \"@hitachivantara/uikit-react-core\";\n\nimport {\n HvBarChartMeasures,\n HvChartAggregation,\n HvChartData,\n HvChartOrder,\n HvDonutChartMeasure,\n HvLineChartMeasures,\n HvScatterPlotMeasure,\n} from \"../types\";\nimport { HvAxisChartCommonProps, HvChartCommonProps } from \"../types/common\";\nimport {\n getGroupKey,\n getHvArqueroCombinedFilters,\n normalizeColumnName,\n processTableData,\n} from \"../utils\";\n\nconst getAgFunc = (func: HvChartAggregation, field: string) =>\n func === \"count\" ? \"count()\" : `${func}(d[\"${field}\"])`;\n\ninterface HvDataHookProps {\n data: HvChartData;\n groupBy: HvChartCommonProps[\"groupBy\"];\n measures:\n | Arrayable<HvLineChartMeasures | HvBarChartMeasures | HvScatterPlotMeasure>\n | HvDonutChartMeasure;\n splitBy?: HvAxisChartCommonProps[\"splitBy\"];\n sortBy?: HvChartCommonProps[\"sortBy\"];\n filters?: HvChartCommonProps[\"filters\"];\n delta?: string;\n}\n\nexport const useData = ({\n data,\n groupBy,\n measures,\n sortBy,\n splitBy,\n filters: filtersProp,\n delta,\n}: HvDataHookProps): internal.ColumnTable => {\n const groupByKey = getGroupKey(groupBy);\n\n const chartData = useMemo<ColumnTable>(() => {\n // Converting data to arquero table data and normalizing the columns name\n const { data: processedData, mapping } = processTableData(data);\n let tableData = processedData;\n\n // Filter data right away\n if (filtersProp) {\n const filters = (\n Array.isArray(filtersProp) ? filtersProp : [filtersProp]\n ).map((filter) => ({\n ...filter,\n field: normalizeColumnName(filter.field), // normalize\n }));\n\n tableData = tableData.filter(\n escape((row) => getHvArqueroCombinedFilters(row, filters)),\n );\n }\n\n const groupByFields = (\n groupBy ? (Array.isArray(groupBy) ? groupBy : [groupBy]) : []\n ).map((value) => normalizeColumnName(value)); // normalize\n\n const splitByFields = (\n Array.isArray(splitBy) ? splitBy : splitBy != null ? [splitBy] : []\n ).map((value) => normalizeColumnName(value)); // normalize\n\n let measuresFields: { [key: string]: string } = {};\n if (typeof measures === \"string\") {\n const normalizedMeasure = normalizeColumnName(measures); // normalize\n measuresFields[normalizedMeasure] = getAgFunc(\"sum\", normalizedMeasure);\n } else if (Array.isArray(measures)) {\n measuresFields = measures.reduce<{ [key: string]: string }>(\n (acc, value) => {\n let field: string;\n let agFunction: HvChartAggregation;\n if (typeof value === \"string\") {\n field = normalizeColumnName(value); // normalize\n agFunction = \"sum\";\n } else {\n field = normalizeColumnName(value.field); // normalize\n agFunction = value.agg ?? \"sum\";\n }\n return {\n ...acc,\n [field]: getAgFunc(agFunction, field),\n };\n },\n {},\n );\n } else if (measures != null) {\n const normalizedMeasure = normalizeColumnName(measures.field); // normalize\n measuresFields[normalizedMeasure] = getAgFunc(\n measures.agg ?? \"sum\",\n normalizedMeasure,\n );\n }\n\n let sortByFields: { [key: string]: HvChartOrder } = {};\n if (typeof sortBy === \"string\") {\n const normalizedSort = normalizeColumnName(sortBy); // normalize\n sortByFields[normalizedSort] = \"asc\";\n } else if (Array.isArray(sortBy)) {\n sortByFields = sortBy.reduce<{ [key: string]: HvChartOrder }>(\n (acc, value) => {\n let field: string;\n let orderFunction: HvChartOrder;\n if (typeof value === \"string\") {\n field = normalizeColumnName(value); // normalize;\n orderFunction = \"asc\";\n } else {\n field = normalizeColumnName(value.field); // normalize\n orderFunction = value.order ?? \"asc\";\n }\n return {\n ...acc,\n [field]: orderFunction,\n };\n },\n {},\n );\n } else if (sortBy != null) {\n const normalizedSort = normalizeColumnName(sortBy.field); // normalize\n sortByFields[normalizedSort] = sortBy.order ?? \"asc\";\n }\n\n const allFields = [\n ...groupByFields,\n ...splitByFields,\n ...Object.keys(measuresFields),\n ];\n\n // --- Confusion matrix ---\n // Recalculate the measures columns according to the delta column\n if (delta) {\n const deltaExpression = Object.keys(measuresFields).reduce(\n (acc, curr) => {\n const normalizedMeasure = normalizeColumnName(curr); // normalize\n const normalizedDelta = normalizeColumnName(delta); // normalize\n return {\n ...acc,\n [normalizedMeasure]: `d => d.${normalizedMeasure} - d.${normalizedDelta}`,\n };\n },\n {},\n );\n tableData = tableData.derive(deltaExpression);\n }\n\n // remove unneeded fields\n tableData = tableData.select(...allFields);\n\n // group by groupBy fields\n if (groupByFields.length > 0) {\n tableData = tableData.groupby(groupByFields);\n }\n\n if (splitByFields.length > 0) {\n // pivot by splitBy fields\n tableData = tableData.pivot(splitByFields, measuresFields);\n } else {\n // if there is no splitBy fields, just aggregate measures fields\n tableData = tableData.rollup(measuresFields);\n }\n\n // if grouped by multiple fields, create a new joint field\n // as the line chart doesn't implement hierarchical axis label grouping\n if (groupByFields.length > 1) {\n const expression = `d => ${groupByFields\n .map((field) => `d.${field}`)\n .join(\" + '_' + \")}`;\n\n tableData = tableData.derive(\n { [groupByKey]: expression },\n { after: groupByFields[groupByFields.length - 1] },\n );\n }\n\n // sort by sortBy fields\n if (Object.keys(sortByFields).length > 0) {\n tableData = tableData.orderby(\n ...Object.keys(sortByFields)\n // only sort by fields that are in the table, ignore the rest\n .filter((key) => allFields.includes(key))\n .map((key) => (sortByFields[key] === \"desc\" ? desc(key) : key)),\n );\n }\n\n // Revert the normalized names to the ones given by the user\n const reversedMapping = {};\n for (const column of tableData.columnNames()) {\n if (mapping[column] != null) {\n reversedMapping[column] = mapping[column];\n } else {\n reversedMapping[column] = column;\n }\n }\n tableData = tableData.select(reversedMapping);\n\n // if a derived field was created, remove the original fields\n if (groupByFields.length > 1) {\n tableData = tableData.select(not(...groupByFields));\n }\n\n return tableData;\n }, [\n data,\n filtersProp,\n groupBy,\n splitBy,\n measures,\n sortBy,\n delta,\n groupByKey,\n ]);\n\n return chartData;\n};\n"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { internal, from, table } from "arquero";
1
2
  const getAxisType = (type) => {
2
3
  switch (type) {
3
4
  case "categorical":
@@ -152,15 +153,41 @@ const getFilterFunction = (operation, field, value) => {
152
153
  const getHvArqueroCombinedFilters = (row, filters) => {
153
154
  return filters.every((filter) => {
154
155
  const { field, operation, value } = filter;
155
- const filterFunction = getFilterFunction(operation, field, value);
156
+ const filterFunction = Object.hasOwn(row, field) ? getFilterFunction(operation, field, value) : () => true;
156
157
  return filterFunction(row);
157
158
  });
158
159
  };
160
+ const normalizeColumnName = (string) => {
161
+ return string.replace(/[^a-zA-Z0-9]/g, "__");
162
+ };
163
+ const processTableData = (data) => {
164
+ let tableData;
165
+ if (data instanceof internal.ColumnTable) {
166
+ tableData = data;
167
+ } else if (Array.isArray(data)) {
168
+ tableData = from(data);
169
+ } else {
170
+ tableData = table(data);
171
+ }
172
+ const nameMapping = {};
173
+ const reversedNameMapping = {};
174
+ for (const column of tableData.columnNames()) {
175
+ const normalizedName = normalizeColumnName(column);
176
+ nameMapping[column] = normalizedName;
177
+ reversedNameMapping[normalizedName] = column;
178
+ }
179
+ return {
180
+ data: tableData.select(nameMapping),
181
+ mapping: reversedNameMapping
182
+ };
183
+ };
159
184
  export {
160
185
  getAxisType,
161
186
  getFilterFunction,
162
187
  getGroupKey,
163
188
  getHvArqueroCombinedFilters,
164
189
  getLegendIcon,
165
- getMeasure
190
+ getMeasure,
191
+ normalizeColumnName,
192
+ processTableData
166
193
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/utils/index.ts"],"sourcesContent":["import { Arrayable } from \"@hitachivantara/uikit-react-core\";\n\nimport type {\n HvBarChartMeasures,\n HvChartAxisType,\n HvChartFilter,\n HvChartFilterOperation,\n HvDonutChartMeasure,\n HvLineChartMeasures,\n} from \"..\";\nimport { HvChartCommonProps } from \"../types/common\";\nimport { HvChartLegendIcon } from \"../types/legend\";\nimport { HvScatterPlotMeasure } from \"../types/measures\";\n\nexport const getAxisType = (type?: HvChartAxisType) => {\n switch (type) {\n case \"categorical\":\n return \"category\";\n case \"time\":\n return \"time\";\n case \"continuous\":\n return \"value\";\n default:\n return undefined;\n }\n};\n\nexport const getGroupKey = (groupBy: HvChartCommonProps[\"groupBy\"]) =>\n Array.isArray(groupBy) ? groupBy.join(\"_\") : groupBy;\n\nexport const getLegendIcon = (icon: HvChartLegendIcon) => {\n switch (icon) {\n case \"circle\":\n return \"circle\";\n case \"square\":\n return \"path://M0,0L16,0L16,16L0,16L0,0Z\";\n case \"line\":\n default:\n return \"path://M0,0L16,0L16,2L0,2Z\";\n }\n};\n\nexport const getMeasure = (\n name: string,\n msr:\n | Arrayable<HvLineChartMeasures | HvBarChartMeasures | HvScatterPlotMeasure>\n | HvDonutChartMeasure,\n):\n | HvLineChartMeasures\n | HvBarChartMeasures\n | HvDonutChartMeasure\n | HvScatterPlotMeasure => {\n const measureName = name.split(\"_\")[0];\n const measuresArray = Array.isArray(msr) ? msr : [msr];\n // find the measure in measures array or return the first one\n return (\n measuresArray.find((m) => {\n if (typeof m === \"string\") {\n return m === measureName;\n }\n return m.field === measureName;\n }) ?? measuresArray[0]\n );\n};\n\nexport const getFilterFunction = (\n operation: HvChartFilterOperation,\n field: HvChartFilter[\"field\"],\n value: HvChartFilter[\"value\"],\n): Function => {\n const valueArray = Array.isArray(value) ? value : [value];\n if (valueArray.length === 0) return () => true;\n\n switch (operation) {\n case \"is\": {\n return (row: any) => valueArray.includes(row[field]);\n }\n case \"isNot\": {\n return (row: any) => !valueArray.includes(row[field]);\n }\n case \"contains\":\n return (row: any) => {\n let include = false;\n for (const val of valueArray) {\n if (String(row[field]).includes(String(val))) {\n include = true;\n }\n }\n return include;\n };\n case \"notContains\":\n return (row: any) => {\n let include = true;\n for (const val of valueArray) {\n if (String(row[field]).includes(String(val))) {\n include = false;\n }\n }\n return include;\n };\n case \"greaterThan\":\n return (row: any) => {\n let include = false;\n for (const val of valueArray) {\n if (row[field] > val) {\n include = true;\n }\n }\n return include;\n };\n case \"greaterThanOrEqual\":\n return (row: any) => {\n let include = false;\n for (const val of valueArray) {\n if (row[field] >= val) {\n include = true;\n }\n }\n return include;\n };\n case \"lessThan\":\n return (row: any) => {\n let include = false;\n for (const val of valueArray) {\n if (row[field] < val) {\n include = true;\n }\n }\n return include;\n };\n case \"lessThanOrEqual\":\n return (row: any) => {\n let include = false;\n for (const val of valueArray) {\n if (row[field] <= val) {\n include = true;\n }\n }\n return include;\n };\n case \"between\":\n return (row: any) => row[field] >= value[0] && row[field] <= value[1];\n case \"ends\":\n return (row: any) => {\n let include = false;\n for (const val of valueArray) {\n if (String(row[field]).endsWith(String(val))) {\n include = true;\n }\n }\n return include;\n };\n case \"notEnds\":\n return (row: any) => {\n let include = true;\n for (const val of valueArray) {\n if (String(row[field]).endsWith(String(val))) {\n include = false;\n }\n }\n return include;\n };\n case \"starts\":\n return (row: any) => {\n let include = false;\n for (const val of valueArray) {\n if (String(row[field]).startsWith(String(val))) {\n include = true;\n }\n }\n return include;\n };\n case \"notStarts\":\n return (row: any) => {\n let include = true;\n for (const val of valueArray) {\n if (String(row[field]).startsWith(String(val))) {\n include = false;\n }\n }\n return include;\n };\n\n default:\n throw new Error(\"Unsupported operation\");\n }\n};\n\n// Note: Exported to the users\n/**\n * Combine filter functions into a single function. Only rows that pass all filters will be included.\n * Should be used inside the `escape` function provided by Arquero.\n * */\nexport const getHvArqueroCombinedFilters = (\n row: any,\n filters: HvChartFilter[],\n) => {\n return filters.every((filter) => {\n const { field, operation, value } = filter;\n const filterFunction = getFilterFunction(operation, field, value);\n return filterFunction(row);\n });\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/utils/index.ts"],"sourcesContent":["import { from, internal, table } from \"arquero\";\nimport type ColumnTable from \"arquero/dist/types/table/column-table\";\nimport { Arrayable } from \"@hitachivantara/uikit-react-core\";\n\nimport type {\n HvBarChartMeasures,\n HvChartAxisType,\n HvChartData,\n HvChartFilter,\n HvChartFilterOperation,\n HvDonutChartMeasure,\n HvLineChartMeasures,\n} from \"..\";\nimport { HvChartCommonProps } from \"../types/common\";\nimport { HvChartLegendIcon } from \"../types/legend\";\nimport { HvScatterPlotMeasure } from \"../types/measures\";\n\nexport const getAxisType = (type?: HvChartAxisType) => {\n switch (type) {\n case \"categorical\":\n return \"category\";\n case \"time\":\n return \"time\";\n case \"continuous\":\n return \"value\";\n default:\n return undefined;\n }\n};\n\nexport const getGroupKey = (groupBy: HvChartCommonProps[\"groupBy\"]) =>\n Array.isArray(groupBy) ? groupBy.join(\"_\") : groupBy;\n\nexport const getLegendIcon = (icon: HvChartLegendIcon) => {\n switch (icon) {\n case \"circle\":\n return \"circle\";\n case \"square\":\n return \"path://M0,0L16,0L16,16L0,16L0,0Z\";\n case \"line\":\n default:\n return \"path://M0,0L16,0L16,2L0,2Z\";\n }\n};\n\nexport const getMeasure = (\n name: string,\n msr:\n | Arrayable<HvLineChartMeasures | HvBarChartMeasures | HvScatterPlotMeasure>\n | HvDonutChartMeasure,\n):\n | HvLineChartMeasures\n | HvBarChartMeasures\n | HvDonutChartMeasure\n | HvScatterPlotMeasure => {\n const measureName = name.split(\"_\")[0];\n const measuresArray = Array.isArray(msr) ? msr : [msr];\n // find the measure in measures array or return the first one\n return (\n measuresArray.find((m) => {\n if (typeof m === \"string\") {\n return m === measureName;\n }\n return m.field === measureName;\n }) ?? measuresArray[0]\n );\n};\n\nexport const getFilterFunction = (\n operation: HvChartFilterOperation,\n field: HvChartFilter[\"field\"],\n value: HvChartFilter[\"value\"],\n): Function => {\n const valueArray = Array.isArray(value) ? value : [value];\n if (valueArray.length === 0) return () => true;\n\n switch (operation) {\n case \"is\": {\n return (row: any) => valueArray.includes(row[field]);\n }\n case \"isNot\": {\n return (row: any) => !valueArray.includes(row[field]);\n }\n case \"contains\":\n return (row: any) => {\n let include = false;\n for (const val of valueArray) {\n if (String(row[field]).includes(String(val))) {\n include = true;\n }\n }\n return include;\n };\n case \"notContains\":\n return (row: any) => {\n let include = true;\n for (const val of valueArray) {\n if (String(row[field]).includes(String(val))) {\n include = false;\n }\n }\n return include;\n };\n case \"greaterThan\":\n return (row: any) => {\n let include = false;\n for (const val of valueArray) {\n if (row[field] > val) {\n include = true;\n }\n }\n return include;\n };\n case \"greaterThanOrEqual\":\n return (row: any) => {\n let include = false;\n for (const val of valueArray) {\n if (row[field] >= val) {\n include = true;\n }\n }\n return include;\n };\n case \"lessThan\":\n return (row: any) => {\n let include = false;\n for (const val of valueArray) {\n if (row[field] < val) {\n include = true;\n }\n }\n return include;\n };\n case \"lessThanOrEqual\":\n return (row: any) => {\n let include = false;\n for (const val of valueArray) {\n if (row[field] <= val) {\n include = true;\n }\n }\n return include;\n };\n case \"between\":\n return (row: any) => row[field] >= value[0] && row[field] <= value[1];\n case \"ends\":\n return (row: any) => {\n let include = false;\n for (const val of valueArray) {\n if (String(row[field]).endsWith(String(val))) {\n include = true;\n }\n }\n return include;\n };\n case \"notEnds\":\n return (row: any) => {\n let include = true;\n for (const val of valueArray) {\n if (String(row[field]).endsWith(String(val))) {\n include = false;\n }\n }\n return include;\n };\n case \"starts\":\n return (row: any) => {\n let include = false;\n for (const val of valueArray) {\n if (String(row[field]).startsWith(String(val))) {\n include = true;\n }\n }\n return include;\n };\n case \"notStarts\":\n return (row: any) => {\n let include = true;\n for (const val of valueArray) {\n if (String(row[field]).startsWith(String(val))) {\n include = false;\n }\n }\n return include;\n };\n\n default:\n throw new Error(\"Unsupported operation\");\n }\n};\n\n// Note: Exported to the users\n/**\n * Combine filter functions into a single function. Only rows that pass all filters will be included.\n * Should be used inside the `escape` function provided by Arquero.\n * */\nexport const getHvArqueroCombinedFilters = (\n row: any,\n filters: HvChartFilter[],\n) => {\n return filters.every((filter) => {\n const { field, operation, value } = filter;\n const filterFunction = Object.hasOwn(row, field)\n ? getFilterFunction(operation, field, value)\n : () => true;\n return filterFunction(row);\n });\n};\n\n/**\n * Normalizes a column name by replacing all characters that are not letters or numbers by \"___\"\n */\nexport const normalizeColumnName = (string: string) => {\n return string.replace(/[^a-zA-Z0-9]/g, \"__\");\n};\n\n/**\n * Converts data to a arquero data table and normalizes the column names for data processing.\n * @param data Chart data\n * @returns Processed data and reversed columns mapping to switch the columns to their original name\n */\nexport const processTableData = (data: HvChartData) => {\n let tableData: ColumnTable;\n if (data instanceof internal.ColumnTable) {\n tableData = data;\n } else if (Array.isArray(data)) {\n tableData = from(data);\n } else {\n tableData = table(data);\n }\n\n // Normalize the column names to remove any special character and spaces since it can lead to errors during processing\n const nameMapping = {};\n const reversedNameMapping = {};\n for (const column of tableData.columnNames()) {\n const normalizedName = normalizeColumnName(column);\n nameMapping[column] = normalizedName;\n reversedNameMapping[normalizedName] = column;\n }\n\n return {\n data: tableData.select(nameMapping),\n mapping: reversedNameMapping,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -118,10 +118,10 @@ export declare type HvBoxplotClasses = ExtractNames<typeof useClasses_4>;
118
118
 
119
119
  export declare type HvBoxplotMeasure = string | BoxplotMeasure;
120
120
 
121
- export declare interface HvBoxplotProps extends HvAxisChartCommonProps, Omit<HvChartCommonProps, "groupBy"> {
121
+ export declare interface HvBoxplotProps extends Omit<HvAxisChartCommonProps, "splitBy" | "horizontalRangeSlider" | "seriesNameFormatter" | "stack">, Omit<HvChartCommonProps, "groupBy" | "sortBy"> {
122
122
  /** The name of the heatmap */
123
123
  name?: string;
124
- /** Columns to measure on the chart. */
124
+ /** Columns to measure on the chart. */
125
125
  measures: Arrayable<HvBoxplotMeasure>;
126
126
  /** Columns to use to group the data. */
127
127
  groupBy?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hitachivantara/uikit-react-viz",
3
- "version": "5.12.4",
3
+ "version": "5.12.6",
4
4
  "private": false,
5
5
  "author": "Hitachi Vantara UI Kit Team",
6
6
  "description": "Contributed React visualization components for the NEXT UI Kit.",
@@ -33,7 +33,7 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "@emotion/css": "^11.11.0",
36
- "@hitachivantara/uikit-react-core": "^5.65.0"
36
+ "@hitachivantara/uikit-react-core": "^5.65.1"
37
37
  },
38
38
  "files": [
39
39
  "dist"
@@ -42,7 +42,7 @@
42
42
  "access": "public",
43
43
  "directory": "package"
44
44
  },
45
- "gitHead": "d5369d3612f68eadfedb240066ea89acd0a629f8",
45
+ "gitHead": "1502305db73d20325c3997f89e82efb9c7468e26",
46
46
  "exports": {
47
47
  ".": {
48
48
  "require": "./dist/cjs/index.cjs",