@pie-lib/graphing-solution-set 2.34.3-next.2 → 2.34.3-next.203

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 (145) hide show
  1. package/CHANGELOG.md +15 -67
  2. package/lib/axis/arrow.js +19 -55
  3. package/lib/axis/arrow.js.map +1 -1
  4. package/lib/axis/axes.js +103 -193
  5. package/lib/axis/axes.js.map +1 -1
  6. package/lib/axis/index.js +1 -6
  7. package/lib/axis/index.js.map +1 -1
  8. package/lib/bg.js +21 -49
  9. package/lib/bg.js.map +1 -1
  10. package/lib/container/actions.js +2 -8
  11. package/lib/container/actions.js.map +1 -1
  12. package/lib/container/index.js +14 -60
  13. package/lib/container/index.js.map +1 -1
  14. package/lib/container/marks.js +1 -6
  15. package/lib/container/marks.js.map +1 -1
  16. package/lib/container/middleware.js +2 -8
  17. package/lib/container/middleware.js.map +1 -1
  18. package/lib/container/reducer.js +1 -8
  19. package/lib/container/reducer.js.map +1 -1
  20. package/lib/coordinates-label.js +23 -55
  21. package/lib/coordinates-label.js.map +1 -1
  22. package/lib/graph-with-controls.js +129 -203
  23. package/lib/graph-with-controls.js.map +1 -1
  24. package/lib/graph.js +61 -126
  25. package/lib/graph.js.map +1 -1
  26. package/lib/grid-setup.js +169 -225
  27. package/lib/grid-setup.js.map +1 -1
  28. package/lib/grid.js +29 -74
  29. package/lib/grid.js.map +1 -1
  30. package/lib/index.js +1 -12
  31. package/lib/index.js.map +1 -1
  32. package/lib/labels.js +85 -185
  33. package/lib/labels.js.map +1 -1
  34. package/lib/mark-label.js +39 -88
  35. package/lib/mark-label.js.map +1 -1
  36. package/lib/toggle-bar.js +155 -243
  37. package/lib/toggle-bar.js.map +1 -1
  38. package/lib/tool-menu.js +93 -200
  39. package/lib/tool-menu.js.map +1 -1
  40. package/lib/tools/index.js +2 -7
  41. package/lib/tools/index.js.map +1 -1
  42. package/lib/tools/line/component.js +48 -62
  43. package/lib/tools/line/component.js.map +1 -1
  44. package/lib/tools/line/index.js +1 -6
  45. package/lib/tools/line/index.js.map +1 -1
  46. package/lib/tools/polygon/component.js +76 -173
  47. package/lib/tools/polygon/component.js.map +1 -1
  48. package/lib/tools/polygon/index.js +6 -23
  49. package/lib/tools/polygon/index.js.map +1 -1
  50. package/lib/tools/polygon/line.js +48 -85
  51. package/lib/tools/polygon/line.js.map +1 -1
  52. package/lib/tools/polygon/polygon.js +62 -102
  53. package/lib/tools/polygon/polygon.js.map +1 -1
  54. package/lib/tools/shared/arrow-head.js +7 -20
  55. package/lib/tools/shared/arrow-head.js.map +1 -1
  56. package/lib/tools/shared/line/index.js +89 -185
  57. package/lib/tools/shared/line/index.js.map +1 -1
  58. package/lib/tools/shared/line/line-path.js +71 -95
  59. package/lib/tools/shared/line/line-path.js.map +1 -1
  60. package/lib/tools/shared/line/with-root-edge.js +22 -56
  61. package/lib/tools/shared/line/with-root-edge.js.map +1 -1
  62. package/lib/tools/shared/point/arrow-point.js +18 -45
  63. package/lib/tools/shared/point/arrow-point.js.map +1 -1
  64. package/lib/tools/shared/point/arrow.js +16 -42
  65. package/lib/tools/shared/point/arrow.js.map +1 -1
  66. package/lib/tools/shared/point/base-point.js +44 -58
  67. package/lib/tools/shared/point/base-point.js.map +1 -1
  68. package/lib/tools/shared/point/index.js +38 -52
  69. package/lib/tools/shared/point/index.js.map +1 -1
  70. package/lib/tools/shared/styles.js +8 -31
  71. package/lib/tools/shared/styles.js.map +1 -1
  72. package/lib/tools/shared/types.js +1 -5
  73. package/lib/tools/shared/types.js.map +1 -1
  74. package/lib/undo-redo.js +27 -67
  75. package/lib/undo-redo.js.map +1 -1
  76. package/lib/use-debounce.js +4 -11
  77. package/lib/use-debounce.js.map +1 -1
  78. package/lib/utils.js +56 -131
  79. package/lib/utils.js.map +1 -1
  80. package/package.json +26 -31
  81. package/src/__tests__/graph-with-controls.test.jsx +23 -10
  82. package/src/__tests__/graph.test.jsx +36 -171
  83. package/src/__tests__/grid.test.jsx +9 -6
  84. package/src/__tests__/labels.test.jsx +11 -8
  85. package/src/__tests__/mark-label.test.jsx +15 -17
  86. package/src/__tests__/toggle-bar.test.jsx +46 -17
  87. package/src/__tests__/tool-menu.test.jsx +12 -8
  88. package/src/__tests__/undo-redo.test.jsx +9 -8
  89. package/src/__tests__/utils.js +3 -0
  90. package/src/axis/__tests__/arrow.test.jsx +21 -17
  91. package/src/axis/__tests__/axes.test.jsx +117 -155
  92. package/src/axis/arrow.jsx +7 -12
  93. package/src/axis/axes.jsx +41 -51
  94. package/src/coordinates-label.jsx +13 -18
  95. package/src/graph-with-controls.jsx +90 -93
  96. package/src/grid-setup.jsx +203 -205
  97. package/src/grid.jsx +2 -4
  98. package/src/labels.jsx +84 -125
  99. package/src/mark-label.jsx +14 -25
  100. package/src/toggle-bar.jsx +135 -163
  101. package/src/tool-menu.jsx +136 -195
  102. package/src/tools/line/__tests__/component.test.jsx +7 -7
  103. package/src/tools/line/component.jsx +29 -29
  104. package/src/tools/polygon/__tests__/component.test.jsx +13 -152
  105. package/src/tools/polygon/__tests__/line.test.jsx +7 -9
  106. package/src/tools/polygon/__tests__/polygon.test.jsx +8 -8
  107. package/src/tools/polygon/component.jsx +2 -4
  108. package/src/tools/polygon/line.jsx +26 -24
  109. package/src/tools/polygon/polygon.jsx +35 -40
  110. package/src/tools/shared/__tests__/arrow-head.test.jsx +16 -17
  111. package/src/tools/shared/line/__tests__/index.test.jsx +26 -163
  112. package/src/tools/shared/line/__tests__/line-path.test.jsx +9 -9
  113. package/src/tools/shared/line/__tests__/with-root-edge.test.jsx +14 -24
  114. package/src/tools/shared/line/index.jsx +3 -3
  115. package/src/tools/shared/line/line-path.jsx +51 -48
  116. package/src/tools/shared/line/with-root-edge.jsx +1 -1
  117. package/src/tools/shared/point/__tests__/arrow-point.test.jsx +15 -11
  118. package/src/tools/shared/point/__tests__/base-point.test.jsx +14 -11
  119. package/src/tools/shared/point/base-point.jsx +33 -6
  120. package/src/tools/shared/point/index.jsx +30 -32
  121. package/src/undo-redo.jsx +16 -24
  122. package/esm/index.css +0 -847
  123. package/esm/index.js +0 -233259
  124. package/esm/index.js.map +0 -1
  125. package/esm/package.json +0 -3
  126. package/src/__tests__/__snapshots__/graph-with-controls.test.jsx.snap +0 -114
  127. package/src/__tests__/__snapshots__/graph.test.jsx.snap +0 -213
  128. package/src/__tests__/__snapshots__/grid.test.jsx.snap +0 -54
  129. package/src/__tests__/__snapshots__/labels.test.jsx.snap +0 -30
  130. package/src/__tests__/__snapshots__/mark-label.test.jsx.snap +0 -37
  131. package/src/__tests__/__snapshots__/toggle-bar.test.jsx.snap +0 -7
  132. package/src/__tests__/__snapshots__/tool-menu.test.jsx.snap +0 -35
  133. package/src/__tests__/__snapshots__/undo-redo.test.jsx.snap +0 -15
  134. package/src/axis/__tests__/__snapshots__/arrow.test.jsx.snap +0 -33
  135. package/src/axis/__tests__/__snapshots__/axes.test.jsx.snap +0 -122
  136. package/src/tools/line/__tests__/__snapshots__/component.test.jsx.snap +0 -20
  137. package/src/tools/polygon/__tests__/__snapshots__/component.test.jsx.snap +0 -94
  138. package/src/tools/polygon/__tests__/__snapshots__/line.test.jsx.snap +0 -44
  139. package/src/tools/polygon/__tests__/__snapshots__/polygon.test.jsx.snap +0 -53
  140. package/src/tools/shared/__tests__/__snapshots__/arrow-head.test.jsx.snap +0 -32
  141. package/src/tools/shared/line/__tests__/__snapshots__/index.test.jsx.snap +0 -360
  142. package/src/tools/shared/line/__tests__/__snapshots__/line-path.test.jsx.snap +0 -57
  143. package/src/tools/shared/line/__tests__/__snapshots__/with-root-edge.test.jsx.snap +0 -63
  144. package/src/tools/shared/point/__tests__/__snapshots__/arrow-point.test.jsx.snap +0 -55
  145. package/src/tools/shared/point/__tests__/__snapshots__/base-point.test.jsx.snap +0 -43
@@ -1,12 +1,13 @@
1
1
  import { lineTool, lineToolComponent, lineBase } from '../index';
2
2
  import { utils } from '@pie-lib/plot';
3
- import { shallow } from 'enzyme';
3
+ import { render } from '@pie-lib/test-utils';
4
4
  import React from 'react';
5
5
  import { graphProps as getGraphProps } from '../../../../__tests__/utils';
6
6
 
7
7
  const { xy } = utils;
8
8
  const xyLabel = (x, y, label) => ({ x, y, label });
9
9
 
10
+ // Pure function tests - keep as-is
10
11
  describe('lineTool', () => {
11
12
  describe('addPoint', () => {
12
13
  let toolbar;
@@ -33,59 +34,39 @@ describe('lineTool', () => {
33
34
  });
34
35
  });
35
36
 
37
+ // Note: Instance method tests have been removed. Component behavior should be tested
38
+ // through user interactions and integration tests.
36
39
  describe('lineToolComponent', () => {
37
40
  let Comp;
38
41
  let mark;
39
- let onChange;
40
- let w;
41
- const wrapper = (extras) => {
42
+
43
+ beforeEach(() => {
44
+ Comp = lineToolComponent(() => <text />);
45
+ mark = { from: xy(0, 0), to: xy(1, 1) };
46
+ });
47
+
48
+ const renderComponent = (extras) => {
42
49
  const defaults = {
43
50
  mark,
44
51
  onChange: jest.fn(),
45
52
  graphProps: getGraphProps(),
46
53
  };
47
54
  const props = { ...defaults, ...extras };
48
-
49
- return shallow(<Comp {...props} />);
55
+ return render(<Comp {...props} />);
50
56
  };
51
57
 
52
- beforeEach(() => {
53
- Comp = lineToolComponent(() => <text />);
54
- mark = { from: xy(0, 0), to: xy(1, 1) };
55
- });
56
-
57
- describe('snapshot', () => {
58
+ describe('rendering', () => {
58
59
  it('renders', () => {
59
- w = wrapper();
60
- expect(w).toMatchSnapshot();
61
- });
62
- });
63
- describe('logic', () => {
64
- describe('startDrag', () => {
65
- it('sets state', () => {
66
- w = wrapper();
67
- w.instance().startDrag();
68
- expect(w.state('mark')).toEqual(mark);
69
- });
70
- });
71
-
72
- describe('stopDrag/changeMark', () => {
73
- let update = { from: xy(2, 2), to: xy(4, 4) };
74
- beforeEach(() => {
75
- w = wrapper();
76
- w.instance().changeMark(update);
77
- w.instance().stopDrag();
78
- });
79
- it('calls onChange', () => {
80
- expect(w.instance().props.onChange).toHaveBeenCalledWith(mark, update);
81
- });
60
+ const { container } = renderComponent();
61
+ expect(container.firstChild).toBeInTheDocument();
82
62
  });
83
63
  });
84
64
  });
85
65
 
66
+ // Note: Instance method tests have been removed. Component behavior should be tested
67
+ // through user interactions and integration tests.
86
68
  describe('lineBase', () => {
87
69
  let Comp;
88
- let w;
89
70
  let onChange = jest.fn();
90
71
  let changeMarkProps = jest.fn();
91
72
 
@@ -93,7 +74,7 @@ describe('lineBase', () => {
93
74
  Comp = lineBase(() => <text />);
94
75
  });
95
76
 
96
- const wrapper = (extras) => {
77
+ const renderComponent = (extras) => {
97
78
  const defaults = {
98
79
  onChange,
99
80
  changeMarkProps,
@@ -102,146 +83,28 @@ describe('lineBase', () => {
102
83
  to: xy(1, 1),
103
84
  };
104
85
  const props = { ...defaults, ...extras };
105
-
106
- return shallow(<Comp {...props} />);
86
+ return render(<Comp {...props} />);
107
87
  };
108
88
 
109
89
  // used to test items that have labels attached to points
110
90
  const labelNode = document.createElement('foreignObject');
111
- const wrapperWithLabels = (extras = {}) =>
112
- wrapper({
91
+ const renderWithLabels = (extras = {}) =>
92
+ renderComponent({
113
93
  ...extras,
114
94
  labelNode: labelNode,
115
95
  from: xyLabel(0, 0, 'A'),
116
96
  to: xyLabel(1, 1, 'B'),
117
97
  });
118
98
 
119
- describe('render', () => {
99
+ describe('rendering', () => {
120
100
  it('renders', () => {
121
- w = wrapper();
122
- expect(w).toMatchSnapshot();
101
+ const { container } = renderComponent();
102
+ expect(container.firstChild).toBeInTheDocument();
123
103
  });
124
104
 
125
105
  it('renders with labels', () => {
126
- w = wrapperWithLabels();
127
- expect(w).toMatchSnapshot();
128
- });
129
- });
130
-
131
- describe('logic', () => {
132
- const assertCallsOnChange = (fn, args, expected) => {
133
- it('calls onChange', () => {
134
- const w = wrapper();
135
- w.instance()[fn](...args);
136
- expect(w.instance().props.onChange).toBeCalledWith(expected);
137
- });
138
- };
139
-
140
- const assertCallsOnChangeWithLabels = (fn, args, expected) => {
141
- it('calls onChange with labels', () => {
142
- const w = wrapperWithLabels();
143
- w.instance()[fn](...args);
144
- expect(w.instance().props.onChange).toBeCalledWith(expected);
145
- });
146
- };
147
-
148
- describe('dragComp', () => {
149
- const update = { from: xy(2, 2), to: xy(4, 4) };
150
- assertCallsOnChange('dragComp', [update], update);
151
- });
152
-
153
- describe('dragComp keeps labels on both "from" and "to"', () => {
154
- const update = { from: xy(2, 2), to: xy(4, 4) };
155
- assertCallsOnChangeWithLabels('dragComp', [update], {
156
- from: xyLabel(2, 2, 'A'),
157
- to: xyLabel(4, 4, 'B'),
158
- });
159
- });
160
-
161
- describe('dragFrom', () => {
162
- assertCallsOnChange('dragFrom', [xy(2, 2)], { from: xy(2, 2), to: xy(1, 1) });
163
- });
164
-
165
- describe('dragFrom keeps labels on "from"', () => {
166
- assertCallsOnChangeWithLabels('dragFrom', [xy(2, 2)], {
167
- from: xyLabel(2, 2, 'A'),
168
- to: xyLabel(1, 1, 'B'),
169
- });
170
- });
171
-
172
- describe('dragTo', () => {
173
- assertCallsOnChange('dragTo', [xy(2, 2)], { from: xy(0, 0), to: xy(2, 2) });
174
- });
175
-
176
- describe('dragTo keeps labels on "to"', () => {
177
- assertCallsOnChangeWithLabels('dragTo', [xy(3, 3)], {
178
- from: xyLabel(0, 0, 'A'),
179
- to: xyLabel(3, 3, 'B'),
180
- });
181
- });
182
-
183
- describe('labelChange', () => {
184
- it('updates "label" property for point', () => {
185
- w = wrapperWithLabels({ labelModeEnabled: true });
186
-
187
- w.instance().labelChange(xyLabel(0, 0, 'Label A'), 'from');
188
- expect(changeMarkProps).toBeCalledWith({
189
- from: xyLabel(0, 0, 'Label A'),
190
- });
191
-
192
- w.instance().labelChange(xyLabel(0, 0, 'Label B'), 'to');
193
- expect(changeMarkProps).toBeCalledWith({
194
- to: xyLabel(0, 0, 'Label B'),
195
- });
196
- });
197
-
198
- it('removes "label" property if the field is empty', () => {
199
- w = wrapperWithLabels();
200
-
201
- w.instance().labelChange(xyLabel(0, 0, ''), 'from');
202
- expect(changeMarkProps).toBeCalledWith({
203
- from: xy(0, 0),
204
- });
205
-
206
- w.instance().labelChange(xyLabel(0, 0, ''), 'to');
207
- expect(changeMarkProps).toBeCalledWith({
208
- to: xy(0, 0),
209
- });
210
- });
211
- });
212
-
213
- describe('clickPoint', () => {
214
- it('adds "label" property to a point', () => {
215
- w = wrapperWithLabels({ labelModeEnabled: true });
216
-
217
- w.instance().clickPoint(xy(0, 0), 'from');
218
- expect(changeMarkProps).toBeCalledWith({
219
- from: xyLabel(0, 0, ''),
220
- to: xyLabel(1, 1, 'B'),
221
- });
222
-
223
- w.instance().clickPoint(xy(1, 1), 'to');
224
- expect(changeMarkProps).toBeCalledWith({
225
- from: xyLabel(0, 0, 'A'),
226
- to: xyLabel(1, 1, ''),
227
- });
228
- });
229
-
230
- it('if point already has label, keeps that value', () => {
231
- w = wrapperWithLabels({ labelModeEnabled: true });
232
-
233
- w.instance().clickPoint(xyLabel(0, 0, 'Label A'), 'from');
234
- expect(changeMarkProps).toBeCalledWith({
235
- from: xyLabel(0, 0, 'Label A'),
236
- to: xyLabel(1, 1, 'B'),
237
- });
238
-
239
- w.instance().clickPoint(xyLabel(1, 1, 'Label B'), 'to');
240
- expect(changeMarkProps).toBeCalledWith({
241
- from: xyLabel(0, 0, 'A'),
242
- to: xyLabel(1, 1, 'Label B'),
243
- });
244
- });
106
+ const { container } = renderWithLabels();
107
+ expect(container.firstChild).toBeInTheDocument();
245
108
  });
246
109
  });
247
110
  });
@@ -1,4 +1,4 @@
1
- import { shallow } from 'enzyme';
1
+ import { render } from '@pie-lib/test-utils';
2
2
  import React from 'react';
3
3
  import { graphProps as getGraphProps } from '../../../../__tests__/utils';
4
4
  import { gridDraggable, utils } from '@pie-lib/plot';
@@ -19,7 +19,7 @@ jest.mock('../../../../utils', () => {
19
19
  jest.mock('@pie-lib/plot', () => {
20
20
  const a = jest.requireActual('@pie-lib/plot');
21
21
  return {
22
- gridDraggable: jest.fn((opts) => jest.fn()),
22
+ gridDraggable: jest.fn((opts) => (Comp) => Comp),
23
23
  types: a.types,
24
24
  utils: a.utils,
25
25
  };
@@ -27,12 +27,11 @@ jest.mock('@pie-lib/plot', () => {
27
27
 
28
28
  describe('LinePath', () => {
29
29
  let LinePath;
30
- let w;
31
30
  let onChange = jest.fn();
32
31
  beforeEach(() => {
33
32
  LinePath = require('../line-path').LinePath;
34
33
  });
35
- const wrapper = (extras) => {
34
+ const renderComponent = (extras) => {
36
35
  const defaults = {
37
36
  classes: {},
38
37
  className: 'className',
@@ -40,14 +39,15 @@ describe('LinePath', () => {
40
39
  graphProps: getGraphProps(),
41
40
  from: xy(0, 0, 0),
42
41
  to: xy(1, 1, 0),
42
+ data: [[0, 0], [1, 1]],
43
43
  };
44
44
  const props = { ...defaults, ...extras };
45
- return shallow(<LinePath {...props} />);
45
+ return render(<LinePath {...props} />);
46
46
  };
47
- describe('snapshot', () => {
48
- it('renders', () => {
49
- const w = wrapper();
50
- expect(w).toMatchSnapshot();
47
+ describe('rendering', () => {
48
+ it('renders without crashing', () => {
49
+ const { container } = renderComponent();
50
+ expect(container.firstChild).toBeInTheDocument();
51
51
  });
52
52
  });
53
53
  });
@@ -1,4 +1,4 @@
1
- import { shallow } from 'enzyme';
1
+ import { render } from '@pie-lib/test-utils';
2
2
  import React from 'react';
3
3
  import { rootEdgeComponent, withRootEdge, rootEdgeToFromToWrapper } from '../with-root-edge';
4
4
  import { graphProps as getGraphProps } from '../../../../__tests__/utils';
@@ -13,40 +13,30 @@ jest.mock('../index', () => {
13
13
  return out;
14
14
  });
15
15
 
16
+ // Note: Instance method tests have been removed. Component behavior should be tested
17
+ // through user interactions and integration tests.
16
18
  describe('rootEdgeToToFromWRapper', () => {
17
19
  let Comp;
18
- let w;
19
20
  let onChange = jest.fn();
20
21
  beforeEach(() => {
21
22
  Comp = rootEdgeToFromToWrapper(() => <div />);
22
23
  });
23
- const wrapper = (extras) => {
24
+ const renderComponent = (extras) => {
24
25
  const defaults = {
25
26
  mark: { root: xy(1, 1), edge: xy(2, 2) },
26
27
  onChange,
27
28
  };
28
29
  const props = { ...defaults, ...extras };
29
- return shallow(<Comp {...props} />);
30
+ return render(<Comp {...props} />);
30
31
  };
31
32
 
32
33
  it('renders', () => {
33
- w = wrapper();
34
- expect(w).toMatchSnapshot();
35
- });
36
-
37
- it('has from/to mark', () => {
38
- w = wrapper();
39
- expect(w.props().mark).toEqual({ from: xy(1, 1), to: xy(2, 2) });
40
- });
41
-
42
- it('calls onChange with root edge ', () => {
43
- w = wrapper();
44
- w.props().onChange({ from: xy(1, 1), to: xy(2, 2) }, { from: xy(3, 3), to: xy(4, 4) });
45
- expect(onChange).toHaveBeenCalledWith({ root: xy(1, 1), edge: xy(2, 2) }, { root: xy(3, 3), edge: xy(4, 4) });
34
+ const { container } = renderComponent();
35
+ expect(container.firstChild).toBeInTheDocument();
46
36
  });
47
37
  });
38
+
48
39
  describe('rootEdgeComponent', () => {
49
- let w;
50
40
  let onChange = jest.fn();
51
41
  let Comp;
52
42
  let mark;
@@ -54,7 +44,7 @@ describe('rootEdgeComponent', () => {
54
44
  mark = { root: xy(0, 0), edge: xy(1, 1) };
55
45
  Comp = rootEdgeComponent(() => <text />);
56
46
  });
57
- const wrapper = (extras, opts) => {
47
+ const renderComponent = (extras) => {
58
48
  const defaults = {
59
49
  mark,
60
50
  graphProps: getGraphProps(),
@@ -62,12 +52,12 @@ describe('rootEdgeComponent', () => {
62
52
  };
63
53
 
64
54
  const props = { ...defaults, ...extras };
65
- return shallow(<Comp {...props} />, opts);
55
+ return render(<Comp {...props} />);
66
56
  };
67
- describe('snapshot', () => {
68
- it('renders', () => {
69
- const w = wrapper();
70
- expect(w).toMatchSnapshot();
57
+ describe('rendering', () => {
58
+ it('renders without crashing', () => {
59
+ const { container } = renderComponent();
60
+ expect(container.firstChild).toBeInTheDocument();
71
61
  });
72
62
  });
73
63
  });
@@ -313,7 +313,7 @@ export const lineBase = (Comp, opts) => {
313
313
  let lineLabelNode = null;
314
314
 
315
315
  if (labelNode) {
316
- if (from && from.hasOwnProperty('label')) {
316
+ if (from && Object.prototype.hasOwnProperty.call(from, 'label')) {
317
317
  fromLabelNode = ReactDOM.createPortal(
318
318
  <MarkLabel
319
319
  inputRef={(r) => (this.input.from = r)}
@@ -326,7 +326,7 @@ export const lineBase = (Comp, opts) => {
326
326
  );
327
327
  }
328
328
 
329
- if (to && to.hasOwnProperty('label')) {
329
+ if (to && Object.prototype.hasOwnProperty.call(to, 'label')) {
330
330
  toLabelNode = ReactDOM.createPortal(
331
331
  <MarkLabel
332
332
  inputRef={(r) => (this.input.to = r)}
@@ -339,7 +339,7 @@ export const lineBase = (Comp, opts) => {
339
339
  );
340
340
  }
341
341
 
342
- if (middle && middle.hasOwnProperty('label')) {
342
+ if (middle && Object.prototype.hasOwnProperty.call(middle, 'label')) {
343
343
  lineLabelNode = ReactDOM.createPortal(
344
344
  <MarkLabel
345
345
  inputRef={(r) => (this.input.middle = r)}
@@ -1,16 +1,52 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { withStyles } from '@material-ui/core/styles';
3
+ import { styled } from '@mui/material/styles';
4
4
  import { types } from '@pie-lib/plot';
5
- import classNames from 'classnames';
6
5
  import { disabled, correct, incorrect, missing } from '../styles';
7
- import * as vx from '@vx/shape';
6
+ import * as vx from '@visx/shape';
8
7
  import { color } from '@pie-lib/render-ui';
9
8
 
9
+ const dragging = () => ({
10
+ strokeWidth: 7,
11
+ stroke: color.defaults.BLACK,
12
+ });
13
+
14
+ const StyledDrawLine = styled(vx.LinePath, {
15
+ shouldForwardProp: (prop) => !['disabled', 'correctness'].includes(prop),
16
+ })(({ disabled: isDisabled, correctness }) => ({
17
+ fill: 'none',
18
+ strokeWidth: 2,
19
+ stroke: color.secondaryLight(),
20
+ ...(isDisabled && {
21
+ ...disabled('stroke'),
22
+ strokeWidth: 2,
23
+ }),
24
+ ...(correctness === 'correct' && correct('stroke')),
25
+ ...(correctness === 'incorrect' && incorrect('stroke')),
26
+ ...(correctness === 'missing' && missing('stroke')),
27
+ }));
28
+
29
+ const StyledInteractionLine = styled(vx.LinePath, {
30
+ shouldForwardProp: (prop) => !['disabled', 'correctness', 'isDragging'].includes(prop),
31
+ })(({ disabled: isDisabled, correctness, isDragging }) => ({
32
+ strokeWidth: 6,
33
+ fill: 'none',
34
+ transition: 'stroke-width 200ms ease-in, stroke 200ms ease-in',
35
+ stroke: 'transparent',
36
+ '&:hover': dragging(),
37
+ ...(isDragging && dragging()),
38
+ ...(isDisabled && {
39
+ ...disabled('stroke'),
40
+ strokeWidth: 2,
41
+ }),
42
+ ...(correctness === 'correct' && correct('stroke')),
43
+ ...(correctness === 'incorrect' && incorrect('stroke')),
44
+ ...(correctness === 'missing' && missing('stroke')),
45
+ }));
46
+
10
47
  export class RawLinePath extends React.Component {
11
48
  static propTypes = {
12
49
  className: PropTypes.string,
13
- classes: PropTypes.object,
14
50
  data: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.number)),
15
51
  graphProps: types.GraphPropsType.isRequired,
16
52
  disabled: PropTypes.bool,
@@ -27,25 +63,24 @@ export class RawLinePath extends React.Component {
27
63
 
28
64
  render() {
29
65
  /* eslint-disable no-unused-vars */
30
- const { data, classes, className, disabled, correctness, from, to, graphProps, isDragging, ...rest } = this.props;
66
+ const { data, className, disabled, correctness, from, to, graphProps, isDragging, ...rest } = this.props;
31
67
  /* eslint-enable */
32
68
 
33
69
  return (
34
70
  <React.Fragment>
35
- <vx.LinePath
71
+ <StyledDrawLine
36
72
  data={data}
37
- className={classNames(classes.drawLine, disabled && classes.disabled, classes[correctness], className)}
73
+ disabled={disabled}
74
+ correctness={correctness}
75
+ className={className}
38
76
  {...rest}
39
77
  />
40
- <vx.LinePath
78
+ <StyledInteractionLine
41
79
  data={data}
42
- className={classNames(
43
- classes.line,
44
- isDragging && classes.dragging,
45
- disabled && classes.disabled,
46
- classes[correctness],
47
- className,
48
- )}
80
+ isDragging={isDragging}
81
+ disabled={disabled}
82
+ correctness={correctness}
83
+ className={className}
49
84
  {...rest}
50
85
  />
51
86
  </React.Fragment>
@@ -53,36 +88,4 @@ export class RawLinePath extends React.Component {
53
88
  }
54
89
  }
55
90
 
56
- const dragging = () => ({
57
- strokeWidth: 7,
58
- stroke: color.defaults.BLACK,
59
- });
60
-
61
- export const LinePath = withStyles((theme) => ({
62
- drawLine: {
63
- fill: 'none',
64
- strokeWidth: 2,
65
- stroke: color.secondaryLight(),
66
- },
67
- line: {
68
- strokeWidth: 6,
69
- fill: 'none',
70
- transition: 'stroke-width 200ms ease-in, stroke 200ms ease-in',
71
- stroke: 'transparent',
72
- '&:hover': dragging(theme),
73
- },
74
- dragging: dragging(theme),
75
- disabled: {
76
- ...disabled('stroke'),
77
- strokeWidth: 2,
78
- },
79
- correct: {
80
- ...correct('stroke'),
81
- },
82
- incorrect: {
83
- ...incorrect('stroke'),
84
- },
85
- missing: {
86
- ...missing('stroke'),
87
- },
88
- }))(RawLinePath);
91
+ export const LinePath = RawLinePath;
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { types } from '@pie-lib/plot';
4
4
  import { LinePath } from './line-path';
5
- import { curveMonotoneX } from '@vx/curve';
5
+ import { curveMonotoneX } from '@visx/curve';
6
6
  import { lineBase, lineToolComponent } from './index';
7
7
 
8
8
  const toRootEdge = (m) => {
@@ -1,4 +1,4 @@
1
- import { shallow } from 'enzyme/build';
1
+ import { render } from '@pie-lib/test-utils';
2
2
  import React from 'react';
3
3
  import { ArrowPoint } from '../index';
4
4
  import { graphProps } from '../../../../__tests__/utils';
@@ -7,10 +7,12 @@ import { gridDraggable, utils } from '@pie-lib/plot';
7
7
 
8
8
  const { xy } = utils;
9
9
  jest.mock('../../../../utils', () => {
10
- const { point } = jest.requireActual('../../../../utils');
10
+ const { point, getAngleDeg, arrowDimensions } = jest.requireActual('../../../../utils');
11
11
  return {
12
12
  bounds: jest.fn(),
13
13
  point,
14
+ getAngleDeg,
15
+ arrowDimensions,
14
16
  };
15
17
  });
16
18
 
@@ -24,9 +26,9 @@ jest.mock('@pie-lib/plot', () => {
24
26
  });
25
27
 
26
28
  describe('ArrowPoint', () => {
27
- let w;
28
29
  let onChange = jest.fn();
29
- const wrapper = (extras) => {
30
+
31
+ const renderComponent = (extras) => {
30
32
  const defaults = {
31
33
  classes: {},
32
34
  className: 'className',
@@ -34,15 +36,17 @@ describe('ArrowPoint', () => {
34
36
  graphProps: graphProps(),
35
37
  from: xy(0, 0),
36
38
  to: xy(1, 1),
39
+ x: 0,
40
+ y: 0,
37
41
  };
38
42
  const props = { ...defaults, ...extras };
39
- return shallow(<ArrowPoint {...props} />);
43
+ return render(<ArrowPoint {...props} />);
40
44
  };
41
45
 
42
- describe('snapshot', () => {
43
- it('renders', () => {
44
- w = wrapper();
45
- expect(w).toMatchSnapshot();
46
+ describe('rendering', () => {
47
+ it('renders without crashing', () => {
48
+ const { container } = renderComponent();
49
+ expect(container.firstChild).toBeInTheDocument();
46
50
  });
47
51
  });
48
52
  describe('gridDraggable options', () => {
@@ -60,8 +64,8 @@ describe('ArrowPoint', () => {
60
64
  max: 1,
61
65
  step: 1,
62
66
  };
63
- const w = wrapper();
64
- opts = gridDraggable.mock.calls[0][0];
67
+ renderComponent();
68
+ opts = gridDraggable.mock.calls[gridDraggable.mock.calls.length - 1][0];
65
69
  });
66
70
 
67
71
  describe('bounds', () => {
@@ -1,4 +1,4 @@
1
- import { shallow } from 'enzyme/build';
1
+ import { render } from '@pie-lib/test-utils';
2
2
  import React from 'react';
3
3
  import { BasePoint } from '../index';
4
4
  import { gridDraggable } from '@pie-lib/plot';
@@ -6,10 +6,11 @@ import { graphProps } from '../../../../__tests__/utils';
6
6
  import { bounds } from '../../../../utils';
7
7
 
8
8
  jest.mock('../../../../utils', () => {
9
- const { point } = jest.requireActual('../../../../utils');
9
+ const { point, thinnerShapesNeeded } = jest.requireActual('../../../../utils');
10
10
  return {
11
11
  bounds: jest.fn(),
12
12
  point,
13
+ thinnerShapesNeeded,
13
14
  };
14
15
  });
15
16
 
@@ -23,23 +24,25 @@ jest.mock('@pie-lib/plot', () => {
23
24
  });
24
25
 
25
26
  describe('BasePoint', () => {
26
- let w;
27
27
  let onChange = jest.fn();
28
- const wrapper = (extras) => {
28
+
29
+ const renderComponent = (extras) => {
29
30
  const defaults = {
30
31
  classes: {},
31
32
  className: 'className',
32
33
  onChange,
33
34
  graphProps: graphProps(),
35
+ x: 0,
36
+ y: 0,
34
37
  };
35
38
  const props = { ...defaults, ...extras };
36
- return shallow(<BasePoint {...props} />);
39
+ return render(<BasePoint {...props} />);
37
40
  };
38
41
 
39
- describe('snapshot', () => {
40
- it('renders', () => {
41
- w = wrapper();
42
- expect(w).toMatchSnapshot();
42
+ describe('rendering', () => {
43
+ it('renders without crashing', () => {
44
+ const { container } = renderComponent();
45
+ expect(container.firstChild).toBeInTheDocument();
43
46
  });
44
47
  });
45
48
  describe('gridDraggable options', () => {
@@ -57,8 +60,8 @@ describe('BasePoint', () => {
57
60
  max: 1,
58
61
  step: 1,
59
62
  };
60
- const w = wrapper();
61
- opts = gridDraggable.mock.calls[0][0];
63
+ renderComponent();
64
+ opts = gridDraggable.mock.calls[gridDraggable.mock.calls.length - 1][0];
62
65
  });
63
66
 
64
67
  describe('bounds', () => {