@widergy/energy-ui 3.111.0 → 3.112.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/components/UTGraph/UTGraph.stories.js +121 -6
- package/dist/components/UTGraph/components/Bars/index.js +12 -20
- package/dist/components/UTGraph/components/Bars/utils.js +29 -0
- package/dist/components/UTGraph/components/CartesianPlane/index.js +41 -10
- package/dist/components/UTGraph/components/Lines/index.js +27 -33
- package/dist/components/UTGraph/components/Lines/utils.js +41 -0
- package/dist/components/UTGraph/constants.js +10 -0
- package/dist/components/UTGraph/index.js +18 -6
- package/dist/components/UTGraph/utils.js +30 -2
- package/dist/components/UTRadioGroup/versions/V0/index.js +0 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [3.112.1](https://github.com/widergy/energy-ui/compare/v3.112.0...v3.112.1) (2025-10-30)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* console log ([#712](https://github.com/widergy/energy-ui/issues/712)) ([a3f0eb8](https://github.com/widergy/energy-ui/commit/a3f0eb8de4ba95b007851d72f88a707a32ec6a44))
|
|
7
|
+
|
|
8
|
+
# [3.112.0](https://github.com/widergy/energy-ui/compare/v3.111.0...v3.112.0) (2025-10-23)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* [COLB-101] dual axis utgraph ([#705](https://github.com/widergy/energy-ui/issues/705)) ([f583827](https://github.com/widergy/energy-ui/commit/f583827c0a593a01209cdf2d7c9fbfe15d9f7e0e))
|
|
14
|
+
|
|
1
15
|
# [3.111.0](https://github.com/widergy/energy-ui/compare/v3.110.4...v3.111.0) (2025-10-16)
|
|
2
16
|
|
|
3
17
|
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default = exports.
|
|
6
|
+
exports.default = exports.DualAxisChart = exports.BarAndLineChart = void 0;
|
|
7
7
|
var _reportSchema = _interopRequireDefault(require("./report.schema.json"));
|
|
8
8
|
var _ = _interopRequireDefault(require("."));
|
|
9
9
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
-
const
|
|
10
|
+
const BarAndLineChartData = {
|
|
11
11
|
meta: {
|
|
12
12
|
code: 'economico',
|
|
13
13
|
enabled: true,
|
|
@@ -279,6 +279,114 @@ const defaultReport = {
|
|
|
279
279
|
}]
|
|
280
280
|
}]
|
|
281
281
|
};
|
|
282
|
+
const DualAxisChartData = {
|
|
283
|
+
meta: {
|
|
284
|
+
code: 'consumo',
|
|
285
|
+
enabled: true,
|
|
286
|
+
report_type: 'chart',
|
|
287
|
+
tabs: [{
|
|
288
|
+
code: 'consumo',
|
|
289
|
+
name: 'Consumo',
|
|
290
|
+
icon: 'IconFilePlus',
|
|
291
|
+
orientation: 'horizontal',
|
|
292
|
+
mainAxis: {
|
|
293
|
+
binding: 'categorical'
|
|
294
|
+
},
|
|
295
|
+
crossAxes: {
|
|
296
|
+
left: {
|
|
297
|
+
label: 'Monto',
|
|
298
|
+
unit: '$'
|
|
299
|
+
},
|
|
300
|
+
right: {
|
|
301
|
+
label: 'Potencia',
|
|
302
|
+
unit: 'kW'
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
subitems_catalog: [[{
|
|
306
|
+
name: 'Item A',
|
|
307
|
+
type: 'bar',
|
|
308
|
+
crossAxis: 'left',
|
|
309
|
+
bindings: {
|
|
310
|
+
crossAxis: 'a'
|
|
311
|
+
}
|
|
312
|
+
}, {
|
|
313
|
+
name: 'Item B',
|
|
314
|
+
type: 'line',
|
|
315
|
+
crossAxis: 'right',
|
|
316
|
+
bindings: {
|
|
317
|
+
crossAxis: 'b'
|
|
318
|
+
}
|
|
319
|
+
}]]
|
|
320
|
+
}]
|
|
321
|
+
},
|
|
322
|
+
datasets: [{
|
|
323
|
+
code: 'consumo',
|
|
324
|
+
mainAxis: [{
|
|
325
|
+
name: 'Ene',
|
|
326
|
+
subitems: [{
|
|
327
|
+
code: 'a',
|
|
328
|
+
value: 30
|
|
329
|
+
}, {
|
|
330
|
+
code: 'b',
|
|
331
|
+
value: 550
|
|
332
|
+
}]
|
|
333
|
+
}, {
|
|
334
|
+
name: 'Feb',
|
|
335
|
+
subitems: [{
|
|
336
|
+
code: 'a',
|
|
337
|
+
value: 42
|
|
338
|
+
}, {
|
|
339
|
+
code: 'b',
|
|
340
|
+
value: 600
|
|
341
|
+
}]
|
|
342
|
+
}, {
|
|
343
|
+
name: 'Mar',
|
|
344
|
+
subitems: [{
|
|
345
|
+
code: 'a',
|
|
346
|
+
value: 60
|
|
347
|
+
}, {
|
|
348
|
+
code: 'b',
|
|
349
|
+
value: 800
|
|
350
|
+
}]
|
|
351
|
+
}, {
|
|
352
|
+
name: 'Abr',
|
|
353
|
+
subitems: [{
|
|
354
|
+
code: 'a',
|
|
355
|
+
value: 80
|
|
356
|
+
}, {
|
|
357
|
+
code: 'b',
|
|
358
|
+
value: 1200
|
|
359
|
+
}]
|
|
360
|
+
}, {
|
|
361
|
+
name: 'May',
|
|
362
|
+
subitems: [{
|
|
363
|
+
code: 'a',
|
|
364
|
+
value: 120
|
|
365
|
+
}, {
|
|
366
|
+
code: 'b',
|
|
367
|
+
value: 1500
|
|
368
|
+
}]
|
|
369
|
+
}, {
|
|
370
|
+
name: 'Jun',
|
|
371
|
+
subitems: [{
|
|
372
|
+
code: 'a',
|
|
373
|
+
value: 150
|
|
374
|
+
}, {
|
|
375
|
+
code: 'b',
|
|
376
|
+
value: 2000
|
|
377
|
+
}]
|
|
378
|
+
}, {
|
|
379
|
+
name: 'Jul',
|
|
380
|
+
subitems: [{
|
|
381
|
+
code: 'a',
|
|
382
|
+
value: 150
|
|
383
|
+
}, {
|
|
384
|
+
code: 'b',
|
|
385
|
+
value: 2000
|
|
386
|
+
}]
|
|
387
|
+
}]
|
|
388
|
+
}]
|
|
389
|
+
};
|
|
282
390
|
var _default = exports.default = {
|
|
283
391
|
title: 'UTGraph',
|
|
284
392
|
component: _.default,
|
|
@@ -303,10 +411,17 @@ var _default = exports.default = {
|
|
|
303
411
|
}
|
|
304
412
|
}
|
|
305
413
|
};
|
|
306
|
-
const
|
|
307
|
-
name: 'Bar Chart',
|
|
414
|
+
const BarAndLineChart = exports.BarAndLineChart = {
|
|
415
|
+
name: 'Bar and Line Chart',
|
|
416
|
+
args: {
|
|
417
|
+
meta: BarAndLineChartData.meta,
|
|
418
|
+
datasets: BarAndLineChartData.datasets
|
|
419
|
+
}
|
|
420
|
+
};
|
|
421
|
+
const DualAxisChart = exports.DualAxisChart = {
|
|
422
|
+
name: 'Dual Axis Chart',
|
|
308
423
|
args: {
|
|
309
|
-
meta:
|
|
310
|
-
datasets:
|
|
424
|
+
meta: DualAxisChartData.meta,
|
|
425
|
+
datasets: DualAxisChartData.datasets
|
|
311
426
|
}
|
|
312
427
|
};
|
|
@@ -8,10 +8,13 @@ var d3 = _interopRequireWildcard(require("d3"));
|
|
|
8
8
|
var _propTypes = require("prop-types");
|
|
9
9
|
var _react = _interopRequireWildcard(require("react"));
|
|
10
10
|
var _utils = require("../../utils");
|
|
11
|
+
var _constants = require("../../constants");
|
|
12
|
+
var _utils2 = require("./utils");
|
|
11
13
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
12
14
|
const Bars = _ref => {
|
|
13
15
|
let {
|
|
14
|
-
|
|
16
|
+
crossAxisLeft,
|
|
17
|
+
crossAxisRight,
|
|
15
18
|
dataset,
|
|
16
19
|
mainAxis,
|
|
17
20
|
mainAxisDomain,
|
|
@@ -27,31 +30,20 @@ const Bars = _ref => {
|
|
|
27
30
|
const categoryXPosition = mainAxis(category);
|
|
28
31
|
const valuesByCode = valuesByCategory.get(category);
|
|
29
32
|
return tab.subitems_catalog.map((cluster, clusterIndex) => {
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
const leftCodes = cluster.filter(series => series.type === _constants.BAR_TYPE && (series.crossAxis || _constants.LEFT_SIDE) === _constants.LEFT_SIDE).map(series => series.bindings.crossAxis);
|
|
34
|
+
const rightCodes = cluster.filter(series => series.type === _constants.BAR_TYPE && (series.crossAxis || _constants.RIGHT_SIDE) === _constants.RIGHT_SIDE).map(series => series.bindings.crossAxis);
|
|
35
|
+
if (leftCodes.length === 0 && rightCodes.length === 0) return null;
|
|
33
36
|
const x = categoryXPosition + clusterScale(clusterIndex);
|
|
34
37
|
const w = clusterScale.bandwidth();
|
|
35
|
-
return
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const yTop = Math.min(crossAxis(y0), crossAxis(y1));
|
|
39
|
-
const yBot = Math.max(crossAxis(y0), crossAxis(y1));
|
|
40
|
-
const h = yBot - yTop;
|
|
41
|
-
return /*#__PURE__*/_react.default.createElement("rect", {
|
|
42
|
-
key: "".concat(category, "-").concat(code),
|
|
43
|
-
x: x,
|
|
44
|
-
y: yTop,
|
|
45
|
-
width: w,
|
|
46
|
-
height: h,
|
|
47
|
-
fill: color(code)
|
|
48
|
-
});
|
|
49
|
-
});
|
|
38
|
+
return /*#__PURE__*/_react.default.createElement("g", {
|
|
39
|
+
key: "".concat(category, "-cluster")
|
|
40
|
+
}, (0, _utils2.renderStacksForSide)(leftCodes, valuesByCode, x, w, crossAxisLeft, category, color), (0, _utils2.renderStacksForSide)(rightCodes, valuesByCode, x, w, crossAxisRight, category, color));
|
|
50
41
|
});
|
|
51
42
|
}));
|
|
52
43
|
};
|
|
53
44
|
Bars.propTypes = {
|
|
54
|
-
|
|
45
|
+
crossAxisLeft: _propTypes.func,
|
|
46
|
+
crossAxisRight: _propTypes.func,
|
|
55
47
|
dataset: _propTypes.object,
|
|
56
48
|
mainAxis: _propTypes.func,
|
|
57
49
|
mainAxisDomain: _propTypes.array,
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.renderStacksForSide = void 0;
|
|
7
|
+
var d3 = _interopRequireWildcard(require("d3"));
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
11
|
+
const renderStacksForSide = (codes, valuesByCode, x, w, crossAxis, category, color) => {
|
|
12
|
+
const stacks = d3.stack().keys(codes).offset(d3.stackOffsetDiverging)([valuesByCode]);
|
|
13
|
+
return stacks.map(series => {
|
|
14
|
+
const code = series.key;
|
|
15
|
+
const [y0, y1] = series[0];
|
|
16
|
+
const yTop = Math.min(crossAxis(y0), crossAxis(y1));
|
|
17
|
+
const yBot = Math.max(crossAxis(y0), crossAxis(y1));
|
|
18
|
+
const h = yBot - yTop;
|
|
19
|
+
return /*#__PURE__*/_react.default.createElement("rect", {
|
|
20
|
+
key: "".concat(category, "-").concat(code),
|
|
21
|
+
x: x,
|
|
22
|
+
y: yTop,
|
|
23
|
+
width: w,
|
|
24
|
+
height: h,
|
|
25
|
+
fill: color(code)
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
exports.renderStacksForSide = renderStacksForSide;
|
|
@@ -12,7 +12,8 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
|
|
|
12
12
|
const CartesianPlane = _ref => {
|
|
13
13
|
let {
|
|
14
14
|
mainAxisDomain,
|
|
15
|
-
|
|
15
|
+
crossAxisLeftDomain,
|
|
16
|
+
crossAxisRightDomain,
|
|
16
17
|
width,
|
|
17
18
|
height,
|
|
18
19
|
margin,
|
|
@@ -20,6 +21,8 @@ const CartesianPlane = _ref => {
|
|
|
20
21
|
crossAxisTickFormat,
|
|
21
22
|
mainAxisTicks,
|
|
22
23
|
mainAxisTickFormat,
|
|
24
|
+
hasLeft,
|
|
25
|
+
hasRight,
|
|
23
26
|
children
|
|
24
27
|
} = _ref;
|
|
25
28
|
const innerWidth = width - margin.left - margin.right;
|
|
@@ -27,33 +30,61 @@ const CartesianPlane = _ref => {
|
|
|
27
30
|
const mainAxis = (0, _react.useMemo)(() => d3.scaleBand().domain(mainAxisDomain).range([0, innerWidth]).padding(0.1),
|
|
28
31
|
// TBD: parametrizar padding
|
|
29
32
|
[mainAxisDomain, innerWidth]);
|
|
30
|
-
const
|
|
33
|
+
const crossAxisLeft = (0, _react.useMemo)(() => d3.scaleLinear().domain(crossAxisLeftDomain).range([innerHeight, 0]).nice(), [crossAxisLeftDomain, innerHeight]);
|
|
34
|
+
const crossAxisRight = (0, _react.useMemo)(() => d3.scaleLinear().domain(crossAxisRightDomain).range([innerHeight, 0]).nice(), [crossAxisRightDomain, innerHeight]);
|
|
31
35
|
const mainAxisRef = (0, _react.useRef)(null);
|
|
32
|
-
const
|
|
36
|
+
const crossAxisLeftRef = (0, _react.useRef)(null);
|
|
37
|
+
const crossAxisRightRef = (0, _react.useRef)(null);
|
|
38
|
+
const gridRef = (0, _react.useRef)(null);
|
|
33
39
|
(0, _react.useEffect)(() => {
|
|
34
40
|
const axis = d3.axisBottom(mainAxis).ticks(mainAxisTicks, mainAxisTickFormat).tickSizeOuter(0);
|
|
35
41
|
d3.select(mainAxisRef.current).call(axis);
|
|
36
42
|
}, [mainAxis, mainAxisTicks, mainAxisTickFormat]);
|
|
37
43
|
(0, _react.useEffect)(() => {
|
|
38
|
-
|
|
39
|
-
d3.
|
|
40
|
-
d3.select(
|
|
41
|
-
|
|
44
|
+
if (!hasLeft) return;
|
|
45
|
+
const axis = d3.axisLeft(crossAxisLeft).ticks(crossAxisTicks, crossAxisTickFormat).tickSize(0).tickSizeOuter(0);
|
|
46
|
+
d3.select(crossAxisLeftRef.current).call(axis);
|
|
47
|
+
d3.select(crossAxisLeftRef.current).selectAll('.tick text').attr('text-anchor', 'end');
|
|
48
|
+
}, [crossAxisLeft, crossAxisTicks, crossAxisTickFormat]);
|
|
49
|
+
(0, _react.useEffect)(() => {
|
|
50
|
+
if (!hasRight) return;
|
|
51
|
+
const axis = d3.axisRight(crossAxisRight).ticks(crossAxisTicks, crossAxisTickFormat).tickSize(0).tickSizeOuter(0);
|
|
52
|
+
d3.select(crossAxisRightRef.current).call(axis);
|
|
53
|
+
d3.select(crossAxisRightRef.current).selectAll('.tick text').attr('text-anchor', 'start');
|
|
54
|
+
}, [crossAxisRight, crossAxisTicks, crossAxisTickFormat]);
|
|
55
|
+
(0, _react.useEffect)(() => {
|
|
56
|
+
const crossAxis = hasLeft ? crossAxisLeft : hasRight ? crossAxisRight : null;
|
|
57
|
+
const g = d3.select(gridRef.current);
|
|
58
|
+
g.selectAll('*').remove();
|
|
59
|
+
if (!crossAxis) return;
|
|
60
|
+
const grid = d3.axisLeft(crossAxis).ticks(crossAxisTicks).tickFormat('').tickSize(-innerWidth).tickSizeOuter(0);
|
|
61
|
+
g.call(grid);
|
|
62
|
+
g.selectAll('.tick line').attr('stroke', '#000').attr('stroke-opacity', 0.5).attr('stroke-dasharray', '5 5');
|
|
63
|
+
g.select('.domain').remove();
|
|
64
|
+
}, [crossAxisLeft, crossAxisRight, innerWidth, crossAxisTicks, crossAxisTickFormat]);
|
|
42
65
|
return /*#__PURE__*/_react.default.createElement("svg", {
|
|
43
66
|
width: width,
|
|
44
67
|
height: height
|
|
45
68
|
}, /*#__PURE__*/_react.default.createElement("g", {
|
|
46
69
|
transform: "translate(".concat(margin.left, ",").concat(margin.top, ")")
|
|
47
70
|
}, /*#__PURE__*/_react.default.createElement("g", {
|
|
48
|
-
ref:
|
|
49
|
-
className: "y-
|
|
71
|
+
ref: gridRef,
|
|
72
|
+
className: "y-grid"
|
|
73
|
+
}), hasLeft && /*#__PURE__*/_react.default.createElement("g", {
|
|
74
|
+
ref: crossAxisLeftRef,
|
|
75
|
+
className: "y-axis-left"
|
|
76
|
+
}), hasRight && /*#__PURE__*/_react.default.createElement("g", {
|
|
77
|
+
ref: crossAxisRightRef,
|
|
78
|
+
className: "y-axis-right",
|
|
79
|
+
transform: "translate(".concat(innerWidth, ", 0)")
|
|
50
80
|
}), /*#__PURE__*/_react.default.createElement("g", {
|
|
51
81
|
ref: mainAxisRef,
|
|
52
82
|
className: "x-axis",
|
|
53
83
|
transform: "translate(0, ".concat(innerHeight, ")")
|
|
54
84
|
}), children({
|
|
55
85
|
mainAxis,
|
|
56
|
-
|
|
86
|
+
crossAxisLeft,
|
|
87
|
+
crossAxisRight
|
|
57
88
|
})));
|
|
58
89
|
};
|
|
59
90
|
var _default = exports.default = CartesianPlane;
|
|
@@ -6,56 +6,50 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _propTypes = require("prop-types");
|
|
9
|
-
var
|
|
9
|
+
var _constants = require("../../constants");
|
|
10
10
|
var _utils = require("../../utils");
|
|
11
|
+
var _utils2 = require("./utils");
|
|
11
12
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
12
13
|
const Lines = _ref => {
|
|
13
14
|
let {
|
|
14
15
|
tab,
|
|
15
16
|
dataset,
|
|
16
17
|
mainAxis,
|
|
17
|
-
|
|
18
|
+
crossAxisLeft,
|
|
19
|
+
crossAxisRight,
|
|
18
20
|
mainAxisDomain,
|
|
19
21
|
color
|
|
20
22
|
} = _ref;
|
|
21
|
-
const lineClusters = (0, _react.useMemo)(() => tab.subitems_catalog.map(cluster => cluster.filter(s => s.type === 'line').map(s => s.bindings.crossAxis)).filter(codes => codes.length > 0), [tab]);
|
|
22
23
|
const valuesByCategory = (0, _react.useMemo)(() => (0, _utils.getValuesMapByCategory)(dataset), [dataset]);
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
d: path,
|
|
45
|
-
fill: "none",
|
|
46
|
-
stroke: color(code),
|
|
47
|
-
strokeWidth: 2,
|
|
48
|
-
strokeLinejoin: "round",
|
|
49
|
-
strokeLinecap: "round"
|
|
50
|
-
});
|
|
51
|
-
});
|
|
24
|
+
const splitLineClusters = (0, _react.useMemo)(() => tab.subitems_catalog.map(cluster => {
|
|
25
|
+
const lineSeries = cluster.filter(s => s.type === _constants.LINE_TYPE);
|
|
26
|
+
const leftCodes = lineSeries.filter(s => (s.crossAxis || _constants.LEFT_SIDE) === _constants.LEFT_SIDE).map(s => s.bindings.crossAxis);
|
|
27
|
+
const rightCodes = lineSeries.filter(s => (s.crossAxis || _constants.RIGHT_SIDE) === _constants.RIGHT_SIDE).map(s => s.bindings.crossAxis);
|
|
28
|
+
return {
|
|
29
|
+
leftCodes,
|
|
30
|
+
rightCodes
|
|
31
|
+
};
|
|
32
|
+
}).filter(_ref2 => {
|
|
33
|
+
let {
|
|
34
|
+
leftCodes,
|
|
35
|
+
rightCodes
|
|
36
|
+
} = _ref2;
|
|
37
|
+
return leftCodes.length > 0 || rightCodes.length > 0;
|
|
38
|
+
}), [tab]);
|
|
39
|
+
return /*#__PURE__*/_react.default.createElement("g", null, splitLineClusters.map(_ref3 => {
|
|
40
|
+
let {
|
|
41
|
+
leftCodes,
|
|
42
|
+
rightCodes
|
|
43
|
+
} = _ref3;
|
|
44
|
+
return /*#__PURE__*/_react.default.createElement("g", null, (0, _utils2.renderStacksForSide)(leftCodes, valuesByCategory, mainAxis, mainAxisDomain, crossAxisLeft, color), (0, _utils2.renderStacksForSide)(rightCodes, valuesByCategory, mainAxis, mainAxisDomain, crossAxisRight, color));
|
|
52
45
|
}));
|
|
53
46
|
};
|
|
54
47
|
Lines.propTypes = {
|
|
55
48
|
tab: _propTypes.object,
|
|
56
49
|
dataset: _propTypes.object,
|
|
57
50
|
mainAxis: _propTypes.func,
|
|
58
|
-
|
|
51
|
+
crossAxisLeft: _propTypes.func,
|
|
52
|
+
crossAxisRight: _propTypes.func,
|
|
59
53
|
mainAxisDomain: _propTypes.array,
|
|
60
54
|
color: _propTypes.func
|
|
61
55
|
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.renderStacksForSide = void 0;
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var d3 = _interopRequireWildcard(require("d3"));
|
|
9
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
const renderStacksForSide = (codes, valuesByCategory, mainAxis, mainAxisDomain, crossAxis, color) => {
|
|
12
|
+
const rows = mainAxisDomain.map(category => {
|
|
13
|
+
const valuesByCode = valuesByCategory.get(category);
|
|
14
|
+
const row = {};
|
|
15
|
+
codes.forEach(code => row[code] = valuesByCode[code]);
|
|
16
|
+
return row;
|
|
17
|
+
});
|
|
18
|
+
const stacks = d3.stack().keys(codes).offset(d3.stackOffsetDiverging)(rows);
|
|
19
|
+
return stacks.map(series => {
|
|
20
|
+
const code = series.key;
|
|
21
|
+
const points = series.map((_ref, i) => {
|
|
22
|
+
let [y0, y1] = _ref;
|
|
23
|
+
return {
|
|
24
|
+
y: Math.max(y0, y1),
|
|
25
|
+
x: mainAxis(mainAxisDomain[i]) + mainAxis.bandwidth() / 2
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
const path = d3.line().defined(d => Number.isFinite(d.y)).x(d => d.x).y(d => crossAxis(d.y))(points);
|
|
29
|
+
if (!path) return null;
|
|
30
|
+
return /*#__PURE__*/_react.default.createElement("path", {
|
|
31
|
+
key: code,
|
|
32
|
+
d: path,
|
|
33
|
+
fill: "none",
|
|
34
|
+
stroke: color(code),
|
|
35
|
+
strokeWidth: 2,
|
|
36
|
+
strokeLinejoin: "round",
|
|
37
|
+
strokeLinecap: "round"
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
exports.renderStacksForSide = renderStacksForSide;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.RIGHT_SIDE = exports.LINE_TYPE = exports.LEFT_SIDE = exports.BAR_TYPE = void 0;
|
|
7
|
+
const LEFT_SIDE = exports.LEFT_SIDE = 'left';
|
|
8
|
+
const RIGHT_SIDE = exports.RIGHT_SIDE = 'right';
|
|
9
|
+
const LINE_TYPE = exports.LINE_TYPE = 'line';
|
|
10
|
+
const BAR_TYPE = exports.BAR_TYPE = 'bar';
|
|
@@ -11,6 +11,7 @@ var _Bars = _interopRequireDefault(require("./components/Bars"));
|
|
|
11
11
|
var _Lines = _interopRequireDefault(require("./components/Lines"));
|
|
12
12
|
var _CartesianPlane = _interopRequireDefault(require("./components/CartesianPlane"));
|
|
13
13
|
var _utils = require("./utils");
|
|
14
|
+
var _constants = require("./constants");
|
|
14
15
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
16
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
16
17
|
const UTGraph = _ref => {
|
|
@@ -21,13 +22,19 @@ const UTGraph = _ref => {
|
|
|
21
22
|
const tab = meta.tabs[0];
|
|
22
23
|
const dataset = (0, _react.useMemo)(() => datasets.find(ds => ds.code === tab.code), [datasets, tab]);
|
|
23
24
|
const mainAxisDomain = (0, _react.useMemo)(() => dataset.mainAxis.map(item => item.name), [dataset]);
|
|
24
|
-
const
|
|
25
|
+
const crossAxisLeftDomain = (0, _react.useMemo)(() => (0, _utils.applyHeadroom)((0, _utils.computeCrossAxisDomainForSide)(tab, dataset, _constants.LEFT_SIDE)), [tab, dataset]);
|
|
26
|
+
const crossAxisRightDomain = (0, _react.useMemo)(() => (0, _utils.applyHeadroom)((0, _utils.computeCrossAxisDomainForSide)(tab, dataset, _constants.RIGHT_SIDE)), [tab, dataset]);
|
|
27
|
+
const {
|
|
28
|
+
hasLeft,
|
|
29
|
+
hasRight
|
|
30
|
+
} = (0, _utils.detectAxisSides)(tab);
|
|
25
31
|
|
|
26
32
|
// TBD: colors should be retrieved from the report's meta
|
|
27
33
|
const codeList = (0, _react.useMemo)(() => tab.subitems_catalog.flatMap(cluster => cluster.map(series => series.bindings.crossAxis)), [tab]);
|
|
28
34
|
const color = (0, _react.useMemo)(() => d3.scaleOrdinal(codeList, d3.schemeTableau10), [codeList]);
|
|
29
35
|
return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_CartesianPlane.default, {
|
|
30
|
-
|
|
36
|
+
crossAxisLeftDomain: crossAxisLeftDomain,
|
|
37
|
+
crossAxisRightDomain: crossAxisRightDomain,
|
|
31
38
|
crossAxisTickFormat: "~s",
|
|
32
39
|
crossAxisTicks: 4,
|
|
33
40
|
height: 700,
|
|
@@ -40,21 +47,26 @@ const UTGraph = _ref => {
|
|
|
40
47
|
bottom: 32,
|
|
41
48
|
left: 64
|
|
42
49
|
},
|
|
43
|
-
width: 1000
|
|
50
|
+
width: 1000,
|
|
51
|
+
hasLeft: hasLeft,
|
|
52
|
+
hasRight: hasRight
|
|
44
53
|
}, _ref2 => {
|
|
45
54
|
let {
|
|
46
55
|
mainAxis,
|
|
47
|
-
|
|
56
|
+
crossAxisLeft,
|
|
57
|
+
crossAxisRight
|
|
48
58
|
} = _ref2;
|
|
49
59
|
return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(_Bars.default, {
|
|
50
|
-
|
|
60
|
+
crossAxisLeft: crossAxisLeft,
|
|
61
|
+
crossAxisRight: crossAxisRight,
|
|
51
62
|
dataset: dataset,
|
|
52
63
|
mainAxis: mainAxis,
|
|
53
64
|
mainAxisDomain: mainAxisDomain,
|
|
54
65
|
tab: tab,
|
|
55
66
|
color: color
|
|
56
67
|
}), /*#__PURE__*/_react.default.createElement(_Lines.default, {
|
|
57
|
-
|
|
68
|
+
crossAxisLeft: crossAxisLeft,
|
|
69
|
+
crossAxisRight: crossAxisRight,
|
|
58
70
|
dataset: dataset,
|
|
59
71
|
mainAxis: mainAxis,
|
|
60
72
|
mainAxisDomain: mainAxisDomain,
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.getValuesMapByCategory = exports.computeCrossAxisDomain = exports.applyHeadroom = void 0;
|
|
6
|
+
exports.getValuesMapByCategory = exports.detectAxisSides = exports.computeCrossAxisDomainForSide = exports.computeCrossAxisDomain = exports.applyHeadroom = void 0;
|
|
7
|
+
var _constants = require("./constants");
|
|
7
8
|
const computeCrossAxisDomain = (tab, dataset) => {
|
|
8
9
|
const {
|
|
9
10
|
yMin,
|
|
@@ -50,6 +51,15 @@ const computeCrossAxisDomain = (tab, dataset) => {
|
|
|
50
51
|
return [Math.min(0, yMin), Math.max(0, yMax)];
|
|
51
52
|
};
|
|
52
53
|
exports.computeCrossAxisDomain = computeCrossAxisDomain;
|
|
54
|
+
const computeCrossAxisDomainForSide = (tab, dataset, side) => {
|
|
55
|
+
const filteredTab = {
|
|
56
|
+
...tab,
|
|
57
|
+
subitems_catalog: tab.subitems_catalog.map(cluster => cluster.filter(series => (series.crossAxis || _constants.LEFT_SIDE) === side))
|
|
58
|
+
};
|
|
59
|
+
filteredTab.subitems_catalog = filteredTab.subitems_catalog.filter(cluster => cluster.length > 0);
|
|
60
|
+
return computeCrossAxisDomain(filteredTab, dataset);
|
|
61
|
+
};
|
|
62
|
+
exports.computeCrossAxisDomainForSide = computeCrossAxisDomainForSide;
|
|
53
63
|
const applyHeadroom = function (_ref2) {
|
|
54
64
|
let [min, max] = _ref2;
|
|
55
65
|
let {
|
|
@@ -65,4 +75,22 @@ const getValuesMapByCategory = dataset => {
|
|
|
65
75
|
});
|
|
66
76
|
return map;
|
|
67
77
|
};
|
|
68
|
-
exports.getValuesMapByCategory = getValuesMapByCategory;
|
|
78
|
+
exports.getValuesMapByCategory = getValuesMapByCategory;
|
|
79
|
+
const detectAxisSides = tab => {
|
|
80
|
+
let hasLeft = false;
|
|
81
|
+
let hasRight = false;
|
|
82
|
+
tab.subitems_catalog.forEach(cluster => {
|
|
83
|
+
cluster.forEach(s => {
|
|
84
|
+
if (s.type === _constants.LINE_TYPE || s.type === _constants.BAR_TYPE) {
|
|
85
|
+
const side = s.crossAxis || _constants.LEFT_SIDE;
|
|
86
|
+
if (side === _constants.LEFT_SIDE) hasLeft = true;
|
|
87
|
+
if (side === _constants.RIGHT_SIDE) hasRight = true;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
return {
|
|
92
|
+
hasLeft,
|
|
93
|
+
hasRight
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
exports.detectAxisSides = detectAxisSides;
|