@pie-lib/graphing 2.6.2 → 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 (107) hide show
  1. package/CHANGELOG.md +34 -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 +116 -55
  16. package/lib/graph-with-controls.js.map +1 -1
  17. package/lib/graph.js +45 -69
  18. package/lib/graph.js.map +1 -1
  19. package/lib/grid-setup.js +109 -50
  20. package/lib/grid-setup.js.map +1 -1
  21. package/lib/grid.js +28 -53
  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 +100 -14
  103. package/src/graph.jsx +2 -0
  104. package/src/grid-setup.jsx +178 -91
  105. package/src/grid.jsx +0 -7
  106. package/src/toggle-bar.jsx +143 -13
  107. package/src/tool-menu.jsx +15 -0
@@ -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 && (