@pie-lib/graphing-solution-set 3.1.1-next.0 → 3.2.0-next.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.
- package/lib/axis/arrow.js +0 -3
- package/lib/axis/arrow.js.map +1 -1
- package/lib/axis/axes.js +0 -16
- package/lib/axis/axes.js.map +1 -1
- package/lib/axis/index.js +0 -7
- package/lib/axis/index.js.map +1 -1
- package/lib/bg.js +0 -6
- package/lib/bg.js.map +1 -1
- package/lib/container/actions.js +0 -1
- package/lib/container/actions.js.map +1 -1
- package/lib/container/index.js +4 -10
- package/lib/container/index.js.map +1 -1
- package/lib/container/marks.js +0 -2
- package/lib/container/marks.js.map +1 -1
- package/lib/container/middleware.js +0 -1
- package/lib/container/middleware.js.map +1 -1
- package/lib/container/reducer.js +0 -1
- package/lib/container/reducer.js.map +1 -1
- package/lib/coordinates-label.js +0 -11
- package/lib/coordinates-label.js.map +1 -1
- package/lib/graph-with-controls.js +3 -22
- package/lib/graph-with-controls.js.map +1 -1
- package/lib/graph.js +7 -26
- package/lib/graph.js.map +1 -1
- package/lib/grid-setup.js +0 -11
- package/lib/grid-setup.js.map +1 -1
- package/lib/grid.js +0 -22
- package/lib/grid.js.map +1 -1
- package/lib/index.js +0 -7
- package/lib/index.js.map +1 -1
- package/lib/labels.js +0 -13
- package/lib/labels.js.map +1 -1
- package/lib/mark-label.js +0 -16
- package/lib/mark-label.js.map +1 -1
- package/lib/toggle-bar.js +0 -17
- package/lib/toggle-bar.js.map +1 -1
- package/lib/tool-menu.js +0 -3
- package/lib/tool-menu.js.map +1 -1
- package/lib/tools/index.js +0 -1
- package/lib/tools/index.js.map +1 -1
- package/lib/tools/line/component.js +0 -13
- package/lib/tools/line/component.js.map +1 -1
- package/lib/tools/line/index.js +0 -1
- package/lib/tools/line/index.js.map +1 -1
- package/lib/tools/polygon/component.js +5 -25
- package/lib/tools/polygon/component.js.map +1 -1
- package/lib/tools/polygon/index.js +0 -12
- package/lib/tools/polygon/index.js.map +1 -1
- package/lib/tools/polygon/line.js +0 -16
- package/lib/tools/polygon/line.js.map +1 -1
- package/lib/tools/polygon/polygon.js +0 -19
- package/lib/tools/polygon/polygon.js.map +1 -1
- package/lib/tools/shared/arrow-head.js +0 -3
- package/lib/tools/shared/arrow-head.js.map +1 -1
- package/lib/tools/shared/line/index.js +7 -22
- package/lib/tools/shared/line/index.js.map +1 -1
- package/lib/tools/shared/line/line-path.js +0 -16
- package/lib/tools/shared/line/line-path.js.map +1 -1
- package/lib/tools/shared/line/with-root-edge.js +0 -11
- package/lib/tools/shared/line/with-root-edge.js.map +1 -1
- package/lib/tools/shared/point/arrow-point.js +2 -5
- package/lib/tools/shared/point/arrow-point.js.map +1 -1
- package/lib/tools/shared/point/arrow.js +0 -3
- package/lib/tools/shared/point/arrow.js.map +1 -1
- package/lib/tools/shared/point/base-point.js +0 -11
- package/lib/tools/shared/point/base-point.js.map +1 -1
- package/lib/tools/shared/point/index.js +0 -16
- package/lib/tools/shared/point/index.js.map +1 -1
- package/lib/tools/shared/styles.js +0 -1
- package/lib/tools/shared/styles.js.map +1 -1
- package/lib/tools/shared/types.js +0 -1
- package/lib/tools/shared/types.js.map +1 -1
- package/lib/undo-redo.js +0 -2
- package/lib/undo-redo.js.map +1 -1
- package/lib/use-debounce.js +0 -2
- package/lib/use-debounce.js.map +1 -1
- package/lib/utils.js +8 -26
- package/lib/utils.js.map +1 -1
- package/package.json +14 -11
- package/src/__tests__/bg.test.jsx +250 -0
- package/src/__tests__/coordinates-label.test.jsx +243 -0
- package/src/__tests__/graph-with-controls.test.jsx +9 -10
- package/src/__tests__/graph.test.jsx +0 -2
- package/src/__tests__/grid-setup.test.jsx +645 -0
- package/src/__tests__/mark-label.test.jsx +1 -1
- package/src/__tests__/tool-menu.test.jsx +422 -2
- package/src/__tests__/use-debounce.test.js +1 -1
- package/src/__tests__/utils.test.js +15 -61
- package/src/axis/__tests__/axes.test.jsx +1 -1
- package/src/axis/axes.jsx +7 -21
- package/src/axis/index.js +1 -0
- package/src/bg.jsx +1 -1
- package/src/container/__tests__/actions.test.js +105 -0
- package/src/container/__tests__/index.test.jsx +227 -0
- package/src/container/__tests__/marks.test.js +172 -0
- package/src/container/__tests__/middleware.test.js +235 -0
- package/src/container/__tests__/reducer.test.js +324 -0
- package/src/container/index.jsx +3 -4
- package/src/coordinates-label.jsx +1 -7
- package/src/graph-with-controls.jsx +7 -25
- package/src/graph.jsx +3 -4
- package/src/grid-setup.jsx +1 -1
- package/src/mark-label.jsx +2 -2
- package/src/toggle-bar.jsx +8 -1
- package/src/tool-menu.jsx +1 -1
- package/src/tools/line/__tests__/component.test.jsx +1 -0
- package/src/tools/line/component.jsx +2 -2
- package/src/tools/polygon/__tests__/component.test.jsx +417 -5
- package/src/tools/polygon/__tests__/polygon.test.jsx +1 -1
- package/src/tools/polygon/component.jsx +4 -14
- package/src/tools/polygon/line.jsx +1 -1
- package/src/tools/shared/line/__tests__/index.test.jsx +460 -17
- package/src/tools/shared/line/__tests__/line-path.test.jsx +7 -4
- package/src/tools/shared/line/__tests__/with-root-edge.test.jsx +439 -14
- package/src/tools/shared/line/index.jsx +4 -6
- package/src/tools/shared/line/line-path.jsx +2 -8
- package/src/tools/shared/point/__tests__/arrow.test.jsx +469 -0
- package/src/tools/shared/point/arrow-point.jsx +2 -2
- package/src/tools/shared/point/base-point.jsx +1 -1
- package/src/tools/shared/point/index.jsx +1 -1
- package/src/undo-redo.jsx +1 -3
- package/src/use-debounce.js +1 -1
- package/src/utils.js +1 -5
- package/NEXT.CHANGELOG.json +0 -16
package/src/mark-label.jsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import { styled } from '@mui/material/styles';
|
|
4
4
|
import AutosizeInput from 'react-input-autosize';
|
|
@@ -17,7 +17,7 @@ const StyledAutosizeInput = styled(AutosizeInput, {
|
|
|
17
17
|
border: `solid 1px ${disabled ? color.defaults.PRIMARY_DARK : markDisabled ? color.disabled() : color.defaults.SECONDARY}`,
|
|
18
18
|
borderRadius: '3px',
|
|
19
19
|
color: markDisabled ? color.disabled() : color.defaults.PRIMARY_DARK,
|
|
20
|
-
background:
|
|
20
|
+
background: disabled || markDisabled ? theme.palette.background.paper : 'transparent',
|
|
21
21
|
},
|
|
22
22
|
}));
|
|
23
23
|
|
package/src/toggle-bar.jsx
CHANGED
|
@@ -159,7 +159,14 @@ export class ToggleBar extends React.Component {
|
|
|
159
159
|
|
|
160
160
|
// DragTool functional component using @dnd-kit hooks
|
|
161
161
|
function DragTool({ children, index, draggable, toolRef, value }) {
|
|
162
|
-
const {
|
|
162
|
+
const {
|
|
163
|
+
attributes,
|
|
164
|
+
listeners,
|
|
165
|
+
setNodeRef: setDragNodeRef,
|
|
166
|
+
transform,
|
|
167
|
+
transition,
|
|
168
|
+
isDragging,
|
|
169
|
+
} = useDraggable({
|
|
163
170
|
id: `tool-${value}-${index}`,
|
|
164
171
|
disabled: !draggable,
|
|
165
172
|
data: {
|
package/src/tool-menu.jsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
|
-
import {
|
|
3
|
+
import { Button, Radio, Typography } from '@mui/material';
|
|
4
4
|
import { styled } from '@mui/material/styles';
|
|
5
5
|
|
|
6
6
|
export class ToolMenu extends React.Component {
|
|
@@ -2,6 +2,7 @@ import { render } from '@pie-lib/test-utils';
|
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { ArrowedLine } from '../component';
|
|
4
4
|
import { graphProps as getGraphProps } from '../../../__tests__/utils';
|
|
5
|
+
|
|
5
6
|
jest.mock('@pie-lib/plot', () => {
|
|
6
7
|
const a = jest.requireActual('@pie-lib/plot');
|
|
7
8
|
return {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { lineBase, lineToolComponent, styles } from '../shared/line';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import PropTypes from 'prop-types';
|
|
4
4
|
import { trig, types } from '@pie-lib/plot';
|
|
5
5
|
import { styled } from '@mui/material/styles';
|
|
6
6
|
import { ArrowMarker, genUid } from '../shared/arrow-head';
|
|
7
|
-
import {
|
|
7
|
+
import { getAdjustedGraphLimits, thinnerShapesNeeded } from '../../utils';
|
|
8
8
|
|
|
9
9
|
const StyledLine = styled('line', {
|
|
10
10
|
shouldForwardProp: (prop) => !['fill', 'disabled', 'correctness'].includes(prop),
|
|
@@ -2,7 +2,7 @@ import { render } from '@pie-lib/test-utils';
|
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { graphProps, xy } from '../../../__tests__/utils';
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { buildLines, RawBaseComponent, swap } from '../component';
|
|
6
6
|
|
|
7
7
|
const xyLabel = (x, y, index, label) => ({
|
|
8
8
|
...xy(x, y, index),
|
|
@@ -31,19 +31,42 @@ describe('swap', () => {
|
|
|
31
31
|
const result = swap([xy(0, 0, 0), xy(1, 1, 1), xy(2, 2, 2)], xy(0, 0, 0), xy(3, 3, 0));
|
|
32
32
|
expect(result).toEqual([xy(3, 3, 0), xy(1, 1, 1), xy(2, 2, 2)]);
|
|
33
33
|
});
|
|
34
|
+
|
|
35
|
+
it('swaps first element', () => {
|
|
36
|
+
const result = swap([xy(0, 0, 0), xy(1, 1, 1)], xy(0, 0, 0), xy(5, 5, 0));
|
|
37
|
+
expect(result).toEqual([xy(5, 5, 0), xy(1, 1, 1)]);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('swaps last element', () => {
|
|
41
|
+
const result = swap([xy(0, 0, 0), xy(1, 1, 1), xy(2, 2, 2)], xy(2, 2, 2), xy(3, 3, 2));
|
|
42
|
+
expect(result).toEqual([xy(0, 0, 0), xy(1, 1, 1), xy(3, 3, 2)]);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('swaps middle element', () => {
|
|
46
|
+
const result = swap([xy(0, 0, 0), xy(1, 1, 1), xy(2, 2, 2)], xy(1, 1, 1), xy(3, 3, 1));
|
|
47
|
+
expect(result).toEqual([xy(0, 0, 0), xy(3, 3, 1), xy(2, 2, 2)]);
|
|
48
|
+
});
|
|
34
49
|
});
|
|
35
50
|
|
|
36
51
|
// Note: Instance method tests have been removed. Component behavior should be tested
|
|
37
52
|
// through user interactions and integration tests.
|
|
38
53
|
describe('RawBaseComponent', () => {
|
|
39
|
-
let onChange
|
|
40
|
-
let onChangeProps
|
|
54
|
+
let onChange;
|
|
55
|
+
let onChangeProps;
|
|
56
|
+
let onClosePolygon;
|
|
57
|
+
|
|
58
|
+
beforeEach(() => {
|
|
59
|
+
onChange = jest.fn();
|
|
60
|
+
onChangeProps = jest.fn();
|
|
61
|
+
onClosePolygon = jest.fn();
|
|
62
|
+
});
|
|
63
|
+
|
|
41
64
|
const renderComponent = (extras) => {
|
|
42
65
|
const defaults = {
|
|
43
66
|
className: 'className',
|
|
44
67
|
onChange,
|
|
45
68
|
onChangeProps,
|
|
46
|
-
onClosePolygon
|
|
69
|
+
onClosePolygon,
|
|
47
70
|
graphProps: graphProps(),
|
|
48
71
|
points: [],
|
|
49
72
|
};
|
|
@@ -62,7 +85,7 @@ describe('RawBaseComponent', () => {
|
|
|
62
85
|
});
|
|
63
86
|
|
|
64
87
|
describe('rendering', () => {
|
|
65
|
-
it('renders', () => {
|
|
88
|
+
it('renders without crashing', () => {
|
|
66
89
|
const { container } = renderComponent();
|
|
67
90
|
expect(container.firstChild).toBeInTheDocument();
|
|
68
91
|
});
|
|
@@ -71,5 +94,394 @@ describe('RawBaseComponent', () => {
|
|
|
71
94
|
const { container } = renderWithLabels();
|
|
72
95
|
expect(container.firstChild).toBeInTheDocument();
|
|
73
96
|
});
|
|
97
|
+
|
|
98
|
+
it('renders with multiple points', () => {
|
|
99
|
+
const { container } = renderComponent({
|
|
100
|
+
points: [xy(0, 0, 0), xy(1, 1, 1), xy(2, 0, 2)],
|
|
101
|
+
});
|
|
102
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('renders with closed polygon', () => {
|
|
106
|
+
const { container } = renderComponent({
|
|
107
|
+
points: [xy(0, 0, 0), xy(1, 1, 1), xy(2, 0, 2)],
|
|
108
|
+
closed: true,
|
|
109
|
+
});
|
|
110
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('renders with single point', () => {
|
|
114
|
+
const { container } = renderComponent({
|
|
115
|
+
points: [xy(0, 0, 0)],
|
|
116
|
+
});
|
|
117
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('renders with two points', () => {
|
|
121
|
+
const { container } = renderComponent({
|
|
122
|
+
points: [xy(0, 0, 0), xy(1, 1, 1)],
|
|
123
|
+
});
|
|
124
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('renders empty polygon', () => {
|
|
128
|
+
const { container } = renderComponent({ points: [] });
|
|
129
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('renders with negative coordinates', () => {
|
|
133
|
+
const { container } = renderComponent({
|
|
134
|
+
points: [xy(-5, -5, 0), xy(-1, -1, 1), xy(-3, -2, 2)],
|
|
135
|
+
});
|
|
136
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it('renders with decimal coordinates', () => {
|
|
140
|
+
const { container } = renderComponent({
|
|
141
|
+
points: [xy(0.5, 0.5, 0), xy(1.5, 1.5, 1), xy(2.5, 0.5, 2)],
|
|
142
|
+
});
|
|
143
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('renders with large coordinate values', () => {
|
|
147
|
+
const { container } = renderComponent({
|
|
148
|
+
points: [xy(100, 100, 0), xy(200, 200, 1), xy(150, 250, 2)],
|
|
149
|
+
});
|
|
150
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
describe('states', () => {
|
|
155
|
+
it('renders in disabled state', () => {
|
|
156
|
+
const { container } = renderComponent({
|
|
157
|
+
points: [xy(0, 0, 0), xy(1, 1, 1), xy(2, 0, 2)],
|
|
158
|
+
disabled: true,
|
|
159
|
+
});
|
|
160
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('renders in enabled state', () => {
|
|
164
|
+
const { container } = renderComponent({
|
|
165
|
+
points: [xy(0, 0, 0), xy(1, 1, 1), xy(2, 0, 2)],
|
|
166
|
+
disabled: false,
|
|
167
|
+
});
|
|
168
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('renders with correctness correct', () => {
|
|
172
|
+
const { container } = renderComponent({
|
|
173
|
+
points: [xy(0, 0, 0), xy(1, 1, 1), xy(2, 0, 2)],
|
|
174
|
+
correctness: 'correct',
|
|
175
|
+
});
|
|
176
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it('renders with correctness incorrect', () => {
|
|
180
|
+
const { container } = renderComponent({
|
|
181
|
+
points: [xy(0, 0, 0), xy(1, 1, 1), xy(2, 0, 2)],
|
|
182
|
+
correctness: 'incorrect',
|
|
183
|
+
});
|
|
184
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('renders with building state', () => {
|
|
188
|
+
const { container } = renderComponent({
|
|
189
|
+
points: [xy(0, 0, 0), xy(1, 1, 1)],
|
|
190
|
+
building: true,
|
|
191
|
+
});
|
|
192
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it('renders with fill property', () => {
|
|
196
|
+
const { container } = renderComponent({
|
|
197
|
+
points: [xy(0, 0, 0), xy(1, 1, 1), xy(2, 0, 2)],
|
|
198
|
+
fill: '#ff0000',
|
|
199
|
+
});
|
|
200
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
describe('labels', () => {
|
|
205
|
+
it('renders with all points labeled', () => {
|
|
206
|
+
const { container } = renderWithLabels();
|
|
207
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('renders with partial labels', () => {
|
|
211
|
+
const partialLabels = [xyLabel(0, 0, 0, 'A'), xy(2, 2, 1), xyLabel(0, 2, 2, 'C')];
|
|
212
|
+
const { container } = renderComponent({
|
|
213
|
+
labelNode,
|
|
214
|
+
points: partialLabels,
|
|
215
|
+
});
|
|
216
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
it('renders with empty string labels', () => {
|
|
220
|
+
const emptyLabels = [xyLabel(0, 0, 0, ''), xyLabel(2, 2, 1, ''), xyLabel(0, 2, 2, '')];
|
|
221
|
+
const { container } = renderComponent({
|
|
222
|
+
labelNode,
|
|
223
|
+
points: emptyLabels,
|
|
224
|
+
});
|
|
225
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
it('renders without labelNode', () => {
|
|
229
|
+
const { container } = renderComponent({
|
|
230
|
+
points: [xyLabel(0, 0, 0, 'A'), xyLabel(2, 2, 1, 'B')],
|
|
231
|
+
});
|
|
232
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it('renders with labelModeEnabled', () => {
|
|
236
|
+
const { container } = renderWithLabels({ labelModeEnabled: true });
|
|
237
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it('renders with labelModeEnabled disabled', () => {
|
|
241
|
+
const { container } = renderWithLabels({ labelModeEnabled: false });
|
|
242
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
it('renders with long labels', () => {
|
|
246
|
+
const longLabels = [
|
|
247
|
+
xyLabel(0, 0, 0, 'Very Long Label Text'),
|
|
248
|
+
xyLabel(2, 2, 1, 'Another Long Label'),
|
|
249
|
+
xyLabel(0, 2, 2, 'Yet Another Long Label'),
|
|
250
|
+
];
|
|
251
|
+
const { container } = renderComponent({
|
|
252
|
+
labelNode,
|
|
253
|
+
points: longLabels,
|
|
254
|
+
});
|
|
255
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
describe('polygon shapes', () => {
|
|
260
|
+
it('renders triangle', () => {
|
|
261
|
+
const { container } = renderComponent({
|
|
262
|
+
points: [xy(0, 0, 0), xy(2, 0, 1), xy(1, 2, 2)],
|
|
263
|
+
closed: true,
|
|
264
|
+
});
|
|
265
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it('renders square', () => {
|
|
269
|
+
const { container } = renderComponent({
|
|
270
|
+
points: [xy(0, 0, 0), xy(2, 0, 1), xy(2, 2, 2), xy(0, 2, 3)],
|
|
271
|
+
closed: true,
|
|
272
|
+
});
|
|
273
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
it('renders pentagon', () => {
|
|
277
|
+
const { container } = renderComponent({
|
|
278
|
+
points: [xy(1, 0, 0), xy(2, 1, 1), xy(1.5, 2.5, 2), xy(0.5, 2.5, 3), xy(0, 1, 4)],
|
|
279
|
+
closed: true,
|
|
280
|
+
});
|
|
281
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
it('renders irregular polygon', () => {
|
|
285
|
+
const { container } = renderComponent({
|
|
286
|
+
points: [xy(0, 0, 0), xy(3, 1, 1), xy(2, 4, 2), xy(-1, 3, 3)],
|
|
287
|
+
closed: true,
|
|
288
|
+
});
|
|
289
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
describe('props', () => {
|
|
294
|
+
it('passes onChange callback', () => {
|
|
295
|
+
const customOnChange = jest.fn();
|
|
296
|
+
const { container } = renderComponent({
|
|
297
|
+
onChange: customOnChange,
|
|
298
|
+
points: [xy(0, 0, 0), xy(1, 1, 1)],
|
|
299
|
+
});
|
|
300
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it('passes onChangeProps callback', () => {
|
|
304
|
+
const customOnChangeProps = jest.fn();
|
|
305
|
+
const { container } = renderComponent({
|
|
306
|
+
onChangeProps: customOnChangeProps,
|
|
307
|
+
points: [xy(0, 0, 0), xy(1, 1, 1)],
|
|
308
|
+
});
|
|
309
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
it('passes onClick callback', () => {
|
|
313
|
+
const onClick = jest.fn();
|
|
314
|
+
const { container } = renderComponent({
|
|
315
|
+
onClick,
|
|
316
|
+
points: [xy(0, 0, 0), xy(1, 1, 1)],
|
|
317
|
+
});
|
|
318
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
it('passes onClosePolygon callback', () => {
|
|
322
|
+
const customOnClosePolygon = jest.fn();
|
|
323
|
+
const { container } = renderComponent({
|
|
324
|
+
onClosePolygon: customOnClosePolygon,
|
|
325
|
+
points: [xy(0, 0, 0), xy(1, 1, 1), xy(2, 0, 2)],
|
|
326
|
+
});
|
|
327
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
it('passes onDragStart callback', () => {
|
|
331
|
+
const onDragStart = jest.fn();
|
|
332
|
+
const { container } = renderComponent({
|
|
333
|
+
onDragStart,
|
|
334
|
+
points: [xy(0, 0, 0), xy(1, 1, 1)],
|
|
335
|
+
});
|
|
336
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
it('passes onDragStop callback', () => {
|
|
340
|
+
const onDragStop = jest.fn();
|
|
341
|
+
const { container } = renderComponent({
|
|
342
|
+
onDragStop,
|
|
343
|
+
points: [xy(0, 0, 0), xy(1, 1, 1)],
|
|
344
|
+
});
|
|
345
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
it('passes coordinatesOnHover', () => {
|
|
349
|
+
const { container } = renderComponent({
|
|
350
|
+
coordinatesOnHover: true,
|
|
351
|
+
points: [xy(0, 0, 0), xy(1, 1, 1)],
|
|
352
|
+
});
|
|
353
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
it('passes graphProps', () => {
|
|
357
|
+
const customGraphProps = graphProps(0, 10, 0, 10);
|
|
358
|
+
const { container } = renderComponent({
|
|
359
|
+
graphProps: customGraphProps,
|
|
360
|
+
points: [xy(5, 5, 0), xy(7, 7, 1)],
|
|
361
|
+
});
|
|
362
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it('passes gssLineData', () => {
|
|
366
|
+
const gssLineData = { selectedTool: 'solutionSet' };
|
|
367
|
+
const { container } = renderComponent({
|
|
368
|
+
gssLineData,
|
|
369
|
+
points: [xy(0, 0, 0), xy(1, 1, 1), xy(2, 0, 2)],
|
|
370
|
+
});
|
|
371
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
describe('edge cases', () => {
|
|
376
|
+
it('handles points with same coordinates', () => {
|
|
377
|
+
const { container } = renderComponent({
|
|
378
|
+
points: [xy(1, 1, 0), xy(1, 1, 1), xy(1, 1, 2)],
|
|
379
|
+
});
|
|
380
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
it('handles collinear points', () => {
|
|
384
|
+
const { container } = renderComponent({
|
|
385
|
+
points: [xy(0, 0, 0), xy(1, 1, 1), xy(2, 2, 2)],
|
|
386
|
+
});
|
|
387
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
it('handles very close points', () => {
|
|
391
|
+
const { container } = renderComponent({
|
|
392
|
+
points: [xy(1, 1, 0), xy(1.001, 1.001, 1), xy(1.002, 1.002, 2)],
|
|
393
|
+
});
|
|
394
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
it('handles mixed positive and negative coordinates', () => {
|
|
398
|
+
const { container } = renderComponent({
|
|
399
|
+
points: [xy(-5, 5, 0), xy(5, 5, 1), xy(5, -5, 2), xy(-5, -5, 3)],
|
|
400
|
+
closed: true,
|
|
401
|
+
});
|
|
402
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
it('handles points without explicit index', () => {
|
|
406
|
+
const { container } = renderComponent({
|
|
407
|
+
points: [
|
|
408
|
+
{ x: 0, y: 0 },
|
|
409
|
+
{ x: 1, y: 1 },
|
|
410
|
+
{ x: 2, y: 0 },
|
|
411
|
+
],
|
|
412
|
+
});
|
|
413
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
it('handles undefined properties', () => {
|
|
417
|
+
const { container } = renderComponent({
|
|
418
|
+
points: [xy(0, 0, 0), xy(1, 1, 1)],
|
|
419
|
+
disabled: undefined,
|
|
420
|
+
correctness: undefined,
|
|
421
|
+
building: undefined,
|
|
422
|
+
fill: undefined,
|
|
423
|
+
});
|
|
424
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
describe('integration', () => {
|
|
429
|
+
it('renders complete closed polygon with all features', () => {
|
|
430
|
+
const { container } = renderComponent({
|
|
431
|
+
points: points,
|
|
432
|
+
closed: true,
|
|
433
|
+
labelNode,
|
|
434
|
+
labelModeEnabled: true,
|
|
435
|
+
coordinatesOnHover: true,
|
|
436
|
+
correctness: 'correct',
|
|
437
|
+
disabled: false,
|
|
438
|
+
fill: '#00ff00',
|
|
439
|
+
gssLineData: { selectedTool: 'solutionSet' },
|
|
440
|
+
onChange: jest.fn(),
|
|
441
|
+
onChangeProps: jest.fn(),
|
|
442
|
+
onClosePolygon: jest.fn(),
|
|
443
|
+
onClick: jest.fn(),
|
|
444
|
+
onDragStart: jest.fn(),
|
|
445
|
+
onDragStop: jest.fn(),
|
|
446
|
+
});
|
|
447
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
it('renders building polygon', () => {
|
|
451
|
+
const { container } = renderComponent({
|
|
452
|
+
points: [xy(0, 0, 0), xy(1, 1, 1)],
|
|
453
|
+
building: true,
|
|
454
|
+
closed: false,
|
|
455
|
+
});
|
|
456
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
it('renders disabled polygon with labels', () => {
|
|
460
|
+
const { container } = renderComponent({
|
|
461
|
+
points: points,
|
|
462
|
+
labelNode,
|
|
463
|
+
disabled: true,
|
|
464
|
+
closed: true,
|
|
465
|
+
});
|
|
466
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
it('renders polygon in solution set mode', () => {
|
|
470
|
+
const { container } = renderComponent({
|
|
471
|
+
points: points,
|
|
472
|
+
closed: true,
|
|
473
|
+
gssLineData: { selectedTool: 'solutionSet' },
|
|
474
|
+
});
|
|
475
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
476
|
+
});
|
|
477
|
+
|
|
478
|
+
it('renders polygon with incorrect correctness', () => {
|
|
479
|
+
const { container } = renderComponent({
|
|
480
|
+
points: points,
|
|
481
|
+
closed: true,
|
|
482
|
+
correctness: 'incorrect',
|
|
483
|
+
});
|
|
484
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
485
|
+
});
|
|
74
486
|
});
|
|
75
487
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { render } from '@pie-lib/test-utils';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { getPointString, Polygon } from '../polygon';
|
|
4
4
|
import { graphProps } from '../../../__tests__/utils';
|
|
5
5
|
|
|
6
6
|
const xy = (x, y) => ({ x, y });
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import { ToolPropTypeFields } from '../shared/types';
|
|
4
|
-
import chunk from 'lodash
|
|
5
|
-
import initial from 'lodash/initial';
|
|
4
|
+
import { chunk, initial, isEmpty } from 'lodash-es';
|
|
6
5
|
import debug from 'debug';
|
|
7
6
|
import DraggablePolygon from './polygon';
|
|
8
7
|
import { types } from '@pie-lib/plot';
|
|
9
8
|
import invariant from 'invariant';
|
|
10
9
|
import ReactDOM from 'react-dom';
|
|
11
10
|
import MarkLabel from '../../mark-label';
|
|
12
|
-
import
|
|
13
|
-
import { getMiddleOfTwoPoints, getRightestPoints, equalPoints } from '../../utils';
|
|
11
|
+
import { equalPoints, getMiddleOfTwoPoints, getRightestPoints } from '../../utils';
|
|
14
12
|
|
|
15
13
|
const log = debug('pie-lib:graphing-solution-set:polygon');
|
|
16
14
|
|
|
@@ -161,16 +159,8 @@ export class RawBaseComponent extends React.Component {
|
|
|
161
159
|
};
|
|
162
160
|
|
|
163
161
|
clickPoint = (point, index, data) => {
|
|
164
|
-
const {
|
|
165
|
-
|
|
166
|
-
disabled,
|
|
167
|
-
onClick,
|
|
168
|
-
isToolActive,
|
|
169
|
-
labelModeEnabled,
|
|
170
|
-
onChangeProps,
|
|
171
|
-
onChangeLabelProps,
|
|
172
|
-
points,
|
|
173
|
-
} = this.props;
|
|
162
|
+
const { closed, disabled, onClick, isToolActive, labelModeEnabled, onChangeProps, onChangeLabelProps, points } =
|
|
163
|
+
this.props;
|
|
174
164
|
|
|
175
165
|
if (labelModeEnabled) {
|
|
176
166
|
if (disabled) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import { styled } from '@mui/material/styles';
|
|
4
|
-
import {
|
|
4
|
+
import { gridDraggable, types } from '@pie-lib/plot';
|
|
5
5
|
import { color } from '@pie-lib/render-ui';
|
|
6
6
|
import * as utils from '../../utils';
|
|
7
7
|
import { correct, disabled, incorrect, missing } from '../shared/styles';
|