@pie-lib/graphing 2.7.0 → 2.8.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 (104) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/lib/axis/arrow.js +15 -25
  3. package/lib/axis/arrow.js.map +1 -1
  4. package/lib/axis/axes.js +41 -73
  5. package/lib/axis/axes.js.map +1 -1
  6. package/lib/axis/index.js +1 -1
  7. package/lib/bg.js +20 -31
  8. package/lib/bg.js.map +1 -1
  9. package/lib/container/index.js +27 -41
  10. package/lib/container/index.js.map +1 -1
  11. package/lib/container/reducer.js +2 -2
  12. package/lib/container/reducer.js.map +1 -1
  13. package/lib/coordinates-label.js +5 -5
  14. package/lib/coordinates-label.js.map +1 -1
  15. package/lib/graph-with-controls.js +37 -38
  16. package/lib/graph-with-controls.js.map +1 -1
  17. package/lib/graph.js +43 -69
  18. package/lib/graph.js.map +1 -1
  19. package/lib/grid-setup.js +6 -6
  20. package/lib/grid-setup.js.map +1 -1
  21. package/lib/grid.js +28 -46
  22. package/lib/grid.js.map +1 -1
  23. package/lib/index.js +3 -3
  24. package/lib/index.js.map +1 -1
  25. package/lib/labels.js +22 -38
  26. package/lib/labels.js.map +1 -1
  27. package/lib/mark-label.js +10 -20
  28. package/lib/mark-label.js.map +1 -1
  29. package/lib/toggle-bar.js +177 -45
  30. package/lib/toggle-bar.js.map +1 -1
  31. package/lib/tool-menu.js +49 -32
  32. package/lib/tool-menu.js.map +1 -1
  33. package/lib/tools/circle/bg-circle.js +27 -38
  34. package/lib/tools/circle/bg-circle.js.map +1 -1
  35. package/lib/tools/circle/component.js +36 -54
  36. package/lib/tools/circle/component.js.map +1 -1
  37. package/lib/tools/circle/index.js +5 -5
  38. package/lib/tools/circle/index.js.map +1 -1
  39. package/lib/tools/line/component.js +11 -25
  40. package/lib/tools/line/component.js.map +1 -1
  41. package/lib/tools/line/index.js +2 -2
  42. package/lib/tools/line/index.js.map +1 -1
  43. package/lib/tools/parabola/component.js +2 -2
  44. package/lib/tools/parabola/component.js.map +1 -1
  45. package/lib/tools/parabola/index.js +5 -5
  46. package/lib/tools/parabola/index.js.map +1 -1
  47. package/lib/tools/point/component.js +30 -47
  48. package/lib/tools/point/component.js.map +1 -1
  49. package/lib/tools/point/index.js +5 -5
  50. package/lib/tools/point/index.js.map +1 -1
  51. package/lib/tools/polygon/component.js +59 -107
  52. package/lib/tools/polygon/component.js.map +1 -1
  53. package/lib/tools/polygon/index.js +9 -19
  54. package/lib/tools/polygon/index.js.map +1 -1
  55. package/lib/tools/polygon/line.js +28 -41
  56. package/lib/tools/polygon/line.js.map +1 -1
  57. package/lib/tools/polygon/polygon.js +28 -42
  58. package/lib/tools/polygon/polygon.js.map +1 -1
  59. package/lib/tools/ray/component.js +11 -25
  60. package/lib/tools/ray/component.js.map +1 -1
  61. package/lib/tools/ray/index.js +2 -2
  62. package/lib/tools/ray/index.js.map +1 -1
  63. package/lib/tools/segment/component.js +8 -11
  64. package/lib/tools/segment/component.js.map +1 -1
  65. package/lib/tools/segment/index.js +2 -2
  66. package/lib/tools/segment/index.js.map +1 -1
  67. package/lib/tools/shared/arrow-head.js +2 -2
  68. package/lib/tools/shared/arrow-head.js.map +1 -1
  69. package/lib/tools/shared/line/index.js +43 -66
  70. package/lib/tools/shared/line/index.js.map +1 -1
  71. package/lib/tools/shared/line/line-path.js +29 -42
  72. package/lib/tools/shared/line/line-path.js.map +1 -1
  73. package/lib/tools/shared/line/with-root-edge.js +12 -14
  74. package/lib/tools/shared/line/with-root-edge.js.map +1 -1
  75. package/lib/tools/shared/point/arrow-point.js +24 -39
  76. package/lib/tools/shared/point/arrow-point.js.map +1 -1
  77. package/lib/tools/shared/point/arrow.js +23 -37
  78. package/lib/tools/shared/point/arrow.js.map +1 -1
  79. package/lib/tools/shared/point/base-point.js +24 -38
  80. package/lib/tools/shared/point/base-point.js.map +1 -1
  81. package/lib/tools/shared/point/index.js +6 -6
  82. package/lib/tools/shared/point/index.js.map +1 -1
  83. package/lib/tools/shared/styles.js +7 -5
  84. package/lib/tools/shared/styles.js.map +1 -1
  85. package/lib/tools/shared/types.js +2 -2
  86. package/lib/tools/shared/types.js.map +1 -1
  87. package/lib/tools/sine/component.js +2 -2
  88. package/lib/tools/sine/component.js.map +1 -1
  89. package/lib/tools/sine/index.js +5 -5
  90. package/lib/tools/sine/index.js.map +1 -1
  91. package/lib/tools/vector/component.js +8 -11
  92. package/lib/tools/vector/component.js.map +1 -1
  93. package/lib/tools/vector/index.js +2 -2
  94. package/lib/tools/vector/index.js.map +1 -1
  95. package/lib/undo-redo.js +19 -31
  96. package/lib/undo-redo.js.map +1 -1
  97. package/lib/use-debounce.js +5 -13
  98. package/lib/use-debounce.js.map +1 -1
  99. package/lib/utils.js +2 -2
  100. package/lib/utils.js.map +1 -1
  101. package/package.json +4 -3
  102. package/src/graph-with-controls.jsx +10 -0
  103. package/src/toggle-bar.jsx +143 -13
  104. package/src/tool-menu.jsx +15 -0
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "2.7.0",
6
+ "version": "2.8.0",
7
7
  "description": "Graphing components",
8
8
  "keywords": [
9
9
  "react",
@@ -18,9 +18,10 @@
18
18
  "dependencies": {
19
19
  "@mapbox/point-geometry": "^0.1.0",
20
20
  "@material-ui/core": "^3.8.3",
21
+ "@pie-lib/drag": "^1.1.52",
21
22
  "@pie-lib/graphing-utils": "^1.1.20",
22
23
  "@pie-lib/plot": "^2.2.0",
23
- "@pie-lib/render-ui": "^4.12.9",
24
+ "@pie-lib/render-ui": "^4.13.0",
24
25
  "@vx/axis": "^0.0.189",
25
26
  "@vx/clip-path": "^0.0.189",
26
27
  "@vx/event": "^0.0.189",
@@ -43,6 +44,6 @@
43
44
  "peerDependencies": {
44
45
  "react": "^16.8.1"
45
46
  },
46
- "gitHead": "2f841d92dcda7472f18cbce517eb664dec2f6442",
47
+ "gitHead": "f766e0fdb9e51a9449324db51ccaa93904211710",
47
48
  "scripts": {}
48
49
  }
@@ -54,6 +54,12 @@ const Collapsible = ({ classes, children, title }) => (
54
54
  </ExpansionPanel>
55
55
  );
56
56
 
57
+ Collapsible.propTypes = {
58
+ classes: PropTypes.object,
59
+ children: PropTypes.array,
60
+ title: PropTypes.string
61
+ };
62
+
57
63
  export class GraphWithControls extends React.Component {
58
64
  static propTypes = {
59
65
  ...graphPropTypes,
@@ -104,8 +110,10 @@ export class GraphWithControls extends React.Component {
104
110
  collapsibleToolbarTitle,
105
111
  disabled,
106
112
  domain,
113
+ draggableTools,
107
114
  labels,
108
115
  onChangeMarks,
116
+ onChangeTools,
109
117
  onUndo,
110
118
  onRedo,
111
119
  onReset,
@@ -136,10 +144,12 @@ export class GraphWithControls extends React.Component {
136
144
  <ToolMenu
137
145
  currentToolType={currentTool && currentTool.type}
138
146
  disabled={!!disabled}
147
+ draggableTools={draggableTools}
139
148
  labelModeEnabled={labelModeEnabled}
140
149
  onChange={tool => this.changeCurrentTool(tool, tools)}
141
150
  onToggleLabelMode={this.toggleLabelMode}
142
151
  toolbarTools={toolbarTools}
152
+ onChangeTools={onChangeTools}
143
153
  />
144
154
 
145
155
  {!disabled && <UndoRedo onUndo={onUndo} onRedo={onRedo} onReset={onReset} />}
@@ -5,6 +5,7 @@ import cn from 'classnames';
5
5
  import Button from '@material-ui/core/Button';
6
6
  import { color } from '@pie-lib/render-ui';
7
7
  import { allTools } from './tools/index';
8
+ import { withDragContext, DragSource, DropTarget } from '@pie-lib/drag';
8
9
 
9
10
  const buttonStyles = () => ({
10
11
  root: {
@@ -52,6 +53,7 @@ export const MiniButton = withStyles(buttonStyles)(props => {
52
53
 
53
54
  MiniButton.propTypes = {
54
55
  disabled: PropTypes.bool,
56
+ classes: PropTypes.object,
55
57
  className: PropTypes.string,
56
58
  disabledClassName: PropTypes.string,
57
59
  selected: PropTypes.bool,
@@ -66,31 +68,53 @@ export class ToggleBar extends React.Component {
66
68
  options: PropTypes.arrayOf(PropTypes.string),
67
69
  selectedToolType: PropTypes.string,
68
70
  disabled: PropTypes.bool,
69
- onChange: PropTypes.func
71
+ draggableTools: PropTypes.bool,
72
+ onChange: PropTypes.func,
73
+ onChangeToolsOrder: PropTypes.func
70
74
  };
71
75
 
72
76
  static defaultProps = {};
73
77
 
74
78
  select = e => this.props.onChange(e.target.textContent);
75
79
 
80
+ moveTool = (dragIndex, hoverIndex) => {
81
+ const { options, onChangeToolsOrder } = this.props;
82
+ const dragged = options[dragIndex];
83
+
84
+ options.splice(dragIndex, 1);
85
+ options.splice(hoverIndex, 0, dragged);
86
+
87
+ onChangeToolsOrder(options);
88
+ };
89
+
76
90
  render() {
77
- const { classes, className, disabled, options, selectedToolType } = this.props;
91
+ const { classes, className, disabled, options, selectedToolType, draggableTools } = this.props;
92
+
78
93
  return (
79
- <div className={cn(className)}>
80
- {(options || []).map(option => {
94
+ <div className={cn(className, classes.toolsContainer)}>
95
+ {(options || []).map((option, index) => {
81
96
  if ((allTools || []).includes(option)) {
82
97
  const isSelected = option === selectedToolType;
98
+ const toolRef = React.createRef();
83
99
 
84
100
  return (
85
- <MiniButton
101
+ <DragTool
86
102
  key={option}
87
- className={cn(classes.button, isSelected && classes.selected)}
88
- disabled={disabled}
89
- disableRipple={true}
90
- onClick={this.select}
91
- value={option}
92
- selected={isSelected}
93
- />
103
+ index={index}
104
+ draggable={draggableTools}
105
+ moveTool={this.moveTool}
106
+ classes={classes}
107
+ toolRef={toolRef}
108
+ >
109
+ <MiniButton
110
+ className={cn(classes.button, isSelected && classes.selected)}
111
+ disabled={disabled}
112
+ disableRipple={true}
113
+ onClick={this.select}
114
+ value={option}
115
+ selected={isSelected}
116
+ />
117
+ </DragTool>
94
118
  );
95
119
  }
96
120
  })}
@@ -100,12 +124,118 @@ export class ToggleBar extends React.Component {
100
124
  }
101
125
 
102
126
  const styles = theme => ({
127
+ toolsContainer: {
128
+ display: 'flex',
129
+ flexWrap: 'wrap'
130
+ },
103
131
  button: {
104
132
  marginRight: theme.spacing.unit / 2,
105
133
  marginBottom: theme.spacing.unit / 2,
106
134
  color: color.text(),
107
135
  backgroundColor: color.background()
136
+ },
137
+ under: {
138
+ position: 'absolute',
139
+ top: 0,
140
+ left: 0,
141
+ zIndex: -1,
142
+ pointerEvents: 'none'
143
+ },
144
+ wrapper: {
145
+ position: 'relative'
146
+ },
147
+ hidden: {
148
+ opacity: 0
149
+ }
150
+ });
151
+
152
+ export default withDragContext(withStyles(styles)(ToggleBar));
153
+
154
+ const DRAG_TYPE = 'tool';
155
+
156
+ export class Item extends React.Component {
157
+ static propTypes = {
158
+ classes: PropTypes.object.isRequired,
159
+ className: PropTypes.string,
160
+ children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
161
+ connectDragSource: PropTypes.func.isRequired,
162
+ connectDragPreview: PropTypes.func.isRequired,
163
+ connectDropTarget: PropTypes.func.isRequired,
164
+ isDragging: PropTypes.bool
165
+ };
166
+
167
+ static defaultProps = {};
168
+
169
+ render() {
170
+ const {
171
+ classes,
172
+ children,
173
+ connectDragSource,
174
+ connectDropTarget,
175
+ connectDragPreview,
176
+ isDragging,
177
+ toolRef
178
+ } = this.props;
179
+
180
+ return (
181
+ <div className={classes.wrapper} ref={toolRef}>
182
+ {connectDragSource(
183
+ connectDropTarget(<div className={isDragging && classes.hidden}>{children}</div>)
184
+ )}
185
+ {connectDragPreview(<div className={classes.under}>{children}</div>)}
186
+ </div>
187
+ );
188
+ }
189
+ }
190
+
191
+ const itemSource = {
192
+ canDrag(props) {
193
+ return props.draggable;
194
+ },
195
+ beginDrag(props) {
196
+ return {
197
+ index: props.index
198
+ };
199
+ }
200
+ };
201
+
202
+ const itemTarget = {
203
+ hover(props, monitor) {
204
+ const dragIndex = monitor.getItem().index;
205
+ const { toolRef, index: hoverIndex } = props;
206
+
207
+ if (dragIndex === hoverIndex || !toolRef.current) {
208
+ return;
209
+ }
210
+
211
+ const hoverBoundingRect = toolRef.current?.getBoundingClientRect();
212
+ const hoverMiddleX = (hoverBoundingRect.right - hoverBoundingRect.left) / 2;
213
+ const clientOffset = monitor.getClientOffset();
214
+ const hoverClientX = clientOffset.x - hoverBoundingRect.left;
215
+
216
+ if (dragIndex < hoverIndex && hoverClientX < hoverMiddleX) {
217
+ return;
218
+ }
219
+
220
+ if (dragIndex > hoverIndex && hoverClientX > hoverMiddleX) {
221
+ return;
222
+ }
223
+
224
+ props.moveTool(dragIndex, hoverIndex);
225
+ monitor.getItem().index = hoverIndex;
108
226
  }
227
+ };
228
+
229
+ const collectTarget = connect => ({ connectDropTarget: connect.dropTarget() });
230
+
231
+ const collectSource = (connect, monitor) => ({
232
+ connectDragSource: connect.dragSource(),
233
+ connectDragPreview: connect.dragPreview(),
234
+ isDragging: monitor.isDragging()
109
235
  });
110
236
 
111
- export default withStyles(styles)(ToggleBar);
237
+ const DragTool = DropTarget(
238
+ DRAG_TYPE,
239
+ itemTarget,
240
+ collectTarget
241
+ )(DragSource(DRAG_TYPE, itemSource, collectSource)(Item));
package/src/tool-menu.jsx CHANGED
@@ -9,9 +9,11 @@ export class ToolMenu extends React.Component {
9
9
  className: PropTypes.string,
10
10
  currentToolType: PropTypes.string,
11
11
  disabled: PropTypes.bool,
12
+ draggableTools: PropTypes.bool,
12
13
  labelModeEnabled: PropTypes.bool,
13
14
  onChange: PropTypes.func,
14
15
  onToggleLabelMode: PropTypes.func,
16
+ onChangeTools: PropTypes.func,
15
17
  toolbarTools: PropTypes.arrayOf(PropTypes.string)
16
18
  };
17
19
 
@@ -19,11 +21,22 @@ export class ToolMenu extends React.Component {
19
21
  toolbarTools: []
20
22
  };
21
23
 
24
+ updateToolsOrder = (tools, showLabel) => {
25
+ const { onChangeTools } = this.props;
26
+
27
+ if (showLabel) {
28
+ tools.push('label');
29
+ }
30
+
31
+ onChangeTools(tools);
32
+ };
33
+
22
34
  render() {
23
35
  const {
24
36
  className,
25
37
  currentToolType,
26
38
  disabled,
39
+ draggableTools,
27
40
  labelModeEnabled,
28
41
  onToggleLabelMode,
29
42
  onChange
@@ -38,9 +51,11 @@ export class ToolMenu extends React.Component {
38
51
  <div className={classNames(className)}>
39
52
  <ToggleBar
40
53
  disabled={disabled}
54
+ draggableTools={draggableTools}
41
55
  options={toolbarTools}
42
56
  selectedToolType={currentToolType}
43
57
  onChange={onChange}
58
+ onChangeToolsOrder={tools => this.updateToolsOrder(tools, showLabel)}
44
59
  />
45
60
 
46
61
  {showLabel && (