sea-chart 2.0.55 → 2.0.57

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.
@@ -16,6 +16,12 @@
16
16
  color: #666666;
17
17
  }
18
18
 
19
+ .sea-chart-formatter .sea-chart-empty-result {
20
+ flex: 1;
21
+ min-height: 0;
22
+ color: #666666;
23
+ }
24
+
19
25
  .sea-chart-formatter .sea-chart-formatter-container {
20
26
  height: 100%;
21
27
  width: 100%;
@@ -20,6 +20,7 @@ var _concurrencyManager = _interopRequireDefault(require("../utils/concurrency-m
20
20
  var _wrapper = _interopRequireDefault(require("./wrapper"));
21
21
  var _title = _interopRequireDefault(require("./title"));
22
22
  require("./index.css");
23
+ const NO_STATISTIC_RESULTS = 'There_are_no_statistic_results_yet';
23
24
  class View extends _react.default.PureComponent {
24
25
  constructor(props) {
25
26
  var _this;
@@ -67,7 +68,7 @@ class View extends _react.default.PureComponent {
67
68
  if (!data) {
68
69
  this.setState({
69
70
  errorMessage: '',
70
- tipMessage: 'There_are_no_statistic_results_yet',
71
+ tipMessage: NO_STATISTIC_RESULTS,
71
72
  data: null,
72
73
  isCalculated: true
73
74
  });
@@ -295,16 +296,12 @@ class View extends _react.default.PureComponent {
295
296
  className: (0, _classnames.default)('error', validClassName, tipBackgroundColorClassName)
296
297
  }, /*#__PURE__*/_react.default.createElement("span", null, errorMessage));
297
298
  }
298
- if (tipMessage) {
299
+ if (tipMessage && tipMessage !== NO_STATISTIC_RESULTS) {
299
300
  return /*#__PURE__*/_react.default.createElement("div", {
300
301
  className: (0, _classnames.default)('error', validClassName, tipBackgroundColorClassName)
301
302
  }, /*#__PURE__*/_react.default.createElement("span", null, _intl.default.get(tipMessage)));
302
303
  }
303
- if (_chartUtils.BaseUtils.imEmptyChartResult(data) && !chartType.includes('map')) {
304
- return /*#__PURE__*/_react.default.createElement("div", {
305
- className: (0, _classnames.default)('error', validClassName, tipBackgroundColorClassName)
306
- }, /*#__PURE__*/_react.default.createElement("span", null, _intl.default.get('There_are_no_statistic_results_yet')));
307
- }
304
+ const isEmptyResult = tipMessage === NO_STATISTIC_RESULTS || _chartUtils.BaseUtils.imEmptyChartResult(data) && !chartType.includes('map');
308
305
  return /*#__PURE__*/_react.default.createElement("div", {
309
306
  className: validClassName
310
307
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -313,7 +310,9 @@ class View extends _react.default.PureComponent {
313
310
  })
314
311
  }, !hideTitle && /*#__PURE__*/_react.default.createElement(_title.default, {
315
312
  chart: chart
316
- }), /*#__PURE__*/_react.default.createElement("div", {
313
+ }), isEmptyResult ? /*#__PURE__*/_react.default.createElement("div", {
314
+ className: (0, _classnames.default)('sea-chart-empty-result', tipBackgroundColorClassName)
315
+ }, /*#__PURE__*/_react.default.createElement("span", null, _intl.default.get(NO_STATISTIC_RESULTS))) : /*#__PURE__*/_react.default.createElement("div", {
317
316
  id: `sea-chart-cavans-container-${chart.id}`,
318
317
  className: (0, _classnames.default)('sea-chart-cavans-container')
319
318
  }, /*#__PURE__*/_react.default.createElement(_wrapper.default, {
@@ -565,6 +565,26 @@ class ChartComponent extends _react.Component {
565
565
  return _intl.default.get(name) || name;
566
566
  }
567
567
  };
568
+ this.truncateLegendText = (textNode, maxWidth) => {
569
+ if (!textNode || !Number.isFinite(maxWidth) || maxWidth <= 0) return false;
570
+ const fullText = textNode.textContent || '';
571
+ const getTextWidth = () => {
572
+ if (typeof textNode.getComputedTextLength === 'function') {
573
+ return textNode.getComputedTextLength();
574
+ }
575
+ return textNode.getBoundingClientRect().width;
576
+ };
577
+ if (!fullText || getTextWidth() <= maxWidth) return false;
578
+ const ellipsis = '...';
579
+ let textLength = fullText.length;
580
+ while (textLength > 0) {
581
+ textNode.textContent = `${fullText.slice(0, textLength)}${ellipsis}`;
582
+ if (getTextWidth() <= maxWidth) return true;
583
+ textLength--;
584
+ }
585
+ textNode.textContent = ellipsis;
586
+ return true;
587
+ };
568
588
  this.setLegend = _ref => {
569
589
  var _chart$config, _chart$config2;
570
590
  let {
@@ -756,11 +776,6 @@ class ChartComponent extends _react.Component {
756
776
  let [groupName] = _ref5;
757
777
  return groupName;
758
778
  }).call(g => {
759
- // Add text
760
- g.nodes().forEach(rect => {
761
- const parentNode = rect.parentNode;
762
- d3.select(parentNode).append('text').attr('x', legendRectWidth + legendRecTextGap).attr('fill', theme.legendTextColor).attr('font-size', theme.legendFontSize).text(this.formatterLegendName(rect.dataset.text)).attr('data-text', rect.dataset.text).attr('y', legendItemTextPaddingTop);
763
- });
764
779
  const legendItems = Array.from(legendWrapper.node().children).filter(item => item.getAttribute('class') !== 'legend-flip-page');
765
780
  const {
766
781
  start,
@@ -768,6 +783,18 @@ class ChartComponent extends _react.Component {
768
783
  top,
769
784
  bottom
770
785
  } = this.getLegendBoundary(legendPosition);
786
+ const legendTranslateX = legendPosition === 'center-right' ? start - 50 : start;
787
+ const maxLegendTextWidth = legendPosition === 'center-right' ? end - legendTranslateX - legendRectWidth - legendRecTextGap : null;
788
+
789
+ // Add text
790
+ g.nodes().forEach(rect => {
791
+ const parentNode = rect.parentNode;
792
+ const label = this.formatterLegendName(rect.dataset.text);
793
+ const textNode = d3.select(parentNode).append('text').attr('x', legendRectWidth + legendRecTextGap).attr('fill', theme.legendTextColor).attr('font-size', theme.legendFontSize).text(label).attr('data-text', rect.dataset.text).attr('y', legendItemTextPaddingTop).node();
794
+ if (this.truncateLegendText(textNode, maxLegendTextWidth)) {
795
+ d3.select(textNode).append('title').text(label);
796
+ }
797
+ });
771
798
  if (top && bottom) {
772
799
  // update g translateY
773
800
  legendItems.forEach((item, index) => {
@@ -780,7 +807,8 @@ class ChartComponent extends _react.Component {
780
807
  const prevTranslateY = Number(prevItem.getAttribute('data-translateY'));
781
808
  translateY = prevTranslateY + height + legendItemMargin;
782
809
  }
783
- d3.select(item).attr('transform', `translate(${start},${translateY})`).attr('data-translateY', translateY);
810
+ const translateX = legendPosition === 'center-right' ? start - 50 : start;
811
+ d3.select(item).attr('transform', `translate(${translateX},${translateY})`).attr('data-translateY', translateY);
784
812
  this.bindLegendItemInteraction(item);
785
813
  });
786
814
  } else {
@@ -798,7 +826,7 @@ class ChartComponent extends _react.Component {
798
826
  d3.select(item).attr('transform', `translate(${translateX},0)`).attr('data-translateX', translateX);
799
827
  this.bindLegendItemInteraction(item);
800
828
 
801
- // legend items add offset
829
+ // legend items add offset
802
830
  if (legendPosition === 'top-right') {
803
831
  d3.select(item).attr('opacity', 0);
804
832
  // Execute only once
@@ -1588,7 +1616,7 @@ class ChartComponent extends _react.Component {
1588
1616
  allTicks.forEach(tick => {
1589
1617
  const opacityVal = tick.getAttribute('opacity');
1590
1618
  if (Number(opacityVal) !== 0) {
1591
- // roate
1619
+ // roate
1592
1620
  d3.select(tick).select('text').attr('transform', 'rotate(30)').style('text-anchor', 'end').attr('dy', '1em').attr('dx', '-0.5em');
1593
1621
  }
1594
1622
  });
@@ -1622,7 +1650,7 @@ class ChartComponent extends _react.Component {
1622
1650
  allTicks.forEach(tick => {
1623
1651
  const opacityVal = tick.getAttribute('opacity');
1624
1652
  if (Number(opacityVal) !== 0) {
1625
- // roate
1653
+ // roate
1626
1654
  d3.select(tick).select('text').attr('transform', 'rotate(45)').style('text-anchor', 'start').attr('dy', '0.4em').attr('dx', '0.4em');
1627
1655
  }
1628
1656
  });
@@ -55,7 +55,7 @@ class Treemap extends _chartComponent.default {
55
55
  offsetY
56
56
  } = event;
57
57
  const newTooltipData = {
58
- title: data.name,
58
+ title: this.getDisplayName(data.name),
59
59
  items: [{
60
60
  color: '',
61
61
  name: _intl.default.get('Amount'),
@@ -120,7 +120,7 @@ class Treemap extends _chartComponent.default {
120
120
  width,
121
121
  height
122
122
  } = group.getBoundingClientRect();
123
- d3.select(group.parentNode).append('text').attr('stroke', '#fff').attr('stroke-width', 0.5).attr('paint-order', 'stroke').attr('fill', '#fff').text(name).call(t => {
123
+ d3.select(group.parentNode).append('text').attr('stroke', '#fff').attr('stroke-width', 0.5).attr('paint-order', 'stroke').attr('fill', '#fff').text(this.getDisplayName(name)).call(t => {
124
124
  const {
125
125
  width: tWidth,
126
126
  height: tHeight
@@ -143,18 +143,16 @@ class Treemap extends _chartComponent.default {
143
143
  });
144
144
  };
145
145
  this.getFullData = data => {
146
- const fullData = {
146
+ return {
147
147
  name: 'root',
148
- children: data.map(item => {
149
- let name = item.name;
150
- item.name = (0, _dtableUtils.isEmpty)(name) ? _intl.default.get(_constants.EMPTY_NAME) : name;
151
- if (name === '_Others') {
152
- item.name = _intl.default.get('Others');
153
- }
154
- return item;
155
- })
148
+ children: data.map(item => ({
149
+ ...item
150
+ }))
156
151
  };
157
- return fullData;
152
+ };
153
+ this.getDisplayName = name => {
154
+ if (name === '_Others') return _intl.default.get('Others');
155
+ return (0, _dtableUtils.isEmpty)(name) ? _intl.default.get(_constants.EMPTY_NAME) : name;
158
156
  };
159
157
  this.chart = null;
160
158
  this.state = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sea-chart",
3
- "version": "2.0.55",
3
+ "version": "2.0.57",
4
4
  "main": "./dist/index.js",
5
5
  "dependencies": {
6
6
  "@dnd-kit/core": "^6.1.0",
@@ -9,7 +9,7 @@
9
9
  "@dnd-kit/utilities": "^3.2.2",
10
10
  "@seafile/seafile-calendar": "^1.0.8",
11
11
  "@seafile/seafile-editor": "^3.0.26",
12
- "axios": "~1.16.*",
12
+ "axios": "^1.19.0",
13
13
  "classnames": "^2.3.2",
14
14
  "d3": "~7.9.0",
15
15
  "dayjs": "1.10.7",
@@ -36,12 +36,11 @@
36
36
  "start.bak": "node scripts/start.js",
37
37
  "build": "node scripts/build.js",
38
38
  "pub:dist": "cross-env BABEL_ENV=production ./node_modules/.bin/babel src --out-dir dist --copy-files",
39
- "eslint": "eslint --ext .jsx,.js src --max-warnings=0",
39
+ "eslint": "cross-env BABEL_ENV=development NODE_ENV=development eslint --ext .jsx,.js src --max-warnings=0",
40
40
  "lint": "lint-staged",
41
41
  "pub:optimized": "rimraf dist/config.js",
42
42
  "prepare": "husky install",
43
43
  "prepublishOnly": "npm run clean && npm run pub:dist",
44
- "release": "release-it",
45
44
  "start": "cross-env NODE_ENV=development LOG_ENV=rc NODE_OPTIONS=--openssl-legacy-provider node dev-server.js",
46
45
  "translate": "node scripts/translate.js",
47
46
  "push-translate": "tx push -s",
@@ -75,17 +74,18 @@
75
74
  },
76
75
  "devDependencies": {
77
76
  "@babel/cli": "7.22.10",
78
- "@babel/core": "7.22.11",
77
+ "@babel/core": "7.29.7",
78
+ "@babel/eslint-parser": "7.25.9",
79
79
  "@babel/plugin-proposal-object-rest-spread": "^7.9.6",
80
+ "@babel/plugin-proposal-private-property-in-object": "7.21.11",
80
81
  "@babel/plugin-transform-runtime": "^7.23.9",
81
82
  "@babel/preset-env": "7.22.14",
82
83
  "@babel/runtime": "^7.10.2",
83
84
  "@gatsbyjs/reach-router": "^1.3.9",
84
85
  "@svgr/webpack": "6.5.1",
85
86
  "@types/jest": "29.0.0",
86
- "@typescript-eslint/eslint-plugin": "^2.2.0",
87
- "@typescript-eslint/parser": "^2.2.0",
88
- "babel-eslint": "10.0.3",
87
+ "@typescript-eslint/eslint-plugin": "5.62.0",
88
+ "@typescript-eslint/parser": "5.62.0",
89
89
  "babel-jest": "26.6.3",
90
90
  "babel-loader": "8.0.6",
91
91
  "babel-plugin-import": "^1.13.8",
@@ -98,19 +98,19 @@
98
98
  "core-js": "^3.35.1",
99
99
  "cross-env": "^7.0.3",
100
100
  "css-loader": "^6.5.1",
101
- "css-minimizer-webpack-plugin": "5.0.1",
101
+ "css-minimizer-webpack-plugin": "8.0.0",
102
102
  "dotenv": "6.2.0",
103
103
  "dotenv-expand": "5.1.0",
104
104
  "dtable-store": "~6.0.11",
105
105
  "dtable-ui-component": "7.0.7",
106
106
  "ejs": "3.1.10",
107
- "eslint": "^6.8.0",
108
- "eslint-config-react-app": "^5.0.2",
109
- "eslint-loader": "4.0.2",
110
- "eslint-plugin-flowtype": "3.13.0",
111
- "eslint-plugin-import": "^2.18.2",
112
- "eslint-plugin-jsx-a11y": "6.2.3",
113
- "eslint-plugin-react": "~7.37.4",
107
+ "eslint": "8.57.1",
108
+ "eslint-config-react-app": "7.0.1",
109
+ "eslint-plugin-flowtype": "8.0.3",
110
+ "eslint-plugin-import": "2.32.0",
111
+ "eslint-plugin-jsx-a11y": "6.10.2",
112
+ "eslint-plugin-react": "7.37.5",
113
+ "eslint-webpack-plugin": "4.2.0",
114
114
  "file-loader": "6.2.0",
115
115
  "fs-extra": "^10.1.0",
116
116
  "html-webpack-plugin": "^5.6.0",
@@ -118,7 +118,7 @@
118
118
  "identity-obj-proxy": "3.0.0",
119
119
  "is-wsl": "^1.1.0",
120
120
  "jest": "26.6.3",
121
- "koa": "2.16.1",
121
+ "koa": "2.16.4",
122
122
  "koa-router": "7.3.0",
123
123
  "koa-send": "5.0.1",
124
124
  "koa2-cors": "2.0.6",
@@ -128,7 +128,7 @@
128
128
  "nodemon": "^3.1.0",
129
129
  "object-assign": "4.1.1",
130
130
  "pnp-webpack-plugin": "1.5.0",
131
- "postcss": "8.4.31",
131
+ "postcss": "8.5.26",
132
132
  "postcss-flexbugs-fixes": "^5.0.2",
133
133
  "postcss-loader": "^6.2.1",
134
134
  "postcss-normalize": "^10.0.1",
@@ -137,33 +137,31 @@
137
137
  "raf": "3.4.0",
138
138
  "react": "~18.3.1",
139
139
  "react-app-polyfill": "~3.0.0",
140
- "react-cookies": "0.1.1",
141
140
  "react-dev-utils": "^12.0.1",
142
141
  "react-dom": "~18.3.1",
143
142
  "react-i18next": "12.1.4",
144
143
  "regenerator-runtime": "^0.14.1",
145
- "release-it": "16.2.1",
146
144
  "resolve": "1.12.0",
147
145
  "resolve-url-loader": "5.0.0",
148
146
  "rimraf": "^5.0.7",
149
147
  "sass-loader": "13.3.2",
150
148
  "style-loader": "^1.0.1",
151
149
  "svgo-loader": "^3.0.0",
152
- "terser-webpack-plugin": "4.2.3",
150
+ "terser-webpack-plugin": "5.6.1",
153
151
  "ts-pnp": "1.1.4",
154
152
  "url-loader": "4.1.1",
155
- "webpack": "5.88.2",
156
- "webpack-dev-server": "5.2.0",
153
+ "webpack": "5.91.0",
154
+ "webpack-dev-server": "5.2.6",
157
155
  "webpack-manifest-plugin": "5.0.0",
158
156
  "webpack-merge": "5.8.0",
159
- "workbox-webpack-plugin": "7.0.0"
157
+ "workbox-webpack-plugin": "7.4.1"
160
158
  },
161
159
  "publishConfig": {
162
160
  "access": "public"
163
161
  },
164
- "release-it": {
165
- "npm": {
166
- "tag": "next"
162
+ "overrides": {
163
+ "slugid": {
164
+ "uuid": "11.1.1"
167
165
  }
168
166
  }
169
167
  }