@pie-lib/graphing-solution-set 2.16.0-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 (151) hide show
  1. package/CHANGELOG.json +1 -0
  2. package/CHANGELOG.md +16 -0
  3. package/LICENSE.md +5 -0
  4. package/NEXT.CHANGELOG.json +1 -0
  5. package/lib/__tests__/graph-with-controls.test.js +191 -0
  6. package/lib/__tests__/graph.test.js +290 -0
  7. package/lib/__tests__/grid.test.js +40 -0
  8. package/lib/__tests__/labels.test.js +59 -0
  9. package/lib/__tests__/mark-label.test.js +154 -0
  10. package/lib/__tests__/toggle-bar.test.js +54 -0
  11. package/lib/__tests__/tool-menu.test.js +43 -0
  12. package/lib/__tests__/undo-redo.test.js +42 -0
  13. package/lib/__tests__/use-debounce.test.js +28 -0
  14. package/lib/__tests__/utils.js +72 -0
  15. package/lib/__tests__/utils.test.js +133 -0
  16. package/lib/axis/__tests__/arrow.test.js +68 -0
  17. package/lib/axis/__tests__/axes.test.js +214 -0
  18. package/lib/axis/arrow.js +115 -0
  19. package/lib/axis/axes.js +415 -0
  20. package/lib/axis/index.js +26 -0
  21. package/lib/bg.js +139 -0
  22. package/lib/container/actions.js +24 -0
  23. package/lib/container/index.js +166 -0
  24. package/lib/container/marks.js +27 -0
  25. package/lib/container/middleware.js +25 -0
  26. package/lib/container/reducer.js +25 -0
  27. package/lib/coordinates-label.js +109 -0
  28. package/lib/graph-with-controls.js +372 -0
  29. package/lib/graph.js +419 -0
  30. package/lib/grid-setup.js +462 -0
  31. package/lib/grid.js +176 -0
  32. package/lib/index.js +51 -0
  33. package/lib/labels.js +299 -0
  34. package/lib/mark-label.js +208 -0
  35. package/lib/toggle-bar.js +336 -0
  36. package/lib/tool-menu.js +325 -0
  37. package/lib/tools/index.js +29 -0
  38. package/lib/tools/line/__tests__/component.test.js +56 -0
  39. package/lib/tools/line/component.js +106 -0
  40. package/lib/tools/line/index.js +16 -0
  41. package/lib/tools/polygon/__tests__/component.test.js +245 -0
  42. package/lib/tools/polygon/__tests__/index.test.js +95 -0
  43. package/lib/tools/polygon/__tests__/line.test.js +43 -0
  44. package/lib/tools/polygon/__tests__/polygon.test.js +73 -0
  45. package/lib/tools/polygon/component.js +457 -0
  46. package/lib/tools/polygon/index.js +106 -0
  47. package/lib/tools/polygon/line.js +151 -0
  48. package/lib/tools/polygon/polygon.js +171 -0
  49. package/lib/tools/shared/__tests__/arrow-head.test.js +62 -0
  50. package/lib/tools/shared/arrow-head.js +75 -0
  51. package/lib/tools/shared/line/__tests__/index.test.js +291 -0
  52. package/lib/tools/shared/line/__tests__/line-path.test.js +78 -0
  53. package/lib/tools/shared/line/__tests__/with-root-edge.test.js +122 -0
  54. package/lib/tools/shared/line/index.js +637 -0
  55. package/lib/tools/shared/line/line-path.js +145 -0
  56. package/lib/tools/shared/line/with-root-edge.js +155 -0
  57. package/lib/tools/shared/point/__tests__/arrow-point.test.js +137 -0
  58. package/lib/tools/shared/point/__tests__/base-point.test.js +134 -0
  59. package/lib/tools/shared/point/arrow-point.js +113 -0
  60. package/lib/tools/shared/point/arrow.js +96 -0
  61. package/lib/tools/shared/point/base-point.js +151 -0
  62. package/lib/tools/shared/point/index.js +94 -0
  63. package/lib/tools/shared/styles.js +49 -0
  64. package/lib/tools/shared/types.js +19 -0
  65. package/lib/undo-redo.js +107 -0
  66. package/lib/use-debounce.js +32 -0
  67. package/lib/utils.js +314 -0
  68. package/package.json +50 -0
  69. package/src/__tests__/__snapshots__/graph-with-controls.test.jsx.snap +114 -0
  70. package/src/__tests__/__snapshots__/graph.test.jsx.snap +213 -0
  71. package/src/__tests__/__snapshots__/grid.test.jsx.snap +54 -0
  72. package/src/__tests__/__snapshots__/labels.test.jsx.snap +30 -0
  73. package/src/__tests__/__snapshots__/mark-label.test.jsx.snap +37 -0
  74. package/src/__tests__/__snapshots__/toggle-bar.test.jsx.snap +7 -0
  75. package/src/__tests__/__snapshots__/tool-menu.test.jsx.snap +35 -0
  76. package/src/__tests__/__snapshots__/undo-redo.test.jsx.snap +15 -0
  77. package/src/__tests__/graph-with-controls.test.jsx +131 -0
  78. package/src/__tests__/graph.test.jsx +230 -0
  79. package/src/__tests__/grid.test.jsx +20 -0
  80. package/src/__tests__/labels.test.jsx +38 -0
  81. package/src/__tests__/mark-label.test.jsx +68 -0
  82. package/src/__tests__/toggle-bar.test.jsx +36 -0
  83. package/src/__tests__/tool-menu.test.jsx +29 -0
  84. package/src/__tests__/undo-redo.test.jsx +25 -0
  85. package/src/__tests__/use-debounce.test.js +21 -0
  86. package/src/__tests__/utils.js +38 -0
  87. package/src/__tests__/utils.test.js +151 -0
  88. package/src/axis/__tests__/__snapshots__/arrow.test.jsx.snap +33 -0
  89. package/src/axis/__tests__/__snapshots__/axes.test.jsx.snap +122 -0
  90. package/src/axis/__tests__/arrow.test.jsx +39 -0
  91. package/src/axis/__tests__/axes.test.jsx +220 -0
  92. package/src/axis/arrow.jsx +62 -0
  93. package/src/axis/axes.jsx +307 -0
  94. package/src/axis/index.js +2 -0
  95. package/src/bg.jsx +96 -0
  96. package/src/container/actions.js +8 -0
  97. package/src/container/index.jsx +86 -0
  98. package/src/container/marks.js +14 -0
  99. package/src/container/middleware.js +7 -0
  100. package/src/container/reducer.js +5 -0
  101. package/src/coordinates-label.jsx +73 -0
  102. package/src/graph-with-controls.jsx +263 -0
  103. package/src/graph.jsx +334 -0
  104. package/src/grid-setup.jsx +427 -0
  105. package/src/grid.jsx +135 -0
  106. package/src/index.js +7 -0
  107. package/src/labels.jsx +214 -0
  108. package/src/mark-label.jsx +136 -0
  109. package/src/toggle-bar.jsx +242 -0
  110. package/src/tool-menu.jsx +294 -0
  111. package/src/tools/index.js +8 -0
  112. package/src/tools/line/__tests__/__snapshots__/component.test.jsx.snap +20 -0
  113. package/src/tools/line/__tests__/component.test.jsx +36 -0
  114. package/src/tools/line/component.jsx +77 -0
  115. package/src/tools/line/index.js +4 -0
  116. package/src/tools/polygon/__tests__/__snapshots__/component.test.jsx.snap +94 -0
  117. package/src/tools/polygon/__tests__/__snapshots__/line.test.jsx.snap +44 -0
  118. package/src/tools/polygon/__tests__/__snapshots__/polygon.test.jsx.snap +53 -0
  119. package/src/tools/polygon/__tests__/component.test.jsx +214 -0
  120. package/src/tools/polygon/__tests__/index.test.js +65 -0
  121. package/src/tools/polygon/__tests__/line.test.jsx +25 -0
  122. package/src/tools/polygon/__tests__/polygon.test.jsx +44 -0
  123. package/src/tools/polygon/component.jsx +336 -0
  124. package/src/tools/polygon/index.js +52 -0
  125. package/src/tools/polygon/line.jsx +78 -0
  126. package/src/tools/polygon/polygon.jsx +101 -0
  127. package/src/tools/shared/__tests__/__snapshots__/arrow-head.test.jsx.snap +32 -0
  128. package/src/tools/shared/__tests__/arrow-head.test.jsx +34 -0
  129. package/src/tools/shared/arrow-head.jsx +46 -0
  130. package/src/tools/shared/line/__tests__/__snapshots__/index.test.jsx.snap +360 -0
  131. package/src/tools/shared/line/__tests__/__snapshots__/line-path.test.jsx.snap +57 -0
  132. package/src/tools/shared/line/__tests__/__snapshots__/with-root-edge.test.jsx.snap +63 -0
  133. package/src/tools/shared/line/__tests__/index.test.jsx +247 -0
  134. package/src/tools/shared/line/__tests__/line-path.test.jsx +53 -0
  135. package/src/tools/shared/line/__tests__/with-root-edge.test.jsx +73 -0
  136. package/src/tools/shared/line/index.jsx +473 -0
  137. package/src/tools/shared/line/line-path.jsx +88 -0
  138. package/src/tools/shared/line/with-root-edge.jsx +97 -0
  139. package/src/tools/shared/point/__tests__/__snapshots__/arrow-point.test.jsx.snap +55 -0
  140. package/src/tools/shared/point/__tests__/__snapshots__/base-point.test.jsx.snap +43 -0
  141. package/src/tools/shared/point/__tests__/arrow-point.test.jsx +87 -0
  142. package/src/tools/shared/point/__tests__/base-point.test.jsx +84 -0
  143. package/src/tools/shared/point/arrow-point.jsx +60 -0
  144. package/src/tools/shared/point/arrow.jsx +40 -0
  145. package/src/tools/shared/point/base-point.jsx +86 -0
  146. package/src/tools/shared/point/index.jsx +60 -0
  147. package/src/tools/shared/styles.js +20 -0
  148. package/src/tools/shared/types.js +8 -0
  149. package/src/undo-redo.jsx +47 -0
  150. package/src/use-debounce.js +13 -0
  151. package/src/utils.js +234 -0
@@ -0,0 +1,122 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`RawXAxis snapshot renders 1`] = `
4
+ <Fragment>
5
+ <F
6
+ left={0}
7
+ scale={[MockFunction]}
8
+ tickFormat={[Function]}
9
+ tickLabelProps={[Function]}
10
+ top={0}
11
+ />
12
+ <WithStyles(Arrow)
13
+ direction="left"
14
+ scale={
15
+ Object {
16
+ "x": [MockFunction],
17
+ "y": [MockFunction] {
18
+ "calls": Array [
19
+ Array [
20
+ 0,
21
+ ],
22
+ ],
23
+ "results": Array [
24
+ Object {
25
+ "type": "return",
26
+ "value": 0,
27
+ },
28
+ ],
29
+ },
30
+ }
31
+ }
32
+ x={0}
33
+ y={0}
34
+ />
35
+ <WithStyles(Arrow)
36
+ direction="right"
37
+ scale={
38
+ Object {
39
+ "x": [MockFunction],
40
+ "y": [MockFunction] {
41
+ "calls": Array [
42
+ Array [
43
+ 0,
44
+ ],
45
+ ],
46
+ "results": Array [
47
+ Object {
48
+ "type": "return",
49
+ "value": 0,
50
+ },
51
+ ],
52
+ },
53
+ }
54
+ }
55
+ x={1}
56
+ y={0}
57
+ />
58
+ </Fragment>
59
+ `;
60
+
61
+ exports[`RawYAxis snapshot renders 1`] = `
62
+ <Fragment>
63
+ <F
64
+ height={400}
65
+ hideZero={true}
66
+ left={0}
67
+ orientation="left"
68
+ scale={[MockFunction]}
69
+ tickFormat={[Function]}
70
+ tickLabelProps={[Function]}
71
+ tickLength={10}
72
+ tickTextAnchor="bottom"
73
+ top={0}
74
+ />
75
+ <WithStyles(Arrow)
76
+ direction="down"
77
+ scale={
78
+ Object {
79
+ "x": [MockFunction] {
80
+ "calls": Array [
81
+ Array [
82
+ 0,
83
+ ],
84
+ ],
85
+ "results": Array [
86
+ Object {
87
+ "type": "return",
88
+ "value": 0,
89
+ },
90
+ ],
91
+ },
92
+ "y": [MockFunction],
93
+ }
94
+ }
95
+ x={0}
96
+ y={0}
97
+ />
98
+ <WithStyles(Arrow)
99
+ direction="up"
100
+ scale={
101
+ Object {
102
+ "x": [MockFunction] {
103
+ "calls": Array [
104
+ Array [
105
+ 0,
106
+ ],
107
+ ],
108
+ "results": Array [
109
+ Object {
110
+ "type": "return",
111
+ "value": 0,
112
+ },
113
+ ],
114
+ },
115
+ "y": [MockFunction],
116
+ }
117
+ }
118
+ x={0}
119
+ y={1}
120
+ />
121
+ </Fragment>
122
+ `;
@@ -0,0 +1,39 @@
1
+ import { shallow } from 'enzyme';
2
+ import React from 'react';
3
+ import { Arrow } from '../arrow';
4
+
5
+ describe('Arrow', () => {
6
+ let w;
7
+ let onChange = jest.fn();
8
+ const wrapper = (extras) => {
9
+ const defaults = {
10
+ classes: {},
11
+ className: 'className',
12
+ onChange,
13
+ scale: {
14
+ x: jest.fn((n) => n),
15
+ y: jest.fn((n) => n),
16
+ },
17
+ };
18
+ const props = { ...defaults, ...extras };
19
+ return shallow(<Arrow {...props} />);
20
+ };
21
+ describe('snapshot', () => {
22
+ it('up', () => {
23
+ w = wrapper({ direction: 'up' });
24
+ expect(w).toMatchSnapshot();
25
+ });
26
+ it('down', () => {
27
+ w = wrapper({ direction: 'down' });
28
+ expect(w).toMatchSnapshot();
29
+ });
30
+ it('left', () => {
31
+ w = wrapper({ direction: 'left' });
32
+ expect(w).toMatchSnapshot();
33
+ });
34
+ it('right', () => {
35
+ w = wrapper({ direction: 'right' });
36
+ expect(w).toMatchSnapshot();
37
+ });
38
+ });
39
+ });
@@ -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
+ });
@@ -0,0 +1,62 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import classNames from 'classnames';
5
+ import { withStyles } from '@material-ui/core/styles';
6
+ import { types } from '@pie-lib/plot';
7
+
8
+ const style = (theme) => ({
9
+ root: {
10
+ fill: `var(--arrow-color, ${theme.palette.common.black})`,
11
+ },
12
+ });
13
+
14
+ export class Arrow extends React.Component {
15
+ render() {
16
+ const { x, y, classes, className, scale } = this.props;
17
+ const names = classNames(classes.root, className);
18
+ let direction = this.props.direction || 'left';
19
+
20
+ const xv = scale.x(x);
21
+ const yv = scale.y(y);
22
+
23
+ let transform = '';
24
+
25
+ const getTransform = (x, y, rotate) => `translate(${x}, ${y}) rotate(${rotate})`;
26
+
27
+ if (direction === 'left') {
28
+ transform = getTransform(xv - 15, yv, 0);
29
+ }
30
+
31
+ if (direction === 'right') {
32
+ transform = getTransform(xv + 15, yv, 180);
33
+ }
34
+
35
+ if (direction === 'up') {
36
+ transform = getTransform(xv, yv - 15, 90);
37
+ }
38
+
39
+ if (direction === 'down') {
40
+ transform = getTransform(xv, yv + 15, 270);
41
+ }
42
+
43
+ return <path d="m 0,0 8,-5 0,10 -8,-5" transform={transform} className={names} />;
44
+ }
45
+ }
46
+
47
+ Arrow.propTypes = {
48
+ y: PropTypes.number,
49
+ x: PropTypes.number,
50
+ direction: PropTypes.oneOf(['left', 'right', 'up', 'down']),
51
+ classes: PropTypes.object.isRequired,
52
+ className: PropTypes.string,
53
+ scale: types.ScaleType.isRequired,
54
+ };
55
+
56
+ Arrow.defaultProps = {
57
+ y: 0,
58
+ x: 0,
59
+ direction: 'left',
60
+ };
61
+
62
+ export default withStyles(style)(Arrow);