@pie-lib/graphing-solution-set 2.34.1 → 2.35.0-mui-update.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 (97) hide show
  1. package/CHANGELOG.md +10 -15
  2. package/lib/axis/arrow.js +19 -55
  3. package/lib/axis/arrow.js.map +1 -1
  4. package/lib/axis/axes.js +101 -184
  5. package/lib/axis/axes.js.map +1 -1
  6. package/lib/axis/index.js +1 -6
  7. package/lib/axis/index.js.map +1 -1
  8. package/lib/bg.js +21 -49
  9. package/lib/bg.js.map +1 -1
  10. package/lib/container/actions.js +2 -8
  11. package/lib/container/actions.js.map +1 -1
  12. package/lib/container/index.js +14 -60
  13. package/lib/container/index.js.map +1 -1
  14. package/lib/container/marks.js +1 -6
  15. package/lib/container/marks.js.map +1 -1
  16. package/lib/container/middleware.js +2 -8
  17. package/lib/container/middleware.js.map +1 -1
  18. package/lib/container/reducer.js +1 -8
  19. package/lib/container/reducer.js.map +1 -1
  20. package/lib/coordinates-label.js +23 -55
  21. package/lib/coordinates-label.js.map +1 -1
  22. package/lib/graph-with-controls.js +132 -203
  23. package/lib/graph-with-controls.js.map +1 -1
  24. package/lib/graph.js +61 -126
  25. package/lib/graph.js.map +1 -1
  26. package/lib/grid-setup.js +161 -223
  27. package/lib/grid-setup.js.map +1 -1
  28. package/lib/grid.js +28 -73
  29. package/lib/grid.js.map +1 -1
  30. package/lib/index.js +1 -12
  31. package/lib/index.js.map +1 -1
  32. package/lib/labels.js +84 -184
  33. package/lib/labels.js.map +1 -1
  34. package/lib/mark-label.js +40 -88
  35. package/lib/mark-label.js.map +1 -1
  36. package/lib/toggle-bar.js +158 -242
  37. package/lib/toggle-bar.js.map +1 -1
  38. package/lib/tool-menu.js +93 -200
  39. package/lib/tool-menu.js.map +1 -1
  40. package/lib/tools/index.js +2 -7
  41. package/lib/tools/index.js.map +1 -1
  42. package/lib/tools/line/component.js +48 -62
  43. package/lib/tools/line/component.js.map +1 -1
  44. package/lib/tools/line/index.js +1 -6
  45. package/lib/tools/line/index.js.map +1 -1
  46. package/lib/tools/polygon/component.js +75 -172
  47. package/lib/tools/polygon/component.js.map +1 -1
  48. package/lib/tools/polygon/index.js +6 -23
  49. package/lib/tools/polygon/index.js.map +1 -1
  50. package/lib/tools/polygon/line.js +48 -85
  51. package/lib/tools/polygon/line.js.map +1 -1
  52. package/lib/tools/polygon/polygon.js +64 -102
  53. package/lib/tools/polygon/polygon.js.map +1 -1
  54. package/lib/tools/shared/arrow-head.js +7 -20
  55. package/lib/tools/shared/arrow-head.js.map +1 -1
  56. package/lib/tools/shared/line/index.js +86 -182
  57. package/lib/tools/shared/line/index.js.map +1 -1
  58. package/lib/tools/shared/line/line-path.js +70 -94
  59. package/lib/tools/shared/line/line-path.js.map +1 -1
  60. package/lib/tools/shared/line/with-root-edge.js +21 -55
  61. package/lib/tools/shared/line/with-root-edge.js.map +1 -1
  62. package/lib/tools/shared/point/arrow-point.js +18 -45
  63. package/lib/tools/shared/point/arrow-point.js.map +1 -1
  64. package/lib/tools/shared/point/arrow.js +16 -42
  65. package/lib/tools/shared/point/arrow.js.map +1 -1
  66. package/lib/tools/shared/point/base-point.js +22 -52
  67. package/lib/tools/shared/point/base-point.js.map +1 -1
  68. package/lib/tools/shared/point/index.js +30 -52
  69. package/lib/tools/shared/point/index.js.map +1 -1
  70. package/lib/tools/shared/styles.js +8 -31
  71. package/lib/tools/shared/styles.js.map +1 -1
  72. package/lib/tools/shared/types.js +1 -5
  73. package/lib/tools/shared/types.js.map +1 -1
  74. package/lib/undo-redo.js +27 -67
  75. package/lib/undo-redo.js.map +1 -1
  76. package/lib/use-debounce.js +4 -11
  77. package/lib/use-debounce.js.map +1 -1
  78. package/lib/utils.js +56 -131
  79. package/lib/utils.js.map +1 -1
  80. package/package.json +16 -14
  81. package/src/axis/arrow.jsx +7 -12
  82. package/src/axis/axes.jsx +32 -37
  83. package/src/coordinates-label.jsx +13 -18
  84. package/src/graph-with-controls.jsx +90 -93
  85. package/src/grid-setup.jsx +204 -206
  86. package/src/grid.jsx +1 -3
  87. package/src/labels.jsx +83 -124
  88. package/src/mark-label.jsx +14 -25
  89. package/src/toggle-bar.jsx +155 -166
  90. package/src/tool-menu.jsx +136 -195
  91. package/src/tools/line/component.jsx +29 -29
  92. package/src/tools/polygon/component.jsx +1 -3
  93. package/src/tools/polygon/line.jsx +26 -24
  94. package/src/tools/polygon/polygon.jsx +34 -39
  95. package/src/tools/shared/line/line-path.jsx +50 -47
  96. package/src/tools/shared/point/index.jsx +22 -34
  97. package/src/undo-redo.jsx +16 -24
@@ -1,60 +1,60 @@
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,
@@ -62,9 +62,23 @@ MiniButton.propTypes = {
62
62
  onClick: PropTypes.func,
63
63
  };
64
64
 
65
+ const StyledToolsContainer = styled('div')(({ theme }) => ({
66
+ display: 'flex',
67
+ flexWrap: 'wrap',
68
+ }));
69
+
70
+ const StyledButton = styled(MiniButton)(({ theme }) => ({
71
+ marginRight: theme.spacing(0.5),
72
+ marginBottom: theme.spacing(0.5),
73
+ color: color.text(),
74
+ }));
75
+
76
+ const StyledWrapper = styled('div')({
77
+ position: 'relative',
78
+ });
79
+
65
80
  export class ToggleBar extends React.Component {
66
81
  static propTypes = {
67
- classes: PropTypes.object.isRequired,
68
82
  className: PropTypes.string,
69
83
  options: PropTypes.arrayOf(PropTypes.string),
70
84
  selectedToolType: PropTypes.string,
@@ -81,162 +95,137 @@ export class ToggleBar extends React.Component {
81
95
 
82
96
  moveTool = (dragIndex, hoverIndex) => {
83
97
  const { options, onChangeToolsOrder } = this.props;
84
- const dragged = options[dragIndex];
85
-
86
- options.splice(dragIndex, 1);
87
- options.splice(hoverIndex, 0, dragged);
98
+ const newOptions = arrayMove(options, dragIndex, hoverIndex);
99
+ console.log('New Options Order:', newOptions);
100
+ onChangeToolsOrder(newOptions);
101
+ };
88
102
 
89
- onChangeToolsOrder(options);
103
+ handleDragEnd = (event) => {
104
+ const { active, over } = event;
105
+
106
+ console.log('Drag End Event:', event);
107
+ if (!over || !active) return;
108
+
109
+ const activeData = active.data.current;
110
+ const overData = over.data.current;
111
+
112
+ if (activeData?.type === 'tool' && overData?.type === 'tool') {
113
+ const dragIndex = activeData.index;
114
+ const hoverIndex = overData.index;
115
+
116
+ if (dragIndex !== hoverIndex) {
117
+ this.moveTool(dragIndex, hoverIndex);
118
+ }
119
+ }
90
120
  };
91
121
 
92
122
  render() {
93
- const { classes, className, disabled, options, selectedToolType, draggableTools, language } = this.props;
123
+ const { className, disabled, options, selectedToolType, draggableTools, language } = this.props;
94
124
 
95
125
  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}
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}
116
137
  value={option}
117
- selected={isSelected}
118
- language={language}
119
- />
120
- </DragTool>
121
- );
122
- }
123
- })}
124
- </div>
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>
125
156
  );
126
157
  }
127
158
  }
128
159
 
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
- });
153
-
154
- export default withDragContext(withStyles(styles)(ToggleBar));
155
-
156
- const DRAG_TYPE = 'tool';
157
-
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,
160
+ // DragTool functional component using @dnd-kit hooks
161
+ function DragTool({
162
+ children,
163
+ index,
164
+ draggable,
165
+ moveTool,
166
+ toolRef,
167
+ value
168
+ }) {
169
+ const {
170
+ attributes,
171
+ listeners,
172
+ setNodeRef: setDragNodeRef,
173
+ transform,
174
+ transition,
175
+ isDragging,
176
+ } = useDraggable({
177
+ id: `tool-${value}-${index}`,
178
+ disabled: !draggable,
179
+ data: {
180
+ type: 'tool',
181
+ index,
182
+ value,
183
+ },
184
+ });
185
+
186
+ const {
187
+ setNodeRef: setDropNodeRef,
188
+ isOver,
189
+ } = useDroppable({
190
+ id: `drop-tool-${value}-${index}`,
191
+ data: {
192
+ type: 'tool',
193
+ index,
194
+ accepts: ['tool'],
195
+ },
196
+ });
197
+
198
+ // Combine refs
199
+ const setNodeRef = (node) => {
200
+ setDragNodeRef(node);
201
+ setDropNodeRef(node);
202
+ if (toolRef?.current) {
203
+ toolRef.current = node;
204
+ }
168
205
  };
169
206
 
170
- static defaultProps = {};
171
-
172
- render() {
173
- const {
174
- classes,
175
- children,
176
- connectDragSource,
177
- connectDropTarget,
178
- connectDragPreview,
179
- isDragging,
180
- toolRef,
181
- } = this.props;
207
+ const style = {
208
+ transform: CSS.Transform.toString(transform),
209
+ transition,
210
+ opacity: isDragging ? 0.5 : 1,
211
+ };
182
212
 
183
- 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>)}
213
+ return (
214
+ <StyledWrapper ref={setNodeRef} style={style}>
215
+ <div {...attributes} {...listeners}>
216
+ {children}
187
217
  </div>
188
- );
189
- }
218
+ </StyledWrapper>
219
+ );
190
220
  }
191
221
 
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;
210
- }
211
-
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
- }
220
-
221
- if (dragIndex > hoverIndex && hoverClientX > hoverMiddleX) {
222
- return;
223
- }
224
-
225
- props.moveTool(dragIndex, hoverIndex);
226
- monitor.getItem().index = hoverIndex;
227
- },
222
+ DragTool.propTypes = {
223
+ children: PropTypes.node,
224
+ index: PropTypes.number,
225
+ draggable: PropTypes.bool,
226
+ moveTool: PropTypes.func,
227
+ toolRef: PropTypes.object,
228
+ value: PropTypes.string,
228
229
  };
229
230
 
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));
231
+ export default ToggleBar;