@pie-lib/graphing-solution-set 2.34.3-next.0 → 2.34.3-next.155

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 (142) hide show
  1. package/CHANGELOG.md +7 -78
  2. package/esm/package.json +3 -0
  3. package/lib/axis/arrow.js +19 -55
  4. package/lib/axis/arrow.js.map +1 -1
  5. package/lib/axis/axes.js +103 -193
  6. package/lib/axis/axes.js.map +1 -1
  7. package/lib/axis/index.js +1 -6
  8. package/lib/axis/index.js.map +1 -1
  9. package/lib/bg.js +21 -49
  10. package/lib/bg.js.map +1 -1
  11. package/lib/container/actions.js +2 -8
  12. package/lib/container/actions.js.map +1 -1
  13. package/lib/container/index.js +14 -60
  14. package/lib/container/index.js.map +1 -1
  15. package/lib/container/marks.js +1 -6
  16. package/lib/container/marks.js.map +1 -1
  17. package/lib/container/middleware.js +2 -8
  18. package/lib/container/middleware.js.map +1 -1
  19. package/lib/container/reducer.js +1 -8
  20. package/lib/container/reducer.js.map +1 -1
  21. package/lib/coordinates-label.js +23 -55
  22. package/lib/coordinates-label.js.map +1 -1
  23. package/lib/graph-with-controls.js +129 -203
  24. package/lib/graph-with-controls.js.map +1 -1
  25. package/lib/graph.js +61 -126
  26. package/lib/graph.js.map +1 -1
  27. package/lib/grid-setup.js +168 -224
  28. package/lib/grid-setup.js.map +1 -1
  29. package/lib/grid.js +29 -74
  30. package/lib/grid.js.map +1 -1
  31. package/lib/index.js +1 -12
  32. package/lib/index.js.map +1 -1
  33. package/lib/labels.js +84 -184
  34. package/lib/labels.js.map +1 -1
  35. package/lib/mark-label.js +39 -88
  36. package/lib/mark-label.js.map +1 -1
  37. package/lib/toggle-bar.js +155 -243
  38. package/lib/toggle-bar.js.map +1 -1
  39. package/lib/tool-menu.js +93 -200
  40. package/lib/tool-menu.js.map +1 -1
  41. package/lib/tools/index.js +2 -7
  42. package/lib/tools/index.js.map +1 -1
  43. package/lib/tools/line/component.js +48 -62
  44. package/lib/tools/line/component.js.map +1 -1
  45. package/lib/tools/line/index.js +1 -6
  46. package/lib/tools/line/index.js.map +1 -1
  47. package/lib/tools/polygon/component.js +76 -173
  48. package/lib/tools/polygon/component.js.map +1 -1
  49. package/lib/tools/polygon/index.js +6 -23
  50. package/lib/tools/polygon/index.js.map +1 -1
  51. package/lib/tools/polygon/line.js +48 -85
  52. package/lib/tools/polygon/line.js.map +1 -1
  53. package/lib/tools/polygon/polygon.js +62 -102
  54. package/lib/tools/polygon/polygon.js.map +1 -1
  55. package/lib/tools/shared/arrow-head.js +7 -20
  56. package/lib/tools/shared/arrow-head.js.map +1 -1
  57. package/lib/tools/shared/line/index.js +89 -185
  58. package/lib/tools/shared/line/index.js.map +1 -1
  59. package/lib/tools/shared/line/line-path.js +71 -95
  60. package/lib/tools/shared/line/line-path.js.map +1 -1
  61. package/lib/tools/shared/line/with-root-edge.js +22 -56
  62. package/lib/tools/shared/line/with-root-edge.js.map +1 -1
  63. package/lib/tools/shared/point/arrow-point.js +18 -45
  64. package/lib/tools/shared/point/arrow-point.js.map +1 -1
  65. package/lib/tools/shared/point/arrow.js +16 -42
  66. package/lib/tools/shared/point/arrow.js.map +1 -1
  67. package/lib/tools/shared/point/base-point.js +44 -58
  68. package/lib/tools/shared/point/base-point.js.map +1 -1
  69. package/lib/tools/shared/point/index.js +38 -52
  70. package/lib/tools/shared/point/index.js.map +1 -1
  71. package/lib/tools/shared/styles.js +8 -31
  72. package/lib/tools/shared/styles.js.map +1 -1
  73. package/lib/tools/shared/types.js +1 -5
  74. package/lib/tools/shared/types.js.map +1 -1
  75. package/lib/undo-redo.js +27 -67
  76. package/lib/undo-redo.js.map +1 -1
  77. package/lib/use-debounce.js +4 -11
  78. package/lib/use-debounce.js.map +1 -1
  79. package/lib/utils.js +56 -131
  80. package/lib/utils.js.map +1 -1
  81. package/package.json +34 -23
  82. package/src/__tests__/graph-with-controls.test.jsx +23 -10
  83. package/src/__tests__/graph.test.jsx +36 -171
  84. package/src/__tests__/grid.test.jsx +9 -6
  85. package/src/__tests__/labels.test.jsx +11 -8
  86. package/src/__tests__/mark-label.test.jsx +15 -17
  87. package/src/__tests__/toggle-bar.test.jsx +46 -17
  88. package/src/__tests__/tool-menu.test.jsx +12 -8
  89. package/src/__tests__/undo-redo.test.jsx +9 -8
  90. package/src/__tests__/utils.js +3 -0
  91. package/src/axis/__tests__/arrow.test.jsx +21 -17
  92. package/src/axis/__tests__/axes.test.jsx +117 -155
  93. package/src/axis/arrow.jsx +7 -12
  94. package/src/axis/axes.jsx +41 -51
  95. package/src/coordinates-label.jsx +13 -18
  96. package/src/graph-with-controls.jsx +90 -93
  97. package/src/grid-setup.jsx +210 -206
  98. package/src/grid.jsx +2 -4
  99. package/src/labels.jsx +83 -124
  100. package/src/mark-label.jsx +14 -25
  101. package/src/toggle-bar.jsx +135 -163
  102. package/src/tool-menu.jsx +136 -195
  103. package/src/tools/line/__tests__/component.test.jsx +7 -7
  104. package/src/tools/line/component.jsx +29 -29
  105. package/src/tools/polygon/__tests__/component.test.jsx +13 -152
  106. package/src/tools/polygon/__tests__/line.test.jsx +7 -9
  107. package/src/tools/polygon/__tests__/polygon.test.jsx +8 -8
  108. package/src/tools/polygon/component.jsx +2 -4
  109. package/src/tools/polygon/line.jsx +26 -24
  110. package/src/tools/polygon/polygon.jsx +35 -40
  111. package/src/tools/shared/__tests__/arrow-head.test.jsx +16 -17
  112. package/src/tools/shared/line/__tests__/index.test.jsx +26 -163
  113. package/src/tools/shared/line/__tests__/line-path.test.jsx +9 -9
  114. package/src/tools/shared/line/__tests__/with-root-edge.test.jsx +14 -24
  115. package/src/tools/shared/line/index.jsx +3 -3
  116. package/src/tools/shared/line/line-path.jsx +51 -48
  117. package/src/tools/shared/line/with-root-edge.jsx +1 -1
  118. package/src/tools/shared/point/__tests__/arrow-point.test.jsx +15 -11
  119. package/src/tools/shared/point/__tests__/base-point.test.jsx +14 -11
  120. package/src/tools/shared/point/base-point.jsx +33 -6
  121. package/src/tools/shared/point/index.jsx +30 -32
  122. package/src/undo-redo.jsx +16 -24
  123. package/src/__tests__/__snapshots__/graph-with-controls.test.jsx.snap +0 -114
  124. package/src/__tests__/__snapshots__/graph.test.jsx.snap +0 -213
  125. package/src/__tests__/__snapshots__/grid.test.jsx.snap +0 -54
  126. package/src/__tests__/__snapshots__/labels.test.jsx.snap +0 -30
  127. package/src/__tests__/__snapshots__/mark-label.test.jsx.snap +0 -37
  128. package/src/__tests__/__snapshots__/toggle-bar.test.jsx.snap +0 -7
  129. package/src/__tests__/__snapshots__/tool-menu.test.jsx.snap +0 -35
  130. package/src/__tests__/__snapshots__/undo-redo.test.jsx.snap +0 -15
  131. package/src/axis/__tests__/__snapshots__/arrow.test.jsx.snap +0 -33
  132. package/src/axis/__tests__/__snapshots__/axes.test.jsx.snap +0 -122
  133. package/src/tools/line/__tests__/__snapshots__/component.test.jsx.snap +0 -20
  134. package/src/tools/polygon/__tests__/__snapshots__/component.test.jsx.snap +0 -94
  135. package/src/tools/polygon/__tests__/__snapshots__/line.test.jsx.snap +0 -44
  136. package/src/tools/polygon/__tests__/__snapshots__/polygon.test.jsx.snap +0 -53
  137. package/src/tools/shared/__tests__/__snapshots__/arrow-head.test.jsx.snap +0 -32
  138. package/src/tools/shared/line/__tests__/__snapshots__/index.test.jsx.snap +0 -360
  139. package/src/tools/shared/line/__tests__/__snapshots__/line-path.test.jsx.snap +0 -57
  140. package/src/tools/shared/line/__tests__/__snapshots__/with-root-edge.test.jsx.snap +0 -63
  141. package/src/tools/shared/point/__tests__/__snapshots__/arrow-point.test.jsx.snap +0 -55
  142. package/src/tools/shared/point/__tests__/__snapshots__/base-point.test.jsx.snap +0 -43
@@ -1,70 +1,85 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { withStyles } from '@material-ui/core/styles';
4
- import cn from 'classnames';
5
- import Button from '@material-ui/core/Button';
3
+ import { styled } from '@mui/material/styles';
4
+ import Button from '@mui/material/Button';
6
5
  import { color } from '@pie-lib/render-ui';
7
6
  import { allTools } from './tools';
8
- import { withDragContext, DragSource, DropTarget } from '@pie-lib/drag';
7
+ import { DragProvider } from '@pie-lib/drag';
8
+ import { useDraggable, useDroppable } from '@dnd-kit/core';
9
+ import { CSS } from '@dnd-kit/utilities';
10
+ import { arrayMove } from '@dnd-kit/sortable';
9
11
  import Translator from '@pie-lib/translator';
10
12
 
11
13
  const { translator } = Translator;
12
14
 
13
- const buttonStyles = () => ({
14
- root: {
15
- color: color.text(),
16
- },
17
- selected: {
18
- backgroundColor: color.background(),
15
+ const StyledMiniButton = styled(Button, {
16
+ shouldForwardProp: (prop) => !['selected'].includes(prop),
17
+ })(({ selected, disabled }) => ({
18
+ color: color.text(),
19
+ backgroundColor: color.background(),
20
+ ...(selected && {
19
21
  border: `1px solid ${color.secondary()}`,
20
- },
21
- notSelected: {
22
+ }),
23
+ ...(!selected && {
22
24
  '& span': {
23
25
  color: color.primary(),
24
26
  },
25
- backgroundColor: color.background(),
26
- },
27
- disabled: {
27
+ }),
28
+ ...(disabled && {
28
29
  '& span': {
29
30
  color: color.primary(),
30
31
  },
31
32
  backgroundColor: color.disabled(),
32
- },
33
- });
33
+ }),
34
+ }));
34
35
 
35
- export const MiniButton = withStyles(buttonStyles)((props) => {
36
- const { disabled, classes, className, selected, value, onClick, language } = props;
36
+ export const MiniButton = (props) => {
37
+ const { disabled, className, selected, value, onClick, language } = props;
37
38
  const translatorKey = value.toLowerCase();
38
39
 
39
40
  return (
40
- <Button
41
+ <StyledMiniButton
41
42
  size="small"
42
43
  disabled={disabled}
43
- className={cn(classes.root, selected && classes.selected, className)}
44
- classes={{ disabled: cn(disabled && classes.disabled) }}
44
+ className={className}
45
+ selected={selected}
45
46
  value={value}
46
47
  key={value}
47
48
  variant="outlined"
48
49
  onClick={(e) => onClick({ ...e, buttonValue: value })}
49
50
  >
50
51
  {translator.t(`graphing.${translatorKey}`, { lng: language })}
51
- </Button>
52
+ </StyledMiniButton>
52
53
  );
53
- });
54
+ };
54
55
 
55
56
  MiniButton.propTypes = {
56
57
  disabled: PropTypes.bool,
57
- classes: PropTypes.object,
58
58
  className: PropTypes.string,
59
59
  disabledClassName: PropTypes.string,
60
60
  selected: PropTypes.bool,
61
61
  value: PropTypes.string,
62
62
  onClick: PropTypes.func,
63
+ language: PropTypes.string,
63
64
  };
64
65
 
66
+ const StyledToolsContainer = styled('div')(() => ({
67
+ display: 'flex',
68
+ flexWrap: 'wrap',
69
+ }));
70
+
71
+ const StyledButton = styled(MiniButton)(({ theme }) => ({
72
+ marginRight: theme.spacing(0.5),
73
+ marginBottom: theme.spacing(0.5),
74
+ color: color.text(),
75
+ }));
76
+
77
+ const StyledWrapper = styled('div')({
78
+ position: 'relative',
79
+ });
80
+
65
81
  export class ToggleBar extends React.Component {
66
82
  static propTypes = {
67
- classes: PropTypes.object.isRequired,
68
83
  className: PropTypes.string,
69
84
  options: PropTypes.arrayOf(PropTypes.string),
70
85
  selectedToolType: PropTypes.string,
@@ -81,162 +96,119 @@ export class ToggleBar extends React.Component {
81
96
 
82
97
  moveTool = (dragIndex, hoverIndex) => {
83
98
  const { options, onChangeToolsOrder } = this.props;
84
- const dragged = options[dragIndex];
85
-
86
- options.splice(dragIndex, 1);
87
- options.splice(hoverIndex, 0, dragged);
99
+ const newOptions = arrayMove(options, dragIndex, hoverIndex);
88
100
 
89
- onChangeToolsOrder(options);
101
+ onChangeToolsOrder(newOptions);
90
102
  };
91
103
 
92
- render() {
93
- const { classes, className, disabled, options, selectedToolType, draggableTools, language } = this.props;
104
+ handleDragEnd = (event) => {
105
+ const { active, over } = event;
94
106
 
95
- return (
96
- <div className={cn(className, classes.toolsContainer)}>
97
- {(options || []).map((option, index) => {
98
- if ((allTools || []).includes(option)) {
99
- const isSelected = option === selectedToolType;
100
- const toolRef = React.createRef();
101
-
102
- return (
103
- <DragTool
104
- key={option}
105
- index={index}
106
- draggable={draggableTools}
107
- moveTool={this.moveTool}
108
- classes={classes}
109
- toolRef={toolRef}
110
- >
111
- <MiniButton
112
- className={cn(classes.button, isSelected && classes.selected)}
113
- disabled={disabled}
114
- disableRipple={true}
115
- onClick={this.select}
116
- value={option}
117
- selected={isSelected}
118
- language={language}
119
- />
120
- </DragTool>
121
- );
122
- }
123
- })}
124
- </div>
125
- );
126
- }
127
- }
128
-
129
- const styles = (theme) => ({
130
- toolsContainer: {
131
- display: 'flex',
132
- flexWrap: 'wrap',
133
- },
134
- button: {
135
- marginRight: theme.spacing.unit / 2,
136
- marginBottom: theme.spacing.unit / 2,
137
- color: color.text(),
138
- },
139
- under: {
140
- position: 'absolute',
141
- top: 0,
142
- left: 0,
143
- zIndex: -1,
144
- pointerEvents: 'none',
145
- },
146
- wrapper: {
147
- position: 'relative',
148
- },
149
- hidden: {
150
- opacity: 0,
151
- },
152
- });
107
+ if (!over || !active) return;
153
108
 
154
- export default withDragContext(withStyles(styles)(ToggleBar));
109
+ const activeData = active.data.current;
110
+ const overData = over.data.current;
155
111
 
156
- const DRAG_TYPE = 'tool';
112
+ if (activeData?.type === 'tool' && overData?.type === 'tool') {
113
+ const dragIndex = activeData.index;
114
+ const hoverIndex = overData.index;
157
115
 
158
- export class Item extends React.Component {
159
- static propTypes = {
160
- classes: PropTypes.object.isRequired,
161
- className: PropTypes.string,
162
- children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
163
- connectDragSource: PropTypes.func.isRequired,
164
- connectDragPreview: PropTypes.func.isRequired,
165
- connectDropTarget: PropTypes.func.isRequired,
166
- isDragging: PropTypes.bool,
167
- toolRef: PropTypes.any,
116
+ if (dragIndex !== hoverIndex) {
117
+ this.moveTool(dragIndex, hoverIndex);
118
+ }
119
+ }
168
120
  };
169
121
 
170
- static defaultProps = {};
171
-
172
122
  render() {
173
- const {
174
- classes,
175
- children,
176
- connectDragSource,
177
- connectDropTarget,
178
- connectDragPreview,
179
- isDragging,
180
- toolRef,
181
- } = this.props;
123
+ const { className, disabled, options, selectedToolType, draggableTools, language } = this.props;
182
124
 
183
125
  return (
184
- <div className={classes.wrapper} ref={toolRef}>
185
- {connectDragSource(connectDropTarget(<div className={isDragging && classes.hidden}>{children}</div>))}
186
- {connectDragPreview(<div className={classes.under}>{children}</div>)}
187
- </div>
126
+ <DragProvider onDragEnd={this.handleDragEnd}>
127
+ <StyledToolsContainer className={className}>
128
+ {(options || []).map((option, index) => {
129
+ if ((allTools || []).includes(option)) {
130
+ const isSelected = option === selectedToolType;
131
+ const toolRef = React.createRef();
132
+
133
+ return (
134
+ <DragTool
135
+ key={option}
136
+ index={index}
137
+ value={option}
138
+ draggable={draggableTools}
139
+ moveTool={this.moveTool}
140
+ toolRef={toolRef}
141
+ >
142
+ <StyledButton
143
+ disabled={disabled}
144
+ disableRipple={true}
145
+ onClick={this.select}
146
+ value={option}
147
+ selected={isSelected}
148
+ language={language}
149
+ />
150
+ </DragTool>
151
+ );
152
+ }
153
+ })}
154
+ </StyledToolsContainer>
155
+ </DragProvider>
188
156
  );
189
157
  }
190
158
  }
191
159
 
192
- const itemSource = {
193
- canDrag(props) {
194
- return props.draggable;
195
- },
196
- beginDrag(props) {
197
- return {
198
- index: props.index,
199
- };
200
- },
201
- };
202
-
203
- const itemTarget = {
204
- hover(props, monitor) {
205
- const dragIndex = monitor.getItem().index;
206
- const { toolRef, index: hoverIndex } = props;
207
-
208
- if (dragIndex === hoverIndex || !toolRef.current) {
209
- return;
160
+ // DragTool functional component using @dnd-kit hooks
161
+ function DragTool({ children, index, draggable, toolRef, value }) {
162
+ const { attributes, listeners, setNodeRef: setDragNodeRef, transform, transition, isDragging } = useDraggable({
163
+ id: `tool-${value}-${index}`,
164
+ disabled: !draggable,
165
+ data: {
166
+ type: 'tool',
167
+ index,
168
+ value,
169
+ },
170
+ });
171
+
172
+ const { setNodeRef: setDropNodeRef } = useDroppable({
173
+ id: `drop-tool-${value}-${index}`,
174
+ data: {
175
+ type: 'tool',
176
+ index,
177
+ accepts: ['tool'],
178
+ },
179
+ });
180
+
181
+ // Combine refs
182
+ const setNodeRef = (node) => {
183
+ setDragNodeRef(node);
184
+ setDropNodeRef(node);
185
+ if (toolRef?.current) {
186
+ toolRef.current = node;
210
187
  }
188
+ };
211
189
 
212
- const hoverBoundingRect = toolRef.current?.getBoundingClientRect();
213
- const hoverMiddleX = (hoverBoundingRect.right - hoverBoundingRect.left) / 2;
214
- const clientOffset = monitor.getClientOffset();
215
- const hoverClientX = clientOffset.x - hoverBoundingRect.left;
216
-
217
- if (dragIndex < hoverIndex && hoverClientX < hoverMiddleX) {
218
- return;
219
- }
190
+ const style = {
191
+ transform: CSS.Transform.toString(transform),
192
+ transition,
193
+ opacity: isDragging ? 0.5 : 1,
194
+ };
220
195
 
221
- if (dragIndex > hoverIndex && hoverClientX > hoverMiddleX) {
222
- return;
223
- }
196
+ return (
197
+ <StyledWrapper ref={setNodeRef} style={style}>
198
+ <div {...attributes} {...listeners}>
199
+ {children}
200
+ </div>
201
+ </StyledWrapper>
202
+ );
203
+ }
224
204
 
225
- props.moveTool(dragIndex, hoverIndex);
226
- monitor.getItem().index = hoverIndex;
227
- },
205
+ DragTool.propTypes = {
206
+ children: PropTypes.node,
207
+ index: PropTypes.number,
208
+ draggable: PropTypes.bool,
209
+ moveTool: PropTypes.func,
210
+ toolRef: PropTypes.object,
211
+ value: PropTypes.string,
228
212
  };
229
213
 
230
- const collectTarget = (connect) => ({ connectDropTarget: connect.dropTarget() });
231
-
232
- const collectSource = (connect, monitor) => ({
233
- connectDragSource: connect.dragSource(),
234
- connectDragPreview: connect.dragPreview(),
235
- isDragging: monitor.isDragging(),
236
- });
237
-
238
- const DragTool = DropTarget(
239
- DRAG_TYPE,
240
- itemTarget,
241
- collectTarget,
242
- )(DragSource(DRAG_TYPE, itemSource, collectSource)(Item));
214
+ export default ToggleBar;