sea-chart 2.0.35 → 2.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/api/index.js +17 -59
  2. package/dist/assets/css/sea-chart-d3-tooltip.css +0 -1
  3. package/dist/components/color-popover/color-rules-popover.js +4 -2
  4. package/dist/components/drill-down-settings/drill-down-fields-popover/index.js +5 -4
  5. package/dist/components/icon/index.js +9 -13
  6. package/dist/components/number-input/index.js +7 -13
  7. package/dist/components/popover/hide-column-popover/hide-column-popover-widgets/hide-column-item.js +7 -3
  8. package/dist/components/popover/hide-column-popover/hide-column-popover.css +5 -1
  9. package/dist/components/popover/hide-column-popover/hide-column-popover.js +2 -4
  10. package/dist/components/popover/sort-popover/sort-popover.js +6 -7
  11. package/dist/components/statistic-record-dialog/index.js +9 -8
  12. package/dist/components/tooltip/index.js +26 -8
  13. package/dist/editor/index.js +5 -1
  14. package/dist/locale/lang/de.js +1 -0
  15. package/dist/locale/lang/en.js +1 -0
  16. package/dist/locale/lang/es.js +1 -0
  17. package/dist/locale/lang/fr.js +1 -0
  18. package/dist/locale/lang/pt.js +1 -0
  19. package/dist/locale/lang/ru.js +1 -0
  20. package/dist/locale/lang/zh_CN.js +1 -0
  21. package/dist/model/funnel.js +2 -2
  22. package/dist/model/map-bubble.js +4 -0
  23. package/dist/services/map-json.js +3 -0
  24. package/dist/settings/advance-bar-settings/data-settings.js +1 -1
  25. package/dist/settings/advance-bar-settings/style-settings.js +4 -3
  26. package/dist/settings/bar-settings/data-settings.js +1 -1
  27. package/dist/settings/bar-settings/style-settings.js +2 -2
  28. package/dist/settings/basic-number-card/data-settings.js +3 -2
  29. package/dist/settings/combination-settings/data-settings.js +0 -1
  30. package/dist/settings/combination-settings/style-settings.js +2 -2
  31. package/dist/settings/dashboard-settings/data-settings.js +3 -2
  32. package/dist/settings/funnel-settings/components/funnel-layer-setting.js +7 -7
  33. package/dist/settings/index.js +8 -3
  34. package/dist/settings/table-element-settings/components/data-filter.js +24 -25
  35. package/dist/settings/table-element-settings/index.css +1 -31
  36. package/dist/settings/table-settings/data-settings.js +3 -2
  37. package/dist/settings/time-comparison-settings/style-settings.js +2 -2
  38. package/dist/settings/widgets/basic-summary/index.js +8 -7
  39. package/dist/settings/widgets/common-data-settings.js +7 -6
  40. package/dist/settings/widgets/data-filter/index.js +30 -22
  41. package/dist/settings/widgets/group-by.js +4 -3
  42. package/dist/settings/widgets/summary-settings.js +3 -2
  43. package/dist/settings/widgets/y-axis-group-settings.js +3 -2
  44. package/dist/utils/cell-format-utils.js +9 -7
  45. package/dist/utils/chart-utils/base-utils.js +194 -86
  46. package/dist/utils/chart-utils/index.js +5 -3
  47. package/dist/utils/chart-utils/original-data-utils/basic-chart-calculator.js +5 -5
  48. package/dist/utils/chart-utils/original-data-utils/card-calculator.js +8 -2
  49. package/dist/utils/chart-utils/original-data-utils/dashboard-calculator.js +12 -3
  50. package/dist/utils/chart-utils/original-data-utils/pivot-table-calculator.js +4 -1
  51. package/dist/utils/chart-utils/original-data-utils/scatter-calculator.js +1 -0
  52. package/dist/utils/chart-utils/original-data-utils/trend-calculator.js +24 -3
  53. package/dist/utils/chart-utils/sql-statistics-utils.js +182 -177
  54. package/dist/utils/column-utils.js +20 -7
  55. package/dist/utils/contexts.js +5 -2
  56. package/dist/utils/index.js +25 -4
  57. package/dist/utils/row-record-utils.js +100 -20
  58. package/dist/utils/sql/column-2-sql-column.js +10 -10
  59. package/dist/utils/trend-utils.js +15 -2
  60. package/dist/view/index.css +2 -8
  61. package/dist/view/index.js +14 -9
  62. package/dist/view/wrapper/area-group.js +15 -7
  63. package/dist/view/wrapper/bar-compare.js +18 -2
  64. package/dist/view/wrapper/bar-custom-stack.js +35 -9
  65. package/dist/view/wrapper/bar-group.js +55 -26
  66. package/dist/view/wrapper/bar-stack.js +2 -2
  67. package/dist/view/wrapper/basic-number-card.js +27 -3
  68. package/dist/view/wrapper/chart-component.js +43 -440
  69. package/dist/view/wrapper/completeness-group.js +104 -49
  70. package/dist/view/wrapper/dashboard.js +68 -18
  71. package/dist/view/wrapper/horizontal-bar-group.js +26 -6
  72. package/dist/view/wrapper/horizontal-bar-stack.js +2 -2
  73. package/dist/view/wrapper/line-group.js +8 -3
  74. package/dist/view/wrapper/map-world-bubble.js +1 -0
  75. package/dist/view/wrapper/map-world.js +1 -0
  76. package/dist/view/wrapper/pie.js +1 -1
  77. package/dist/view/wrapper/ring.js +1 -1
  78. package/dist/view/wrapper/scatter.js +8 -6
  79. package/dist/view/wrapper/table/two-dimension-table.js +3 -2
  80. package/dist/view/wrapper/table-element/components/records-header/index.js +0 -1
  81. package/dist/view/wrapper/table-element/components/resize-column-handle/resize-column-handle.js +3 -1
  82. package/dist/view/wrapper/table-element/index.js +16 -21
  83. package/dist/view/wrapper/trend.js +24 -1
  84. package/package.json +15 -12
@@ -39,10 +39,11 @@ class Completeness extends _chartComponent.default {
39
39
  this.initChart(this.container, chart === null || chart === void 0 ? void 0 : chart.id, initConfig);
40
40
  };
41
41
  this.drawChart = () => {
42
+ var _this$props$chart, _this$props$chart$con;
42
43
  let {
43
44
  result: data
44
45
  } = this.props;
45
- data = _utils.BaseUtils.formatEmptyName(data, '', _intl.default.get('Empty'));
46
+ data = _utils.BaseUtils.formatEmptyName(data, (_this$props$chart = this.props.chart) === null || _this$props$chart === void 0 ? void 0 : (_this$props$chart$con = _this$props$chart.config) === null || _this$props$chart$con === void 0 ? void 0 : _this$props$chart$con.column_groupby_column_key, _intl.default.get('Empty'));
46
47
  if (!Array.isArray(data)) return;
47
48
  this.draw(data);
48
49
  };
@@ -70,12 +71,20 @@ class Completeness extends _chartComponent.default {
70
71
  } = this.chartBoundingClientRect;
71
72
  this.markLastForCompleteness(data);
72
73
  const colors = _utils.BaseUtils.getCurrentTheme(chartColorTheme).colors;
74
+ // Normalize groupby to string before setColorMap to ensure consistent keys
75
+ data.forEach(item => {
76
+ if (Array.isArray(item.groupby)) {
77
+ item.groupby = item.groupby.join(', ');
78
+ }
79
+ });
73
80
  this.setColorMap(data, chartColorTheme, 'groupby', columnGroupbyColumn, chart);
74
81
  const newSeries = this.getGroupSeries(data, columnGroupbyColumn, chart);
75
82
 
76
83
  // Y axis
77
84
  const fy = d3.scaleBand().domain(newSeries.map(item => item[0])).range([chartHeight - insertPadding, insertPadding]).paddingInner(0.5).paddingOuter(0.1);
78
- const y = d3.scaleBand().domain(new Set(data.map(d => d.groupby))).range([0, fy.bandwidth()]).paddingInner(0).paddingOuter(0);
85
+
86
+ // y scale will be created per main group (local) to avoid overlap
87
+
79
88
  const yAxis = this.chart.append('g').attr('class', 'y-axis-wrapper').call(d3.axisLeft(fy).tickSizeOuter(0).tickPadding(0).tickSizeInner(5)).call(g => {
80
89
  g.selectAll('.domain').attr('stroke', theme.XAxisColor);
81
90
  g.selectAll('.tick line').attr('stroke', theme.XAxisColor);
@@ -103,38 +112,64 @@ class Completeness extends _chartComponent.default {
103
112
 
104
113
  // Rect group
105
114
  const contentWrapper = this.chart.append('g').attr('class', 'content-wrapper').attr('transform', "translate(".concat(Number(yAxis.node().getAttribute('data-axisWidth')), ", 0)"));
106
- contentWrapper.selectAll().data(newSeries).join('g').attr('transform', _ref => {
107
- let [name, dum] = _ref;
108
- const offset = (fy.bandwidth() - dum.length * y.bandwidth()) / 2;
109
- return "translate(0, ".concat(fy(name) + offset, ")");
115
+ const mainGroups = contentWrapper.selectAll().data(newSeries).join('g').attr('transform', _ref => {
116
+ let [name] = _ref;
117
+ return "translate(0, ".concat(fy(name), ")");
110
118
  }).attr('data-transform', _ref2 => {
111
- let [name, dum] = _ref2;
112
- const offset = (fy.bandwidth() - dum.length * y.bandwidth()) / 2;
113
- return "".concat(fy(name) + offset);
114
- }).selectAll().data(_ref3 => {
115
- let [groupKey] = _ref3;
116
- const curSeriesData = newSeries.find(item => item[0] === groupKey);
117
- return curSeriesData[1];
118
- }).join('g').attr('data-completedRate', _ref4 => {
119
- let [_, d] = _ref4;
120
- const restData = d.find(item => item.rawData.group_name === 'rest');
121
- const completedRate = restData.rawData.completedRate;
122
- if (completedRate === 'empty') return '';
123
- return completedRate + '%';
124
- }).selectAll().data(_ref5 => {
125
- let [_, d] = _ref5;
126
- return d;
127
- }).join('rect').attr('class', 'rect').attr('opacity', 1).attr('x', d => x(d[0]) - Number(yAxis.node().getAttribute('data-axisWidth'))).attr('y', d => y.bandwidth() * d.serieIndex).attr('data-y', d => y.bandwidth() * d.serieIndex).attr('width', d => x(d[1]) - x(d[0])).attr('height', y.bandwidth()).attr('fill', d => {
128
- const key = d.key;
129
- const groupby = d.rawData.groupby;
130
- if (key === 'rest') {
131
- return '#bdbdbd';
132
- }
133
- if (column_groupby_column_key) {
134
- return this.colorMap[groupby];
135
- }
136
- return colors[0];
137
- }).attr('data-value', d => d.rawData.value).attr('data-groupName', d => d.rawData.slugId).attr('data-tooltipTitle', d => d.rawData.name).attr('data-tooltipName', d => d.key).attr('data-groupBy', d => d.rawData.groupby).call(g => {
119
+ let [name] = _ref2;
120
+ return "".concat(fy(name));
121
+ });
122
+ const colorMap = this.colorMap;
123
+ const self = this;
124
+
125
+ // Calculate max sub group count across all main groups for uniform bar height
126
+ const maxSubGroupCount = Math.max(...newSeries.map(_ref3 => {
127
+ let [_, subGroups] = _ref3;
128
+ return subGroups.length;
129
+ }));
130
+ const uniformBandwidth = fy.bandwidth() / maxSubGroupCount;
131
+ mainGroups.each(function (_ref4) {
132
+ let [mainGroupName, subGroups] = _ref4;
133
+ const mainGroupNode = d3.select(this);
134
+
135
+ // Create local y scale for this main group, using uniform bandwidth
136
+ const localY = d3.scaleBand().domain(subGroups.map(sg => sg[0])).range([0, uniformBandwidth * subGroups.length]).paddingInner(0).paddingOuter(0);
137
+ mainGroupNode.selectAll().data(subGroups).join('g').attr('data-completedRate', _ref5 => {
138
+ var _restItem$rawData, _completedItem$rawDat;
139
+ let [_, d] = _ref5;
140
+ const restItem = d.find(item => item.key === 'rest');
141
+ const completedItem = d.find(item => item.key === 'completed');
142
+ const restValue = restItem ? Number(((_restItem$rawData = restItem.rawData) === null || _restItem$rawData === void 0 ? void 0 : _restItem$rawData.value) || 0) : 0;
143
+ const completedValue = completedItem ? Number(((_completedItem$rawDat = completedItem.rawData) === null || _completedItem$rawDat === void 0 ? void 0 : _completedItem$rawDat.value) || 0) : 0;
144
+ const targetValue = restValue + completedValue;
145
+ if (!targetValue) return '';
146
+ return "".concat(Math.round(completedValue / targetValue * 100), "%");
147
+ }).selectAll().data(_ref6 => {
148
+ let [_, d] = _ref6;
149
+ return d;
150
+ }).join('rect').attr('class', 'rect').attr('opacity', 1).attr('x', d => x(d[0]) - Number(yAxis.node().getAttribute('data-axisWidth'))).attr('y', d => localY(d.groupby)).attr('data-y', d => localY(d.groupby)).attr('width', d => x(d[1]) - x(d[0])).attr('height', localY.bandwidth()).attr('fill', d => {
151
+ const key = d.key;
152
+ const groupby = d.groupby;
153
+ if (key === 'rest') {
154
+ return '#bdbdbd';
155
+ }
156
+ if (column_groupby_column_key) {
157
+ return colorMap[groupby];
158
+ }
159
+ return colors[0];
160
+ }).attr('data-value', d => d.rawData.value).attr('data-groupName', d => d.rawData.slugId).attr('data-tooltipTitle', d => d.rawData.name).attr('data-tooltipName', d => d.key).attr('data-groupBy', d => d.groupby).on('click', (event, data) => {
161
+ self.props.toggleRecords(data);
162
+ }).on('mouseover', event => {
163
+ self.showTooltip(event);
164
+ self.handleAcitveAndInActiveState('inActive', event);
165
+ }).on('mousemove', event => {
166
+ self.moveTooltip(event);
167
+ }).on('mouseleave', event => {
168
+ self.hiddenTooltip();
169
+ self.handleAcitveAndInActiveState('active', event);
170
+ });
171
+ });
172
+ mainGroups.call(g => {
138
173
  // add rect borderRadius
139
174
  const allGroup = this.getAllGroup(contentWrapper);
140
175
  allGroup.forEach(group => {
@@ -163,16 +198,6 @@ class Completeness extends _chartComponent.default {
163
198
  });
164
199
  });
165
200
  }
166
- }).on('click', (event, data) => {
167
- this.props.toggleRecords(data);
168
- }).on('mouseover', event => {
169
- this.showTooltip(event);
170
- this.handleAcitveAndInActiveState('inActive', event);
171
- }).on('mousemove', event => {
172
- this.moveTooltip(event);
173
- }).on('mouseleave', (event, data) => {
174
- this.hiddenTooltip();
175
- this.handleAcitveAndInActiveState('active', event);
176
201
  });
177
202
  this.setLegend({
178
203
  legendName: 'groupby',
@@ -255,34 +280,64 @@ class Completeness extends _chartComponent.default {
255
280
  };
256
281
  this.getGroupSeries = (data, columnGroupbyColumn, chart) => {
257
282
  const sortedData = _utils.BaseUtils.sortDataByGroupName((0, _lodashEs.cloneDeep)(data), 'groupby', columnGroupbyColumn, chart);
283
+ sortedData.forEach(item => {
284
+ if (Array.isArray(item.groupby)) {
285
+ item.groupby = item.groupby.join(', ');
286
+ }
287
+ });
258
288
  const groups = d3.groups(sortedData, d => d.name);
289
+ // Sort main groups by name for stable order
290
+ groups.sort((a, b) => String(a[0]).localeCompare(String(b[0])));
259
291
  groups.forEach((item, index) => {
260
292
  const itemData = (0, _lodashEs.cloneDeep)(item[1]);
293
+ const valueMap = d3.rollup(itemData, v => d3.sum(v, d => d.value), d => d.groupby, d => d.group_name);
294
+ const rawDataMap = d3.rollup(itemData, v => v[0], d => d.groupby, d => d.group_name);
261
295
 
262
296
  // get series
263
- const series = d3.stack().keys(d3.union(itemData.map(d => d.group_name))).value((_ref6, key) => {
264
- var _group$get;
265
- let [_, group] = _ref6;
266
- return ((_group$get = group.get(String(key))) === null || _group$get === void 0 ? void 0 : _group$get.value) || 0;
267
- })(d3.index(itemData, d => d.groupby, d => d.group_name));
297
+ const series = d3.stack().keys(d3.union(itemData.map(d => d.group_name))).value((_ref7, key) => {
298
+ let [_, group] = _ref7;
299
+ return group.get(key) || 0;
300
+ })(valueMap);
268
301
  item[1] = d3.groups(itemData, d => d.groupby);
302
+ // Sort sub groups by groupby for stable order
303
+ item[1].sort((a, b) => String(a[0]).localeCompare(String(b[0])));
269
304
  item[1].forEach((group, index) => {
305
+ var _completedItem$rawDat2, _restItem$rawData2;
270
306
  const groupKey = group[0];
271
307
  group[1] = [];
272
308
  series.forEach(serie => {
273
309
  const serieKey = serie.key;
274
310
  serie.forEach(item => {
275
311
  if (item.data[0] === groupKey) {
312
+ var _valueMap$get, _rawDataMap$get;
313
+ const aggregatedValue = ((_valueMap$get = valueMap.get(groupKey)) === null || _valueMap$get === void 0 ? void 0 : _valueMap$get.get(serieKey)) || 0;
314
+ const rawData = (_rawDataMap$get = rawDataMap.get(groupKey)) === null || _rawDataMap$get === void 0 ? void 0 : _rawDataMap$get.get(serieKey);
276
315
  const newItem = {
277
316
  ...item,
278
317
  key: serieKey,
279
318
  serieIndex: index,
280
- rawData: item.data[1].get(serieKey)
319
+ groupby: groupKey,
320
+ rawData: {
321
+ ...(rawData || {}),
322
+ value: aggregatedValue,
323
+ groupby: groupKey,
324
+ group_name: serieKey
325
+ }
281
326
  };
282
327
  group[1].push(newItem);
283
328
  }
284
329
  });
285
330
  });
331
+ const completedItem = group[1].find(d => d.key === 'completed');
332
+ const restItem = group[1].find(d => d.key === 'rest');
333
+ const completedValue = completedItem ? Number(((_completedItem$rawDat2 = completedItem.rawData) === null || _completedItem$rawDat2 === void 0 ? void 0 : _completedItem$rawDat2.value) || 0) : 0;
334
+ const restValue = restItem ? Number(((_restItem$rawData2 = restItem.rawData) === null || _restItem$rawData2 === void 0 ? void 0 : _restItem$rawData2.value) || 0) : 0;
335
+ const targetValue = completedValue + restValue;
336
+ if (!targetValue) {
337
+ restItem && (restItem.rawData.completedRate = 'empty');
338
+ } else {
339
+ restItem && (restItem.rawData.completedRate = Math.round(completedValue / targetValue * 100));
340
+ }
286
341
  let sumValue = 0;
287
342
  group[1].forEach(g => {
288
343
  sumValue = sumValue + g[1];
@@ -17,6 +17,28 @@ var _chartComponent = _interopRequireDefault(require("./chart-component"));
17
17
  class Dashboard extends _chartComponent.default {
18
18
  constructor(props) {
19
19
  super(props);
20
+ this.handleClickNumber = () => {
21
+ const {
22
+ toggleRecords,
23
+ result
24
+ } = this.props;
25
+ if (!toggleRecords) return;
26
+ if (typeof result === 'object' && result !== null && result.rows) {
27
+ toggleRecords({
28
+ rows: result.rows
29
+ });
30
+ } else {
31
+ toggleRecords({
32
+ isQueryBySql: true
33
+ });
34
+ }
35
+ };
36
+ this.componentDidMount = () => {
37
+ this.createChart();
38
+ this.drawChart();
39
+ this.debouncedHandleResize = (0, _lodashEs.debounce)(this.handleResize, 300);
40
+ window.addEventListener('resize', this.debouncedHandleResize);
41
+ };
20
42
  this.handleResize = () => {
21
43
  this.destroyChart();
22
44
  this.createChart();
@@ -152,21 +174,55 @@ class Dashboard extends _chartComponent.default {
152
174
  const {
153
175
  height: chartHeight
154
176
  } = this.chartBoundingClientRect;
177
+ const {
178
+ toggleRecords
179
+ } = this.props;
180
+ const {
181
+ font_size,
182
+ font_color,
183
+ font_weight,
184
+ text_align,
185
+ card_label_font_size,
186
+ label_font_color,
187
+ label_text_align,
188
+ label_font_weight
189
+ } = chart.config;
190
+ const {
191
+ width: chartWidth,
192
+ height: fullChartHeight
193
+ } = this.chartBoundingClientRect;
194
+ const radius = Math.min(chartWidth, fullChartHeight) / 2 * 0.75;
195
+ const alignOffset = radius * 0.25;
196
+ const getTextAnchorAndX = align => {
197
+ const v = (align || '').toLowerCase();
198
+ if (v === 'left') {
199
+ return {
200
+ textAnchor: 'end',
201
+ x: -alignOffset
202
+ };
203
+ }
204
+ if (v === 'right') {
205
+ return {
206
+ textAnchor: 'start',
207
+ x: alignOffset
208
+ };
209
+ }
210
+ return {
211
+ textAnchor: 'middle',
212
+ x: 0
213
+ };
214
+ };
215
+ const titleAlign = getTextAnchorAndX(label_text_align);
216
+ const numberAlign = getTextAnchorAndX(text_align);
155
217
  const totalWrapper = d3.select(wrapper).append('g').attr('class', 'total-wrapper');
156
218
  // title
157
- totalWrapper.append('text').attr('fill', '#545454').attr('font-size', chartHeight > 240 ? 20 : 12).text(name).attr('dy', 50).call(g => {
158
- const {
159
- width
160
- } = g.node().getBoundingClientRect();
161
- g.attr('dx', "".concat(-(width / 2)));
162
- });
219
+ totalWrapper.append('text').attr('fill', label_font_color || theme.textColor).attr('font-size', card_label_font_size || (chartHeight > 240 ? 20 : 12)).attr('font-weight', label_font_weight).attr('text-anchor', titleAlign.textAnchor).attr('x', titleAlign.x).text(name).attr('dy', 50);
163
220
 
164
221
  // total
165
- totalWrapper.append('text').attr('fill', theme.textColor).attr('font-size', chartHeight > 240 ? 36 : 16).text("".concat(formatValue, "%")).attr('dx', -10).attr('dy', 90).call(g => {
166
- const {
167
- width
168
- } = g.node().getBoundingClientRect();
169
- g.attr('dx', "".concat(-(width / 2)));
222
+ totalWrapper.append('text').attr('fill', font_color || theme.textColor).attr('font-size', font_size || (chartHeight > 240 ? 36 : 16)).attr('font-weight', font_weight).attr('text-anchor', numberAlign.textAnchor).attr('x', numberAlign.x).text("".concat(formatValue, "%")).attr('dy', 90).style('cursor', toggleRecords ? 'pointer' : 'default').on('click', () => {
223
+ if (toggleRecords) {
224
+ this.handleClickNumber();
225
+ }
170
226
  });
171
227
  };
172
228
  this.chart = null;
@@ -175,12 +231,6 @@ class Dashboard extends _chartComponent.default {
175
231
  toolTipPosition: null
176
232
  };
177
233
  }
178
- componentDidMount() {
179
- this.createChart();
180
- this.drawChart();
181
- this.debouncedHandleResize = (0, _lodashEs.debounce)(this.handleResize, 300);
182
- window.addEventListener('resize', this.debouncedHandleResize);
183
- }
184
234
  componentDidUpdate(prevProps) {
185
235
  super.componentDidUpdate(prevProps);
186
236
  if (_utils.BaseUtils.shouldChartComponentUpdate(prevProps, this.props)) {
@@ -213,7 +263,7 @@ Dashboard.propTypes = {
213
263
  chart: _propTypes.default.object,
214
264
  groupbyColumn: _propTypes.default.object,
215
265
  summaryColumn: _propTypes.default.object,
216
- result: _propTypes.default.number,
266
+ result: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.object]),
217
267
  tables: _propTypes.default.array,
218
268
  globalTheme: _propTypes.default.string,
219
269
  chartColorTheme: _propTypes.default.string,
@@ -12,6 +12,7 @@ var _lodashEs = require("lodash-es");
12
12
  var _classnames = _interopRequireDefault(require("classnames"));
13
13
  var d3 = _interopRequireWildcard(require("d3"));
14
14
  var _dtableUtils = require("dtable-utils");
15
+ var _dayjs = _interopRequireDefault(require("dayjs"));
15
16
  var _constants = require("../../constants");
16
17
  var _utils = require("../../utils");
17
18
  var _intl = _interopRequireDefault(require("../../intl"));
@@ -51,7 +52,10 @@ class HorizontalBarGroup extends _chartComponent.default {
51
52
  customRender,
52
53
  chart
53
54
  } = this.props;
54
- data = _utils.BaseUtils.formatEmptyName(data, '', _intl.default.get('Empty'));
55
+ const {
56
+ column_groupby_column_key
57
+ } = chart.config || {};
58
+ data = _utils.BaseUtils.formatEmptyName(data, column_groupby_column_key, _intl.default.get(_constants.EMPTY_NAME));
55
59
  if (!Array.isArray(data)) return;
56
60
  const {
57
61
  sort_type,
@@ -92,9 +96,24 @@ class HorizontalBarGroup extends _chartComponent.default {
92
96
  marginRight
93
97
  } = this.chartBoundingClientRect;
94
98
  const groupByColumn = this.getColumn(tables, table_id, column_groupby_column_key);
99
+ const isGroupByDate = [_dtableUtils.CellType.DATE, _dtableUtils.CellType.CTIME, _dtableUtils.CellType.MTIME].includes(groupByColumn === null || groupByColumn === void 0 ? void 0 : groupByColumn.type);
100
+ if (isGroupByDate) {
101
+ const emptyName = _intl.default.get(_constants.EMPTY_NAME);
102
+ data = data.map(item => {
103
+ const rawGroupName = item.group_name;
104
+ if (rawGroupName === null || rawGroupName === undefined || rawGroupName === '') return item;
105
+ if (rawGroupName === emptyName) return item;
106
+ const dateValue = (0, _dayjs.default)(rawGroupName);
107
+ if (!dateValue.isValid()) return item;
108
+ return {
109
+ ...item,
110
+ group_name: dateValue.format('YYYY-MM-DD')
111
+ };
112
+ });
113
+ }
95
114
  const useSingleSelectColumnColor = (groupByColumn === null || groupByColumn === void 0 ? void 0 : groupByColumn.type) === _dtableUtils.CellType.SINGLE_SELECT && color_theme === _colorRules.SUPPORT_SINGLE_SELECT_THEMES_OPTIONS.SINGLE_SELECT_COLUMN_COLORS;
96
115
  useSingleSelectColumnColor ? this.setSingleSelectColorMap(data) : this.setColorMap(data, chartColorTheme);
97
- const fy = d3.scaleBand().domain(new Set(data.map(d => d.name))).range([chartHeight - insertPadding, insertPadding]).paddingInner(0.5).paddingOuter(0.1);
116
+ const fy = d3.scaleBand().domain(new Set(data.map(d => d.name))).range([chartHeight - insertPadding, insertPadding]).paddingInner(0.3).paddingOuter(0.1);
98
117
  const sortedData = _utils.BaseUtils.sortDataByGroupName((0, _lodashEs.cloneDeep)(data), 'group_name', columnGroupbyColumn, chart);
99
118
  const y = d3.scaleBand().domain(new Set(sortedData.map(d => d.group_name))).range([0, fy.bandwidth()]).paddingInner(0).paddingOuter(0);
100
119
 
@@ -176,7 +195,7 @@ class HorizontalBarGroup extends _chartComponent.default {
176
195
  this.setLegend({
177
196
  legendName: 'group_name',
178
197
  theme,
179
- legendPosition: 'top-left',
198
+ legendPosition: 'top-right',
180
199
  data,
181
200
  groupColumn: this.props.columnGroupbyColumn,
182
201
  chart
@@ -205,10 +224,11 @@ class HorizontalBarGroup extends _chartComponent.default {
205
224
  title: !title && typeof title !== 'number' ? _intl.default.get(_constants.EMPTY_NAME) : title,
206
225
  items: children.map(child => {
207
226
  const data = child.__data__;
227
+ const groupName = data.group_name === null || data.group_name === undefined || data.group_name === '' ? _intl.default.get(_constants.EMPTY_NAME) : data.group_name;
208
228
  return {
209
- color: this.colorMap[data.group_name] || _constants.CHART_STYLE_COLORS[0],
210
- name: data.group_name,
211
- value: _utils.BaseUtils.getSummaryValueDisplayString(summaryColumn, Number(data.value), horizontal_axis_summary_method)
229
+ color: this.colorMap[groupName] || _constants.CHART_STYLE_COLORS[0],
230
+ name: groupName,
231
+ value: _utils.BaseUtils.getSummaryValueDisplayString(summaryColumn, Number(child.getAttribute('value')), horizontal_axis_summary_method)
212
232
  };
213
233
  })
214
234
  };
@@ -49,7 +49,7 @@ class HorizontalBarStack extends _chartComponent.default {
49
49
  customRender,
50
50
  chart
51
51
  } = this.props;
52
- data = _utils.BaseUtils.formatEmptyName(data, '', _intl.default.get('Empty'));
52
+ data = _utils.BaseUtils.formatEmptyName(data, chart.config.column_groupby_column_key, _intl.default.get('Empty'));
53
53
  if (!Array.isArray(data)) return;
54
54
  const {
55
55
  sort_type,
@@ -95,7 +95,7 @@ class HorizontalBarStack extends _chartComponent.default {
95
95
  const series = d3.stack().keys(d3.union(sortedData.map(d => d.group_name))).value((_ref, key) => {
96
96
  var _group$get;
97
97
  let [_, group] = _ref;
98
- return ((_group$get = group.get(String(key))) === null || _group$get === void 0 ? void 0 : _group$get.value) || 0;
98
+ return ((_group$get = group.get(key)) === null || _group$get === void 0 ? void 0 : _group$get.value) || 0;
99
99
  })(d3.index(sortedData, d => d.name, d => d.group_name));
100
100
  const newSeries = this.handleSeries(series, sortedData);
101
101
  const y = d3.scaleBand().domain(new Set(data.map(d => d.name))).range([chartHeight - insertPadding, insertPadding]).paddingInner(0.5).paddingOuter(0.1);
@@ -50,7 +50,7 @@ class LineGroup extends _chartComponent.default {
50
50
  let {
51
51
  result: data
52
52
  } = this.props;
53
- data = _utils.BaseUtils.formatEmptyName(data, '', _intl.default.get('Empty'));
53
+ data = _utils.BaseUtils.formatEmptyName(data, 'group_name', _intl.default.get('Empty'));
54
54
  if (!Array.isArray(data)) return;
55
55
  this.draw(data);
56
56
  this.renderAxisLabel(this.props.chart, this.props.tables, this.container);
@@ -119,12 +119,17 @@ class LineGroup extends _chartComponent.default {
119
119
  const title = !data.name && typeof data.name !== 'number' ? _intl.default.get(_constants.EMPTY_NAME) : data.name;
120
120
  const circleList = (_contentWrapper$selec = contentWrapper.selectAll('circle')) === null || _contentWrapper$selec === void 0 ? void 0 : _contentWrapper$selec.nodes();
121
121
  const items = circleList.filter(circle => circle.getAttribute('data-name') === title).map(circle => {
122
+ const groupName = circle.getAttribute('data-groupName') || _intl.default.get(_constants.EMPTY_NAME);
122
123
  return {
123
- color: this.colorMap[circle.getAttribute('data-groupName')],
124
- name: circle.getAttribute('data-groupName'),
124
+ color: this.colorMap[groupName],
125
+ name: groupName,
125
126
  value: _utils.BaseUtils.getSummaryValueDisplayString(summaryColumn, Number(circle.getAttribute('data-text')), y_axis_summary_method)
126
127
  };
127
128
  });
129
+ items.sort((a, b) => String(a.name).localeCompare(String(b.name), undefined, {
130
+ numeric: true,
131
+ sensitivity: 'base'
132
+ }));
128
133
  return {
129
134
  title,
130
135
  items
@@ -53,6 +53,7 @@ class MapBubble extends _chartComponent.default {
53
53
  };
54
54
  this.showTooltip = (event, data) => {
55
55
  const curData = data.find(item => item.name.includes(event.currentTarget.getAttribute('data-name')));
56
+ if (!curData) return;
56
57
  const title = curData.nameType === 'en' ? curData.name : curData.name_cn;
57
58
  const value = Number(event.currentTarget.getAttribute('data-value'));
58
59
  const {
@@ -54,6 +54,7 @@ class Map extends _chartComponent.default {
54
54
  };
55
55
  this.showTooltip = (event, data) => {
56
56
  const curData = data.find(item => item.name.includes(event.target.parentNode.getAttribute('data-name')));
57
+ if (!curData) return;
57
58
  const title = curData.nameType === 'en' ? curData.name : curData.name_cn;
58
59
  const value = Number(event.target.parentNode.getAttribute('data-value'));
59
60
  const {
@@ -33,7 +33,7 @@ class Pie extends _chartComponent.default {
33
33
  } = chart.config;
34
34
  const initConfig = {
35
35
  insertPadding: 30,
36
- rightLegendSpace: show_legend ? 150 : 0
36
+ rightLegendSpace: show_legend ? 50 : 0
37
37
  };
38
38
  this.initChart(this.container, chart === null || chart === void 0 ? void 0 : chart.id, initConfig);
39
39
  };
@@ -33,7 +33,7 @@ class Ring extends _chartComponent.default {
33
33
  } = chart.config;
34
34
  const initConfig = {
35
35
  insertPadding: 30,
36
- rightLegendSpace: show_legend ? 150 : 0
36
+ rightLegendSpace: show_legend ? 50 : 0
37
37
  };
38
38
  this.initChart(this.container, chart === null || chart === void 0 ? void 0 : chart.id, initConfig);
39
39
  };
@@ -27,8 +27,7 @@ class Scatter extends _chartComponent.default {
27
27
  };
28
28
  this.createChart = () => {
29
29
  const {
30
- chart,
31
- columnGroupbyColumn
30
+ chart
32
31
  } = this.props;
33
32
  const {
34
33
  y_axis_show_label,
@@ -40,7 +39,7 @@ class Scatter extends _chartComponent.default {
40
39
  marginLeft: y_axis_show_label ? 20 : 0,
41
40
  marginBottom: x_axis_show_label ? 20 : 0,
42
41
  marginTop: y_axis_show_value ? 15 : 0,
43
- bottomLegendSpace: columnGroupbyColumn ? 20 : 0
42
+ bottomLegendSpace: 0
44
43
  };
45
44
  this.initChart(this.container, chart === null || chart === void 0 ? void 0 : chart.id, initConfig);
46
45
  };
@@ -61,8 +60,11 @@ class Scatter extends _chartComponent.default {
61
60
  this.transformStringToNumber = data => {
62
61
  const newData = (0, _lodashEs.cloneDeep)(data);
63
62
  newData.forEach(item => {
64
- item.name = item.original_value.name;
65
- item.value = item.original_value.value;
63
+ if (item.original_value) {
64
+ var _item$original_value, _item$original_value2;
65
+ item.name = ((_item$original_value = item.original_value) === null || _item$original_value === void 0 ? void 0 : _item$original_value.name) || '';
66
+ item.value = ((_item$original_value2 = item.original_value) === null || _item$original_value2 === void 0 ? void 0 : _item$original_value2.value) || 0;
67
+ }
66
68
  });
67
69
  return newData;
68
70
  };
@@ -268,7 +270,7 @@ class Scatter extends _chartComponent.default {
268
270
  this.setLegend({
269
271
  legendName: 'groupby',
270
272
  theme,
271
- legendPosition: 'top-left',
273
+ legendPosition: 'top-right',
272
274
  data,
273
275
  groupColumn: this.props.columnGroupbyColumn,
274
276
  chart,
@@ -98,13 +98,14 @@ class TwoDimensionTable extends _react.PureComponent {
98
98
  className: "pivot-table-header"
99
99
  }), Array.isArray(pivot_columns) && pivot_columns.map((item, index) => {
100
100
  return /*#__PURE__*/_react.default.createElement("th", {
101
+ key: "pivot-column-".concat(index),
101
102
  className: "pivot-table-header summary-columns-header"
102
103
  }, /*#__PURE__*/_react.default.createElement("div", {
103
104
  className: "pivot-table-header-summary-columns-container"
104
105
  }, summary_columns.map((column, idx) => {
105
106
  return /*#__PURE__*/_react.default.createElement("div", {
106
107
  className: (0, _classnames.default)('pivot-table-header'),
107
- key: "pivot-column-".concat(idx)
108
+ key: "pivot-summary-column-".concat(idx)
108
109
  }, /*#__PURE__*/_react.default.createElement(_pivotTableDisplayName.default, {
109
110
  value: column.name,
110
111
  column: column || {},
@@ -306,7 +307,7 @@ class TwoDimensionTable extends _react.PureComponent {
306
307
  cellIdx: cells.length
307
308
  }),
308
309
  title: rowTotal
309
- }, _utils.BaseUtils.isValidValue(rowTotal, display_empty) ? (0, _utils.formatRowTotal)(rowTotal) : /*#__PURE__*/_react.default.createElement("i", null), /*#__PURE__*/_react.default.createElement("span", {
310
+ }, _utils.BaseUtils.isValidValue(rowTotal, display_empty) ? _utils.BaseUtils.getSummaryValueDisplayString(summaryColumn, rowTotal, summaryMethod) : /*#__PURE__*/_react.default.createElement("i", null), /*#__PURE__*/_react.default.createElement("span", {
310
311
  className: (0, _classnames.default)({
311
312
  'selected-pivot-cell-border': isSelectedTotalCell
312
313
  })
@@ -7,7 +7,6 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
- var _contexts = require("../../../../../utils/contexts");
11
10
  var _recordsHeaderCell = _interopRequireDefault(require("./records-header-cell"));
12
11
  class RecordsHeader extends _react.Component {
13
12
  constructor() {
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
- var _lodashEs = require("lodash-es");
10
9
  require("./index.css");
11
10
  class ResizeColumnHandle extends _react.Component {
12
11
  constructor() {
@@ -18,6 +17,7 @@ class ResizeColumnHandle extends _react.Component {
18
17
  window.removeEventListener('touchmove', this.onMouseMove);
19
18
  };
20
19
  this.onMouseDown = e => {
20
+ e.stopPropagation();
21
21
  if (e.preventDefault) {
22
22
  e.preventDefault();
23
23
  }
@@ -27,12 +27,14 @@ class ResizeColumnHandle extends _react.Component {
27
27
  window.addEventListener('touchmove', this.onMouseMove);
28
28
  };
29
29
  this.onMouseUp = e => {
30
+ e.stopPropagation();
30
31
  if (this.props.onDragEnd) {
31
32
  this.props.onDragEnd(e);
32
33
  }
33
34
  this.cleanUp();
34
35
  };
35
36
  this.onMouseMove = e => {
37
+ e.stopPropagation();
36
38
  if (e.preventDefault) {
37
39
  e.preventDefault();
38
40
  }