@pie-lib/charting 4.5.6 → 4.5.11-next.256
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.json +105 -0
- package/CHANGELOG.md +16 -20
- package/lib/axes.js +84 -36
- package/lib/axes.js.map +1 -1
- package/lib/bars/bar.js +17 -13
- package/lib/bars/bar.js.map +1 -1
- package/lib/bars/common/bars.js +27 -21
- package/lib/bars/common/bars.js.map +1 -1
- package/lib/bars/histogram.js +17 -13
- package/lib/bars/histogram.js.map +1 -1
- package/lib/chart.js +55 -37
- package/lib/chart.js.map +1 -1
- package/lib/common/drag-handle.js +24 -18
- package/lib/common/drag-handle.js.map +1 -1
- package/lib/common/styles.js +1 -1
- package/lib/grid.js +17 -13
- package/lib/grid.js.map +1 -1
- package/lib/line/common/drag-handle.js +20 -14
- package/lib/line/common/drag-handle.js.map +1 -1
- package/lib/line/common/line.js +38 -30
- package/lib/line/common/line.js.map +1 -1
- package/lib/line/line-cross.js +23 -17
- package/lib/line/line-cross.js.map +1 -1
- package/lib/line/line-dot.js +21 -15
- package/lib/line/line-dot.js.map +1 -1
- package/lib/mark-label.js +37 -11
- package/lib/mark-label.js.map +1 -1
- package/lib/plot/common/plot.js +27 -21
- package/lib/plot/common/plot.js.map +1 -1
- package/lib/plot/dot.js +18 -14
- package/lib/plot/dot.js.map +1 -1
- package/lib/plot/line.js +19 -15
- package/lib/plot/line.js.map +1 -1
- package/lib/tool-menu.js +19 -15
- package/lib/tool-menu.js.map +1 -1
- package/lib/utils.js +79 -26
- package/lib/utils.js.map +1 -1
- package/package.json +3 -3
- package/src/axes.jsx +72 -29
- package/src/chart.jsx +31 -6
- package/src/line/common/line.jsx +1 -1
- package/src/mark-label.jsx +15 -4
- package/src/utils.js +75 -19
package/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.js"],"names":["tickCount","utils","bounds","point","bandKey","d","index","label","dataToXBand","scaleX","data","width","type","rangeRound","domain","map","padding","range","getTickValues","prop","tickValues","tickVal","min","max","push","Math","round","step","getDomainAndRangeByChartType","chartType","labelStep","numberMax","parseFloat","intMin","intMax","getGridLinesAndAxisByChartType","verticalLines","undefined","horizontalLines","leftAxis","getRotateAngle","barWidth","getTopPadding"],"mappings":"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","sourcesContent":["import { scaleBand, scalePoint } from '@vx/scale';\nimport { utils } from '@pie-lib/plot';\n\nexport const tickCount = utils.tickCount;\nexport const bounds = utils.bounds;\nexport const point = utils.point;\n\nexport const bandKey = (d, index) => `${index}-${d.label || '-'}`;\n\nexport const dataToXBand = (scaleX, data, width, type) => {\n switch (type) {\n case 'bar':\n case 'dotPlot':\n case 'linePlot':\n return scaleBand({\n rangeRound: [0, width],\n domain: data && data.map(bandKey),\n padding: 0.2\n });\n case 'histogram':\n return scaleBand({\n rangeRound: [0, width],\n domain: data && data.map(bandKey),\n padding: 0\n });\n case 'lineCross':\n case 'lineDot':\n return scalePoint({\n domain: data && data.map(bandKey),\n rangeRound: [0, width]\n });\n default:\n return scaleBand({\n range: [0, width],\n domain: data && data.map(bandKey),\n padding: 0\n });\n }\n};\n\nexport const getTickValues = (prop = {}) => {\n const tickValues = [];\n let tickVal = prop.min;\n\n while (tickVal <= prop.max) {\n tickValues.push(tickVal);\n tickVal = Math.round((tickVal + prop.step) * 100) / 100;\n }\n\n return tickValues;\n};\n\nexport const getDomainAndRangeByChartType = (domain, range, chartType) => {\n let { step, labelStep, min, max } = range || {};\n\n if (!min) {\n min = 0;\n }\n\n if (!max || max < 0) {\n max = range.min + 1;\n }\n\n const numberMax = parseFloat(max);\n\n if (!step) {\n if (numberMax < 20) {\n step = 1;\n } else if (numberMax >= 20 && numberMax < 100) {\n step = 5;\n } else {\n step = 10;\n }\n }\n\n if (!labelStep) {\n labelStep = numberMax;\n }\n\n switch (chartType) {\n // if chart is dot plot or line plot, we should ignore step and make sure that min & max are integer values\n case 'dotPlot':\n case 'linePlot': {\n const intMin = Math.round(min);\n const intMax = Math.round(max);\n\n return {\n domain: {\n ...domain,\n step: 1,\n labelStep: 1,\n min: 0,\n max: 1\n },\n range: {\n ...range,\n min: intMin,\n max: intMin === intMax ? intMin + 1 : intMax,\n labelStep,\n step: 1\n }\n };\n }\n default:\n return {\n domain: {\n ...domain,\n step: 1,\n labelStep: 1,\n min: 0,\n max: 1\n },\n range: {\n ...range,\n labelStep,\n step\n }\n };\n }\n};\n\nexport const getGridLinesAndAxisByChartType = (range, chartType) => {\n switch (chartType) {\n case 'lineDot':\n case 'lineCross':\n return {\n verticalLines: undefined,\n horizontalLines: getTickValues(range),\n leftAxis: true\n };\n case 'dotPlot':\n case 'linePlot':\n return {\n verticalLines: [],\n horizontalLines: [],\n leftAxis: false\n };\n default:\n return {\n verticalLines: [],\n horizontalLines: getTickValues(range),\n leftAxis: true\n };\n }\n};\n\nexport const getRotateAngle = barWidth => {\n if (barWidth < 30) {\n return 75;\n }\n\n if (barWidth < 40) {\n return 45;\n }\n\n if (barWidth < 60) {\n return 25;\n }\n\n return 0;\n};\n\nexport const getTopPadding = barWidth => {\n if (barWidth < 30) {\n return 50;\n }\n\n if (barWidth < 40) {\n return 30;\n }\n\n if (barWidth < 60) {\n return 15;\n }\n\n return 0;\n};\n"],"file":"utils.js"}
|
|
1
|
+
{"version":3,"sources":["../src/utils.js"],"names":["tickCount","utils","bounds","point","bandKey","d","index","label","dataToXBand","scaleX","data","width","type","rangeRound","domain","map","padding","range","getTickValues","prop","tickValues","tickVal","min","max","push","Math","round","step","customLabelStep","rangeMax","size","labelFontSize","ceilMax","ceil","segmentLength","height","ticksToFitInOneSegment","tickWidthPerSegment","rawLabelStep","roundedStep","labelStep","crowdedTicks","numberOfSegments","modulo","a","b","Number","isInteger","decimals","toString","split","pop","length","aux","pow","getDomainAndRangeByChartType","chartType","isNaN","crowded","intMin","intMax","getGridLinesAndAxisByChartType","verticalLines","undefined","horizontalLines","leftAxis","getRotateAngle","fontSize","getTopPadding","barWidth"],"mappings":"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","sourcesContent":["import { scaleBand, scalePoint } from '@vx/scale';\nimport { utils } from '@pie-lib/plot';\n\nexport const tickCount = utils.tickCount;\nexport const bounds = utils.bounds;\nexport const point = utils.point;\n\nexport const bandKey = (d, index) => `${index}-${d.label || '-'}`;\n\nexport const dataToXBand = (scaleX, data, width, type) => {\n switch (type) {\n case 'bar':\n case 'dotPlot':\n case 'linePlot':\n return scaleBand({\n rangeRound: [0, width],\n domain: data && data.map(bandKey),\n padding: 0.2\n });\n case 'histogram':\n return scaleBand({\n rangeRound: [0, width],\n domain: data && data.map(bandKey),\n padding: 0\n });\n case 'lineCross':\n case 'lineDot':\n return scalePoint({\n domain: data && data.map(bandKey),\n rangeRound: [0, width]\n });\n default:\n return scaleBand({\n range: [0, width],\n domain: data && data.map(bandKey),\n padding: 0\n });\n }\n};\n\nexport const getTickValues = (prop = {}) => {\n const tickValues = [];\n let tickVal = prop.min;\n\n while (tickVal <= prop.max) {\n tickValues.push(tickVal);\n tickVal = Math.round((tickVal + prop.step) * 100) / 100;\n }\n\n return tickValues;\n};\n\nexport const customLabelStep = (rangeMax, size, labelFontSize) => {\n const ceilMax = Math.ceil(rangeMax);\n const segmentLength = size.height / ceilMax;\n const ticksToFitInOneSegment = 2;\n\n // how many ticksWidth fit in a segment\n const tickWidthPerSegment = segmentLength / labelFontSize;\n const rawLabelStep = ticksToFitInOneSegment / tickWidthPerSegment;\n const roundedStep = Math.ceil((rawLabelStep * 10) / 10);\n\n let labelStep;\n\n if (rawLabelStep > 0.15) {\n labelStep = roundedStep;\n } else if (rawLabelStep < 0.05) {\n labelStep = 0.1;\n } else {\n labelStep = 0.5;\n }\n\n return labelStep;\n};\n\nexport const crowdedTicks = (rangeMax, customLabelStep, size, labelFontSize) => {\n const ceilMax = Math.ceil(rangeMax);\n\n const numberOfSegments = ceilMax * customLabelStep;\n\n return size.height / numberOfSegments < labelFontSize && size.height / numberOfSegments > 0.5;\n};\n\n// multiply values with 10^number_of_decimals if needed because modulo function(%) is only defined for integers\nconst modulo = (a, b) => {\n if (Number.isInteger(b)) {\n return a % b;\n }\n\n const decimals = b\n .toString()\n .split('.')\n .pop().length;\n const aux = Math.pow(10, decimals);\n\n return (a * aux) % (b * aux);\n};\n\nexport const getDomainAndRangeByChartType = (domain, range, size, chartType, labelFontSize) => {\n let { step, labelStep, min, max } = range || {};\n\n if (!min) {\n min = 0;\n }\n\n if (!max || max < 0) {\n max = range.min + 1;\n }\n\n if (labelStep && !step) {\n step = labelStep;\n }\n if (!labelStep || (isNaN(labelStep) && step)) {\n let customLabelStep = step;\n let crowded = crowdedTicks(max, customLabelStep, size, labelFontSize);\n\n if (crowded) {\n customLabelStep = customLabelStep * 2;\n }\n\n labelStep = customLabelStep;\n }\n\n if (!step || (isNaN(step) && !labelStep) || isNaN(labelStep)) {\n labelStep = customLabelStep(max, size, labelFontSize);\n\n if (labelStep <= 1) {\n step = labelStep;\n } else if (labelStep <= 4) {\n step = 1;\n } else if (labelStep > 4 && labelStep < 10) {\n step = labelStep / 2;\n } else {\n step = labelStep / 3;\n }\n }\n\n if (modulo(max, step) !== 0) {\n max = max + step;\n }\n\n range.max = max;\n\n switch (chartType) {\n // if chart is dot plot or line plot, we should ignore step and make sure that min & max are integer values\n case 'dotPlot':\n case 'linePlot': {\n const intMin = Math.round(min);\n const intMax = Math.round(max);\n\n return {\n domain: {\n ...domain,\n step: 1,\n labelStep: 1,\n min: 0,\n max: 1\n },\n range: {\n ...range,\n min: intMin,\n max: intMin === intMax ? intMin + 1 : intMax,\n labelStep,\n step: 1\n }\n };\n }\n default:\n return {\n domain: {\n ...domain,\n step: 1,\n labelStep: 1,\n min: 0,\n max: 1\n },\n range: {\n ...range,\n labelStep,\n step\n }\n };\n }\n};\n\nexport const getGridLinesAndAxisByChartType = (range, chartType) => {\n switch (chartType) {\n case 'lineDot':\n case 'lineCross':\n return {\n verticalLines: undefined,\n horizontalLines: getTickValues(range),\n leftAxis: true\n };\n case 'dotPlot':\n case 'linePlot':\n return {\n verticalLines: [],\n horizontalLines: [],\n leftAxis: false\n };\n default:\n return {\n verticalLines: [],\n horizontalLines: getTickValues(range),\n leftAxis: true\n };\n }\n};\n\nexport const getRotateAngle = (fontSize, height) => {\n if (height >= fontSize * 2) {\n return 25;\n }\n\n return 0;\n};\n\nexport const getTopPadding = barWidth => {\n if (barWidth < 30) {\n return 50;\n }\n\n if (barWidth < 40) {\n return 30;\n }\n\n if (barWidth < 60) {\n return 15;\n }\n\n return 0;\n};\n"],"file":"utils.js"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "4.5.
|
|
6
|
+
"version": "4.5.11-next.256+a82f29f3",
|
|
7
7
|
"description": "charting",
|
|
8
8
|
"keywords": [
|
|
9
9
|
"react",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"@mapbox/point-geometry": "^0.1.0",
|
|
21
21
|
"@material-ui/core": "^3.8.3",
|
|
22
|
-
"@pie-lib/plot": "^2.1.
|
|
22
|
+
"@pie-lib/plot": "^2.1.9",
|
|
23
23
|
"@vx/axis": "^0.0.183",
|
|
24
24
|
"@vx/event": "^0.0.182",
|
|
25
25
|
"@vx/grid": "^0.0.183",
|
|
@@ -43,5 +43,5 @@
|
|
|
43
43
|
"peerDependencies": {
|
|
44
44
|
"react": "^16.8.1"
|
|
45
45
|
},
|
|
46
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "a82f29f3ebb98147471c1f0f727052e792cd2957"
|
|
47
47
|
}
|
package/src/axes.jsx
CHANGED
|
@@ -46,6 +46,14 @@ export class TickComponent extends React.Component {
|
|
|
46
46
|
const category = categories[index];
|
|
47
47
|
const { deletable, editable, interactive, label, correctness } = category || {};
|
|
48
48
|
const barX = xBand(bandKey({ label }, index));
|
|
49
|
+
const longestCategory = (categories || []).reduce((a, b) => {
|
|
50
|
+
const lengthA = a && a.label ? a.label.length : 0;
|
|
51
|
+
const lengthB = b && b.label ? b.label.length : 0;
|
|
52
|
+
|
|
53
|
+
return lengthA > lengthB ? a : b;
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const longestLabel = (longestCategory && longestCategory.label) || '';
|
|
49
57
|
|
|
50
58
|
return (
|
|
51
59
|
<g>
|
|
@@ -56,6 +64,21 @@ export class TickComponent extends React.Component {
|
|
|
56
64
|
height={24}
|
|
57
65
|
style={{ pointerEvents: 'none', overflow: 'visible' }}
|
|
58
66
|
>
|
|
67
|
+
{index === 0 && (
|
|
68
|
+
<div
|
|
69
|
+
id="hiddenLabel"
|
|
70
|
+
style={{
|
|
71
|
+
position: 'absolute',
|
|
72
|
+
visibility: 'hidden',
|
|
73
|
+
wordBreak: 'break-word',
|
|
74
|
+
overflow: 'visible',
|
|
75
|
+
maxWidth: barWidth,
|
|
76
|
+
display: 'block'
|
|
77
|
+
}}
|
|
78
|
+
>
|
|
79
|
+
{longestLabel}
|
|
80
|
+
</div>
|
|
81
|
+
)}
|
|
59
82
|
<MarkLabel
|
|
60
83
|
inputRef={r => (this.input = r)}
|
|
61
84
|
disabled={!(editable && interactive)}
|
|
@@ -121,9 +144,20 @@ export class RawChartAxes extends React.Component {
|
|
|
121
144
|
leftAxis: PropTypes.bool,
|
|
122
145
|
onChange: PropTypes.func,
|
|
123
146
|
onChangeCategory: PropTypes.func,
|
|
124
|
-
top: PropTypes.number
|
|
147
|
+
top: PropTypes.number,
|
|
148
|
+
theme: PropTypes.object
|
|
125
149
|
};
|
|
126
150
|
|
|
151
|
+
state = { height: 0 };
|
|
152
|
+
|
|
153
|
+
componentDidMount() {
|
|
154
|
+
const height = document.getElementById('hiddenLabel')
|
|
155
|
+
? document.getElementById('hiddenLabel').offsetHeight
|
|
156
|
+
: 0;
|
|
157
|
+
|
|
158
|
+
this.setState({ height });
|
|
159
|
+
}
|
|
160
|
+
|
|
127
161
|
render() {
|
|
128
162
|
const {
|
|
129
163
|
classes,
|
|
@@ -133,17 +167,23 @@ export class RawChartAxes extends React.Component {
|
|
|
133
167
|
onChange,
|
|
134
168
|
onChangeCategory,
|
|
135
169
|
categories = [],
|
|
136
|
-
top
|
|
170
|
+
top,
|
|
171
|
+
theme
|
|
137
172
|
} = this.props;
|
|
173
|
+
|
|
138
174
|
const { axis, axisLine, tick, axisLabel } = classes;
|
|
139
175
|
const { scale = {}, range = {}, domain = {}, size = {} } = graphProps || {};
|
|
176
|
+
const { height } = this.state;
|
|
177
|
+
|
|
140
178
|
const bottomScale =
|
|
141
179
|
xBand && typeof xBand.rangeRound === 'function' && xBand.rangeRound([0, size.width]);
|
|
142
180
|
const bandWidth = xBand && typeof xBand.bandwidth === 'function' && xBand.bandwidth();
|
|
143
181
|
// for chartType "line", bandWidth will be 0, so we have to calculate it
|
|
144
182
|
const barWidth = bandWidth || (scale.x && scale.x(domain.max) / categories.length);
|
|
183
|
+
|
|
145
184
|
const rowTickValues = getTickValues({ ...range, step: range.labelStep });
|
|
146
|
-
const
|
|
185
|
+
const fontSize = theme && theme.typography ? theme.typography.fontSize : 14;
|
|
186
|
+
const rotate = getRotateAngle(fontSize, height);
|
|
147
187
|
|
|
148
188
|
const getTickLabelProps = value => ({
|
|
149
189
|
dy: 4,
|
|
@@ -203,34 +243,37 @@ export class RawChartAxes extends React.Component {
|
|
|
203
243
|
}
|
|
204
244
|
}
|
|
205
245
|
|
|
206
|
-
const ChartAxes = withStyles(
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
strokeWidth: 2
|
|
215
|
-
},
|
|
216
|
-
axisLine: {
|
|
217
|
-
stroke: color.primaryDark(),
|
|
218
|
-
strokeWidth: 2
|
|
219
|
-
},
|
|
220
|
-
tick: {
|
|
221
|
-
'& > line': {
|
|
246
|
+
const ChartAxes = withStyles(
|
|
247
|
+
theme => ({
|
|
248
|
+
axisLabel: {
|
|
249
|
+
fontFamily: theme.typography.body1.fontFamily,
|
|
250
|
+
fontSize: theme.typography.fontSize,
|
|
251
|
+
fill: color.secondary()
|
|
252
|
+
},
|
|
253
|
+
axis: {
|
|
222
254
|
stroke: color.primaryDark(),
|
|
223
255
|
strokeWidth: 2
|
|
224
256
|
},
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
257
|
+
axisLine: {
|
|
258
|
+
stroke: color.primaryDark(),
|
|
259
|
+
strokeWidth: 2
|
|
260
|
+
},
|
|
261
|
+
tick: {
|
|
262
|
+
'& > line': {
|
|
263
|
+
stroke: color.primaryDark(),
|
|
264
|
+
strokeWidth: 2
|
|
265
|
+
},
|
|
266
|
+
fill: color.primaryDark(),
|
|
267
|
+
fontFamily: theme.typography.body1.fontFamily,
|
|
268
|
+
fontSize: theme.typography.fontSize,
|
|
269
|
+
textAnchor: 'middle'
|
|
270
|
+
},
|
|
271
|
+
dottedLine: {
|
|
272
|
+
stroke: color.primaryLight(),
|
|
273
|
+
opacity: 0.2
|
|
274
|
+
}
|
|
275
|
+
}),
|
|
276
|
+
{ withTheme: true }
|
|
277
|
+
)(RawChartAxes);
|
|
235
278
|
|
|
236
279
|
export default ChartAxes;
|
package/src/chart.jsx
CHANGED
|
@@ -48,7 +48,8 @@ export class Chart extends React.Component {
|
|
|
48
48
|
onDataChange: PropTypes.func,
|
|
49
49
|
addCategoryEnabled: PropTypes.bool,
|
|
50
50
|
editCategoryEnabled: PropTypes.bool,
|
|
51
|
-
categoryDefaultLabel: PropTypes.string
|
|
51
|
+
categoryDefaultLabel: PropTypes.string,
|
|
52
|
+
theme: PropTypes.object
|
|
52
53
|
};
|
|
53
54
|
|
|
54
55
|
static defaultProps = {
|
|
@@ -126,25 +127,43 @@ export class Chart extends React.Component {
|
|
|
126
127
|
};
|
|
127
128
|
|
|
128
129
|
getFilteredCategories = () => {
|
|
129
|
-
const { data, editCategoryEnabled } = this.props;
|
|
130
|
+
const { data, editCategoryEnabled, addCategoryEnabled } = this.props;
|
|
130
131
|
|
|
131
132
|
return data
|
|
132
133
|
? data.map(d => ({
|
|
133
134
|
...d,
|
|
134
135
|
editable: !d.initial || (d.initial && editCategoryEnabled),
|
|
135
|
-
deletable: !d.initial
|
|
136
|
+
deletable: !d.initial || (d.initial && addCategoryEnabled)
|
|
136
137
|
}))
|
|
137
138
|
: [];
|
|
138
139
|
};
|
|
139
140
|
|
|
140
141
|
render() {
|
|
141
|
-
const {
|
|
142
|
+
const {
|
|
143
|
+
classes,
|
|
144
|
+
className,
|
|
145
|
+
domain,
|
|
146
|
+
range,
|
|
147
|
+
size,
|
|
148
|
+
title,
|
|
149
|
+
addCategoryEnabled,
|
|
150
|
+
theme
|
|
151
|
+
} = this.props;
|
|
142
152
|
let { chartType } = this.props;
|
|
143
153
|
const { width, height } = size || {};
|
|
144
154
|
|
|
145
155
|
const { ChartComponent } = this.getChart();
|
|
146
156
|
const categories = this.getFilteredCategories();
|
|
147
|
-
|
|
157
|
+
|
|
158
|
+
const labelFontSize = (theme && theme.typography && theme.typography.fontSize) || 14;
|
|
159
|
+
const correctValues = getDomainAndRangeByChartType(
|
|
160
|
+
domain,
|
|
161
|
+
range,
|
|
162
|
+
size,
|
|
163
|
+
chartType,
|
|
164
|
+
labelFontSize
|
|
165
|
+
);
|
|
166
|
+
|
|
148
167
|
const { verticalLines, horizontalLines, leftAxis } = getGridLinesAndAxisByChartType(
|
|
149
168
|
correctValues.range,
|
|
150
169
|
chartType
|
|
@@ -234,9 +253,15 @@ const styles = theme => ({
|
|
|
234
253
|
borderLeft: `solid 1px ${color.primaryDark()}`,
|
|
235
254
|
borderRight: `solid 1px ${color.primaryDark()}`
|
|
236
255
|
},
|
|
256
|
+
root: {
|
|
257
|
+
overflow: 'hidden'
|
|
258
|
+
},
|
|
259
|
+
svg: {
|
|
260
|
+
overflow: 'visible'
|
|
261
|
+
},
|
|
237
262
|
toolMenu: {
|
|
238
263
|
minHeight: '36px'
|
|
239
264
|
}
|
|
240
265
|
});
|
|
241
266
|
|
|
242
|
-
export default withStyles(styles)(Chart);
|
|
267
|
+
export default withStyles(styles, { withTheme: true })(Chart);
|
package/src/line/common/line.jsx
CHANGED
package/src/mark-label.jsx
CHANGED
|
@@ -16,7 +16,8 @@ const styles = theme => ({
|
|
|
16
16
|
color: color.primaryDark(),
|
|
17
17
|
'&.correct': correct('color'),
|
|
18
18
|
'&.incorrect': incorrect('color'),
|
|
19
|
-
'&.disabled': disabled('color')
|
|
19
|
+
'&.disabled': disabled('color'),
|
|
20
|
+
backgroundColor: 'transparent !important'
|
|
20
21
|
}
|
|
21
22
|
});
|
|
22
23
|
|
|
@@ -37,8 +38,14 @@ export const MarkLabel = props => {
|
|
|
37
38
|
const [label, setLabel] = useState(mark.label);
|
|
38
39
|
const onChange = e => setLabel(e.target.value);
|
|
39
40
|
const onChangeProp = e => props.onChange(e.target.value);
|
|
41
|
+
let extraStyle = {};
|
|
40
42
|
|
|
41
|
-
|
|
43
|
+
if (rotate) {
|
|
44
|
+
extraStyle = {
|
|
45
|
+
width: 'unset',
|
|
46
|
+
textAlign: 'left'
|
|
47
|
+
};
|
|
48
|
+
}
|
|
42
49
|
|
|
43
50
|
// useState only sets the value once, to synch props to state need useEffect
|
|
44
51
|
useEffect(() => {
|
|
@@ -56,14 +63,18 @@ export const MarkLabel = props => {
|
|
|
56
63
|
inputStyle={{
|
|
57
64
|
minWidth: barWidth,
|
|
58
65
|
textAlign: 'center',
|
|
59
|
-
background: 'transparent'
|
|
66
|
+
background: 'transparent',
|
|
67
|
+
boxSizing: 'border-box',
|
|
68
|
+
paddingLeft: 0,
|
|
69
|
+
paddingRight: 0,
|
|
70
|
+
...extraStyle
|
|
60
71
|
}}
|
|
61
72
|
value={label}
|
|
62
73
|
style={{
|
|
63
74
|
position: 'absolute',
|
|
64
75
|
pointerEvents: 'auto',
|
|
65
76
|
top: 0,
|
|
66
|
-
left,
|
|
77
|
+
left: 0,
|
|
67
78
|
minWidth: barWidth,
|
|
68
79
|
transformOrigin: 'left',
|
|
69
80
|
transform: `rotate(${rotate}deg)`
|
package/src/utils.js
CHANGED
|
@@ -50,7 +50,53 @@ export const getTickValues = (prop = {}) => {
|
|
|
50
50
|
return tickValues;
|
|
51
51
|
};
|
|
52
52
|
|
|
53
|
-
export const
|
|
53
|
+
export const customLabelStep = (rangeMax, size, labelFontSize) => {
|
|
54
|
+
const ceilMax = Math.ceil(rangeMax);
|
|
55
|
+
const segmentLength = size.height / ceilMax;
|
|
56
|
+
const ticksToFitInOneSegment = 2;
|
|
57
|
+
|
|
58
|
+
// how many ticksWidth fit in a segment
|
|
59
|
+
const tickWidthPerSegment = segmentLength / labelFontSize;
|
|
60
|
+
const rawLabelStep = ticksToFitInOneSegment / tickWidthPerSegment;
|
|
61
|
+
const roundedStep = Math.ceil((rawLabelStep * 10) / 10);
|
|
62
|
+
|
|
63
|
+
let labelStep;
|
|
64
|
+
|
|
65
|
+
if (rawLabelStep > 0.15) {
|
|
66
|
+
labelStep = roundedStep;
|
|
67
|
+
} else if (rawLabelStep < 0.05) {
|
|
68
|
+
labelStep = 0.1;
|
|
69
|
+
} else {
|
|
70
|
+
labelStep = 0.5;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return labelStep;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export const crowdedTicks = (rangeMax, customLabelStep, size, labelFontSize) => {
|
|
77
|
+
const ceilMax = Math.ceil(rangeMax);
|
|
78
|
+
|
|
79
|
+
const numberOfSegments = ceilMax * customLabelStep;
|
|
80
|
+
|
|
81
|
+
return size.height / numberOfSegments < labelFontSize && size.height / numberOfSegments > 0.5;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
// multiply values with 10^number_of_decimals if needed because modulo function(%) is only defined for integers
|
|
85
|
+
const modulo = (a, b) => {
|
|
86
|
+
if (Number.isInteger(b)) {
|
|
87
|
+
return a % b;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const decimals = b
|
|
91
|
+
.toString()
|
|
92
|
+
.split('.')
|
|
93
|
+
.pop().length;
|
|
94
|
+
const aux = Math.pow(10, decimals);
|
|
95
|
+
|
|
96
|
+
return (a * aux) % (b * aux);
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export const getDomainAndRangeByChartType = (domain, range, size, chartType, labelFontSize) => {
|
|
54
100
|
let { step, labelStep, min, max } = range || {};
|
|
55
101
|
|
|
56
102
|
if (!min) {
|
|
@@ -61,22 +107,40 @@ export const getDomainAndRangeByChartType = (domain, range, chartType) => {
|
|
|
61
107
|
max = range.min + 1;
|
|
62
108
|
}
|
|
63
109
|
|
|
64
|
-
|
|
110
|
+
if (labelStep && !step) {
|
|
111
|
+
step = labelStep;
|
|
112
|
+
}
|
|
113
|
+
if (!labelStep || (isNaN(labelStep) && step)) {
|
|
114
|
+
let customLabelStep = step;
|
|
115
|
+
let crowded = crowdedTicks(max, customLabelStep, size, labelFontSize);
|
|
65
116
|
|
|
66
|
-
|
|
67
|
-
|
|
117
|
+
if (crowded) {
|
|
118
|
+
customLabelStep = customLabelStep * 2;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
labelStep = customLabelStep;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (!step || (isNaN(step) && !labelStep) || isNaN(labelStep)) {
|
|
125
|
+
labelStep = customLabelStep(max, size, labelFontSize);
|
|
126
|
+
|
|
127
|
+
if (labelStep <= 1) {
|
|
128
|
+
step = labelStep;
|
|
129
|
+
} else if (labelStep <= 4) {
|
|
68
130
|
step = 1;
|
|
69
|
-
} else if (
|
|
70
|
-
step =
|
|
131
|
+
} else if (labelStep > 4 && labelStep < 10) {
|
|
132
|
+
step = labelStep / 2;
|
|
71
133
|
} else {
|
|
72
|
-
step =
|
|
134
|
+
step = labelStep / 3;
|
|
73
135
|
}
|
|
74
136
|
}
|
|
75
137
|
|
|
76
|
-
if (
|
|
77
|
-
|
|
138
|
+
if (modulo(max, step) !== 0) {
|
|
139
|
+
max = max + step;
|
|
78
140
|
}
|
|
79
141
|
|
|
142
|
+
range.max = max;
|
|
143
|
+
|
|
80
144
|
switch (chartType) {
|
|
81
145
|
// if chart is dot plot or line plot, we should ignore step and make sure that min & max are integer values
|
|
82
146
|
case 'dotPlot':
|
|
@@ -144,16 +208,8 @@ export const getGridLinesAndAxisByChartType = (range, chartType) => {
|
|
|
144
208
|
}
|
|
145
209
|
};
|
|
146
210
|
|
|
147
|
-
export const getRotateAngle =
|
|
148
|
-
if (
|
|
149
|
-
return 75;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
if (barWidth < 40) {
|
|
153
|
-
return 45;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
if (barWidth < 60) {
|
|
211
|
+
export const getRotateAngle = (fontSize, height) => {
|
|
212
|
+
if (height >= fontSize * 2) {
|
|
157
213
|
return 25;
|
|
158
214
|
}
|
|
159
215
|
|