@abidibo/react-cam-roi 0.0.12 → 0.1.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 (93) hide show
  1. package/README.md +44 -29
  2. package/package.json +29 -2
  3. package/dist/Components/BoolField/BoolField.module.css +0 -60
  4. package/dist/Components/BoolField/index.d.ts +0 -5
  5. package/dist/Components/BoolField/index.js +0 -13
  6. package/dist/Components/Button/Button.module.css +0 -27
  7. package/dist/Components/Button/index.d.ts +0 -8
  8. package/dist/Components/Button/index.js +0 -15
  9. package/dist/Components/EnumField/EnumField.module.css +0 -61
  10. package/dist/Components/EnumField/index.d.ts +0 -10
  11. package/dist/Components/EnumField/index.js +0 -16
  12. package/dist/Components/IconButton/IconButton.module.css +0 -20
  13. package/dist/Components/IconButton/index.d.ts +0 -7
  14. package/dist/Components/IconButton/index.js +0 -10
  15. package/dist/Components/Loader/Loader.module.css +0 -25
  16. package/dist/Components/Loader/index.d.ts +0 -1
  17. package/dist/Components/Loader/index.js +0 -9
  18. package/dist/Components/Modal/Modal.module.css +0 -92
  19. package/dist/Components/Modal/index.d.ts +0 -10
  20. package/dist/Components/Modal/index.js +0 -16
  21. package/dist/Components/NumberField/NumberField.module.css +0 -60
  22. package/dist/Components/NumberField/index.d.ts +0 -3
  23. package/dist/Components/NumberField/index.js +0 -13
  24. package/dist/Components/RoiEditor/Canvas.d.ts +0 -10
  25. package/dist/Components/RoiEditor/Canvas.js +0 -28
  26. package/dist/Components/RoiEditor/ColorPicker.d.ts +0 -5
  27. package/dist/Components/RoiEditor/ColorPicker.js +0 -12
  28. package/dist/Components/RoiEditor/ColorPicker.module.css +0 -17
  29. package/dist/Components/RoiEditor/Hooks.d.ts +0 -35
  30. package/dist/Components/RoiEditor/Hooks.js +0 -320
  31. package/dist/Components/RoiEditor/ParameterField.d.ts +0 -9
  32. package/dist/Components/RoiEditor/ParameterField.js +0 -27
  33. package/dist/Components/RoiEditor/ParametersModalForm/ParametersModalForm.module.css +0 -5
  34. package/dist/Components/RoiEditor/ParametersModalForm/index.d.ts +0 -10
  35. package/dist/Components/RoiEditor/ParametersModalForm/index.js +0 -31
  36. package/dist/Components/RoiEditor/Polygon.d.ts +0 -18
  37. package/dist/Components/RoiEditor/Polygon.js +0 -76
  38. package/dist/Components/RoiEditor/Polyline.d.ts +0 -28
  39. package/dist/Components/RoiEditor/Polyline.js +0 -74
  40. package/dist/Components/RoiEditor/Rectangle.d.ts +0 -21
  41. package/dist/Components/RoiEditor/Rectangle.js +0 -72
  42. package/dist/Components/RoiEditor/RoiEditor.module.css +0 -5
  43. package/dist/Components/RoiEditor/ShapesList.d.ts +0 -2
  44. package/dist/Components/RoiEditor/ShapesList.js +0 -47
  45. package/dist/Components/RoiEditor/ShapesList.module.css +0 -36
  46. package/dist/Components/RoiEditor/Toolbar.d.ts +0 -2
  47. package/dist/Components/RoiEditor/Toolbar.js +0 -33
  48. package/dist/Components/RoiEditor/Toolbar.module.css +0 -53
  49. package/dist/Components/RoiEditor/Types.d.ts +0 -115
  50. package/dist/Components/RoiEditor/Types.js +0 -15
  51. package/dist/Components/RoiEditor/Utils.d.ts +0 -22
  52. package/dist/Components/RoiEditor/Utils.js +0 -143
  53. package/dist/Components/RoiEditor/index.d.ts +0 -10
  54. package/dist/Components/RoiEditor/index.js +0 -74
  55. package/dist/Components/TextField/TextField.module.css +0 -61
  56. package/dist/Components/TextField/index.d.ts +0 -6
  57. package/dist/Components/TextField/index.js +0 -13
  58. package/dist/Components/Typography/index.d.ts +0 -9
  59. package/dist/Components/Typography/index.js +0 -6
  60. package/dist/Icons/AnnotateIcon.d.ts +0 -6
  61. package/dist/Icons/AnnotateIcon.js +0 -5
  62. package/dist/Icons/CloseIcon.d.ts +0 -6
  63. package/dist/Icons/CloseIcon.js +0 -5
  64. package/dist/Icons/CopyIcon.d.ts +0 -6
  65. package/dist/Icons/CopyIcon.js +0 -5
  66. package/dist/Icons/DeleteIcon.d.ts +0 -6
  67. package/dist/Icons/DeleteIcon.js +0 -5
  68. package/dist/Icons/EditIcon.d.ts +0 -6
  69. package/dist/Icons/EditIcon.js +0 -5
  70. package/dist/Icons/PointerIcon.d.ts +0 -6
  71. package/dist/Icons/PointerIcon.js +0 -5
  72. package/dist/Icons/PolygonIcon.d.ts +0 -6
  73. package/dist/Icons/PolygonIcon.js +0 -5
  74. package/dist/Icons/PolylineIcon.d.ts +0 -6
  75. package/dist/Icons/PolylineIcon.js +0 -5
  76. package/dist/Icons/RectangleIcon.d.ts +0 -6
  77. package/dist/Icons/RectangleIcon.js +0 -5
  78. package/dist/Icons/SaveIcon.d.ts +0 -6
  79. package/dist/Icons/SaveIcon.js +0 -5
  80. package/dist/Icons/SelectIcon.d.ts +0 -6
  81. package/dist/Icons/SelectIcon.js +0 -5
  82. package/dist/Providers/EditorProvider.d.ts +0 -26
  83. package/dist/Providers/EditorProvider.js +0 -29
  84. package/dist/Providers/UiProvider.d.ts +0 -73
  85. package/dist/Providers/UiProvider.js +0 -95
  86. package/dist/Types.d.ts +0 -10
  87. package/dist/Types.js +0 -1
  88. package/dist/Utils/Dispatcher.d.ts +0 -16
  89. package/dist/Utils/Dispatcher.js +0 -65
  90. package/dist/Utils/index.d.ts +0 -2
  91. package/dist/Utils/index.js +0 -2
  92. package/dist/index.d.ts +0 -4
  93. package/dist/index.js +0 -4
@@ -1,60 +0,0 @@
1
- /*
2
- .number-field-wrapper {
3
- }
4
- .number-field-wrapper-light {
5
- }
6
- .number-field-wrapper-dark {
7
- }
8
- */
9
-
10
- .number-field {
11
- border-radius: 0.25rem;
12
- box-sizing: border-box;
13
- padding: 0.5rem;
14
- width: 100%;
15
- }
16
- .number-field:focus-visible {
17
- outline: none;
18
- border: 1px solid #1976d2;
19
- }
20
- .number-field-light {
21
- background-color: #fff;
22
- color: #333;
23
- border: 1px solid #ccc;
24
- }
25
- .number-field-dark {
26
- background-color: #333;
27
- border: 1px solid #666;
28
- color: #fff;
29
- }
30
- .number-field-error {
31
- border: 1px solid #d32f2f;
32
- }
33
- .number-field-label {
34
- font-weight: bold;
35
- display: block;
36
- margin: 0 0 1rem 0;
37
- }
38
- /*
39
- .text-fiel-label-light {
40
- }
41
- .number-field-label-dark {
42
- }
43
- */
44
- .number-field-label-error {
45
- color: #d32f2f;
46
- }
47
- .number-field-helper-text {
48
- font-style: italic;
49
- font-size: 0.9rem;
50
- padding-top: 0.5rem;
51
- }
52
- /*
53
- .number-field-helper-text-light {
54
- }
55
- .number-field-helper-text-dark {
56
- }
57
- */
58
- .number-field-helper-text-error {
59
- color: #d32f2f;
60
- }
@@ -1,3 +0,0 @@
1
- import { FieldProps } from '../../Types';
2
- declare const NumberField: React.FC<FieldProps<number | null>>;
3
- export default NumberField;
@@ -1,13 +0,0 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- import { useContext } from 'react';
3
- import { UiContext } from '../../Providers/UiProvider';
4
- import { css } from '../../Utils';
5
- import styles from './NumberField.module.css';
6
- const NumberField = ({ onChange, value, label, required, helperText, error }) => {
7
- const { themeMode, Typography } = useContext(UiContext);
8
- const handleChange = (e) => {
9
- onChange(parseFloat(e.target.value));
10
- };
11
- return (_jsxs("div", { className: css('number-field-wrapper', styles, themeMode), children: [_jsx("label", { className: `${css('number-field-label', styles, themeMode)} ${error ? css('number-field-label-error', styles, null) : ''}`, children: _jsxs(Typography, { children: [label, required && ' *'] }) }), _jsx("input", { type: 'number', className: `${css('number-field', styles, themeMode)} ${error ? css('number-field-error', styles, null) : ''}`, onChange: handleChange, value: value !== null && value !== void 0 ? value : '' }), helperText && (_jsx(Typography, { component: 'div', className: `${css('number-field-helper-text', styles, themeMode)} ${error ? css('number-field-helper-text-error', styles, null) : ''}`, children: helperText }))] }));
12
- };
13
- export default NumberField;
@@ -1,10 +0,0 @@
1
- import { Output } from './Types';
2
- type CanvasProps = {
3
- canvasSize: {
4
- width: number;
5
- height: number;
6
- };
7
- initialData?: Output;
8
- };
9
- declare const Canvas: React.FC<CanvasProps>;
10
- export default Canvas;
@@ -1,28 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import * as fabric from 'fabric';
3
- import { useRef, useEffect, useState, useContext } from 'react';
4
- import { useEditorContext } from '../../Providers/EditorProvider';
5
- import { UiContext } from '../../Providers/UiProvider';
6
- import { initCanvasData, useDispatcherEvents, useTool } from './Hooks';
7
- const Canvas = ({ canvasSize, initialData }) => {
8
- const { metadata, setMetadata, addShapes, id } = useEditorContext();
9
- const { enableLogs } = useContext(UiContext);
10
- const [initialized, setInitialized] = useState(false);
11
- const canvasRef = useRef(null);
12
- useTool(canvasRef.current);
13
- useDispatcherEvents(canvasRef.current);
14
- useEffect(() => {
15
- if (canvasSize.width !== 0 && canvasSize.height !== 0 && !initialized) {
16
- canvasRef.current = new fabric.Canvas(`react-cam-roi-canvas-${id}`);
17
- canvasRef.current.setDimensions({ width: canvasSize.width, height: canvasSize.height });
18
- initCanvasData(canvasRef, addShapes, metadata, setMetadata, initialData, enableLogs);
19
- setInitialized(true);
20
- }
21
- return () => {
22
- var _a;
23
- (_a = canvasRef.current) === null || _a === void 0 ? void 0 : _a.dispose();
24
- };
25
- }, [canvasSize.width, canvasSize.height]); // eslint-disable-line
26
- return (_jsx("canvas", { id: `react-cam-roi-canvas-${id}`, style: { width: `${canvasSize.width}px`, height: `${canvasSize.height}px` } }));
27
- };
28
- export default Canvas;
@@ -1,5 +0,0 @@
1
- type ColorPickerProps = {
2
- style?: React.CSSProperties;
3
- };
4
- declare const ColorPicker: React.FC<ColorPickerProps>;
5
- export default ColorPicker;
@@ -1,12 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useContext } from 'react';
3
- import { useEditorContext } from '../../Providers/EditorProvider';
4
- import { UiContext } from '../../Providers/UiProvider';
5
- import { css } from '../../Utils';
6
- import styles from './ColorPicker.module.css';
7
- const ColorPicker = ({ style }) => {
8
- const { pickerColors, themeMode } = useContext(UiContext);
9
- const { activeColor, setActiveColor } = useEditorContext();
10
- return (_jsx("div", { style: style, className: styles.colorpickerWrapper, children: pickerColors.map((color) => (_jsx("div", { onClick: () => setActiveColor(color), className: `${css('colorpicker-button', styles, themeMode)} ${activeColor === color ? css('colorpicker-button-active', styles, themeMode) : ''}`, style: { backgroundColor: color } }, color))) }));
11
- };
12
- export default ColorPicker;
@@ -1,17 +0,0 @@
1
- .colorpickerWrapper {
2
- display: flex;
3
- flex-wrap: nowrap;
4
- gap: .2rem;
5
- }
6
-
7
- .colorpicker-button {
8
- box-sizing: border-box;
9
- width: 24px;
10
- height: 24px;
11
- border-radius: 50%;
12
- cursor: pointer;
13
- }
14
-
15
- .colorpicker-button-active {
16
- border: 2px solid red;
17
- }
@@ -1,35 +0,0 @@
1
- import * as fabric from 'fabric';
2
- import { Metadata, Output, OutputParameter, Shape, ShapeType } from './Types';
3
- export declare const useImageSize: (imageUrl: string) => {
4
- imageSize: {
5
- width: number;
6
- height: number;
7
- };
8
- isReady: boolean;
9
- };
10
- export declare const useCanvasSize: (imageUrl: string) => {
11
- imageSize: {
12
- width: number;
13
- height: number;
14
- };
15
- canvasSize: {
16
- width: number;
17
- height: number;
18
- };
19
- wrapperRef: import("react").RefObject<HTMLDivElement>;
20
- isReady: boolean;
21
- };
22
- export declare const initCanvasData: (canvasRef: React.MutableRefObject<fabric.Canvas | null>, addShapes: (shapes: {
23
- id: string;
24
- type: ShapeType;
25
- shape: Shape;
26
- }[]) => void, metadata: Metadata, setMetadata: (v: Metadata) => void, initialData?: Output, enableLogs?: boolean) => void;
27
- export declare const useTool: (canvas: fabric.Canvas | null) => void;
28
- export declare const useDispatcherEvents: (canvas: fabric.Canvas | null) => void;
29
- export declare const useParametersForm: (parameters: OutputParameter[]) => {
30
- fields: Record<string, unknown>;
31
- setField: <T>(key: string) => (value: T) => void;
32
- setFields: import("react").Dispatch<import("react").SetStateAction<Record<string, unknown>>>;
33
- errors: Record<string, string>;
34
- setErrors: import("react").Dispatch<import("react").SetStateAction<Record<string, string>>>;
35
- };
@@ -1,320 +0,0 @@
1
- import * as fabric from 'fabric';
2
- import { useCallback, useContext, useEffect, useRef, useState } from 'react';
3
- import { v4 as uuidv4 } from 'uuid';
4
- import { useEditorContext } from '../../Providers/EditorProvider';
5
- import { UiContext } from '../../Providers/UiProvider';
6
- import { log } from '../../Utils';
7
- import Dispatcher from '../../Utils/Dispatcher';
8
- import { copyPolygon, handleDoubleClickPolygon, handleMouseDownPolygon, handleMouseMovePolygon } from './Polygon';
9
- import { copyPolyline, handleDoubleClickPolyline, handleMouseDownPolyline, handleMouseMovePolyline } from './Polyline';
10
- import { copyRectangle, handleMouseDownRect, handleMouseMoveRect, handleMouseUpRect } from './Rectangle';
11
- import { canDrawShape } from './Utils';
12
- export const useImageSize = (imageUrl) => {
13
- const [imageSize, setImageSize] = useState({ width: 0, height: 0 });
14
- useEffect(() => {
15
- const image = new Image();
16
- image.src = imageUrl;
17
- image.onload = () => {
18
- setImageSize({ width: image.width, height: image.height });
19
- };
20
- }, [imageUrl]);
21
- return { imageSize, isReady: imageSize.width > 0 };
22
- };
23
- export const useCanvasSize = (imageUrl) => {
24
- const wrapperRef = useRef(null);
25
- const [canvasSize, setCanvasSize] = useState({ width: 0, height: 0 });
26
- const { imageSize, isReady } = useImageSize(imageUrl);
27
- useEffect(() => {
28
- if (wrapperRef.current) {
29
- const update = () => {
30
- const availableWidth = wrapperRef.current.offsetWidth;
31
- if (availableWidth < imageSize.width) {
32
- setCanvasSize({
33
- width: availableWidth,
34
- height: availableWidth * (imageSize.height / imageSize.width),
35
- });
36
- }
37
- else {
38
- setCanvasSize({
39
- width: imageSize.width,
40
- height: imageSize.height,
41
- });
42
- }
43
- };
44
- if (imageSize.width > 0 && wrapperRef.current) {
45
- update();
46
- }
47
- }
48
- }, [imageSize, wrapperRef.current]); // eslint-disable-line
49
- return { imageSize, canvasSize, wrapperRef, isReady };
50
- };
51
- export const initCanvasData = (canvasRef, addShapes, metadata, setMetadata, initialData, enableLogs) => {
52
- log('info', enableLogs !== null && enableLogs !== void 0 ? enableLogs : false, 'Loading initial shapes data', initialData, canvasRef.current);
53
- if (initialData === null || initialData === void 0 ? void 0 : initialData.rois) {
54
- const m = [];
55
- const s = [];
56
- initialData.rois.forEach((r) => {
57
- var _a, _b, _c;
58
- log('info', enableLogs !== null && enableLogs !== void 0 ? enableLogs : false, 'Loading initial shape', r);
59
- const id = uuidv4();
60
- let shape;
61
- switch (r.type) {
62
- case "rect" /* ToolEnum.Rectangle */:
63
- shape = new fabric.Rect({
64
- left: r.shape.left,
65
- top: r.shape.top,
66
- originX: 'left',
67
- originY: 'top',
68
- width: r.shape.width,
69
- height: r.shape.height,
70
- fill: 'transparent',
71
- stroke: r.shape.color,
72
- strokeWidth: 2,
73
- strokeUniform: true,
74
- selectable: false,
75
- hasControls: true,
76
- hoverCursor: 'default',
77
- id,
78
- });
79
- (_a = canvasRef.current) === null || _a === void 0 ? void 0 : _a.add(shape);
80
- break;
81
- case "polygon" /* ToolEnum.Polygon */:
82
- shape = new fabric.Polygon(r.shape.points, {
83
- top: r.shape.top + 10,
84
- left: r.shape.left + 10,
85
- fill: 'transparent',
86
- stroke: r.shape.color,
87
- strokeWidth: 2,
88
- selectable: false,
89
- hasControls: true,
90
- hoverCursor: 'default',
91
- // @ts-expect-error id is not included in types but the property is added and it works
92
- id,
93
- });
94
- (_b = canvasRef.current) === null || _b === void 0 ? void 0 : _b.add(shape);
95
- break;
96
- case "polyline" /* ToolEnum.Polyline */:
97
- shape = new fabric.Polyline(r.shape.points, {
98
- top: r.shape.top + 10,
99
- left: r.shape.left + 10,
100
- fill: 'transparent',
101
- stroke: r.shape.color,
102
- strokeWidth: 2,
103
- selectable: false,
104
- hasControls: true,
105
- hoverCursor: 'default',
106
- id,
107
- });
108
- (_c = canvasRef.current) === null || _c === void 0 ? void 0 : _c.add(shape);
109
- break;
110
- }
111
- m.push({ id, parameters: r.parameters });
112
- s.push({ id, type: r.type, shape });
113
- });
114
- addShapes(s);
115
- setMetadata(Object.assign(Object.assign({}, metadata), { rois: m }));
116
- }
117
- };
118
- export const useTool = (canvas) => {
119
- const { configuration, activeTool, activeColor, shapes, addShape } = useEditorContext();
120
- const { notify, strings } = useContext(UiContext);
121
- const [isDrawing, setIsDrawing] = useState(false);
122
- const [shape, setShape] = useState(null);
123
- const [originX, setOriginX] = useState(0);
124
- const [originY, setOriginY] = useState(0);
125
- const [startPos] = useState({ x: 0, y: 0 });
126
- const [points, setPoints] = useState([]);
127
- const [lines, setLines] = useState([]);
128
- // Handler for object selected event to update style settings
129
- const handleObjectSelected = useCallback((event) => {
130
- var _a;
131
- Dispatcher.emit('canvas:shapeSelected', (_a = event.selected) !== null && _a !== void 0 ? _a : null);
132
- }, []);
133
- // Handler for selection cleared event to reset selected shapes state
134
- const handleSelectionCleared = useCallback(() => {
135
- Dispatcher.emit('canvas:shapeSelected', null);
136
- }, []);
137
- useEffect(() => {
138
- if (!canvas) {
139
- return;
140
- }
141
- if (activeTool === "pointer" /* ToolEnum.Pointer */) {
142
- // enable selection
143
- canvas.selection = true;
144
- canvas.getObjects().forEach((object) => {
145
- object.selectable = true;
146
- });
147
- canvas.renderAll();
148
- }
149
- else {
150
- // disable selection
151
- canvas.selection = false;
152
- canvas.discardActiveObject();
153
- Dispatcher.emit('canvas:shapeSelected', null);
154
- canvas.renderAll();
155
- }
156
- const handleMouseDown = (event) => {
157
- switch (activeTool) {
158
- case "rect" /* ToolEnum.Rectangle */:
159
- if (!canDrawShape(configuration, "rect" /* ToolEnum.Rectangle */, shapes, notify, strings.cannotDrawMoreRectangles))
160
- return;
161
- handleMouseDownRect(event, canvas, activeColor, setOriginX, setOriginY, setShape, setIsDrawing);
162
- break;
163
- case "polygon" /* ToolEnum.Polygon */:
164
- if (!canDrawShape(configuration, "polygon" /* ToolEnum.Polygon */, shapes, notify, strings.cannotDrawMorePolygons))
165
- return;
166
- handleMouseDownPolygon(event, canvas, activeColor, setIsDrawing, points, setPoints, lines, setLines);
167
- break;
168
- case "polyline" /* ToolEnum.Polyline */:
169
- if (!canDrawShape(configuration, "polyline" /* ToolEnum.Polyline */, shapes, notify, strings.cannotDrawMorePolylines))
170
- return;
171
- handleMouseDownPolyline(event, canvas, activeColor, setIsDrawing, points, setPoints, lines, setLines);
172
- break;
173
- default:
174
- break;
175
- }
176
- };
177
- const handleMouseMove = (event) => {
178
- switch (activeTool) {
179
- case "rect" /* ToolEnum.Rectangle */:
180
- handleMouseMoveRect(event, canvas, originX, originY, shape, isDrawing);
181
- break;
182
- case "polygon" /* ToolEnum.Polygon */:
183
- handleMouseMovePolygon(event, canvas, isDrawing, lines);
184
- break;
185
- case "polyline" /* ToolEnum.Polyline */:
186
- handleMouseMovePolyline(event, canvas, isDrawing, lines);
187
- break;
188
- default:
189
- break;
190
- }
191
- };
192
- const handleMouseUp = () => {
193
- switch (activeTool) {
194
- case "rect" /* ToolEnum.Rectangle */:
195
- handleMouseUpRect(canvas, setIsDrawing, shape, setShape, addShape);
196
- break;
197
- default:
198
- break;
199
- }
200
- };
201
- const handleDoubleClick = () => {
202
- switch (activeTool) {
203
- case "polygon" /* ToolEnum.Polygon */:
204
- handleDoubleClickPolygon(canvas, activeColor, setIsDrawing, points, setPoints, lines, setLines, addShape);
205
- break;
206
- case "polyline" /* ToolEnum.Polyline */:
207
- handleDoubleClickPolyline(canvas, activeColor, setIsDrawing, points, setPoints, lines, setLines, addShape);
208
- break;
209
- default:
210
- break;
211
- }
212
- };
213
- canvas.on('mouse:down', handleMouseDown);
214
- canvas.on('mouse:move', handleMouseMove);
215
- canvas.on('mouse:up', handleMouseUp);
216
- canvas.on('mouse:dblclick', handleDoubleClick);
217
- canvas.on('selection:created', handleObjectSelected);
218
- canvas.on('selection:updated', handleObjectSelected);
219
- canvas.on('selection:cleared', handleSelectionCleared);
220
- return () => {
221
- canvas.off('mouse:down', handleMouseDown);
222
- canvas.off('mouse:move', handleMouseMove);
223
- canvas.off('mouse:up', handleMouseUp);
224
- canvas.off('mouse:dblclick', handleDoubleClick);
225
- canvas.off('selection:created', handleObjectSelected);
226
- canvas.off('selection:updated', handleObjectSelected);
227
- canvas.off('selection:cleared', handleSelectionCleared);
228
- };
229
- }, [
230
- activeTool,
231
- activeColor,
232
- isDrawing,
233
- shape,
234
- originX,
235
- originY,
236
- startPos,
237
- lines,
238
- points,
239
- canvas,
240
- addShape,
241
- handleObjectSelected,
242
- handleSelectionCleared,
243
- configuration,
244
- notify,
245
- strings,
246
- shapes,
247
- ]);
248
- };
249
- export const useDispatcherEvents = (canvas) => {
250
- const { configuration, shapes, addShape, setActiveTool } = useEditorContext();
251
- const { notify, strings } = useContext(UiContext);
252
- useEffect(() => {
253
- const removeShape = (_, id) => {
254
- const obj = canvas === null || canvas === void 0 ? void 0 : canvas.getObjects().find((s) => s.id === id);
255
- if (obj) {
256
- canvas === null || canvas === void 0 ? void 0 : canvas.remove(obj);
257
- }
258
- };
259
- const copyShape = (_, id) => {
260
- const obj = canvas === null || canvas === void 0 ? void 0 : canvas.getObjects().find((s) => s.id === id);
261
- let copy;
262
- switch (obj === null || obj === void 0 ? void 0 : obj.type) {
263
- case "polygon" /* ToolEnum.Polygon */:
264
- if (!canDrawShape(configuration, "polygon" /* ToolEnum.Polygon */, shapes, notify, strings.cannotDrawMorePolygons))
265
- return;
266
- copy = copyPolygon(canvas, obj, addShape);
267
- // @ts-expect-error id exists but his stupid ts does not know
268
- Dispatcher.emit('canvas:selectShape', copy.id);
269
- break;
270
- case "polyline" /* ToolEnum.Polyline */:
271
- if (!canDrawShape(configuration, "polyline" /* ToolEnum.Polyline */, shapes, notify, strings.cannotDrawMorePolylines))
272
- return;
273
- copy = copyPolyline(canvas, obj, addShape);
274
- // @ts-expect-error id exists but his stupid ts does not know
275
- Dispatcher.emit('canvas:selectShape', copy.id);
276
- break;
277
- case "rect" /* ToolEnum.Rectangle */:
278
- if (!canDrawShape(configuration, "rect" /* ToolEnum.Rectangle */, shapes, notify, strings.cannotDrawMoreRectangles))
279
- return;
280
- copy = copyRectangle(canvas, obj, addShape);
281
- // @ts-expect-error id exists but his stupid ts does not know
282
- Dispatcher.emit('canvas:selectShape', copy.id);
283
- break;
284
- default:
285
- break;
286
- }
287
- };
288
- const selectShape = (_, id) => {
289
- const obj = canvas === null || canvas === void 0 ? void 0 : canvas.getObjects().find((s) => s.id === id);
290
- if (obj) {
291
- canvas === null || canvas === void 0 ? void 0 : canvas.discardActiveObject();
292
- canvas === null || canvas === void 0 ? void 0 : canvas.setActiveObject(obj);
293
- canvas === null || canvas === void 0 ? void 0 : canvas.requestRenderAll();
294
- setActiveTool("pointer" /* ToolEnum.Pointer */);
295
- }
296
- };
297
- Dispatcher.register('canvas:removeShape', removeShape);
298
- Dispatcher.register('canvas:copyShape', copyShape);
299
- Dispatcher.register('canvas:selectShape', selectShape);
300
- return () => {
301
- Dispatcher.unregister('canvas:removeShape', removeShape);
302
- Dispatcher.unregister('canvas:copyShape', copyShape);
303
- Dispatcher.unregister('canvas:selectShape', selectShape);
304
- };
305
- }, [setActiveTool, canvas, addShape, configuration, shapes, notify, strings]);
306
- };
307
- export const useParametersForm = (parameters) => {
308
- const [errors, setErrors] = useState({});
309
- const [fields, setFields] = useState(parameters.reduce((acc, p) => (Object.assign(Object.assign({}, acc), { [p.codename]: p.value })), {}));
310
- const setField = (key) => (value) => {
311
- setFields(Object.assign(Object.assign({}, fields), { [key]: value }));
312
- };
313
- return {
314
- fields,
315
- setField,
316
- setFields,
317
- errors,
318
- setErrors,
319
- };
320
- };
@@ -1,9 +0,0 @@
1
- import { ConfigurationParameter } from './Types';
2
- export type ParameterFieldProps<T> = {
3
- value: T;
4
- onChange: (value: T) => void;
5
- parameter: ConfigurationParameter;
6
- errors: Record<string, string>;
7
- };
8
- declare const ParameterField: <T>({ value, onChange, parameter, errors }: ParameterFieldProps<T>) => import("react/jsx-runtime").JSX.Element | null;
9
- export default ParameterField;
@@ -1,27 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useContext } from 'react';
3
- import { UiContext } from '../../Providers/UiProvider';
4
- const ParameterField = ({ value, onChange, parameter, errors }) => {
5
- var _a, _b;
6
- const { TextField, NumberField, BoolField, EnumField, strings } = useContext(UiContext);
7
- const props = {
8
- required: parameter.required,
9
- label: `${parameter.label}${parameter.unit ? ` (${parameter.unit})` : ''}`,
10
- error: !!errors[parameter.codename],
11
- helperText: errors[parameter.codename]
12
- ? strings[errors[parameter.codename]]
13
- : parameter.description,
14
- };
15
- switch (parameter.type) {
16
- case 'string':
17
- return ((_a = parameter.options) === null || _a === void 0 ? void 0 : _a.length) ? (_jsx(EnumField, Object.assign({ value: value, onChange: (v) => onChange(v), options: parameter.options, multiple: parameter.multiple }, props))) : (_jsx(TextField, Object.assign({ type: "text", value: value, onChange: (v) => onChange(v) }, props)));
18
- case 'int':
19
- case 'float':
20
- return ((_b = parameter.options) === null || _b === void 0 ? void 0 : _b.length) ? (_jsx(EnumField, Object.assign({ value: value, onChange: (v) => onChange(v), options: parameter.options, multiple: parameter.multiple }, props))) : (_jsx(NumberField, Object.assign({ value: value, onChange: (v) => onChange(v) }, props)));
21
- case 'bool':
22
- return _jsx(BoolField, Object.assign({ value: value, onChange: (v) => onChange(v) }, props));
23
- default:
24
- return null;
25
- }
26
- };
27
- export default ParameterField;
@@ -1,5 +0,0 @@
1
- .form {
2
- display: flex;
3
- flex-direction: column;
4
- gap: 1rem;
5
- }
@@ -1,10 +0,0 @@
1
- import { ConfigurationParameter, OutputParameter } from '../Types';
2
- export type ParametersModalFormProps = {
3
- onClose: () => void;
4
- title: string;
5
- parameters: ConfigurationParameter[];
6
- data: OutputParameter[];
7
- onSubmit: (data: OutputParameter[]) => void;
8
- };
9
- declare const ParametersModalForm: React.FC<ParametersModalFormProps>;
10
- export default ParametersModalForm;
@@ -1,31 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useContext } from 'react';
3
- import { UiContext } from '../../../Providers/UiProvider';
4
- import { css } from '../../../Utils';
5
- import { useParametersForm } from '../Hooks';
6
- import ParameterField from '../ParameterField';
7
- import styles from './ParametersModalForm.module.css';
8
- import { validateParametersForm } from '../Utils';
9
- const ParametersModalForm = ({ title, onClose, parameters, data, onSubmit }) => {
10
- const { Modal } = useContext(UiContext);
11
- const { fields, setField, errors, setErrors } = useParametersForm(data);
12
- const handleSubmit = () => {
13
- if (validateParametersForm(parameters, fields, setErrors)) {
14
- onSubmit([...parameters.map((p) => ({ codename: p.codename, value: fields[p.codename] }))]);
15
- }
16
- };
17
- return (_jsx(Modal, { onClose: onClose, title: title, isOpen: true, maxWidth: "sm", onSubmit: handleSubmit, children: _jsx("div", { className: css('form', styles, null), children: parameters.map((parameter) => {
18
- switch (parameter.type) {
19
- case 'string':
20
- return (_jsx(ParameterField, { value: String(fields[parameter.codename]), onChange: setField(parameter.codename), parameter: parameter, errors: errors }, parameter.codename));
21
- case 'int':
22
- case 'float':
23
- return (_jsx(ParameterField, { value: fields[parameter.codename], onChange: setField(parameter.codename), parameter: parameter, errors: errors }, parameter.codename));
24
- case 'bool':
25
- return (_jsx(ParameterField, { value: fields[parameter.codename], onChange: setField(parameter.codename), parameter: parameter, errors: errors }, parameter.codename));
26
- default:
27
- return null;
28
- }
29
- }) }) }));
30
- };
31
- export default ParametersModalForm;
@@ -1,18 +0,0 @@
1
- import * as fabric from 'fabric';
2
- import { FabricEvent, IAddShape } from './Types';
3
- export declare const handleMouseDownPolygon: (event: FabricEvent, canvas: fabric.Canvas, activeColor: string, setIsDrawing: (v: boolean) => void, points: {
4
- x: number;
5
- y: number;
6
- }[], setPoints: (v: {
7
- x: number;
8
- y: number;
9
- }[]) => void, lines: fabric.Line[], setLines: (v: fabric.Line[]) => void) => void;
10
- export declare const handleMouseMovePolygon: (event: FabricEvent, canvas: fabric.Canvas, isDrawing: boolean, lines: fabric.Line[]) => void;
11
- export declare const handleDoubleClickPolygon: (canvas: fabric.Canvas, activeColor: string, setIsDrawing: (v: boolean) => void, points: {
12
- x: number;
13
- y: number;
14
- }[], setPoints: (v: {
15
- x: number;
16
- y: number;
17
- }[]) => void, lines: fabric.Line[], setLines: (v: fabric.Line[]) => void, addShape: IAddShape) => void;
18
- export declare const copyPolygon: (canvas: fabric.Canvas, polygon: fabric.Polygon, addShape: IAddShape) => fabric.Polygon;