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
@@ -98,7 +98,7 @@ Object.defineProperty(exports, "getDateColumnFormat", {
98
98
  return _columnUtils.getDateColumnFormat;
99
99
  }
100
100
  });
101
- exports.getGeoGranularityByLevel = exports.getEventClassName = exports.getErrorMessage = void 0;
101
+ exports.getGeoGranularityByLevel = exports.getFirstDayOfWeekForGroupby = exports.getEventClassName = exports.getErrorMessage = void 0;
102
102
  Object.defineProperty(exports, "getKnownCollaboratorByEmail", {
103
103
  enumerable: true,
104
104
  get: function () {
@@ -155,7 +155,7 @@ Object.defineProperty(exports, "translateCalendar", {
155
155
  return _dateTranslate.translateCalendar;
156
156
  }
157
157
  });
158
- var _lodashEs = require("lodash-es");
158
+ var _lodash = require("lodash");
159
159
  var _constants = require("../constants");
160
160
  var _intl = _interopRequireDefault(require("../intl"));
161
161
  var _error = require("../constants/error");
@@ -251,7 +251,7 @@ const getSortedDataByGivenOrder = (data, x_axis_option_list) => {
251
251
  let sortedData = [];
252
252
  data.forEach(item => {
253
253
  const index = idIndexMap[item.group_name];
254
- sortedData[index] = (0, _lodashEs.cloneDeep)(item);
254
+ sortedData[index] = (0, _lodash.cloneDeep)(item);
255
255
  });
256
256
  sortedData = sortedData.filter(Boolean);
257
257
  return sortedData;
@@ -396,4 +396,25 @@ const getEventClassName = e => {
396
396
  if (!e || !e.target) return '';
397
397
  return e.target.getAttribute('class') || '';
398
398
  };
399
- exports.getEventClassName = getEventClassName;
399
+ exports.getEventClassName = getEventClassName;
400
+ const getFirstDayOfWeekForGroupby = source => {
401
+ let firstDayOfWeek = 'Sunday';
402
+ if (source === 'base') {
403
+ const {
404
+ settings
405
+ } = window.app.state.value;
406
+ const {
407
+ date_settings
408
+ } = settings || {};
409
+ firstDayOfWeek = date_settings === null || date_settings === void 0 ? void 0 : date_settings.first_day_of_week;
410
+ } else if (source === 'app') {
411
+ var _window$app, _window$app$dtableUti;
412
+ const dtableSettings = (_window$app = window.app) === null || _window$app === void 0 ? void 0 : (_window$app$dtableUti = _window$app.dtableUtils) === null || _window$app$dtableUti === void 0 ? void 0 : _window$app$dtableUti.settings;
413
+ const {
414
+ date_settings
415
+ } = dtableSettings || {};
416
+ firstDayOfWeek = date_settings === null || date_settings === void 0 ? void 0 : date_settings.first_day_of_week;
417
+ }
418
+ return firstDayOfWeek || 'Sunday';
419
+ };
420
+ exports.getFirstDayOfWeekForGroupby = getFirstDayOfWeekForGroupby;
@@ -20,6 +20,7 @@ var _digitalSignUtils = _interopRequireDefault(require("../utils/digital-sign-ut
20
20
  var _columnUtils = require("../utils/column-utils");
21
21
  var _context = _interopRequireDefault(require("../context"));
22
22
  var _constants = require("../constants");
23
+ var _type = require("../constants/type");
23
24
  var _sql = require("./sql");
24
25
  var _chartUtils = require("./chart-utils");
25
26
  const UNSHOW_COLUMN_TYPE = exports.UNSHOW_COLUMN_TYPE = [_dtableUtils.CellType.LINK, _dtableUtils.CellType.LONG_TEXT, _dtableUtils.CellType.FORMULA, _dtableUtils.CellType.LINK_FORMULA];
@@ -512,7 +513,8 @@ const filterPredicateMap = {
512
513
  [_dtableUtils.CellType.URL]: 'is',
513
514
  [_dtableUtils.CellType.STRING]: 'is',
514
515
  [_dtableUtils.CellType.BOOL]: 'is',
515
- [_dtableUtils.CellType.LINK_FORMULA]: 'has_any_of'
516
+ [_dtableUtils.CellType.LINK_FORMULA]: 'is',
517
+ [_dtableUtils.CellType.LINK]: 'is'
516
518
  };
517
519
  const USE_OPTION_ID_CELL_TYPES = [_dtableUtils.CellType.SINGLE_SELECT, _dtableUtils.CellType.MULTIPLE_SELECT];
518
520
  const getFilterByColumnTypeForPivot = (columnKey, columns, value, rows) => {
@@ -526,11 +528,38 @@ const getFilterByColumnTypeForPivot = (columnKey, columns, value, rows) => {
526
528
  }
527
529
  let type = column.type;
528
530
  const columnType = column.type;
531
+ const {
532
+ result_type,
533
+ array_type
534
+ } = column.data || {};
535
+
536
+ // get the actual type for formula columns
529
537
  if (type === _dtableUtils.CellType.FORMULA) {
530
- type = column.data.result_type;
538
+ if (result_type === _dtableUtils.FORMULA_RESULT_TYPE.ARRAY && array_type) {
539
+ type = array_type;
540
+ } else {
541
+ type = result_type;
542
+ }
531
543
  }
532
544
  if (type === _dtableUtils.CellType.LINK_FORMULA) {
533
- type = column.data.array_type;
545
+ type = array_type;
546
+ // extract display_value from link formula column value
547
+ if (Array.isArray(value) && value.length > 0) {
548
+ value = value[0];
549
+ }
550
+ }
551
+
552
+ // handle link column based on array_type
553
+ if (columnType === _dtableUtils.CellType.LINK) {
554
+ var _column$data, _value$;
555
+ const linkArrayType = (_column$data = column.data) === null || _column$data === void 0 ? void 0 : _column$data.array_type;
556
+ if (linkArrayType) {
557
+ type = linkArrayType;
558
+ }
559
+ // extract display_value from link column value
560
+ if (Array.isArray(value) && value.length > 0 && ((_value$ = value[0]) === null || _value$ === void 0 ? void 0 : _value$.display_value) !== undefined) {
561
+ value = value[0].display_value;
562
+ }
534
563
  }
535
564
  if (column && [_dtableUtils.CellType.GEOLOCATION, _dtableUtils.CellType.DATE, _dtableUtils.CellType.MTIME, _dtableUtils.CellType.CTIME].includes(type)) {
536
565
  filter['value'] = value;
@@ -539,19 +568,24 @@ const getFilterByColumnTypeForPivot = (columnKey, columns, value, rows) => {
539
568
  if (typeof value === 'string') {
540
569
  value = value.trim();
541
570
  }
571
+
572
+ // handle collaborator type for formula/link_formula columns
573
+ const isFormulaCollaborator = (columnType === _dtableUtils.CellType.FORMULA || columnType === _dtableUtils.CellType.LINK_FORMULA) && result_type === _dtableUtils.FORMULA_RESULT_TYPE.ARRAY && _dtableUtils.COLLABORATOR_COLUMN_TYPES.includes(array_type);
542
574
  if (USE_OPTION_ID_CELL_TYPES.includes(column.type)) {
543
575
  const options = (0, _dtableUtils.getColumnOptions)(column);
544
576
  // name may contains spaces
545
577
  // value maybe id or name, find option by name or id
546
578
  const selectedOption = options.find(o => o.name.trim() === value || o.id === value);
547
579
  filter['filter_term'] = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.id;
580
+ } else if (isFormulaCollaborator) {
581
+ filter['filter_term'] = Array.isArray(value) ? value : [value];
548
582
  } else {
549
583
  // value may contains spaces
550
584
  filter['filter_term'] = value;
551
585
  }
552
-
553
- // link_formula use has_any_of
554
- if (columnType === _dtableUtils.CellType.LINK_FORMULA) {
586
+ if (isFormulaCollaborator) {
587
+ filter['filter_predicate'] = filterPredicateMap[_dtableUtils.CellType.COLLABORATOR];
588
+ } else if ([_dtableUtils.CellType.LINK_FORMULA, _dtableUtils.CellType.LINK].includes(columnType)) {
555
589
  filter['filter_predicate'] = filterPredicateMap[columnType];
556
590
  } else {
557
591
  filter['filter_predicate'] = filterPredicateMap[type];
@@ -574,13 +608,40 @@ const getFilterByColumnType = (columnKey, columns, rows, sqlColumnKey) => {
574
608
  let value;
575
609
  let type = column.type;
576
610
  let columnType = column.type;
611
+ const {
612
+ result_type,
613
+ array_type
614
+ } = column.data || {};
577
615
  const correctRow = rows.find(r => sqlColumnKey in r);
578
616
  value = correctRow && correctRow[sqlColumnKey];
617
+
618
+ // get the actual type for formula columns
579
619
  if (type === _dtableUtils.CellType.FORMULA) {
580
- type = column.data.result_type;
620
+ if (result_type === _dtableUtils.FORMULA_RESULT_TYPE.ARRAY && array_type) {
621
+ type = array_type;
622
+ } else {
623
+ type = result_type;
624
+ }
581
625
  }
582
626
  if (type === _dtableUtils.CellType.LINK_FORMULA) {
583
- type = column.data.array_type;
627
+ type = array_type;
628
+ // extract display_value from link formula column value
629
+ if (Array.isArray(value) && value.length > 0) {
630
+ value = value[0];
631
+ }
632
+ }
633
+
634
+ // handle link column based on array_type
635
+ if (columnType === _dtableUtils.CellType.LINK) {
636
+ var _column$data2, _value$2;
637
+ const linkArrayType = (_column$data2 = column.data) === null || _column$data2 === void 0 ? void 0 : _column$data2.array_type;
638
+ if (linkArrayType) {
639
+ type = linkArrayType;
640
+ }
641
+ // extract display_value from link column value
642
+ if (Array.isArray(value) && value.length > 0 && ((_value$2 = value[0]) === null || _value$2 === void 0 ? void 0 : _value$2.display_value) !== undefined) {
643
+ value = value[0].display_value;
644
+ }
584
645
  }
585
646
  if (column && [_dtableUtils.CellType.GEOLOCATION, _dtableUtils.CellType.DATE, _dtableUtils.CellType.MTIME, _dtableUtils.CellType.CTIME].includes(type)) {
586
647
  // link_formula result is an array, but can't pass the value directly as an array here
@@ -589,14 +650,21 @@ const getFilterByColumnType = (columnKey, columns, rows, sqlColumnKey) => {
589
650
  return filter;
590
651
  }
591
652
 
653
+ // handle collaborator type for formula/link_formula columns
654
+ const isFormulaCollaborator = (columnType === _dtableUtils.CellType.FORMULA || columnType === _dtableUtils.CellType.LINK_FORMULA) && result_type === _dtableUtils.FORMULA_RESULT_TYPE.ARRAY && _dtableUtils.COLLABORATOR_COLUMN_TYPES.includes(array_type);
655
+
592
656
  // value may contains spaces
593
657
  if (typeof value === 'string') {
594
658
  value = value.trim();
595
659
  }
596
- filter['filter_term'] = value;
597
-
598
- // link_formula use has_any_of
599
- if (columnType === _dtableUtils.CellType.LINK_FORMULA) {
660
+ if (isFormulaCollaborator) {
661
+ filter['filter_term'] = Array.isArray(value) ? value : [value];
662
+ } else {
663
+ filter['filter_term'] = value;
664
+ }
665
+ if (isFormulaCollaborator) {
666
+ filter['filter_predicate'] = filterPredicateMap[_dtableUtils.CellType.COLLABORATOR];
667
+ } else if ([_dtableUtils.CellType.LINK_FORMULA, _dtableUtils.CellType.LINK].includes(columnType)) {
600
668
  filter['filter_predicate'] = filterPredicateMap[columnType];
601
669
  } else {
602
670
  filter['filter_predicate'] = filterPredicateMap[type];
@@ -621,10 +689,18 @@ const getFilterConditions = (statisticRecord, chart, table) => {
621
689
  const groupColumnKey = _constants.groupAxisMap[type];
622
690
  chart.config = _chartUtils.BaseUtils.convertConfig(config);
623
691
  const chartSQLMap = (0, _sql.chartColumn2SqlColumn)(chart, table);
624
- const {
692
+ let {
625
693
  sqlColumnGroupbyColumnKey,
626
- sqlGroupbyColumnKey
694
+ sqlGroupbyColumnKey,
695
+ sqlXColumnKey,
696
+ sqlYColumnKey
627
697
  } = chartSQLMap;
698
+ if (type === _type.CHART_TYPE.COMPLETENESS_GROUP || type === _type.CHART_TYPE.COMPLETENESS) {
699
+ const {
700
+ sqlColumns
701
+ } = chartSQLMap;
702
+ sqlGroupbyColumnKey = sqlColumns.name_column.key;
703
+ }
628
704
  if (isPivot && rows.length) {
629
705
  const xValueList = [];
630
706
  const yValueList = [];
@@ -648,19 +724,23 @@ const getFilterConditions = (statisticRecord, chart, table) => {
648
724
  });
649
725
  } else {
650
726
  if (name === '_Others') {
651
- const columnFilters = rows.map(row => getFilterByColumnType(config[columnKey], columns, [row], sqlGroupbyColumnKey));
652
- filters.push(...columnFilters);
727
+ const flters = rows.map(row => getFilterByColumnType(config[columnKey], columns, [row], sqlGroupbyColumnKey));
728
+ filters.push(...flters);
653
729
  } else {
654
- let columnFilter;
655
730
  if (['map', 'map_bubble'].includes(type)) {
656
- columnFilter = {
731
+ const filter = {
657
732
  column_key: config[columnKey],
658
733
  value: name
659
734
  };
735
+ filters.push(filter);
736
+ } else if (type === _type.CHART_TYPE.SCATTER) {
737
+ const filterX = getFilterByColumnType(config['x_axis_column_key'], columns, rows, sqlXColumnKey);
738
+ const filterY = getFilterByColumnType(config['y_axis_column_key'], columns, rows, sqlYColumnKey);
739
+ filters.push(filterX, filterY);
660
740
  } else {
661
- columnFilter = getFilterByColumnType(config[columnKey], columns, rows, sqlGroupbyColumnKey);
741
+ const filter = getFilterByColumnType(config[columnKey], columns, rows, sqlGroupbyColumnKey);
742
+ filters.push(filter);
662
743
  }
663
- filters.push(columnFilter);
664
744
  }
665
745
  if (sqlColumnGroupbyColumnKey) {
666
746
  const groupColumnFilter = getFilterByColumnType(config[groupColumnKey], columns, rows, sqlColumnGroupbyColumnKey);
@@ -11,6 +11,7 @@ var _baseUtils = _interopRequireDefault(require("../chart-utils/base-utils"));
11
11
  var _map = require("../map");
12
12
  var _columnUtils = require("../column-utils");
13
13
  var _intl = _interopRequireDefault(require("../../intl"));
14
+ var _index = require("../index");
14
15
  const column2SqlColumn = function (column) {
15
16
  let {
16
17
  dateGranularity,
@@ -18,14 +19,13 @@ const column2SqlColumn = function (column) {
18
19
  } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
19
20
  const {
20
21
  name,
21
- type,
22
22
  key
23
23
  } = column;
24
24
  const validColumnName = "`".concat(name, "`");
25
- switch (type) {
26
- case _dtableUtils.CellType.DATE:
27
- case _dtableUtils.CellType.MTIME:
28
- case _dtableUtils.CellType.CTIME:
25
+ const startOfWeek = (0, _index.getFirstDayOfWeekForGroupby)('app').toLowerCase();
26
+ switch (true) {
27
+ case (0, _columnUtils.isDateColumn)(column):
28
+ case (0, _columnUtils.isDateFormulaColumn)(column):
29
29
  {
30
30
  const validDateGranularity = dateGranularity && dateGranularity.toUpperCase();
31
31
  if (['DAY', 'DAYS_7', 'DAYS_30'].includes(validDateGranularity)) {
@@ -36,7 +36,7 @@ const column2SqlColumn = function (column) {
36
36
  };
37
37
  }
38
38
  if (validDateGranularity === 'WEEK') {
39
- const sqlColumnName = "ISODATE(STARTOFWEEK(".concat(validColumnName, ", \"monday\"))");
39
+ const sqlColumnName = "ISODATE(STARTOFWEEK(".concat(validColumnName, ", \"").concat(startOfWeek, "\"))");
40
40
  return {
41
41
  name: sqlColumnName,
42
42
  key: sqlColumnName
@@ -76,7 +76,7 @@ const column2SqlColumn = function (column) {
76
76
  key: sqlColumnName
77
77
  };
78
78
  }
79
- case _dtableUtils.CellType.GEOLOCATION:
79
+ case column.type === _dtableUtils.CellType.GEOLOCATION:
80
80
  {
81
81
  const validGeolocationGranularity = geolocationGranularity && geolocationGranularity.toUpperCase();
82
82
  if (validGeolocationGranularity === 'PROVINCE') {
@@ -805,12 +805,12 @@ const chartColumn2SqlColumn = (chartElement, table) => {
805
805
  case _constants.CHART_TYPE.COMPLETENESS_GROUP:
806
806
  {
807
807
  const sqlColumns = getCompletenessSettingColumn(chart, table);
808
- const sqlColumnGroupByColumnKey = completenessColumn2SqlColumn(chart, table);
809
- // only has columnGroupByColumn key need maped to sql key
808
+ const sqlColumnGroupbyColumnKey = completenessColumn2SqlColumn(chart, table);
809
+ // only has columnGroupbyColumn key need maped to sql key
810
810
  // for example: 'xxx' => 'ISODATE(xxxx)'
811
811
  return {
812
812
  sqlColumns,
813
- sqlColumnGroupByColumnKey
813
+ sqlColumnGroupbyColumnKey
814
814
  };
815
815
  }
816
816
  case _constants.CHART_TYPE.SCATTER:
@@ -10,8 +10,18 @@ var _dayjs = _interopRequireDefault(require("dayjs"));
10
10
  var _quarterOfYear = _interopRequireDefault(require("dayjs/plugin/quarterOfYear"));
11
11
  var _constants = require("../constants");
12
12
  var _chartUtils = require("./chart-utils");
13
+ var _index = require("./index");
13
14
  _dayjs.default.extend(_quarterOfYear.default);
14
- function getCompareDate(dateGranularity) {
15
+ const dayOfWeekMap = {
16
+ 'Sunday': 0,
17
+ 'Monday': 1,
18
+ 'Tuesday': 2,
19
+ 'Wednesday': 3,
20
+ 'Thursday': 4,
21
+ 'Friday': 5,
22
+ 'Saturday': 6
23
+ };
24
+ function getCompareDate(dateGranularity, source) {
15
25
  const currentDate = (0, _dayjs.default)();
16
26
  switch (dateGranularity) {
17
27
  case _constants.CHART_SUMMARY_TYPE.DAY:
@@ -25,7 +35,10 @@ function getCompareDate(dateGranularity) {
25
35
  }
26
36
  case _constants.CHART_SUMMARY_TYPE.WEEK:
27
37
  {
28
- const currentWeek = (0, _dayjs.default)().day(1);
38
+ var _dayOfWeekMap$firstDa;
39
+ const firstDayOfWeek = (0, _index.getFirstDayOfWeekForGroupby)(source);
40
+ const startDayIndex = (_dayOfWeekMap$firstDa = dayOfWeekMap[firstDayOfWeek]) !== null && _dayOfWeekMap$firstDa !== void 0 ? _dayOfWeekMap$firstDa : 0; // default to Sunday
41
+ const currentWeek = (0, _dayjs.default)().day(startDayIndex);
29
42
  const compareDate = (0, _dayjs.default)(currentWeek).subtract(1, 'weeks').format('YYYY-MM-DD');
30
43
  const comparedDate = (0, _dayjs.default)(currentWeek).subtract(2, 'weeks').format('YYYY-MM-DD');
31
44
  return {
@@ -30,10 +30,6 @@
30
30
  height: 100%
31
31
  }
32
32
 
33
- .sea-chart-formatter .sea-chart-cavans-container.has-title {
34
- height: calc(100% - 41px);
35
- }
36
-
37
33
  .sea-chart-formatter .sea-chart-table-formatter-container:hover {
38
34
  overflow: auto;
39
35
  }
@@ -49,10 +45,8 @@
49
45
  .sea-chart-formatter .sea-chart-container {
50
46
  font-size: 12px;
51
47
  position: absolute;
52
- left: 2%;
53
- right: 2%;
54
- top: 2%;
55
- bottom: 8%;
48
+ width: 100%;
49
+ height: 100%;
56
50
  }
57
51
 
58
52
  .sea-chart-formatter .sea-chart-container.plugin-number-card,
@@ -248,7 +248,7 @@ class View extends _react.default.PureComponent {
248
248
  });
249
249
  }
250
250
  render() {
251
- var _title$text, _chart$config3;
251
+ var _chart$config3;
252
252
  const {
253
253
  // style
254
254
  className,
@@ -283,10 +283,6 @@ class View extends _react.default.PureComponent {
283
283
  const {
284
284
  type: chartType
285
285
  } = config;
286
- const {
287
- title
288
- } = style_config;
289
- const hasTitle = title && ((_title$text = title.text) === null || _title$text === void 0 ? void 0 : _title$text.length);
290
286
  const validClassName = (0, _classnames.default)('sea-chart-formatter', className);
291
287
  const tipBackgroundColorClassName = 'sea-chart-formatter-tip';
292
288
  if (!isCalculated) {
@@ -319,9 +315,7 @@ class View extends _react.default.PureComponent {
319
315
  chart: chart
320
316
  }), /*#__PURE__*/_react.default.createElement("div", {
321
317
  id: "sea-chart-cavans-container-".concat(chart.id),
322
- className: (0, _classnames.default)('sea-chart-cavans-container', {
323
- 'has-title': hasTitle
324
- })
318
+ className: (0, _classnames.default)('sea-chart-cavans-container')
325
319
  }, /*#__PURE__*/_react.default.createElement(_wrapper.default, {
326
320
  chart: chart,
327
321
  data: data,
@@ -339,6 +333,18 @@ class View extends _react.default.PureComponent {
339
333
  }))));
340
334
  }
341
335
  }
336
+ View.defaultProps = {
337
+ canvasStyle: {},
338
+ tables: [],
339
+ chart: {
340
+ id: '',
341
+ config: {},
342
+ style_config: {}
343
+ },
344
+ collaborators: [],
345
+ globalTheme: _constants.THEME_NAME_MAP.LIGHT,
346
+ isCalculateByView: false
347
+ };
342
348
  const propTypes = exports.propTypes = {
343
349
  // style
344
350
  className: _propTypes.default.string,
@@ -377,5 +383,4 @@ const defaultProps = exports.defaultProps = {
377
383
  globalTheme: _constants.THEME_NAME_MAP.LIGHT,
378
384
  isCalculateByView: false
379
385
  };
380
- View.defaultProps = defaultProps;
381
386
  var _default = exports.default = View;
@@ -48,7 +48,7 @@ class AreaGroup extends _chartComponent.default {
48
48
  result: data,
49
49
  customRender
50
50
  } = this.props;
51
- data = _utils.BaseUtils.formatEmptyName(data, '', _intl.default.get('Empty'));
51
+ data = _utils.BaseUtils.formatEmptyName(data, 'group_name', _intl.default.get('Empty'));
52
52
  if (!Array.isArray(data)) return;
53
53
  this.draw(data);
54
54
  (0, _utils.isFunction)(customRender) && customRender(this.chart);
@@ -300,12 +300,16 @@ class AreaGroup extends _chartComponent.default {
300
300
  const newTooltipData = {
301
301
  title: title,
302
302
  items: data.map(item => {
303
+ const groupName = item.group_name || _intl.default.get('Empty');
303
304
  return {
304
- color: this.colorMap[item.group_name],
305
- name: item.group_name,
305
+ color: this.colorMap[groupName],
306
+ name: groupName,
306
307
  value: _utils.BaseUtils.getSummaryValueDisplayString(summaryColumn, item.value, y_axis_summary_method)
307
308
  };
308
- })
309
+ }).sort((a, b) => String(a.name).localeCompare(String(b.name), undefined, {
310
+ numeric: true,
311
+ sensitivity: 'base'
312
+ }))
309
313
  };
310
314
  this.setState({
311
315
  tooltipData: newTooltipData
@@ -332,12 +336,16 @@ class AreaGroup extends _chartComponent.default {
332
336
  const newTooltipData = {
333
337
  title: title,
334
338
  items: data.map(item => {
339
+ const groupName = item.group_name || _intl.default.get('Empty');
335
340
  return {
336
- color: this.colorMap[item.group_name],
337
- name: item.group_name,
341
+ color: this.colorMap[groupName],
342
+ name: groupName,
338
343
  value: _utils.BaseUtils.getSummaryValueDisplayString(summaryColumn, item.value, y_axis_summary_method)
339
344
  };
340
- })
345
+ }).sort((a, b) => String(a.name).localeCompare(String(b.name), undefined, {
346
+ numeric: true,
347
+ sensitivity: 'base'
348
+ }))
341
349
  };
342
350
  this.setState({
343
351
  tooltipData: newTooltipData
@@ -196,7 +196,6 @@ class BarCompare extends _chartComponent.default {
196
196
  const theme = _constants.CHART_THEME_COLOR[globalTheme];
197
197
  const {
198
198
  label_font_size,
199
- y_axis_auto_range,
200
199
  y_axis_min,
201
200
  y_axis_max,
202
201
  increase_line_color,
@@ -207,9 +206,26 @@ class BarCompare extends _chartComponent.default {
207
206
  height: chartHeight,
208
207
  insertPadding
209
208
  } = this.chartBoundingClientRect;
209
+ if (!Array.isArray(increaseData) || increaseData.length === 0) return;
210
210
  const circleData = increaseData.map(() => ({}));
211
211
  const lineX = d3.scaleBand().domain(increaseData.map(d => d.name)).range([insertPadding + this.horizontalOverflowOffset, chartWidth - insertPadding]).paddingInner(0.5).paddingOuter(0.1);
212
- const lineY = d3.scaleLinear().domain(y_axis_auto_range ? [d3.min(increaseData, d => d.value), d3.max(increaseData, d => d.value)] : [y_axis_min, y_axis_max]).range([chartHeight - insertPadding, insertPadding]);
212
+ const autoMin = d3.min(increaseData, d => d.value);
213
+ const autoMax = d3.max(increaseData, d => d.value);
214
+ let min, max;
215
+ if (!(y_axis_min && y_axis_max)) {
216
+ min = autoMin;
217
+ max = autoMax;
218
+ } else {
219
+ min = y_axis_min;
220
+ max = y_axis_max;
221
+ }
222
+ let yDomain = [min, max];
223
+ // avoid y axis range is invalid
224
+ if (min === max) {
225
+ const padding = min === 0 ? 1 : Math.max(Math.abs(min) * 0.1, 0.1);
226
+ yDomain = [min - padding, max + padding];
227
+ }
228
+ const lineY = d3.scaleLinear().domain(yDomain).range([chartHeight - insertPadding, insertPadding]);
213
229
  const line = d3.line().x((d, index) => {
214
230
  const x = lineX(d.name) + lineX.bandwidth() / 2;
215
231
  circleData[index]['x'] = x;
@@ -182,16 +182,39 @@ class BarCustom extends _chartComponent.default {
182
182
  const height = y(d[0][0]) - y(d[0][1]);
183
183
  return isNaN(height) ? 0 : height;
184
184
  }).attr('fill', d => color(d.key)).attr('data-value', d => d.stackData.value).attr('data-rectId', d => d.stackData.slugId).attr('data-groupName', d => d.stackData.group_name).attr('data-title', d => d.stackData.name).call(g => {
185
- // add rect borderRadius
186
- Array.from(g._parents).forEach(group => {
187
- const topRect = Array.from(group.children).reverse().find(rect => Number(rect.getAttribute('height')) !== 0);
188
- // Add mask rect
189
- if (topRect) {
190
- this.addMaskRect(group, topRect, x.bandwidth(), color);
185
+ const {
186
+ borderRadius
187
+ } = this.chartBoundingClientRect;
188
+ const xWidth = x.bandwidth();
189
+ const stackGroupNodes = Array.from(g._parents);
190
+ const nameGroups = [];
191
+ stackGroupNodes.forEach(stackGroup => {
192
+ const nameGroup = stackGroup.parentNode;
193
+ if (nameGroup && !nameGroups.includes(nameGroup)) {
194
+ nameGroups.push(nameGroup);
191
195
  }
192
196
  });
197
+ nameGroups.forEach(nameGroup => {
198
+ const stackGroups = Array.from(nameGroup.children);
199
+ let groupBorderRadius = Infinity;
200
+ stackGroups.forEach(stackGroup => {
201
+ const topRect = Array.from(stackGroup.children).reverse().find(rect => Number(rect.getAttribute('height')) !== 0);
202
+ if (!topRect) return;
203
+ const rectHeight = Number(topRect.getAttribute('height'));
204
+ const computedBorderRadius = Math.min(xWidth * borderRadius, rectHeight / 2, xWidth / 2);
205
+ groupBorderRadius = Math.min(groupBorderRadius, computedBorderRadius);
206
+ });
207
+ if (!Number.isFinite(groupBorderRadius)) {
208
+ groupBorderRadius = 0;
209
+ }
210
+ stackGroups.forEach(stackGroup => {
211
+ const topRect = Array.from(stackGroup.children).reverse().find(rect => Number(rect.getAttribute('height')) !== 0);
212
+ if (!topRect) return;
213
+ this.addMaskRect(stackGroup, topRect, xWidth, color, groupBorderRadius);
214
+ });
215
+ });
193
216
  if (display_each_block_data) {
194
- this.handleLabelToRectCenter(g, x.bandwidth());
217
+ this.handleLabelToRectCenter(g, xWidth);
195
218
  }
196
219
  }).on('click', (event, data) => {
197
220
  this.props.toggleRecords(data);
@@ -241,10 +264,13 @@ class BarCustom extends _chartComponent.default {
241
264
  });
242
265
  });
243
266
  };
244
- this.addMaskRect = (topG, rect, xWidth, colorScale) => {
267
+ this.addMaskRect = (topG, rect, xWidth, colorScale, borderRadiusVal) => {
245
268
  const {
246
269
  borderRadius
247
270
  } = this.chartBoundingClientRect;
271
+ const rectHeight = Number(rect.getAttribute('height'));
272
+ const computedBorderRadius = Math.min(xWidth * borderRadius, rectHeight / 2, xWidth / 2);
273
+ const safeBorderRadius = Math.min(borderRadiusVal !== null && borderRadiusVal !== void 0 ? borderRadiusVal : computedBorderRadius, rectHeight / 2, xWidth / 2);
248
274
  // Add mask rect
249
275
  d3.select(topG).append('foreignObject').attr('class', 'stack-wrapper').attr('opacity', rect.getAttribute('opacity')).attr('x', rect.getAttribute('x')).attr('data-x', topG.parentNode.getAttribute('data-transform')).attr('y', rect.getAttribute('y')).attr('width', xWidth).attr('height', rect.getAttribute('height')).attr('data-groupName', rect.getAttribute('data-groupName')).attr('data-value', rect.getAttribute('data-value')).attr('data-title', rect.getAttribute('data-title')).attr('data-rectId', rect.getAttribute('data-rectId')).on('click', (event, data) => {
250
276
  this.props.toggleRecords(data);
@@ -256,7 +282,7 @@ class BarCustom extends _chartComponent.default {
256
282
  }).on('mouseleave', (event, data) => {
257
283
  this.hiddenTooltip();
258
284
  this.handleStacksAcitveAndInActiveState('active', event);
259
- }).append('xhtml:div').attr('class', 'stack').attr('data-rectId', rect.getAttribute('data-rectId')).attr('style', "width: 100%; height: 100%; background-color: ".concat(rect.getAttribute('fill'), "; border-radius: ").concat(xWidth * borderRadius, "px ").concat(xWidth * borderRadius, "px 0px 0px"));
285
+ }).append('xhtml:div').attr('class', 'stack').attr('data-rectId', rect.getAttribute('data-rectId')).attr('style', "width: 100%; height: 100%; background-color: ".concat(rect.getAttribute('fill'), "; border-radius: ").concat(safeBorderRadius, "px ").concat(safeBorderRadius, "px 0px 0px"));
260
286
 
261
287
  // Remove old rect
262
288
  d3.select(rect).remove();