@pie-lib/graphing 2.14.22 → 2.15.1-beta.0

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 (215) hide show
  1. package/CHANGELOG.md +13 -80
  2. package/NEXT.CHANGELOG.json +1 -0
  3. package/package.json +14 -7
  4. package/src/__tests__/__snapshots__/graph-with-controls.test.jsx.snap +237 -0
  5. package/src/__tests__/__snapshots__/graph.test.jsx.snap +211 -0
  6. package/src/__tests__/__snapshots__/grid.test.jsx.snap +54 -0
  7. package/src/__tests__/__snapshots__/labels.test.jsx.snap +30 -0
  8. package/src/__tests__/__snapshots__/mark-label.test.jsx.snap +45 -0
  9. package/src/__tests__/__snapshots__/toggle-bar.test.jsx.snap +7 -0
  10. package/src/__tests__/__snapshots__/tool-menu.test.jsx.snap +13 -0
  11. package/src/__tests__/__snapshots__/undo-redo.test.jsx.snap +14 -0
  12. package/src/__tests__/graph-with-controls.test.jsx +147 -0
  13. package/src/__tests__/graph.test.jsx +230 -0
  14. package/src/__tests__/grid.test.jsx +20 -0
  15. package/src/__tests__/labels.test.jsx +38 -0
  16. package/src/__tests__/mark-label.test.jsx +68 -0
  17. package/src/__tests__/toggle-bar.test.jsx +36 -0
  18. package/src/__tests__/tool-menu.test.jsx +29 -0
  19. package/src/__tests__/undo-redo.test.jsx +25 -0
  20. package/src/__tests__/use-debounce.test.js +21 -0
  21. package/src/__tests__/utils.js +38 -0
  22. package/src/__tests__/utils.test.js +151 -0
  23. package/src/axis/__tests__/__snapshots__/arrow.test.jsx.snap +33 -0
  24. package/src/axis/__tests__/__snapshots__/axes.test.jsx.snap +122 -0
  25. package/src/axis/__tests__/arrow.test.jsx +39 -0
  26. package/src/axis/__tests__/axes.test.jsx +220 -0
  27. package/src/axis/axes.jsx +5 -5
  28. package/src/container/index.jsx +2 -4
  29. package/src/coordinates-label.jsx +4 -3
  30. package/src/graph-with-controls.jsx +8 -10
  31. package/src/graph.jsx +22 -10
  32. package/src/grid.jsx +8 -10
  33. package/src/index.js +2 -2
  34. package/src/key-legend.jsx +145 -0
  35. package/src/label-svg-icon.jsx +39 -0
  36. package/src/labels.jsx +2 -1
  37. package/src/mark-label.jsx +149 -52
  38. package/src/toggle-bar.jsx +1 -2
  39. package/src/tool-menu.jsx +3 -26
  40. package/src/tools/absolute/__tests__/component.test.jsx +54 -0
  41. package/src/tools/absolute/component.jsx +23 -0
  42. package/src/tools/absolute/index.js +31 -0
  43. package/src/tools/circle/__tests__/__snapshots__/bg-circle.test.jsx.snap +46 -0
  44. package/src/tools/circle/__tests__/__snapshots__/component.test.jsx.snap +293 -0
  45. package/src/tools/circle/__tests__/bg-circle.test.jsx +28 -0
  46. package/src/tools/circle/__tests__/component.test.jsx +228 -0
  47. package/src/tools/circle/bg-circle.jsx +5 -4
  48. package/src/tools/circle/component.jsx +22 -8
  49. package/src/tools/exponential/__tests__/component.test.jsx +54 -0
  50. package/src/tools/exponential/component.jsx +23 -0
  51. package/src/tools/exponential/index.js +39 -0
  52. package/src/tools/index.js +38 -5
  53. package/src/tools/line/__tests__/__snapshots__/component.test.jsx.snap +20 -0
  54. package/src/tools/line/__tests__/component.test.jsx +36 -0
  55. package/src/tools/line/component.jsx +2 -1
  56. package/src/tools/parabola/__tests__/component.test.jsx +49 -0
  57. package/src/tools/parabola/component.jsx +7 -6
  58. package/src/tools/point/__tests__/__snapshots__/component.test.jsx.snap +40 -0
  59. package/src/tools/point/__tests__/component.test.jsx +66 -0
  60. package/src/tools/point/component.jsx +12 -6
  61. package/src/tools/polygon/__tests__/__snapshots__/component.test.jsx.snap +415 -0
  62. package/src/tools/polygon/__tests__/__snapshots__/line.test.jsx.snap +45 -0
  63. package/src/tools/polygon/__tests__/__snapshots__/polygon.test.jsx.snap +52 -0
  64. package/src/tools/polygon/__tests__/component.test.jsx +226 -0
  65. package/src/tools/polygon/__tests__/index.test.js +65 -0
  66. package/src/tools/polygon/__tests__/line.test.jsx +25 -0
  67. package/src/tools/polygon/__tests__/polygon.test.jsx +44 -0
  68. package/src/tools/polygon/component.jsx +39 -11
  69. package/src/tools/polygon/line.jsx +15 -7
  70. package/src/tools/polygon/polygon.jsx +7 -3
  71. package/src/tools/ray/__tests__/__snapshots__/component.test.jsx.snap +23 -0
  72. package/src/tools/ray/__tests__/component.test.jsx +29 -0
  73. package/src/tools/ray/component.jsx +2 -1
  74. package/src/tools/segment/__tests__/__snapshots__/component.test.jsx.snap +14 -0
  75. package/src/tools/segment/__tests__/component.test.jsx +28 -0
  76. package/src/tools/segment/component.jsx +2 -1
  77. package/src/tools/shared/__tests__/__snapshots__/arrow-head.test.jsx.snap +27 -0
  78. package/src/tools/shared/__tests__/arrow-head.test.jsx +34 -0
  79. package/src/tools/shared/icons/CorrectSVG.jsx +22 -0
  80. package/src/tools/shared/icons/IncorrectSVG.jsx +20 -0
  81. package/src/tools/shared/icons/MissingSVG.jsx +21 -0
  82. package/src/tools/shared/line/__tests__/__snapshots__/index.test.jsx.snap +360 -0
  83. package/src/tools/shared/line/__tests__/__snapshots__/line-path.test.jsx.snap +58 -0
  84. package/src/tools/shared/line/__tests__/__snapshots__/with-root-edge.test.jsx.snap +63 -0
  85. package/src/tools/shared/line/__tests__/index.test.jsx +255 -0
  86. package/src/tools/shared/line/__tests__/line-path.test.jsx +53 -0
  87. package/src/tools/shared/line/__tests__/with-root-edge.test.jsx +73 -0
  88. package/src/tools/shared/line/index.jsx +39 -13
  89. package/src/tools/shared/line/line-path.jsx +18 -7
  90. package/src/tools/shared/line/with-root-edge.jsx +10 -3
  91. package/src/tools/shared/point/__tests__/__snapshots__/arrow-point.test.jsx.snap +56 -0
  92. package/src/tools/shared/point/__tests__/__snapshots__/base-point.test.jsx.snap +44 -0
  93. package/src/tools/shared/point/__tests__/arrow-point.test.jsx +87 -0
  94. package/src/tools/shared/point/__tests__/base-point.test.jsx +84 -0
  95. package/src/tools/shared/point/arrow-point.jsx +4 -1
  96. package/src/tools/shared/point/arrow.jsx +4 -1
  97. package/src/tools/shared/point/base-point.jsx +28 -3
  98. package/src/tools/shared/point/index.jsx +7 -2
  99. package/src/tools/shared/styles.js +8 -3
  100. package/src/tools/sine/__tests__/component.test.jsx +51 -0
  101. package/src/tools/sine/component.jsx +7 -7
  102. package/src/tools/vector/__tests__/__snapshots__/component.test.jsx.snap +12 -0
  103. package/src/tools/vector/__tests__/component.test.jsx +26 -0
  104. package/src/tools/vector/component.jsx +2 -1
  105. package/src/undo-redo.jsx +0 -1
  106. package/src/utils.js +1 -1
  107. package/legacy.png +0 -0
  108. package/lib/axis/arrow.js +0 -115
  109. package/lib/axis/arrow.js.map +0 -1
  110. package/lib/axis/axes.js +0 -415
  111. package/lib/axis/axes.js.map +0 -1
  112. package/lib/axis/index.js +0 -26
  113. package/lib/axis/index.js.map +0 -1
  114. package/lib/bg.js +0 -139
  115. package/lib/bg.js.map +0 -1
  116. package/lib/container/actions.js +0 -24
  117. package/lib/container/actions.js.map +0 -1
  118. package/lib/container/index.js +0 -166
  119. package/lib/container/index.js.map +0 -1
  120. package/lib/container/marks.js +0 -27
  121. package/lib/container/marks.js.map +0 -1
  122. package/lib/container/middleware.js +0 -25
  123. package/lib/container/middleware.js.map +0 -1
  124. package/lib/container/reducer.js +0 -25
  125. package/lib/container/reducer.js.map +0 -1
  126. package/lib/coordinates-label.js +0 -107
  127. package/lib/coordinates-label.js.map +0 -1
  128. package/lib/graph-with-controls.js +0 -366
  129. package/lib/graph-with-controls.js.map +0 -1
  130. package/lib/graph.js +0 -354
  131. package/lib/graph.js.map +0 -1
  132. package/lib/grid-setup.js +0 -462
  133. package/lib/grid-setup.js.map +0 -1
  134. package/lib/grid.js +0 -184
  135. package/lib/grid.js.map +0 -1
  136. package/lib/index.js +0 -51
  137. package/lib/index.js.map +0 -1
  138. package/lib/labels.js +0 -298
  139. package/lib/labels.js.map +0 -1
  140. package/lib/mark-label.js +0 -210
  141. package/lib/mark-label.js.map +0 -1
  142. package/lib/toggle-bar.js +0 -337
  143. package/lib/toggle-bar.js.map +0 -1
  144. package/lib/tool-menu.js +0 -132
  145. package/lib/tool-menu.js.map +0 -1
  146. package/lib/tools/circle/bg-circle.js +0 -172
  147. package/lib/tools/circle/bg-circle.js.map +0 -1
  148. package/lib/tools/circle/component.js +0 -387
  149. package/lib/tools/circle/component.js.map +0 -1
  150. package/lib/tools/circle/index.js +0 -51
  151. package/lib/tools/circle/index.js.map +0 -1
  152. package/lib/tools/index.js +0 -79
  153. package/lib/tools/index.js.map +0 -1
  154. package/lib/tools/line/component.js +0 -102
  155. package/lib/tools/line/component.js.map +0 -1
  156. package/lib/tools/line/index.js +0 -16
  157. package/lib/tools/line/index.js.map +0 -1
  158. package/lib/tools/parabola/component.js +0 -33
  159. package/lib/tools/parabola/component.js.map +0 -1
  160. package/lib/tools/parabola/index.js +0 -63
  161. package/lib/tools/parabola/index.js.map +0 -1
  162. package/lib/tools/point/component.js +0 -181
  163. package/lib/tools/point/component.js.map +0 -1
  164. package/lib/tools/point/index.js +0 -32
  165. package/lib/tools/point/index.js.map +0 -1
  166. package/lib/tools/polygon/component.js +0 -505
  167. package/lib/tools/polygon/component.js.map +0 -1
  168. package/lib/tools/polygon/index.js +0 -106
  169. package/lib/tools/polygon/index.js.map +0 -1
  170. package/lib/tools/polygon/line.js +0 -151
  171. package/lib/tools/polygon/line.js.map +0 -1
  172. package/lib/tools/polygon/polygon.js +0 -162
  173. package/lib/tools/polygon/polygon.js.map +0 -1
  174. package/lib/tools/ray/component.js +0 -101
  175. package/lib/tools/ray/component.js.map +0 -1
  176. package/lib/tools/ray/index.js +0 -16
  177. package/lib/tools/ray/index.js.map +0 -1
  178. package/lib/tools/segment/component.js +0 -74
  179. package/lib/tools/segment/component.js.map +0 -1
  180. package/lib/tools/segment/index.js +0 -16
  181. package/lib/tools/segment/index.js.map +0 -1
  182. package/lib/tools/shared/arrow-head.js +0 -70
  183. package/lib/tools/shared/arrow-head.js.map +0 -1
  184. package/lib/tools/shared/line/index.js +0 -567
  185. package/lib/tools/shared/line/index.js.map +0 -1
  186. package/lib/tools/shared/line/line-path.js +0 -145
  187. package/lib/tools/shared/line/line-path.js.map +0 -1
  188. package/lib/tools/shared/line/with-root-edge.js +0 -144
  189. package/lib/tools/shared/line/with-root-edge.js.map +0 -1
  190. package/lib/tools/shared/point/arrow-point.js +0 -113
  191. package/lib/tools/shared/point/arrow-point.js.map +0 -1
  192. package/lib/tools/shared/point/arrow.js +0 -96
  193. package/lib/tools/shared/point/arrow.js.map +0 -1
  194. package/lib/tools/shared/point/base-point.js +0 -139
  195. package/lib/tools/shared/point/base-point.js.map +0 -1
  196. package/lib/tools/shared/point/index.js +0 -94
  197. package/lib/tools/shared/point/index.js.map +0 -1
  198. package/lib/tools/shared/styles.js +0 -49
  199. package/lib/tools/shared/styles.js.map +0 -1
  200. package/lib/tools/shared/types.js +0 -23
  201. package/lib/tools/shared/types.js.map +0 -1
  202. package/lib/tools/sine/component.js +0 -42
  203. package/lib/tools/sine/component.js.map +0 -1
  204. package/lib/tools/sine/index.js +0 -63
  205. package/lib/tools/sine/index.js.map +0 -1
  206. package/lib/tools/vector/component.js +0 -87
  207. package/lib/tools/vector/component.js.map +0 -1
  208. package/lib/tools/vector/index.js +0 -16
  209. package/lib/tools/vector/index.js.map +0 -1
  210. package/lib/undo-redo.js +0 -124
  211. package/lib/undo-redo.js.map +0 -1
  212. package/lib/use-debounce.js +0 -32
  213. package/lib/use-debounce.js.map +0 -1
  214. package/lib/utils.js +0 -307
  215. package/lib/utils.js.map +0 -1
@@ -0,0 +1,220 @@
1
+ import { shallow } from 'enzyme';
2
+ import React from 'react';
3
+ import { graphProps } from '../../__tests__/utils';
4
+
5
+ import Axes, { RawXAxis, RawYAxis, firstNegativeValue, sharedValues } from '../axes';
6
+
7
+ describe('RawXAxis', () => {
8
+ let w;
9
+ let onChange = jest.fn();
10
+ const wrapper = (extras) => {
11
+ const defaults = {
12
+ classes: {},
13
+ className: 'className',
14
+ onChange,
15
+ graphProps: graphProps(),
16
+ includeArrows: {
17
+ left: true,
18
+ right: true,
19
+ up: true,
20
+ down: true,
21
+ },
22
+ };
23
+ const props = { ...defaults, ...extras };
24
+ return shallow(<RawXAxis {...props} />);
25
+ };
26
+ describe('snapshot', () => {
27
+ it('renders', () => {
28
+ w = wrapper();
29
+ expect(w).toMatchSnapshot();
30
+ });
31
+ });
32
+ });
33
+
34
+ describe('RawYAxis', () => {
35
+ let w;
36
+ let onChange = jest.fn();
37
+ const wrapper = (extras) => {
38
+ const defaults = {
39
+ classes: {},
40
+ className: 'className',
41
+ onChange,
42
+ graphProps: graphProps(),
43
+ includeArrows: {
44
+ left: true,
45
+ right: true,
46
+ up: true,
47
+ down: true,
48
+ },
49
+ };
50
+ const props = { ...defaults, ...extras };
51
+ return shallow(<RawYAxis {...props} />);
52
+ };
53
+ describe('snapshot', () => {
54
+ it('renders', () => {
55
+ w = wrapper();
56
+ expect(w).toMatchSnapshot();
57
+ });
58
+ });
59
+ });
60
+
61
+ const customScaleMock = (distance) => {
62
+ const fn = jest.fn((n) => n * distance);
63
+ fn.invert = jest.fn((n) => n * distance);
64
+ return fn;
65
+ };
66
+
67
+ describe.only('Axes', () => {
68
+ let w;
69
+ let onChange = jest.fn();
70
+
71
+ const customGraphProps = {
72
+ ...graphProps(),
73
+ domain: {
74
+ min: -2,
75
+ max: 2,
76
+ labelStep: 1,
77
+ step: 1,
78
+ },
79
+ range: {
80
+ min: -2,
81
+ max: 2,
82
+ step: 1,
83
+ labelStep: 1,
84
+ },
85
+ scale: {
86
+ x: customScaleMock(200),
87
+ y: customScaleMock(150),
88
+ },
89
+ };
90
+
91
+ const wrapper = (extras) => {
92
+ const defaults = {
93
+ classes: {},
94
+ className: 'className',
95
+ onChange,
96
+ graphProps: customGraphProps,
97
+ };
98
+
99
+ const props = { ...defaults, ...extras };
100
+ return shallow(<Axes {...props} />);
101
+ };
102
+ describe('xValues', () => {
103
+ it('renders', () => {
104
+ w = wrapper();
105
+ const result = w.instance().xValues();
106
+ expect(result).toEqual({
107
+ columnTicksValues: expect.arrayContaining([-2, -1, 0, 1, 2]),
108
+ distanceFromOriginToFirstNegativeX: 150,
109
+ firstNegativeX: -1,
110
+ });
111
+ });
112
+ });
113
+ describe('yValues', () => {
114
+ it('renders', () => {
115
+ w = wrapper();
116
+ const result = w.instance().yValues();
117
+ expect(result).toEqual({
118
+ rowTickValues: expect.arrayContaining([-2, -1, 0, 1, 2]),
119
+ distanceFromOriginToFirstNegativeY: 200,
120
+ firstNegativeY: -1,
121
+ });
122
+ });
123
+ });
124
+ });
125
+
126
+ describe('firstNegativeValue should return undefiend for undefined interval', () => {
127
+ const interval = undefined;
128
+ const result = firstNegativeValue(interval);
129
+ expect(result).toEqual(undefined);
130
+ });
131
+
132
+ describe('firstNegativeValue should return undefiend for empty interval', () => {
133
+ const interval = [];
134
+ const result = firstNegativeValue(interval);
135
+ expect(result).toEqual(undefined);
136
+ });
137
+
138
+ describe('firstNegativeValue should return undefined if there is no negative in interval array', () => {
139
+ const interval = [1, 5, 7, 4, 5];
140
+ const result = firstNegativeValue(interval);
141
+ expect(result).toEqual(undefined);
142
+ });
143
+
144
+ describe('firstNegativeValue should return first negative number from interval', () => {
145
+ const interval = [1, 5, 7, -2, 4, 5, -1];
146
+ const result = firstNegativeValue(interval);
147
+ expect(result).toEqual(-2);
148
+ });
149
+
150
+ describe('skipValue should be empty array if firstNegativeValue for one of the axes is undefined', () => {
151
+ // x
152
+ const intervalX = [1, 2, 3, 4, 5, 6];
153
+ const firstNegativeX = firstNegativeValue(intervalX);
154
+ const distanceFromOriginToFirstNegativeX = -22;
155
+
156
+ // y
157
+ const intervalY = [-1, -2, 1, 2, 3, 4, 5, 6];
158
+ const firstNegativeY = firstNegativeValue(intervalY);
159
+ const distanceFromOriginToFirstNegativeY = -22;
160
+
161
+ const deltaAllowance = 5;
162
+
163
+ const result = sharedValues(
164
+ firstNegativeX,
165
+ firstNegativeY,
166
+ distanceFromOriginToFirstNegativeX,
167
+ distanceFromOriginToFirstNegativeY,
168
+ deltaAllowance,
169
+ );
170
+
171
+ expect(result).toEqual([]);
172
+ });
173
+
174
+ describe('skipValue should be empty array if firstNegativeX and firstNegativeY are equal but they do not overlap', () => {
175
+ // x
176
+ const intervalX = [-1, -2, 1, 2, 3, 4, 5, 6];
177
+ const firstNegativeX = firstNegativeValue(intervalX);
178
+ const distanceFromOriginToFirstNegativeX = -7;
179
+
180
+ // y
181
+ const intervalY = [-1, -2, 1, 2, 3, 4, 5, 6];
182
+ const firstNegativeY = firstNegativeValue(intervalY);
183
+ const distanceFromOriginToFirstNegativeY = -22;
184
+
185
+ const deltaAllowance = 5;
186
+
187
+ const result = sharedValues(
188
+ firstNegativeX,
189
+ firstNegativeY,
190
+ distanceFromOriginToFirstNegativeX,
191
+ distanceFromOriginToFirstNegativeY,
192
+ deltaAllowance,
193
+ );
194
+
195
+ expect(result).toEqual([]);
196
+ });
197
+
198
+ describe('skipValue should be -1 if firstNegativeX and firstNegativeY are equal and they overlap', () => {
199
+ // x
200
+ const intervalX = [-1, -2, 1, 2, 3, 4, 5, 6];
201
+ const firstNegativeX = firstNegativeValue(intervalX);
202
+ const distanceFromOriginToFirstNegativeX = -20;
203
+
204
+ // y
205
+ const intervalY = [-1, -2, 1, 2, 3, 4, 5, 6];
206
+ const firstNegativeY = firstNegativeValue(intervalY);
207
+ const distanceFromOriginToFirstNegativeY = -22;
208
+
209
+ const deltaAllowance = 5;
210
+
211
+ const result = sharedValues(
212
+ firstNegativeX,
213
+ firstNegativeY,
214
+ distanceFromOriginToFirstNegativeX,
215
+ distanceFromOriginToFirstNegativeY,
216
+ deltaAllowance,
217
+ );
218
+
219
+ expect(result).toEqual([-1]);
220
+ });
package/src/axis/axes.jsx CHANGED
@@ -23,16 +23,16 @@ const AxisDefaultProps = {
23
23
 
24
24
  const axisStyles = (theme) => ({
25
25
  line: {
26
- stroke: color.primary(),
27
- strokeWidth: 5,
26
+ stroke: color.defaults.PRIMARY,
27
+ strokeWidth: 3,
28
28
  },
29
29
  arrow: {
30
- fill: color.primary(),
30
+ fill: color.defaults.PRIMARY,
31
31
  },
32
32
  tick: {
33
- fill: color.primary(),
33
+ fill: color.defaults.PRIMARY,
34
34
  '& > line': {
35
- stroke: color.primary(),
35
+ stroke: color.defaults.PRIMARY,
36
36
  },
37
37
  },
38
38
  labelFontSize: {
@@ -8,7 +8,7 @@ import PropTypes from 'prop-types';
8
8
  import isEqual from 'lodash/isEqual';
9
9
  import { ActionCreators } from 'redux-undo';
10
10
  import GraphWithControls from '../graph-with-controls';
11
- import { lastActionMiddleware, getLastAction } from './middleware';
11
+ import { lastActionMiddleware } from './middleware';
12
12
 
13
13
  const mapStateToProps = (s) => ({
14
14
  marks: s.marks.present,
@@ -58,11 +58,9 @@ class Root extends React.Component {
58
58
  onStoreChange = () => {
59
59
  const { marks, onChangeMarks } = this.props;
60
60
  const storeState = this.store.getState();
61
- const lastAction = getLastAction();
62
- const isUndoOperation = lastAction.type.includes('UNDO') || lastAction.type.includes('REDO');
63
61
 
64
62
  if (!isEqual(storeState.marks.present, marks)) {
65
- onChangeMarks(storeState.marks.present, isUndoOperation);
63
+ onChangeMarks(storeState.marks.present);
66
64
  }
67
65
  };
68
66
 
@@ -12,7 +12,7 @@ const styles = (theme) => ({
12
12
  fontSize: theme.typography.fontSize,
13
13
  borderRadius: '8px',
14
14
  background: theme.palette.common.white,
15
- color: color.primaryDark(),
15
+ color: color.defaults.PRIMARY_DARK,
16
16
  },
17
17
  inputLabel: {
18
18
  padding: 0,
@@ -20,8 +20,9 @@ const styles = (theme) => ({
20
20
  });
21
21
 
22
22
  export const getLabelPosition = (graphProps, x, y, labelLength) => {
23
- const { scale, domain } = graphProps;
24
- const topShift = 8;
23
+ const { scale, domain, range } = graphProps;
24
+ // treat corner cases for maximum and minimum
25
+ const topShift = y === range.min ? 16 : y === range.max ? 0 : 8;
25
26
  const leftShift = 10;
26
27
  const rightEdge = scale.x(x) + labelLength + leftShift;
27
28
 
@@ -89,9 +89,8 @@ export class GraphWithControls extends React.Component {
89
89
  }
90
90
  }
91
91
 
92
- changeCurrentTool = (tool, tools) => this.setState({ currentTool: tools.find((t) => t.type === tool) });
93
-
94
- toggleLabelMode = () => this.setState((state) => ({ labelModeEnabled: !state.labelModeEnabled }));
92
+ changeCurrentTool = (tool, tools) =>
93
+ this.setState({ currentTool: tools.find((t) => t.type === tool), labelModeEnabled: tool === 'label' });
95
94
 
96
95
  render() {
97
96
  let { currentTool, labelModeEnabled } = this.state;
@@ -123,7 +122,9 @@ export class GraphWithControls extends React.Component {
123
122
  showTitle,
124
123
  title,
125
124
  titlePlaceholder,
126
- language
125
+ language,
126
+ removeIncompleteTool,
127
+ limitLabeling,
127
128
  } = this.props;
128
129
  let { backgroundMarks, marks, toolbarTools } = this.props;
129
130
 
@@ -151,13 +152,12 @@ export class GraphWithControls extends React.Component {
151
152
  draggableTools={draggableTools}
152
153
  labelModeEnabled={labelModeEnabled}
153
154
  onChange={(tool) => this.changeCurrentTool(tool, tools)}
154
- onToggleLabelMode={this.toggleLabelMode}
155
155
  toolbarTools={toolbarTools}
156
156
  onChangeTools={onChangeTools}
157
157
  language={language}
158
158
  />
159
159
 
160
- {!disabled && <UndoRedo onUndo={onUndo} onRedo={onRedo} onReset={onReset} language={language}/>}
160
+ {!disabled && <UndoRedo onUndo={onUndo} onRedo={onRedo} onReset={onReset} language={language} />}
161
161
  </React.Fragment>
162
162
  );
163
163
 
@@ -198,6 +198,8 @@ export class GraphWithControls extends React.Component {
198
198
  title={title}
199
199
  titlePlaceholder={titlePlaceholder}
200
200
  tools={tools}
201
+ removeIncompleteTool={removeIncompleteTool}
202
+ limitLabeling={limitLabeling}
201
203
  />
202
204
  </div>
203
205
  );
@@ -216,10 +218,6 @@ const styles = (theme) => ({
216
218
  padding: theme.spacing.unit,
217
219
  color: color.text(),
218
220
  backgroundColor: color.primaryLight(),
219
- borderTop: `solid 1px ${color.primaryDark()}`,
220
- borderBottom: `solid 0px ${color.primaryDark()}`,
221
- borderLeft: `solid 1px ${color.primaryDark()}`,
222
- borderRight: `solid 1px ${color.primaryDark()}`,
223
221
  '& button': {
224
222
  fontSize: theme.typography.fontSize,
225
223
  },
package/src/graph.jsx CHANGED
@@ -39,6 +39,7 @@ export const graphPropTypes = {
39
39
  showTitle: PropTypes.bool,
40
40
  title: PropTypes.string,
41
41
  tools: PropTypes.array,
42
+ limitLabeling: PropTypes.bool,
42
43
  };
43
44
 
44
45
  const getMaskSize = (size) => ({
@@ -48,7 +49,7 @@ const getMaskSize = (size) => ({
48
49
  height: size.height + 46,
49
50
  });
50
51
 
51
- export const removeBuildingToolIfCurrentToolDiffers = ({ marks, currentTool }) => {
52
+ export const removeBuildingToolIfCurrentToolDiffers = ({ marks, currentTool, onChangeMarks, removeIncompleteTool }) => {
52
53
  const buildingMark = marks.filter((m) => m.building)[0];
53
54
  let newMarks = cloneDeep(marks);
54
55
 
@@ -59,7 +60,9 @@ export const removeBuildingToolIfCurrentToolDiffers = ({ marks, currentTool }) =
59
60
  newMarks.splice(index, 1);
60
61
  }
61
62
  }
62
-
63
+ if (removeIncompleteTool && !isEqual(newMarks, marks)) {
64
+ onChangeMarks(newMarks);
65
+ }
63
66
  return newMarks;
64
67
  };
65
68
 
@@ -116,7 +119,7 @@ export class Graph extends React.Component {
116
119
  const { onChangeMarks, marks } = this.props;
117
120
  let newMarks = cloneDeep(marks);
118
121
 
119
- if (!update.building && isDuplicatedMark(update, marks)) {
122
+ if (!update || (!update.building && isDuplicatedMark(update, marks))) {
120
123
  return;
121
124
  }
122
125
 
@@ -140,15 +143,15 @@ export class Graph extends React.Component {
140
143
  };
141
144
 
142
145
  onBgClick = (point) => {
143
- const { x, y } = point;
146
+ const { x, y } = point || {};
144
147
  const { labelModeEnabled, currentTool, marks } = this.props;
145
148
 
146
- log('[onBgClick] x,y: ', x, y);
147
-
148
- if (labelModeEnabled || !currentTool) {
149
+ if (labelModeEnabled || !currentTool || [null, undefined].includes(x) || [null, undefined].includes(y)) {
149
150
  return;
150
151
  }
151
152
 
153
+ log('[onBgClick] x,y: ', x, y);
154
+
152
155
  const buildingMark = marks.filter((m) => m.building)[0];
153
156
  let updatedMark;
154
157
 
@@ -177,6 +180,7 @@ export class Graph extends React.Component {
177
180
  labels,
178
181
  labelModeEnabled,
179
182
  labelsPlaceholders,
183
+ limitLabeling,
180
184
  showLabels,
181
185
  showPixelGuides,
182
186
  showTitle,
@@ -184,15 +188,22 @@ export class Graph extends React.Component {
184
188
  onChangeLabels,
185
189
  onChangeTitle,
186
190
  mathMlOptions = {},
191
+ onChangeMarks,
192
+ removeIncompleteTool,
187
193
  } = this.props;
188
194
  let { marks } = this.props;
189
195
 
190
196
  const graphProps = createGraphProps(domain, range, size, () => this.rootNode);
191
197
 
192
198
  const maskSize = getMaskSize(size);
193
- const common = { graphProps, labelModeEnabled };
199
+ const common = { graphProps, labelModeEnabled, limitLabeling };
194
200
 
195
- marks = removeBuildingToolIfCurrentToolDiffers({ marks: marks || [], currentTool });
201
+ marks = removeBuildingToolIfCurrentToolDiffers({
202
+ marks: marks || [],
203
+ currentTool,
204
+ onChangeMarks,
205
+ removeIncompleteTool,
206
+ });
196
207
 
197
208
  return (
198
209
  <Root
@@ -233,6 +244,7 @@ export class Graph extends React.Component {
233
244
  key={`${markType}-${index}-bg`}
234
245
  mark={{ ...m, disabled: true, isBackground: true }}
235
246
  labelNode={this.state.labelNode}
247
+ onClick={this.onBgClick}
236
248
  {...common}
237
249
  />
238
250
  );
@@ -263,7 +275,7 @@ export class Graph extends React.Component {
263
275
  x="0"
264
276
  y="0"
265
277
  {...size}
266
- style={{ pointerEvents: 'none' }}
278
+ style={{ pointerEvents: 'none', fontSize: '14px' }}
267
279
  />
268
280
  </g>
269
281
  </g>
package/src/grid.jsx CHANGED
@@ -2,7 +2,6 @@ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import * as vx from '@vx/grid';
4
4
  import { types } from '@pie-lib/plot';
5
- import { color } from '@pie-lib/render-ui';
6
5
  import { withStyles } from '@material-ui/core/styles';
7
6
  import { getTickValues } from './utils';
8
7
 
@@ -78,7 +77,7 @@ export class Grid extends React.Component {
78
77
  };
79
78
 
80
79
  render() {
81
- const { classes, graphProps } = this.props;
80
+ const { graphProps } = this.props;
82
81
  const {
83
82
  scale,
84
83
  size: { height, width },
@@ -95,6 +94,9 @@ export class Grid extends React.Component {
95
94
  displayAdditionalGrid,
96
95
  } = this.getAdditionalGridProps(rowTickValues, columnTickValues);
97
96
 
97
+ const additionalGridStroke =
98
+ domain.labelStep * 2 === domain.step || range.labelStep * 2 === range.step ? '#9FA8DA' : '#7985CB';
99
+
98
100
  return (
99
101
  <>
100
102
  <vx.Grid
@@ -103,7 +105,7 @@ export class Grid extends React.Component {
103
105
  yScale={scale.y}
104
106
  width={width}
105
107
  height={height}
106
- className={classes.grid}
108
+ stroke="#E1E6EC"
107
109
  rowTickValues={rowTickValues}
108
110
  columnTickValues={columnTickValues}
109
111
  />
@@ -113,14 +115,14 @@ export class Grid extends React.Component {
113
115
  scale={scale.y}
114
116
  width={width}
115
117
  tickValues={rowTickLabelValues}
116
- stroke={color.primary()}
118
+ stroke={additionalGridStroke}
117
119
  strokeDasharray={rowStrokeDasharray}
118
120
  />
119
121
  <vx.GridColumns
120
122
  scale={scale.x}
121
123
  height={height}
122
124
  tickValues={columnTickLabelValues}
123
- stroke={color.primary()}
125
+ stroke={additionalGridStroke}
124
126
  strokeDasharray={columnStrokeDasharray}
125
127
  />
126
128
  </>
@@ -130,8 +132,4 @@ export class Grid extends React.Component {
130
132
  }
131
133
  }
132
134
 
133
- export default withStyles(() => ({
134
- grid: {
135
- stroke: 'purple', // TODO hardcoded color
136
- },
137
- }))(Grid);
135
+ export default withStyles(() => ({}))(Grid);
package/src/index.js CHANGED
@@ -3,5 +3,5 @@ import GraphContainer from './container';
3
3
  import GridSetup from './grid-setup';
4
4
  import * as tools from './tools';
5
5
  import ToolMenu from './tool-menu';
6
-
7
- export { Graph, GraphContainer, GridSetup, ToolMenu, tools };
6
+ import KeyLegend from './key-legend';
7
+ export { Graph, GraphContainer, GridSetup, ToolMenu, tools, KeyLegend };