@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.
- package/dist/cjs/Boxplot/Boxplot.cjs +0 -2
- package/dist/cjs/Boxplot/useBoxplot.cjs +2 -4
- package/dist/cjs/Boxplot/useBoxplotData.cjs +17 -20
- package/dist/cjs/Treemap/Treemap.cjs +0 -4
- package/dist/cjs/hooks/useData.cjs +90 -54
- package/dist/cjs/utils/index.cjs +28 -1
- package/dist/esm/Boxplot/Boxplot.js +0 -2
- package/dist/esm/Boxplot/Boxplot.js.map +1 -1
- package/dist/esm/Boxplot/useBoxplot.js +2 -4
- package/dist/esm/Boxplot/useBoxplot.js.map +1 -1
- package/dist/esm/Boxplot/useBoxplotData.js +19 -22
- package/dist/esm/Boxplot/useBoxplotData.js.map +1 -1
- package/dist/esm/Treemap/Treemap.js +0 -4
- package/dist/esm/Treemap/Treemap.js.map +1 -1
- package/dist/esm/hooks/useData.js +92 -56
- package/dist/esm/hooks/useData.js.map +1 -1
- package/dist/esm/utils/index.js +29 -2
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/package.json +3 -3
|
@@ -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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
|
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,
|
|
37
|
+
}, [data, filtersProp, groupByProp, measures]);
|
|
41
38
|
return chartData;
|
|
42
39
|
};
|
|
43
40
|
exports.useBoxplotData = useBoxplotData;
|
|
@@ -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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
56
|
-
)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
[
|
|
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
|
-
}, [
|
|
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;
|
package/dist/cjs/utils/index.cjs
CHANGED
|
@@ -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;
|
|
@@ -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 /**
|
|
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)
|
|
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 {
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
|
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,
|
|
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
|
|
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;"}
|
|
@@ -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
|
|
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 {
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
54
|
-
)
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
[
|
|
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
|
-
}, [
|
|
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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"}
|
package/dist/esm/utils/index.js
CHANGED
|
@@ -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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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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
|
-
/**
|
|
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.
|
|
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.
|
|
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": "
|
|
45
|
+
"gitHead": "1502305db73d20325c3997f89e82efb9c7468e26",
|
|
46
46
|
"exports": {
|
|
47
47
|
".": {
|
|
48
48
|
"require": "./dist/cjs/index.cjs",
|