@yorab/react-paint 0.2.2
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.
- package/Changelog.md +26 -0
- package/README.md +99 -0
- package/dist/components/App.d.ts +20 -0
- package/dist/components/App.js +533 -0
- package/dist/components/Canvas.d.ts +28 -0
- package/dist/components/Canvas.js +188 -0
- package/dist/components/common/Button.d.ts +14 -0
- package/dist/components/common/Button.js +97 -0
- package/dist/components/common/Loading.d.ts +6 -0
- package/dist/components/common/Loading.js +66 -0
- package/dist/components/common/Modal.d.ts +8 -0
- package/dist/components/common/Modal.js +41 -0
- package/dist/components/common/Panel.d.ts +10 -0
- package/dist/components/common/Panel.js +48 -0
- package/dist/components/common/Snackbar.d.ts +7 -0
- package/dist/components/common/Snackbar.js +75 -0
- package/dist/components/settings/ColorField.d.ts +12 -0
- package/dist/components/settings/ColorField.js +128 -0
- package/dist/components/settings/DeleteButton.d.ts +9 -0
- package/dist/components/settings/DeleteButton.js +36 -0
- package/dist/components/settings/FontFamilyField.d.ts +10 -0
- package/dist/components/settings/FontFamilyField.js +57 -0
- package/dist/components/settings/LayoutButton.d.ts +8 -0
- package/dist/components/settings/LayoutButton.js +37 -0
- package/dist/components/settings/Layouts.d.ts +18 -0
- package/dist/components/settings/Layouts.js +218 -0
- package/dist/components/settings/LineArrowField.d.ts +10 -0
- package/dist/components/settings/LineArrowField.js +59 -0
- package/dist/components/settings/LineTypeField.d.ts +14 -0
- package/dist/components/settings/LineTypeField.js +57 -0
- package/dist/components/settings/PointsNumberField.d.ts +11 -0
- package/dist/components/settings/PointsNumberField.js +51 -0
- package/dist/components/settings/RangeField.d.ts +16 -0
- package/dist/components/settings/RangeField.js +90 -0
- package/dist/components/settings/SelectField.d.ts +16 -0
- package/dist/components/settings/SelectField.js +82 -0
- package/dist/components/settings/SettingsBar.d.ts +16 -0
- package/dist/components/settings/SettingsBar.js +262 -0
- package/dist/components/toolbox/EditTextBox.d.ts +10 -0
- package/dist/components/toolbox/EditTextBox.js +89 -0
- package/dist/components/toolbox/LoadFileTool.d.ts +11 -0
- package/dist/components/toolbox/LoadFileTool.js +58 -0
- package/dist/components/toolbox/MenuGroup.d.ts +23 -0
- package/dist/components/toolbox/MenuGroup.js +173 -0
- package/dist/components/toolbox/PictureUrlInput.d.ts +7 -0
- package/dist/components/toolbox/PictureUrlInput.js +96 -0
- package/dist/components/toolbox/Tool.d.ts +13 -0
- package/dist/components/toolbox/Tool.js +41 -0
- package/dist/components/toolbox/Toolbar.d.ts +20 -0
- package/dist/components/toolbox/Toolbar.js +205 -0
- package/dist/components/toolbox/ToolbarGroup.d.ts +18 -0
- package/dist/components/toolbox/ToolbarGroup.js +139 -0
- package/dist/constants/draw.d.ts +2 -0
- package/dist/constants/draw.js +10 -0
- package/dist/constants/icons.d.ts +36 -0
- package/dist/constants/icons.js +80 -0
- package/dist/constants/shapes.d.ts +5 -0
- package/dist/constants/shapes.js +14 -0
- package/dist/constants/snackbar.d.ts +11 -0
- package/dist/constants/snackbar.js +23 -0
- package/dist/constants/style.d.ts +12 -0
- package/dist/constants/style.js +30 -0
- package/dist/hooks/useComponent.d.ts +9 -0
- package/dist/hooks/useComponent.js +48 -0
- package/dist/hooks/useDrag.d.ts +15 -0
- package/dist/hooks/useDrag.js +100 -0
- package/dist/hooks/useDrawableCanvas.d.ts +30 -0
- package/dist/hooks/useDrawableCanvas.js +250 -0
- package/dist/hooks/useKeyboard.d.ts +15 -0
- package/dist/hooks/useKeyboard.js +123 -0
- package/dist/hooks/useShapes.d.ts +22 -0
- package/dist/hooks/useShapes.js +229 -0
- package/dist/hooks/useSnackbar.d.ts +16 -0
- package/dist/hooks/useSnackbar.js +86 -0
- package/dist/schemas/drawableShape.json +1021 -0
- package/dist/styles.css +88 -0
- package/dist/types/Mode.d.ts +51 -0
- package/dist/types/Mode.js +17 -0
- package/dist/types/Shapes.d.ts +122 -0
- package/dist/types/Shapes.js +35 -0
- package/dist/types/keyboard.d.ts +15 -0
- package/dist/types/keyboard.js +28 -0
- package/dist/utils/data.d.ts +4 -0
- package/dist/utils/data.js +178 -0
- package/dist/utils/draw.d.ts +18 -0
- package/dist/utils/draw.js +422 -0
- package/dist/utils/file.d.ts +33 -0
- package/dist/utils/file.js +220 -0
- package/dist/utils/intersect.d.ts +8 -0
- package/dist/utils/intersect.js +194 -0
- package/dist/utils/selection.d.ts +7 -0
- package/dist/utils/selection.js +88 -0
- package/dist/utils/shapeData.d.ts +5 -0
- package/dist/utils/shapeData.js +178 -0
- package/dist/utils/string.d.ts +3 -0
- package/dist/utils/string.js +42 -0
- package/dist/utils/style.d.ts +2 -0
- package/dist/utils/style.js +46 -0
- package/dist/utils/toolbar.d.ts +12 -0
- package/dist/utils/toolbar.js +37 -0
- package/dist/utils/transform.d.ts +271 -0
- package/dist/utils/transform.js +371 -0
- package/package.json +79 -0
package/Changelog.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# V.0.2.2 :
|
|
2
|
+
|
|
3
|
+
- Migrate to react 18
|
|
4
|
+
- fix Picture type
|
|
5
|
+
- change pen join and cap to round
|
|
6
|
+
- replace loading snackbar with proper loader
|
|
7
|
+
- support for canGrow and canShrink prop
|
|
8
|
+
- rename project
|
|
9
|
+
- release on npm
|
|
10
|
+
|
|
11
|
+
# V.0.2.1 :
|
|
12
|
+
|
|
13
|
+
- better ui for input modal
|
|
14
|
+
- lock functionnality
|
|
15
|
+
- toggle grid
|
|
16
|
+
- layouts panel UI
|
|
17
|
+
|
|
18
|
+
# V.0.2.0 :
|
|
19
|
+
|
|
20
|
+
- fix for scaling brush
|
|
21
|
+
- fix snackbar
|
|
22
|
+
- refonte UI toolbar
|
|
23
|
+
- update examples
|
|
24
|
+
- button with icons
|
|
25
|
+
- mini toolbar to fix
|
|
26
|
+
- provide tool for url only
|
package/README.md
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
## To regenerate schema :
|
|
2
|
+
|
|
3
|
+
typescript-json-schema "src/types/Shapes.ts" DrawableShapeJson --out 'src/schemas/drawableShape.json'
|
|
4
|
+
|
|
5
|
+
# known issues :
|
|
6
|
+
|
|
7
|
+
## mobile/touch
|
|
8
|
+
|
|
9
|
+
- dnd layout on mobile not working CRITIC (fix : use dnd lib, or add touch listener to fake dnd, or provide alt UI)
|
|
10
|
+
- double click not working with touch CRITIC (fix: fake it countinng delay between touch)
|
|
11
|
+
|
|
12
|
+
## canvas resizing
|
|
13
|
+
|
|
14
|
+
- TextEdit position and size not working with canvas resized MINOR (fix : apply current canvas ratio to position and font size)
|
|
15
|
+
- anchors become too small MAJOR (possible fix : increase size with current canvas ratio )
|
|
16
|
+
|
|
17
|
+
## other
|
|
18
|
+
|
|
19
|
+
- TextEdit cursor overflow MINOR (quick fix : edit on modale)
|
|
20
|
+
- circle resizing only goes one direction
|
|
21
|
+
|
|
22
|
+
# Remarques de thomas :
|
|
23
|
+
|
|
24
|
+
## done
|
|
25
|
+
|
|
26
|
+
- les options (épaisseurs, style de trait...) ont une UI très peu utilisable (on sait pas quel option fait quoi et comment, on teste au pif)
|
|
27
|
+
l'option de changement de couleur :
|
|
28
|
+
ne s'applique qu'à la validation, c'est pas top pour savoir quelle couleur on veut parce qu'on est obligé de validé, voir que c'est pas beau, rouvrir... et ainsi de suite
|
|
29
|
+
- a un petit bug : j'ouvre la modale de sélection, je clique à côté (ça unselect la forme), je change la couleur et valide : il ne se passe rien. Je comprends la logique derrière, mais à l'usage ça n'a pas trop de sens
|
|
30
|
+
- pas de possibilité de setter l'opacité des objets, dommage je pense qu'il y a une vraie utilité à ça
|
|
31
|
+
- croix qui efface le canvas
|
|
32
|
+
il faut une confirmation ! :D
|
|
33
|
+
|
|
34
|
+
## remaining
|
|
35
|
+
|
|
36
|
+
- pas de possibilité de sélectionner plusieurs objets avec un press/trace une zone avec la souris/relache (mécanique assez courante quand il y a de la manipulation d'objets)
|
|
37
|
+
- pas de possibilité de zoom/dezoom dans le canvas, et ça c'est super utile amha
|
|
38
|
+
|
|
39
|
+
### pinceau
|
|
40
|
+
|
|
41
|
+
- certains outils lisse le trait une fois que tu valides le tracé, et ça donne un rendu plus naturel et propre que ce qu'on trace au pad/souris. Du nice to have loin d'être prioritaire
|
|
42
|
+
- avoir plusieurs style de pinceau (mode surligneur par exemple). ca serait utile sur des exo et techniquement c'est peut-être juste des preset de taille/couleur/opacité de l'outil actuel
|
|
43
|
+
- je ne sais pas pourquoi, mais il a l'air moins fluide/smooth au tracé que marker.js (peut-être une illusion)
|
|
44
|
+
|
|
45
|
+
### trait
|
|
46
|
+
|
|
47
|
+
- j'ai été surpris que ça me trace la "forme" dans un rectangle plutôt que d'avoir juste les 2 points sélectionnés (sans le cadre autour quoi)
|
|
48
|
+
|
|
49
|
+
### polygone
|
|
50
|
+
|
|
51
|
+
- démarrer avec un polygone à 2 côté, c'est pas possible ça :sourire:
|
|
52
|
+
quand on change le nombre de côté ça reste un truc plat et ensuite on tire des points :
|
|
53
|
+
c'est pas du tout évident
|
|
54
|
+
ça donne des formes qui ne sont pas des polygones (genre un noeuf papillon)
|
|
55
|
+
idéalement, il faudrait démarrer avec un pentagone parfait -5 côtés de même longueur- (en dessous se sont des polygones trop communs) et quand on change le nombre de côté ça reset la forme sur un polygone parfait de X côtés
|
|
56
|
+
|
|
57
|
+
### Texte
|
|
58
|
+
|
|
59
|
+
- options trop limitée, il faudrait à minima pouvoir changer la taille de la police, choisir plus de police, et faire un peu de mise en forme (i, b, u)
|
|
60
|
+
|
|
61
|
+
## bof
|
|
62
|
+
|
|
63
|
+
- avoir les options dans un tooltip-like, au dessus de la forme, serait merveilleux (comme sur Miro, ou comme sur nos manuels avec la barre de mise en forme de texte)
|
|
64
|
+
- rectangle: pas de carré avec maj, snif
|
|
65
|
+
une option de la forme pour bloqué le ratio en "carré" ?
|
|
66
|
+
- cercle/elipse
|
|
67
|
+
redondant, la diff des outils me parait too much et pas clair
|
|
68
|
+
bloqué en ratio cercle avec maj ou une option de forme (cf rectangle/carré) ?
|
|
69
|
+
|
|
70
|
+
# En prévision / Future MAJ
|
|
71
|
+
|
|
72
|
+
- fix text
|
|
73
|
+
|
|
74
|
+
- Migrer sous Vite +
|
|
75
|
+
|
|
76
|
+
- configurer npm publish
|
|
77
|
+
|
|
78
|
+
- possibility to have presets
|
|
79
|
+
- possibility to provide presets in props
|
|
80
|
+
- add presets
|
|
81
|
+
|
|
82
|
+
- add more settings
|
|
83
|
+
- settings ui
|
|
84
|
+
- add settings customization
|
|
85
|
+
|
|
86
|
+
# A prévoir
|
|
87
|
+
|
|
88
|
+
- ladle (wait for windows support https://github.com/tajo/ladle/issues/67)
|
|
89
|
+
- get rid of enum for better typescript
|
|
90
|
+
- add shortcuts (for tools) and show it in titles
|
|
91
|
+
- Menu contextuel au clic droit (changement de plan, supprimer, duplicate, copy, lock)
|
|
92
|
+
- bordure des traits à revoir
|
|
93
|
+
- améliorer perfs avec précalculs + usage de path
|
|
94
|
+
- lissage de traits
|
|
95
|
+
- Move + zoom functionnality
|
|
96
|
+
- UI customization
|
|
97
|
+
- Tests !
|
|
98
|
+
- fix remaining issues
|
|
99
|
+
- fullscreen mode ?
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { MutableRefObject } from 'react';
|
|
2
|
+
import { DrawableShapeJson, ShapeEnum } from 'types/Shapes';
|
|
3
|
+
declare type AppType = {
|
|
4
|
+
width?: number;
|
|
5
|
+
height?: number;
|
|
6
|
+
canGrow?: boolean;
|
|
7
|
+
canShrink?: boolean;
|
|
8
|
+
withLayouts?: 'always' | 'never' | 'visible' | 'hidden';
|
|
9
|
+
shapes?: DrawableShapeJson[];
|
|
10
|
+
className?: string;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
onDataChanged?: () => void;
|
|
13
|
+
availableTools?: ShapeEnum[];
|
|
14
|
+
apiRef?: MutableRefObject<undefined | {
|
|
15
|
+
getCurrentImage: () => string | undefined;
|
|
16
|
+
getCurrentData: () => DrawableShapeJson[];
|
|
17
|
+
}>;
|
|
18
|
+
};
|
|
19
|
+
declare const App: ({ width, height, canGrow, canShrink, withLayouts, shapes: shapesFromProps, className: classNameFromProps, disabled, onDataChanged, availableTools: availableToolsFromProps, apiRef }: AppType) => JSX.Element;
|
|
20
|
+
export default App;
|
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "__esModule", {
|
|
8
|
+
value: true
|
|
9
|
+
});
|
|
10
|
+
exports["default"] = void 0;
|
|
11
|
+
|
|
12
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
13
|
+
|
|
14
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
15
|
+
|
|
16
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
17
|
+
|
|
18
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
19
|
+
|
|
20
|
+
var _fp = _interopRequireDefault(require("lodash/fp"));
|
|
21
|
+
|
|
22
|
+
var _Shapes = require("../types/Shapes");
|
|
23
|
+
|
|
24
|
+
var _Canvas = _interopRequireDefault(require("./Canvas"));
|
|
25
|
+
|
|
26
|
+
var _Layouts = _interopRequireDefault(require("./settings/Layouts"));
|
|
27
|
+
|
|
28
|
+
var _Toolbar = _interopRequireDefault(require("./toolbox/Toolbar"));
|
|
29
|
+
|
|
30
|
+
var _react2 = require("@linaria/react");
|
|
31
|
+
|
|
32
|
+
var _SettingsBar = _interopRequireDefault(require("./settings/SettingsBar"));
|
|
33
|
+
|
|
34
|
+
var _style = require("../constants/style");
|
|
35
|
+
|
|
36
|
+
var _useKeyboard = _interopRequireDefault(require("../hooks/useKeyboard"));
|
|
37
|
+
|
|
38
|
+
var _file = require("../utils/file");
|
|
39
|
+
|
|
40
|
+
var _Mode = require("../types/Mode");
|
|
41
|
+
|
|
42
|
+
var _useComponent2 = _interopRequireDefault(require("../hooks/useComponent"));
|
|
43
|
+
|
|
44
|
+
var _useShapes2 = _interopRequireDefault(require("../hooks/useShapes"));
|
|
45
|
+
|
|
46
|
+
var _Snackbar = _interopRequireDefault(require("./common/Snackbar"));
|
|
47
|
+
|
|
48
|
+
var _useSnackbar2 = _interopRequireDefault(require("../hooks/useSnackbar"));
|
|
49
|
+
|
|
50
|
+
var _snackbar = require("../constants/snackbar");
|
|
51
|
+
|
|
52
|
+
var _Loading = _interopRequireDefault(require("./common/Loading"));
|
|
53
|
+
|
|
54
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
55
|
+
|
|
56
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
57
|
+
|
|
58
|
+
var StyledApp = /*#__PURE__*/(0, _react2.styled)("div")({
|
|
59
|
+
name: "StyledApp",
|
|
60
|
+
"class": "s1v9piyg",
|
|
61
|
+
vars: {
|
|
62
|
+
"s1v9piyg-0": [function (_ref) {
|
|
63
|
+
var width = _ref.width;
|
|
64
|
+
return "min(100%, ".concat(width, "px)");
|
|
65
|
+
}],
|
|
66
|
+
"s1v9piyg-1": [function (_ref2) {
|
|
67
|
+
var width = _ref2.width;
|
|
68
|
+
return width;
|
|
69
|
+
}, "px"]
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
var StyledRow = /*#__PURE__*/(0, _react2.styled)("div")({
|
|
73
|
+
name: "StyledRow",
|
|
74
|
+
"class": "s6o5tmu",
|
|
75
|
+
vars: {
|
|
76
|
+
"s6o5tmu-1": [function (_ref3) {
|
|
77
|
+
var width = _ref3.width;
|
|
78
|
+
return width;
|
|
79
|
+
}, "px"],
|
|
80
|
+
"s6o5tmu-2": [function (_ref4) {
|
|
81
|
+
var aspectRatio = _ref4.aspectRatio;
|
|
82
|
+
return aspectRatio;
|
|
83
|
+
}]
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
var DEFAULT_TOOLS = [_Shapes.ShapeEnum.brush, _Shapes.ShapeEnum.line, _Shapes.ShapeEnum.polygon, _Shapes.ShapeEnum.curve, _Shapes.ShapeEnum.rect, _Shapes.ShapeEnum.square, _Shapes.ShapeEnum.circle, _Shapes.ShapeEnum.ellipse, _Shapes.ShapeEnum.text, _Shapes.ShapeEnum.picture];
|
|
87
|
+
|
|
88
|
+
var App = function App(_ref5) {
|
|
89
|
+
var _ref5$width = _ref5.width,
|
|
90
|
+
width = _ref5$width === void 0 ? 1000 : _ref5$width,
|
|
91
|
+
_ref5$height = _ref5.height,
|
|
92
|
+
height = _ref5$height === void 0 ? 600 : _ref5$height,
|
|
93
|
+
_ref5$canGrow = _ref5.canGrow,
|
|
94
|
+
canGrow = _ref5$canGrow === void 0 ? false : _ref5$canGrow,
|
|
95
|
+
_ref5$canShrink = _ref5.canShrink,
|
|
96
|
+
canShrink = _ref5$canShrink === void 0 ? true : _ref5$canShrink,
|
|
97
|
+
_ref5$withLayouts = _ref5.withLayouts,
|
|
98
|
+
withLayouts = _ref5$withLayouts === void 0 ? 'hidden' : _ref5$withLayouts,
|
|
99
|
+
shapesFromProps = _ref5.shapes,
|
|
100
|
+
classNameFromProps = _ref5.className,
|
|
101
|
+
_ref5$disabled = _ref5.disabled,
|
|
102
|
+
disabled = _ref5$disabled === void 0 ? false : _ref5$disabled,
|
|
103
|
+
onDataChanged = _ref5.onDataChanged,
|
|
104
|
+
_ref5$availableTools = _ref5.availableTools,
|
|
105
|
+
availableToolsFromProps = _ref5$availableTools === void 0 ? DEFAULT_TOOLS : _ref5$availableTools,
|
|
106
|
+
apiRef = _ref5.apiRef;
|
|
107
|
+
var componentRef = (0, _react.useRef)(null);
|
|
108
|
+
var canvasRef = (0, _react.useRef)(null);
|
|
109
|
+
|
|
110
|
+
var availableTools = _fp["default"].intersection(DEFAULT_TOOLS, availableToolsFromProps);
|
|
111
|
+
|
|
112
|
+
var _useComponent = (0, _useComponent2["default"])({
|
|
113
|
+
disabled: disabled,
|
|
114
|
+
componentRef: componentRef
|
|
115
|
+
}),
|
|
116
|
+
isInsideComponent = _useComponent.isInsideComponent;
|
|
117
|
+
|
|
118
|
+
var _useState = (0, _react.useState)({
|
|
119
|
+
style: {
|
|
120
|
+
fillColor: 'transparent',
|
|
121
|
+
strokeColor: 'black',
|
|
122
|
+
globalAlpha: 100,
|
|
123
|
+
lineWidth: 1,
|
|
124
|
+
lineDash: 0,
|
|
125
|
+
lineArrow: 0,
|
|
126
|
+
pointsCount: 3,
|
|
127
|
+
fontFamily: _style.STYLE_FONT_DEFAULT
|
|
128
|
+
}
|
|
129
|
+
}),
|
|
130
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
131
|
+
defaultConf = _useState2[0],
|
|
132
|
+
setDefaultConf = _useState2[1];
|
|
133
|
+
|
|
134
|
+
var _useState3 = (0, _react.useState)(false),
|
|
135
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
136
|
+
isLoading = _useState4[0],
|
|
137
|
+
setIsLoading = _useState4[1];
|
|
138
|
+
|
|
139
|
+
var _useState5 = (0, _react.useState)(withLayouts === 'always' || withLayouts === 'visible'),
|
|
140
|
+
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
|
|
141
|
+
isLayoutPanelShown = _useState6[0],
|
|
142
|
+
setIsLayoutPanelShown = _useState6[1];
|
|
143
|
+
|
|
144
|
+
var _useState7 = (0, _react.useState)([0, 0]),
|
|
145
|
+
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
|
|
146
|
+
canvasOffset = _useState8[0],
|
|
147
|
+
setCanvasOffset = _useState8[1];
|
|
148
|
+
|
|
149
|
+
var _useState9 = (0, _react.useState)(undefined),
|
|
150
|
+
_useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
|
|
151
|
+
canvasOffsetStartPosition = _useState10[0],
|
|
152
|
+
setCanvasOffsetStartPosition = _useState10[1];
|
|
153
|
+
|
|
154
|
+
var _useState11 = (0, _react.useState)(_Shapes.ToolEnum.selection),
|
|
155
|
+
_useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
|
|
156
|
+
activeTool = _useState12[0],
|
|
157
|
+
setActiveTool = _useState12[1];
|
|
158
|
+
|
|
159
|
+
var _useState13 = (0, _react.useState)({
|
|
160
|
+
mode: _Mode.SelectionModeLib["default"]
|
|
161
|
+
}),
|
|
162
|
+
_useState14 = (0, _slicedToArray2["default"])(_useState13, 2),
|
|
163
|
+
selectionMode = _useState14[0],
|
|
164
|
+
setSelectionMode = _useState14[1];
|
|
165
|
+
|
|
166
|
+
var _useState15 = (0, _react.useState)(true),
|
|
167
|
+
_useState16 = (0, _slicedToArray2["default"])(_useState15, 2),
|
|
168
|
+
withGrid = _useState16[0],
|
|
169
|
+
setWithGrid = _useState16[1];
|
|
170
|
+
|
|
171
|
+
var _useShapes = (0, _useShapes2["default"])(onDataChanged),
|
|
172
|
+
shapesRef = _useShapes.shapesRef,
|
|
173
|
+
selectedShape = _useShapes.selectedShape,
|
|
174
|
+
addShape = _useShapes.addShape,
|
|
175
|
+
addPictureShape = _useShapes.addPictureShape,
|
|
176
|
+
moveShapes = _useShapes.moveShapes,
|
|
177
|
+
setSelectedShape = _useShapes.setSelectedShape,
|
|
178
|
+
removeShape = _useShapes.removeShape,
|
|
179
|
+
updateShape = _useShapes.updateShape,
|
|
180
|
+
backwardShape = _useShapes.backwardShape,
|
|
181
|
+
forwardShape = _useShapes.forwardShape,
|
|
182
|
+
clearShapes = _useShapes.clearShapes,
|
|
183
|
+
saveShapes = _useShapes.saveShapes,
|
|
184
|
+
toggleShapeVisibility = _useShapes.toggleShapeVisibility,
|
|
185
|
+
toggleShapeLock = _useShapes.toggleShapeLock,
|
|
186
|
+
canGoBackward = _useShapes.canGoBackward,
|
|
187
|
+
canGoForward = _useShapes.canGoForward,
|
|
188
|
+
canClear = _useShapes.canClear;
|
|
189
|
+
|
|
190
|
+
var _useSnackbar = (0, _useSnackbar2["default"])(),
|
|
191
|
+
snackbarList = _useSnackbar.snackbarList,
|
|
192
|
+
addSnackbar = _useSnackbar.addSnackbar;
|
|
193
|
+
|
|
194
|
+
var selectTool = (0, _react.useCallback)(function (tool) {
|
|
195
|
+
setSelectedShape(undefined);
|
|
196
|
+
setActiveTool(tool);
|
|
197
|
+
}, [setSelectedShape]);
|
|
198
|
+
var undoAction = (0, _react.useCallback)(function () {
|
|
199
|
+
selectTool(_Shapes.ToolEnum.selection);
|
|
200
|
+
backwardShape();
|
|
201
|
+
}, [selectTool, backwardShape]);
|
|
202
|
+
var redoAction = (0, _react.useCallback)(function () {
|
|
203
|
+
selectTool(_Shapes.ToolEnum.selection);
|
|
204
|
+
forwardShape();
|
|
205
|
+
}, [selectTool, forwardShape]);
|
|
206
|
+
var clearCanvas = (0, _react.useCallback)(function () {
|
|
207
|
+
var shapesToInit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
208
|
+
var clearHistory = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
209
|
+
clearShapes(shapesToInit, clearHistory);
|
|
210
|
+
selectTool(_Shapes.ToolEnum.selection);
|
|
211
|
+
setCanvasOffset([0, 0]);
|
|
212
|
+
}, [selectTool, clearShapes]);
|
|
213
|
+
var selectShape = (0, _react.useCallback)(function (shape) {
|
|
214
|
+
setActiveTool(_Shapes.ToolEnum.selection);
|
|
215
|
+
setSelectedShape(shape);
|
|
216
|
+
}, [setSelectedShape]);
|
|
217
|
+
var pasteShape = (0, _react.useCallback)(function (shape) {
|
|
218
|
+
addShape(shape);
|
|
219
|
+
selectShape(shape);
|
|
220
|
+
}, [addShape, selectShape]);
|
|
221
|
+
var exportCanvasInFile = (0, _react.useCallback)(function () {
|
|
222
|
+
setIsLoading(true);
|
|
223
|
+
|
|
224
|
+
try {
|
|
225
|
+
var dataURL = canvasRef.current && (0, _file.getCanvasImage)(canvasRef.current);
|
|
226
|
+
|
|
227
|
+
if (!dataURL) {
|
|
228
|
+
throw new Error();
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
(0, _file.downloadFile)(dataURL, 'drawing.png');
|
|
232
|
+
addSnackbar({
|
|
233
|
+
type: _snackbar.SnackbarTypeEnum.Success,
|
|
234
|
+
text: 'Export terminé !'
|
|
235
|
+
});
|
|
236
|
+
setIsLoading(false);
|
|
237
|
+
} catch (e) {
|
|
238
|
+
if (e instanceof Error) {
|
|
239
|
+
addSnackbar({
|
|
240
|
+
type: _snackbar.SnackbarTypeEnum.Error,
|
|
241
|
+
text: "L'export a échoué"
|
|
242
|
+
});
|
|
243
|
+
} else {
|
|
244
|
+
console.warn(e);
|
|
245
|
+
}
|
|
246
|
+
} finally {
|
|
247
|
+
setIsLoading(false);
|
|
248
|
+
}
|
|
249
|
+
}, [addSnackbar]);
|
|
250
|
+
var saveFile = (0, _react.useCallback)(function () {
|
|
251
|
+
setIsLoading(true);
|
|
252
|
+
|
|
253
|
+
try {
|
|
254
|
+
var content = (0, _file.encodeShapesInString)(shapesRef.current);
|
|
255
|
+
|
|
256
|
+
if (!content) {
|
|
257
|
+
throw new Error("L'enregistrement a échoué");
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
(0, _file.downloadFile)(content, 'drawing.json');
|
|
261
|
+
addSnackbar({
|
|
262
|
+
type: _snackbar.SnackbarTypeEnum.Success,
|
|
263
|
+
text: 'Fichier enregistré !'
|
|
264
|
+
});
|
|
265
|
+
setIsLoading(false);
|
|
266
|
+
} catch (e) {
|
|
267
|
+
if (e instanceof Error) {
|
|
268
|
+
addSnackbar({
|
|
269
|
+
type: _snackbar.SnackbarTypeEnum.Error,
|
|
270
|
+
text: e.message
|
|
271
|
+
});
|
|
272
|
+
} else {
|
|
273
|
+
console.warn(e);
|
|
274
|
+
}
|
|
275
|
+
} finally {
|
|
276
|
+
setIsLoading(false);
|
|
277
|
+
}
|
|
278
|
+
}, [shapesRef, addSnackbar]);
|
|
279
|
+
var loadJson = (0, _react.useCallback)( /*#__PURE__*/function () {
|
|
280
|
+
var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(json) {
|
|
281
|
+
var isValidated, shapes;
|
|
282
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
283
|
+
while (1) {
|
|
284
|
+
switch (_context.prev = _context.next) {
|
|
285
|
+
case 0:
|
|
286
|
+
isValidated = (0, _file.validateJson)(json);
|
|
287
|
+
|
|
288
|
+
if (isValidated) {
|
|
289
|
+
_context.next = 3;
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
throw new Error('Le fichier est corrompu');
|
|
294
|
+
|
|
295
|
+
case 3:
|
|
296
|
+
_context.next = 5;
|
|
297
|
+
return (0, _file.decodePicturesInShapes)(json);
|
|
298
|
+
|
|
299
|
+
case 5:
|
|
300
|
+
shapes = _context.sent;
|
|
301
|
+
clearCanvas(shapes, true);
|
|
302
|
+
|
|
303
|
+
case 7:
|
|
304
|
+
case "end":
|
|
305
|
+
return _context.stop();
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}, _callee);
|
|
309
|
+
}));
|
|
310
|
+
|
|
311
|
+
return function (_x) {
|
|
312
|
+
return _ref6.apply(this, arguments);
|
|
313
|
+
};
|
|
314
|
+
}(), [clearCanvas]);
|
|
315
|
+
var loadFile = (0, _react.useCallback)( /*#__PURE__*/function () {
|
|
316
|
+
var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(file) {
|
|
317
|
+
var json;
|
|
318
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
319
|
+
while (1) {
|
|
320
|
+
switch (_context2.prev = _context2.next) {
|
|
321
|
+
case 0:
|
|
322
|
+
setIsLoading(true);
|
|
323
|
+
_context2.prev = 1;
|
|
324
|
+
_context2.next = 4;
|
|
325
|
+
return (0, _file.decodeJson)(file);
|
|
326
|
+
|
|
327
|
+
case 4:
|
|
328
|
+
json = _context2.sent;
|
|
329
|
+
_context2.next = 7;
|
|
330
|
+
return loadJson(json);
|
|
331
|
+
|
|
332
|
+
case 7:
|
|
333
|
+
addSnackbar({
|
|
334
|
+
type: _snackbar.SnackbarTypeEnum.Success,
|
|
335
|
+
text: 'Fichier chargé !'
|
|
336
|
+
});
|
|
337
|
+
_context2.next = 13;
|
|
338
|
+
break;
|
|
339
|
+
|
|
340
|
+
case 10:
|
|
341
|
+
_context2.prev = 10;
|
|
342
|
+
_context2.t0 = _context2["catch"](1);
|
|
343
|
+
|
|
344
|
+
if (_context2.t0 instanceof Error) {
|
|
345
|
+
addSnackbar({
|
|
346
|
+
type: _snackbar.SnackbarTypeEnum.Error,
|
|
347
|
+
text: _context2.t0.message
|
|
348
|
+
});
|
|
349
|
+
} else {
|
|
350
|
+
console.warn(_context2.t0);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
case 13:
|
|
354
|
+
_context2.prev = 13;
|
|
355
|
+
setIsLoading(false);
|
|
356
|
+
return _context2.finish(13);
|
|
357
|
+
|
|
358
|
+
case 16:
|
|
359
|
+
case "end":
|
|
360
|
+
return _context2.stop();
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}, _callee2, null, [[1, 10, 13, 16]]);
|
|
364
|
+
}));
|
|
365
|
+
|
|
366
|
+
return function (_x2) {
|
|
367
|
+
return _ref7.apply(this, arguments);
|
|
368
|
+
};
|
|
369
|
+
}(), [loadJson, addSnackbar]);
|
|
370
|
+
var addPicture = (0, _react.useCallback)( /*#__PURE__*/function () {
|
|
371
|
+
var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(fileOrUrl) {
|
|
372
|
+
var pictureShape;
|
|
373
|
+
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
374
|
+
while (1) {
|
|
375
|
+
switch (_context3.prev = _context3.next) {
|
|
376
|
+
case 0:
|
|
377
|
+
setIsLoading(true);
|
|
378
|
+
_context3.prev = 1;
|
|
379
|
+
_context3.next = 4;
|
|
380
|
+
return addPictureShape(fileOrUrl);
|
|
381
|
+
|
|
382
|
+
case 4:
|
|
383
|
+
pictureShape = _context3.sent;
|
|
384
|
+
selectShape(pictureShape);
|
|
385
|
+
_context3.next = 11;
|
|
386
|
+
break;
|
|
387
|
+
|
|
388
|
+
case 8:
|
|
389
|
+
_context3.prev = 8;
|
|
390
|
+
_context3.t0 = _context3["catch"](1);
|
|
391
|
+
|
|
392
|
+
if (_context3.t0 instanceof Error) {
|
|
393
|
+
addSnackbar({
|
|
394
|
+
type: _snackbar.SnackbarTypeEnum.Error,
|
|
395
|
+
text: _context3.t0.message
|
|
396
|
+
});
|
|
397
|
+
} else {
|
|
398
|
+
console.warn(_context3.t0);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
case 11:
|
|
402
|
+
_context3.prev = 11;
|
|
403
|
+
setIsLoading(false);
|
|
404
|
+
return _context3.finish(11);
|
|
405
|
+
|
|
406
|
+
case 14:
|
|
407
|
+
case "end":
|
|
408
|
+
return _context3.stop();
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}, _callee3, null, [[1, 8, 11, 14]]);
|
|
412
|
+
}));
|
|
413
|
+
|
|
414
|
+
return function (_x3) {
|
|
415
|
+
return _ref8.apply(this, arguments);
|
|
416
|
+
};
|
|
417
|
+
}(), [addPictureShape, selectShape, addSnackbar]);
|
|
418
|
+
(0, _useKeyboard["default"])({
|
|
419
|
+
isInsideComponent: isInsideComponent,
|
|
420
|
+
isEditingText: selectionMode.mode === _Mode.SelectionModeLib.textedition,
|
|
421
|
+
selectedShape: selectedShape,
|
|
422
|
+
setSelectedShape: setSelectedShape,
|
|
423
|
+
removeShape: removeShape,
|
|
424
|
+
pasteShape: pasteShape,
|
|
425
|
+
updateShape: updateShape,
|
|
426
|
+
backwardShape: backwardShape,
|
|
427
|
+
forwardShape: forwardShape
|
|
428
|
+
});
|
|
429
|
+
(0, _react.useEffect)(function () {
|
|
430
|
+
if (!isInsideComponent) setSelectedShape(undefined);
|
|
431
|
+
}, [isInsideComponent, setSelectedShape]);
|
|
432
|
+
(0, _react.useEffect)(function () {
|
|
433
|
+
if (shapesFromProps !== undefined) {
|
|
434
|
+
void loadJson(shapesFromProps);
|
|
435
|
+
}
|
|
436
|
+
}, [loadJson, shapesFromProps]);
|
|
437
|
+
(0, _react.useEffect)(function () {
|
|
438
|
+
if (!apiRef) return;
|
|
439
|
+
apiRef.current = {
|
|
440
|
+
getCurrentImage: function getCurrentImage() {
|
|
441
|
+
return canvasRef.current ? (0, _file.getCanvasImage)(canvasRef.current) : undefined;
|
|
442
|
+
},
|
|
443
|
+
getCurrentData: function getCurrentData() {
|
|
444
|
+
return (0, _file.encodePicturesInShapes)(shapesRef.current);
|
|
445
|
+
}
|
|
446
|
+
};
|
|
447
|
+
}, [apiRef, shapesRef]);
|
|
448
|
+
var className = "".concat(classNameFromProps !== null && classNameFromProps !== void 0 ? classNameFromProps : '', " ").concat(isLayoutPanelShown ? 'layoutPanelOpened' : '');
|
|
449
|
+
return /*#__PURE__*/_react["default"].createElement(StyledApp, {
|
|
450
|
+
ref: componentRef,
|
|
451
|
+
className: className,
|
|
452
|
+
width: width,
|
|
453
|
+
"data-grow": canGrow,
|
|
454
|
+
"data-shrink": canShrink
|
|
455
|
+
}, /*#__PURE__*/_react["default"].createElement(_Toolbar["default"], {
|
|
456
|
+
disabled: disabled,
|
|
457
|
+
activeTool: activeTool,
|
|
458
|
+
clearCanvas: clearCanvas,
|
|
459
|
+
setActiveTool: selectTool,
|
|
460
|
+
exportCanvasInFile: exportCanvasInFile,
|
|
461
|
+
saveFile: saveFile,
|
|
462
|
+
loadFile: loadFile,
|
|
463
|
+
addPicture: addPicture,
|
|
464
|
+
hasActionToUndo: canGoBackward,
|
|
465
|
+
hasActionToRedo: canGoForward,
|
|
466
|
+
hasActionToClear: canClear,
|
|
467
|
+
undoAction: undoAction,
|
|
468
|
+
redoAction: redoAction,
|
|
469
|
+
availableTools: availableTools
|
|
470
|
+
}), /*#__PURE__*/_react["default"].createElement(StyledRow, {
|
|
471
|
+
"data-grow": canGrow,
|
|
472
|
+
width: width,
|
|
473
|
+
aspectRatio: "calc(".concat(width, " / ").concat(height, ")")
|
|
474
|
+
}, /*#__PURE__*/_react["default"].createElement(_Canvas["default"], {
|
|
475
|
+
canGrow: canGrow,
|
|
476
|
+
withGrid: withGrid,
|
|
477
|
+
disabled: disabled,
|
|
478
|
+
isInsideComponent: isInsideComponent,
|
|
479
|
+
activeTool: activeTool,
|
|
480
|
+
setActiveTool: setActiveTool,
|
|
481
|
+
canvasOffsetStartPosition: canvasOffsetStartPosition,
|
|
482
|
+
setCanvasOffsetStartPosition: setCanvasOffsetStartPosition,
|
|
483
|
+
shapes: shapesRef.current,
|
|
484
|
+
addShape: addShape,
|
|
485
|
+
updateSingleShape: updateShape,
|
|
486
|
+
selectedShape: selectedShape,
|
|
487
|
+
setSelectedShape: setSelectedShape,
|
|
488
|
+
canvasOffset: canvasOffset,
|
|
489
|
+
setCanvasOffset: setCanvasOffset,
|
|
490
|
+
defaultConf: defaultConf,
|
|
491
|
+
saveShapes: saveShapes,
|
|
492
|
+
ref: canvasRef,
|
|
493
|
+
width: width,
|
|
494
|
+
height: height,
|
|
495
|
+
selectionMode: selectionMode,
|
|
496
|
+
setSelectionMode: setSelectionMode
|
|
497
|
+
}), /*#__PURE__*/_react["default"].createElement(_Layouts["default"], {
|
|
498
|
+
withGrid: withGrid,
|
|
499
|
+
setWithGrid: setWithGrid,
|
|
500
|
+
disabled: disabled,
|
|
501
|
+
shapes: shapesRef.current,
|
|
502
|
+
moveShapes: moveShapes,
|
|
503
|
+
selectedShape: selectedShape,
|
|
504
|
+
removeShape: removeShape,
|
|
505
|
+
selectShape: selectShape,
|
|
506
|
+
toggleShapeVisibility: toggleShapeVisibility,
|
|
507
|
+
toggleShapeLock: toggleShapeLock,
|
|
508
|
+
withLayouts: withLayouts,
|
|
509
|
+
isLayoutPanelShown: isLayoutPanelShown
|
|
510
|
+
})), /*#__PURE__*/_react["default"].createElement(_SettingsBar["default"], {
|
|
511
|
+
disabled: disabled,
|
|
512
|
+
activeTool: activeTool,
|
|
513
|
+
selectedShape: selectedShape,
|
|
514
|
+
removeShape: removeShape,
|
|
515
|
+
updateShape: updateShape,
|
|
516
|
+
defaultConf: defaultConf,
|
|
517
|
+
setDefaultConf: setDefaultConf,
|
|
518
|
+
canvas: canvasRef.current,
|
|
519
|
+
withLayouts: withLayouts,
|
|
520
|
+
toggleLayoutPanel: function toggleLayoutPanel() {
|
|
521
|
+
setIsLayoutPanelShown(function (prev) {
|
|
522
|
+
return !prev;
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
}), /*#__PURE__*/_react["default"].createElement(_Loading["default"], {
|
|
526
|
+
isLoading: isLoading
|
|
527
|
+
}), /*#__PURE__*/_react["default"].createElement(_Snackbar["default"], {
|
|
528
|
+
snackbarList: snackbarList
|
|
529
|
+
}));
|
|
530
|
+
};
|
|
531
|
+
|
|
532
|
+
var _default = App;
|
|
533
|
+
exports["default"] = _default;
|