@searpent/react-image-annotate 2.0.77 → 2.0.78

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 (224) hide show
  1. package/Annotator/exampleImages.js +41 -0
  2. package/Annotator/examplePhotos.js +6980 -0
  3. package/Annotator/index.js +417 -0
  4. package/Annotator/reducers/combine-reducers.js +14 -0
  5. package/Annotator/reducers/convert-expanding-line-to-polygon.js +73 -0
  6. package/{src/Annotator → Annotator}/reducers/fix-twisted.js +3 -5
  7. package/Annotator/reducers/general-reducer.js +1430 -0
  8. package/Annotator/reducers/get-active-image.js +27 -0
  9. package/Annotator/reducers/get-implied-video-regions.js +180 -0
  10. package/Annotator/reducers/history-handler.js +38 -0
  11. package/Annotator/reducers/image-reducer.js +20 -0
  12. package/Annotator/reducers/video-reducer.js +88 -0
  13. package/ClassSelectionMenu/index.js +140 -0
  14. package/Crosshairs/index.js +53 -0
  15. package/DebugSidebarBox/index.js +20 -0
  16. package/DemoSite/Editor.js +194 -0
  17. package/DemoSite/ErrorBoundaryDialog.js +64 -0
  18. package/DemoSite/index.js +40 -0
  19. package/Editor/annotation-plugin/annotation.js +697 -0
  20. package/Editor/index.js +93 -0
  21. package/Editor/readOnly.js +123 -0
  22. package/{src/Editor → Editor}/tools.js +2 -3
  23. package/Errorer/index.js +11 -0
  24. package/FullImageSegmentationAnnotator/index.js +7 -0
  25. package/GroupSelectorSidebarBox/index.js +63 -0
  26. package/GroupsEditorSidebarBox/index.js +138 -0
  27. package/HelpSidebarBox/index.js +58 -0
  28. package/HighlightBox/index.js +102 -0
  29. package/HistorySidebarBox/index.js +71 -0
  30. package/ImageCanvas/index.js +441 -0
  31. package/ImageCanvas/region-tools.js +165 -0
  32. package/{src/ImageCanvas → ImageCanvas}/styles.js +12 -8
  33. package/ImageCanvas/use-mouse.js +180 -0
  34. package/ImageCanvas/use-project-box.js +27 -0
  35. package/ImageCanvas/use-wasd-mode.js +62 -0
  36. package/ImageMask/index.js +133 -0
  37. package/ImageMask/load-image.js +25 -0
  38. package/ImageSelectorSidebarBox/index.js +60 -0
  39. package/KeyframeTimeline/get-time-string.js +27 -0
  40. package/KeyframeTimeline/index.js +233 -0
  41. package/KeyframesSelectorSidebarBox/index.js +93 -0
  42. package/LandingPage/index.js +159 -0
  43. package/Locker/index.js +11 -0
  44. package/MainLayout/RightSidebarItemsWrapper.js +19 -0
  45. package/MainLayout/icon-dictionary.js +104 -0
  46. package/MainLayout/index.js +526 -0
  47. package/{src/MainLayout → MainLayout}/styles.js +6 -7
  48. package/MainLayout/types.js +0 -0
  49. package/MainLayout/use-implied-video-regions.js +13 -0
  50. package/MetadataEditorSidebarBox/index.js +231 -0
  51. package/PageSelector/index.js +180 -0
  52. package/PointDistances/index.js +73 -0
  53. package/PreventScrollToParents/index.js +51 -0
  54. package/RegionLabel/index.js +232 -0
  55. package/{src/RegionLabel → RegionLabel}/styles.js +12 -15
  56. package/RegionSelectAndTransformBoxes/index.js +169 -0
  57. package/RegionSelectorSidebarBox/index.js +254 -0
  58. package/{src/RegionSelectorSidebarBox → RegionSelectorSidebarBox}/styles.js +13 -14
  59. package/RegionShapes/index.js +294 -0
  60. package/RegionTags/index.js +144 -0
  61. package/SettingsDialog/index.js +52 -0
  62. package/SettingsProvider/index.js +60 -0
  63. package/Shortcuts/ShortcutField.js +46 -0
  64. package/Shortcuts/index.js +133 -0
  65. package/ShortcutsManager/index.js +155 -0
  66. package/Sidebar/index.js +69 -0
  67. package/SidebarBoxContainer/index.js +93 -0
  68. package/SmallToolButton/index.js +42 -0
  69. package/TagsSidebarBox/index.js +105 -0
  70. package/TaskDescriptionSidebarBox/index.js +58 -0
  71. package/Theme/index.js +30 -0
  72. package/VideoOrImageCanvasBackground/index.js +151 -0
  73. package/colors.js +14 -0
  74. package/hooks/use-colors.js +127 -0
  75. package/hooks/use-event-callback.js +10 -0
  76. package/hooks/use-exclude-pattern.js +24 -0
  77. package/hooks/use-load-image.js +26 -0
  78. package/hooks/use-window-size.js +46 -0
  79. package/{src/hooks → hooks}/xpattern.js +1 -1
  80. package/index.js +3 -0
  81. package/lib.js +3 -0
  82. package/package.json +1 -1
  83. package/stories.js +5 -0
  84. package/utils/blocks-to-article.js +60 -0
  85. package/{src/utils → utils}/blocks-to-article.test.js +5 -8
  86. package/{src/utils → utils}/default-locked-until.js +2 -1
  87. package/{src/utils → utils}/filter-only-unique.js +1 -1
  88. package/utils/get-from-local-storage.js +7 -0
  89. package/utils/get-hotkey-help-text.js +9 -0
  90. package/utils/get-landmarks-with-transform.js +40 -0
  91. package/utils/photosToImages.js +85 -0
  92. package/utils/regions-groups.js +28 -0
  93. package/utils/regions-to-blocks.js +18 -0
  94. package/utils/saveable-actions-enum.js +3 -0
  95. package/utils/set-in-local-storage.js +3 -0
  96. package/utils/sleep.js +7 -0
  97. package/utils/uuid-to-hash.js +5 -0
  98. package/.babelrc +0 -6
  99. package/.env +0 -1
  100. package/.flowconfig +0 -2
  101. package/.github/workflows/release-on-master.yml +0 -32
  102. package/.github/workflows/test.yml +0 -16
  103. package/.prettierrc +0 -3
  104. package/.releaserc.js +0 -18
  105. package/.storybook/addons.js +0 -2
  106. package/.storybook/config.js +0 -16
  107. package/LICENSE +0 -21
  108. package/public/favicon.ico +0 -0
  109. package/public/index.html +0 -38
  110. package/src/Annotator/bike-pic.png +0 -0
  111. package/src/Annotator/bike-pic2.png +0 -0
  112. package/src/Annotator/dab-keyframes.story.json +0 -1
  113. package/src/Annotator/exampleImages.js +0 -48
  114. package/src/Annotator/examplePhotos.js +0 -7603
  115. package/src/Annotator/index.js +0 -380
  116. package/src/Annotator/index.story.js +0 -899
  117. package/src/Annotator/poses.story.js +0 -150
  118. package/src/Annotator/reducers/combine-reducers.js +0 -7
  119. package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -53
  120. package/src/Annotator/reducers/general-reducer.js +0 -1228
  121. package/src/Annotator/reducers/get-active-image.js +0 -21
  122. package/src/Annotator/reducers/get-implied-video-regions.js +0 -115
  123. package/src/Annotator/reducers/history-handler.js +0 -60
  124. package/src/Annotator/reducers/image-reducer.js +0 -23
  125. package/src/Annotator/reducers/video-reducer.js +0 -85
  126. package/src/Annotator/video.story.js +0 -51
  127. package/src/ClassSelectionMenu/index.js +0 -112
  128. package/src/Crosshairs/index.js +0 -64
  129. package/src/DebugSidebarBox/index.js +0 -36
  130. package/src/DemoSite/Editor.js +0 -235
  131. package/src/DemoSite/ErrorBoundaryDialog.js +0 -34
  132. package/src/DemoSite/index.js +0 -41
  133. package/src/DemoSite/index.story.js +0 -10
  134. package/src/DemoSite/simple-segmentation-example.json +0 -572
  135. package/src/Editor/annotation-plugin/annotation.js +0 -546
  136. package/src/Editor/index.js +0 -50
  137. package/src/Editor/readOnly.js +0 -31
  138. package/src/Errorer/index.js +0 -13
  139. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  140. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  141. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  142. package/src/FullImageSegmentationAnnotator/index.js +0 -7
  143. package/src/FullImageSegmentationAnnotator/index.story.js +0 -177
  144. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  145. package/src/GroupSelectorSidebarBox/index.js +0 -48
  146. package/src/GroupsEditorSidebarBox/index.js +0 -108
  147. package/src/HelpSidebarBox/index.js +0 -43
  148. package/src/HighlightBox/index.js +0 -143
  149. package/src/HistorySidebarBox/index.js +0 -78
  150. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  151. package/src/ImageCanvas/index.js +0 -515
  152. package/src/ImageCanvas/index.story.js +0 -314
  153. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  154. package/src/ImageCanvas/region-tools.js +0 -171
  155. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  156. package/src/ImageCanvas/use-mouse.js +0 -168
  157. package/src/ImageCanvas/use-project-box.js +0 -23
  158. package/src/ImageCanvas/use-wasd-mode.js +0 -50
  159. package/src/ImageMask/index.js +0 -127
  160. package/src/ImageMask/load-image.js +0 -32
  161. package/src/ImageSelectorSidebarBox/index.js +0 -54
  162. package/src/KeyframeTimeline/get-time-string.js +0 -25
  163. package/src/KeyframeTimeline/index.js +0 -223
  164. package/src/KeyframesSelectorSidebarBox/index.js +0 -93
  165. package/src/LandingPage/content.md +0 -57
  166. package/src/LandingPage/github-markdown.css +0 -964
  167. package/src/LandingPage/index.js +0 -147
  168. package/src/Locker/index.js +0 -13
  169. package/src/MainLayout/RightSidebarItemsWrapper.js +0 -21
  170. package/src/MainLayout/icon-dictionary.js +0 -79
  171. package/src/MainLayout/index.js +0 -564
  172. package/src/MainLayout/index.story.js +0 -240
  173. package/src/MainLayout/types.js +0 -171
  174. package/src/MainLayout/use-implied-video-regions.js +0 -17
  175. package/src/MetadataEditorSidebarBox/index.js +0 -160
  176. package/src/PageSelector/index.js +0 -159
  177. package/src/PointDistances/index.js +0 -90
  178. package/src/PreventScrollToParents/index.js +0 -48
  179. package/src/PreventScrollToParents/index.story.js +0 -23
  180. package/src/RegionLabel/index.js +0 -236
  181. package/src/RegionSelectAndTransformBoxes/index.js +0 -236
  182. package/src/RegionSelectorSidebarBox/index.js +0 -220
  183. package/src/RegionShapes/index.js +0 -254
  184. package/src/RegionTags/index.js +0 -136
  185. package/src/SettingsDialog/index.js +0 -58
  186. package/src/SettingsProvider/index.js +0 -57
  187. package/src/Shortcuts/ShortcutField.js +0 -44
  188. package/src/Shortcuts/index.js +0 -129
  189. package/src/ShortcutsManager/index.js +0 -162
  190. package/src/Sidebar/index.js +0 -117
  191. package/src/SidebarBoxContainer/index.js +0 -93
  192. package/src/SmallToolButton/index.js +0 -57
  193. package/src/TagsSidebarBox/index.js +0 -93
  194. package/src/TaskDescriptionSidebarBox/index.js +0 -43
  195. package/src/Theme/index.js +0 -36
  196. package/src/VideoOrImageCanvasBackground/index.js +0 -170
  197. package/src/colors.js +0 -32
  198. package/src/hooks/use-colors.js +0 -95
  199. package/src/hooks/use-event-callback.js +0 -11
  200. package/src/hooks/use-exclude-pattern.js +0 -27
  201. package/src/hooks/use-load-image.js +0 -21
  202. package/src/hooks/use-window-size.js +0 -46
  203. package/src/hooks/xpattern.png +0 -0
  204. package/src/index.js +0 -18
  205. package/src/lib.js +0 -7
  206. package/src/screenshot.png +0 -0
  207. package/src/site.css +0 -5
  208. package/src/stories.js +0 -2
  209. package/src/utils/blocks-to-article.js +0 -61
  210. package/src/utils/get-from-local-storage.js +0 -7
  211. package/src/utils/get-hotkey-help-text.js +0 -11
  212. package/src/utils/get-landmarks-with-transform.js +0 -23
  213. package/src/utils/photosToImages.js +0 -67
  214. package/src/utils/regions-groups.js +0 -19
  215. package/src/utils/regions-to-blocks.js +0 -16
  216. package/src/utils/saveable-actions-enum.js +0 -5
  217. package/src/utils/set-in-local-storage.js +0 -6
  218. package/src/utils/sleep.js +0 -3
  219. package/src/utils/uuid-to-hash.js +0 -5
  220. /package/{src/Editor → Editor}/annotation-plugin/annotation.css +0 -0
  221. /package/{src/Errorer → Errorer}/errorer.css +0 -0
  222. /package/{src/Locker → Locker}/locker.css +0 -0
  223. /package/{src/PageSelector → PageSelector}/page-selector.css +0 -0
  224. /package/{src/utils → utils}/next-group-id.js +0 -0
@@ -0,0 +1,151 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import React, { useRef, useEffect, useMemo, useState } from "react";
3
+ import { styled } from "@mui/material/styles";
4
+ import { createTheme, ThemeProvider } from "@mui/material/styles";
5
+ import useEventCallback from "use-event-callback";
6
+ import { useSettings } from "../SettingsProvider";
7
+ var theme = createTheme();
8
+ var Video = styled("video")(function (_ref) {
9
+ var theme = _ref.theme;
10
+ return {
11
+ zIndex: 0,
12
+ position: "absolute"
13
+ };
14
+ });
15
+ var StyledImage = styled("img")(function (_ref2) {
16
+ var theme = _ref2.theme;
17
+ return {
18
+ zIndex: 0,
19
+ position: "absolute"
20
+ };
21
+ });
22
+ var Error = styled("div")(function (_ref3) {
23
+ var theme = _ref3.theme;
24
+ return {
25
+ zIndex: 0,
26
+ position: "absolute",
27
+ left: 0,
28
+ right: 0,
29
+ bottom: 0,
30
+ top: 0,
31
+ backgroundColor: "rgba(255,0,0,0.2)",
32
+ color: "#ff0000",
33
+ fontWeight: "bold",
34
+ whiteSpace: "pre-wrap",
35
+ padding: 50
36
+ };
37
+ });
38
+ export default (function (_ref4) {
39
+ var imagePosition = _ref4.imagePosition,
40
+ mouseEvents = _ref4.mouseEvents,
41
+ videoTime = _ref4.videoTime,
42
+ videoSrc = _ref4.videoSrc,
43
+ imageSrc = _ref4.imageSrc,
44
+ onLoad = _ref4.onLoad,
45
+ _ref4$useCrossOrigin = _ref4.useCrossOrigin,
46
+ useCrossOrigin = _ref4$useCrossOrigin === void 0 ? false : _ref4$useCrossOrigin,
47
+ videoPlaying = _ref4.videoPlaying,
48
+ onChangeVideoTime = _ref4.onChangeVideoTime,
49
+ onChangeVideoPlaying = _ref4.onChangeVideoPlaying;
50
+ var settings = useSettings();
51
+ var videoRef = useRef();
52
+ var imageRef = useRef();
53
+
54
+ var _useState = useState(),
55
+ _useState2 = _slicedToArray(_useState, 2),
56
+ error = _useState2[0],
57
+ setError = _useState2[1];
58
+
59
+ useEffect(function () {
60
+ if (!videoPlaying && videoRef.current) {
61
+ videoRef.current.currentTime = (videoTime || 0) / 1000;
62
+ }
63
+ }, [videoTime]);
64
+ useEffect(function () {
65
+ var renderLoopRunning = false;
66
+
67
+ if (videoRef.current) {
68
+ if (videoPlaying) {
69
+ videoRef.current.play();
70
+ renderLoopRunning = true;
71
+
72
+ if (settings.videoPlaybackSpeed) {
73
+ videoRef.current.playbackRate = parseFloat(settings.videoPlaybackSpeed);
74
+ }
75
+ } else {
76
+ videoRef.current.pause();
77
+ }
78
+ }
79
+
80
+ function checkForNewFrame() {
81
+ if (!renderLoopRunning) return;
82
+ if (!videoRef.current) return;
83
+ var newVideoTime = Math.floor(videoRef.current.currentTime * 1000);
84
+
85
+ if (videoTime !== newVideoTime) {
86
+ onChangeVideoTime(newVideoTime);
87
+ }
88
+
89
+ if (videoRef.current.paused) {
90
+ renderLoopRunning = false;
91
+ onChangeVideoPlaying(false);
92
+ }
93
+
94
+ requestAnimationFrame(checkForNewFrame);
95
+ }
96
+
97
+ checkForNewFrame();
98
+ return function () {
99
+ renderLoopRunning = false;
100
+ };
101
+ }, [videoPlaying]);
102
+ var onLoadedVideoMetadata = useEventCallback(function (event) {
103
+ var videoElm = event.currentTarget;
104
+ videoElm.currentTime = (videoTime || 0) / 1000;
105
+ if (onLoad) onLoad({
106
+ naturalWidth: videoElm.videoWidth,
107
+ naturalHeight: videoElm.videoHeight,
108
+ videoElm: videoElm,
109
+ duration: videoElm.duration
110
+ });
111
+ });
112
+ var onImageLoaded = useEventCallback(function (event) {
113
+ var imageElm = event.currentTarget;
114
+ if (onLoad) onLoad({
115
+ naturalWidth: imageElm.naturalWidth,
116
+ naturalHeight: imageElm.naturalHeight,
117
+ imageElm: imageElm
118
+ });
119
+ });
120
+ var onImageError = useEventCallback(function (event) {
121
+ setError("Could not load image\n\nMake sure your image works by visiting ".concat(imageSrc || videoSrc, " in a web browser. If that URL works, the server hosting the URL may be not allowing you to access the image from your current domain. Adjust server settings to enable the image to be viewed.").concat(!useCrossOrigin ? "" : "\n\nYour image may be blocked because it's not being sent with CORs headers. To do pixel segmentation, browser web security requires CORs headers in order for the algorithm to read the pixel data from the image. CORs headers are easy to add if you're using an S3 bucket or own the server hosting your images.", "\n\n If you need a hand, reach out to the community at universaldatatool.slack.com"));
122
+ });
123
+ var stylePosition = useMemo(function () {
124
+ var width = imagePosition.bottomRight.x - imagePosition.topLeft.x;
125
+ var height = imagePosition.bottomRight.y - imagePosition.topLeft.y;
126
+ return {
127
+ imageRendering: "pixelated",
128
+ left: imagePosition.topLeft.x,
129
+ top: imagePosition.topLeft.y,
130
+ width: isNaN(width) ? 0 : width,
131
+ height: isNaN(height) ? 0 : height
132
+ };
133
+ }, [imagePosition.topLeft.x, imagePosition.topLeft.y, imagePosition.bottomRight.x, imagePosition.bottomRight.y]);
134
+ if (!videoSrc && !imageSrc) return React.createElement(Error, null, "No imageSrc or videoSrc provided");
135
+ if (error) return React.createElement(Error, null, error);
136
+ return React.createElement(ThemeProvider, {
137
+ theme: theme
138
+ }, imageSrc && videoTime === undefined ? React.createElement(StyledImage, Object.assign({}, mouseEvents, {
139
+ src: imageSrc,
140
+ ref: imageRef,
141
+ style: stylePosition,
142
+ onLoad: onImageLoaded,
143
+ onError: onImageError,
144
+ crossOrigin: useCrossOrigin ? "anonymous" : undefined
145
+ })) : React.createElement(Video, Object.assign({}, mouseEvents, {
146
+ ref: videoRef,
147
+ style: stylePosition,
148
+ onLoadedMetadata: onLoadedVideoMetadata,
149
+ src: videoSrc || imageSrc
150
+ })));
151
+ });
package/colors.js ADDED
@@ -0,0 +1,14 @@
1
+ import * as muiColors from "@mui/material/colors";
2
+ export var colors = [muiColors.red[500], muiColors.blue[500], muiColors.green[500], muiColors.orange[800], muiColors.brown[500], muiColors.lightGreen[700], muiColors.pink[500], muiColors.purple[500], muiColors.indigo[500], muiColors.teal[500], muiColors.lime[500], muiColors.blueGrey[500]];
3
+ var transparency = 0x88000000;
4
+
5
+ function reverseParseColor(rrggbb) {
6
+ rrggbb = rrggbb.replace("#", "");
7
+ var bbggrr = rrggbb.substr(4, 2) + rrggbb.substr(2, 2) + rrggbb.substr(0, 2);
8
+ return parseInt(bbggrr, 16);
9
+ }
10
+
11
+ export var colorInts = colors.map(function (c) {
12
+ return (reverseParseColor(c) | transparency) >>> 0;
13
+ });
14
+ export default colors;
@@ -0,0 +1,127 @@
1
+ import { useSettings } from "../SettingsProvider";
2
+ var DEFAULT_GROUP_COLOR = "#32CD32";
3
+
4
+ function defaultClsColor(cls) {
5
+ switch (cls) {
6
+ case 'title':
7
+ return '#f70202';
8
+
9
+ case 'subtitle':
10
+ return "#ffb405";
11
+
12
+ case 'text':
13
+ return "#14deef";
14
+
15
+ case 'author':
16
+ return "#f8d51e";
17
+
18
+ case 'appendix':
19
+ return "#bfede2";
20
+
21
+ case 'photo_author':
22
+ return "#9a17bb";
23
+
24
+ case 'photo_caption':
25
+ return "#ff84f6";
26
+
27
+ case 'advertisement':
28
+ return "#ffb201";
29
+
30
+ case 'other_graphics':
31
+ return "#ff5400";
32
+
33
+ case 'unknown':
34
+ return "#bfede2";
35
+
36
+ case 'about_author':
37
+ return "#9a17bb";
38
+
39
+ case 'image':
40
+ return "#14deef";
41
+
42
+ case 'interview':
43
+ return "#23b20f";
44
+
45
+ case 'table':
46
+ return "#02b4ba";
47
+
48
+ case 'section':
49
+ return "#ffcccc";
50
+
51
+ case 'continuation_ref':
52
+ return '#FF33CC';
53
+
54
+ case 'cover_clip':
55
+ return '#669966';
56
+
57
+ case 'page_id':
58
+ return '#4433AA';
59
+
60
+ case 'continuation_mark':
61
+ return '#660066';
62
+
63
+ case 'follow_up_mark':
64
+ return '#873e23';
65
+
66
+ case 'article_termination_mark':
67
+ return '#873e23';
68
+
69
+ case 'page_splitting_stripe':
70
+ return '#873e23';
71
+
72
+ case 'column_id_stripe':
73
+ return '#873e23';
74
+
75
+ case 'prev_page_reference':
76
+ return '#f3a864';
77
+
78
+ case 'section_subcategory':
79
+ return '#442c55';
80
+
81
+ default:
82
+ return "#02b4ba";
83
+ }
84
+ }
85
+
86
+ function stringToNumber(str) {
87
+ var sum = 0;
88
+
89
+ for (var index = 0; index < str.length; index++) {
90
+ sum += str.charCodeAt(index);
91
+ }
92
+
93
+ return sum;
94
+ }
95
+
96
+ var useColors = function useColors() {
97
+ var _useSettings = useSettings(),
98
+ clsColors = _useSettings.clsColors,
99
+ groupColors = _useSettings.groupColors;
100
+
101
+ var clsColor = function clsColor(cls) {
102
+ if (!clsColors) {
103
+ return DEFAULT_GROUP_COLOR;
104
+ }
105
+
106
+ if (clsColors[cls]) {
107
+ return clsColors[cls];
108
+ }
109
+
110
+ return defaultClsColor(cls);
111
+ };
112
+
113
+ var groupColor = function groupColor(idx) {
114
+ if (isNaN(idx)) {
115
+ return groupColors[stringToNumber(idx) % groupColors.length] || DEFAULT_GROUP_COLOR;
116
+ } else {
117
+ return groupColors[idx % groupColors.length] || DEFAULT_GROUP_COLOR;
118
+ }
119
+ };
120
+
121
+ return {
122
+ clsColor: clsColor,
123
+ groupColor: groupColor
124
+ };
125
+ };
126
+
127
+ export default useColors;
@@ -0,0 +1,10 @@
1
+ import { useRef, useCallback, useLayoutEffect, useEffect } from "react";
2
+ export default (function (fn) {
3
+ var ref = useRef();
4
+ useLayoutEffect(function () {
5
+ ref.current = fn;
6
+ });
7
+ return useCallback(function () {
8
+ return (0, ref.current).apply(void 0, arguments);
9
+ }, []);
10
+ });
@@ -0,0 +1,24 @@
1
+ import { useRef } from "react";
2
+ import excludePatternSrc from "./xpattern.js";
3
+ export default (function () {
4
+ var excludePattern = useRef(null);
5
+
6
+ if (excludePattern.current === null) {
7
+ excludePattern.current = {
8
+ image: new Image(),
9
+ pattern: null
10
+ };
11
+ var canvas = document.createElement("canvas");
12
+ canvas.width = 100;
13
+ canvas.height = 100;
14
+ var context = canvas.getContext("2d");
15
+
16
+ excludePattern.current.image.onload = function () {
17
+ excludePattern.current.pattern = context.createPattern(excludePattern.current.image, "repeat");
18
+ };
19
+
20
+ excludePattern.current.image.src = excludePatternSrc;
21
+ }
22
+
23
+ return excludePattern.current.pattern;
24
+ });
@@ -0,0 +1,26 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import { useRef, useState } from "react";
3
+ export default (function (imageSrc, onImageLoaded) {
4
+ var _useState = useState(false),
5
+ _useState2 = _slicedToArray(_useState, 2),
6
+ imageLoaded = _useState2[0],
7
+ changeImageLoaded = _useState2[1];
8
+
9
+ var image = useRef(null);
10
+
11
+ if (image.current === null) {
12
+ image.current = new Image();
13
+
14
+ image.current.onload = function () {
15
+ changeImageLoaded(true);
16
+ if (onImageLoaded) onImageLoaded({
17
+ width: image.current.naturalWidth,
18
+ height: image.current.naturalHeight
19
+ });
20
+ };
21
+
22
+ image.current.src = imageSrc;
23
+ }
24
+
25
+ return [image.current, imageLoaded];
26
+ });
@@ -0,0 +1,46 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ import { useEffect } from "react";
3
+ import { useRafState, useInterval } from "react-use";
4
+
5
+ var useWindowSize = function useWindowSize() {
6
+ var initialWidth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity;
7
+ var initialHeight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity;
8
+ var isClient = typeof window !== "undefined";
9
+
10
+ var _useRafState = useRafState({
11
+ width: isClient ? window.innerWidth : initialWidth,
12
+ height: isClient ? window.innerHeight : initialHeight
13
+ }),
14
+ _useRafState2 = _slicedToArray(_useRafState, 2),
15
+ state = _useRafState2[0],
16
+ setState = _useRafState2[1];
17
+
18
+ useEffect(function () {
19
+ if (!isClient) return;
20
+
21
+ var handler = function handler() {
22
+ setState({
23
+ width: window.innerWidth,
24
+ height: window.innerHeight
25
+ });
26
+ };
27
+
28
+ window.addEventListener("resize", handler);
29
+ return function () {
30
+ window.removeEventListener("resize", handler);
31
+ };
32
+ }, []);
33
+ useInterval(function () {
34
+ if (!isClient) return;
35
+
36
+ if (window.innerWidth !== state.width || window.innerHeight !== state.height) {
37
+ setState({
38
+ width: window.innerWidth,
39
+ height: window.innerHeight
40
+ });
41
+ }
42
+ }, 100);
43
+ return state;
44
+ };
45
+
46
+ export default useWindowSize;
@@ -1 +1 @@
1
- export default `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4wMSAxY5oG+lzgAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAcSURBVAjXY/jPwPCfAQnA+TAGugLcAhhakRUAAK3lEe8m9qZhAAAAAElFTkSuQmCC`
1
+ export default "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH4wMSAxY5oG+lzgAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAcSURBVAjXY/jPwPCfAQnA+TAGugLcAhhakRUAAK3lEe8m9qZhAAAAAElFTkSuQmCC";
package/index.js ADDED
@@ -0,0 +1,3 @@
1
+ import Annotator from "./Annotator";
2
+ export { Annotator };
3
+ export default Annotator;
package/lib.js ADDED
@@ -0,0 +1,3 @@
1
+ import Annotator from "./Annotator";
2
+ export { Annotator };
3
+ export default Annotator;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@searpent/react-image-annotate",
3
- "version": "2.0.77",
3
+ "version": "2.0.78",
4
4
  "dependencies": {
5
5
  "@editorjs/editorjs": "^2.25.0",
6
6
  "@editorjs/paragraph": "^2.8.0",
package/stories.js ADDED
@@ -0,0 +1,5 @@
1
+ var importAll = function importAll(r) {
2
+ return r.keys().map(r);
3
+ };
4
+
5
+ importAll(require.context("./", true, /\.story\.js$/));
@@ -0,0 +1,60 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread";
2
+ import { whitespaceCharactersToHTML } from '../Editor/annotation-plugin/annotation';
3
+
4
+ function sanitizedText(text) {
5
+ var escapedWhitespaces = whitespaceCharactersToHTML(text); // remove whitespaces
6
+
7
+ var trimmed = escapedWhitespaces.trim(); // replace dashes at the end of sentence
8
+
9
+ var noTrailingDash = trimmed.replace(/-$/, "");
10
+ return noTrailingDash;
11
+ }
12
+
13
+ function getConnectingSymbol(labelName) {
14
+ switch (labelName) {
15
+ case 'text':
16
+ return "";
17
+
18
+ case 'appendix':
19
+ return "<br><br>";
20
+
21
+ default:
22
+ return "<br>";
23
+ }
24
+ }
25
+
26
+ function blocksToArticle(blocks) {
27
+ var renamedBlocks = blocks.map(function (b) {
28
+ var newBlock = _objectSpread({}, b, {
29
+ data: _objectSpread({}, b.data, {
30
+ labelName: b.data.labelName === 'interview' ? 'text' : b.data.labelName
31
+ })
32
+ });
33
+
34
+ return newBlock;
35
+ });
36
+ var article = renamedBlocks.reduce(function (acc, curr) {
37
+ var _ref = curr === null || curr === void 0 ? void 0 : curr.data,
38
+ labelName = _ref.labelName,
39
+ text = _ref.text;
40
+
41
+ if (acc[labelName] === undefined) {
42
+ acc[labelName] = "";
43
+ }
44
+
45
+ var connectingSymbol = getConnectingSymbol(labelName); // if last symbol is dot, next sentence should start with space
46
+
47
+ if (acc[labelName].charAt(acc[labelName].length - 1) === "." && connectingSymbol === "") {
48
+ connectingSymbol = " ";
49
+ }
50
+
51
+ acc[labelName] = acc[labelName] + connectingSymbol + sanitizedText(text);
52
+ return acc;
53
+ }, {
54
+ title: "",
55
+ text: ""
56
+ });
57
+ return article;
58
+ }
59
+
60
+ export default blocksToArticle;
@@ -1,6 +1,5 @@
1
1
  import blocksToArticle from "./blocks-to-article";
2
-
3
- const blocks = [{
2
+ var blocks = [{
4
3
  id: "a1",
5
4
  type: "annotation",
6
5
  data: {
@@ -45,13 +44,11 @@ const blocks = [{
45
44
  labelName: "text",
46
45
  text: "potamus is a big animal."
47
46
  }
48
- }]
49
-
50
- test('blocksToArticle', () => {
51
- const article = blocksToArticle(blocks);
47
+ }];
48
+ test('blocksToArticle', function () {
49
+ var article = blocksToArticle(blocks);
52
50
  expect(article).toEqual({
53
51
  title: "Tohle je jeden kus title.",
54
52
  text: "First part of text. First part of interview. Second part of text. Hippopotamus is a big animal."
55
53
  });
56
- });
57
-
54
+ });
@@ -1,5 +1,6 @@
1
1
  export default function defaultLockedUntil() {
2
2
  var now = new Date();
3
3
  now.setDate(now.getDate() + 1); // Add 1 day to current date
4
- return now
4
+
5
+ return now;
5
6
  }
@@ -2,4 +2,4 @@ function onlyUnique(value, index, self) {
2
2
  return self.indexOf(value) === index;
3
3
  }
4
4
 
5
- export default onlyUnique;
5
+ export default onlyUnique;
@@ -0,0 +1,7 @@
1
+ export default (function (key, defaultValue) {
2
+ try {
3
+ return JSON.parse(window.localStorage["__REACT_IMAGE_ANNOTATE_".concat(key)]);
4
+ } catch (e) {
5
+ return defaultValue;
6
+ }
7
+ });
@@ -0,0 +1,9 @@
1
+ import { getApplicationKeyMap } from "react-hotkeys";
2
+ export var getHotkeyHelpText = function getHotkeyHelpText(commandName) {
3
+ var _getApplicationKeyMap, _getApplicationKeyMap2, _getApplicationKeyMap3;
4
+
5
+ var firstSequence = (_getApplicationKeyMap = getApplicationKeyMap()[commandName]) === null || _getApplicationKeyMap === void 0 ? void 0 : (_getApplicationKeyMap2 = _getApplicationKeyMap.sequences) === null || _getApplicationKeyMap2 === void 0 ? void 0 : (_getApplicationKeyMap3 = _getApplicationKeyMap2[0]) === null || _getApplicationKeyMap3 === void 0 ? void 0 : _getApplicationKeyMap3.sequence;
6
+ if (!firstSequence) return "";
7
+ return " (".concat(firstSequence, ")");
8
+ };
9
+ export default getHotkeyHelpText;
@@ -0,0 +1,40 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
+ export default (function (_ref) {
3
+ var center = _ref.center,
4
+ scale = _ref.scale,
5
+ landmarks = _ref.landmarks;
6
+ var points = {};
7
+ var _iteratorNormalCompletion = true;
8
+ var _didIteratorError = false;
9
+ var _iteratorError = undefined;
10
+
11
+ try {
12
+ for (var _iterator = Object.entries(landmarks)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
13
+ var _ref4 = _step.value;
14
+
15
+ var _ref3 = _slicedToArray(_ref4, 2);
16
+
17
+ var keypointId = _ref3[0];
18
+ var defaultPosition = _ref3[1].defaultPosition;
19
+ points[keypointId] = {
20
+ x: defaultPosition[0] * scale + center.x,
21
+ y: defaultPosition[1] * scale + center.y
22
+ };
23
+ }
24
+ } catch (err) {
25
+ _didIteratorError = true;
26
+ _iteratorError = err;
27
+ } finally {
28
+ try {
29
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
30
+ _iterator.return();
31
+ }
32
+ } finally {
33
+ if (_didIteratorError) {
34
+ throw _iteratorError;
35
+ }
36
+ }
37
+ }
38
+
39
+ return points;
40
+ });
@@ -0,0 +1,85 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+
3
+ function labelAndTextFromResultText(resultText) {
4
+ if (!resultText) {
5
+ return {};
6
+ }
7
+
8
+ var parsedResultText = JSON.parse(resultText);
9
+ var label = parsedResultText[0].label;
10
+ var text = parsedResultText[0].text;
11
+ return {
12
+ label: label,
13
+ text: text
14
+ };
15
+ }
16
+
17
+ function extractionEngineModelResultsToRegions(modelResults) {
18
+ return modelResults.map(function (r) {
19
+ var _labelAndTextFromResu = labelAndTextFromResultText(r.text),
20
+ label = _labelAndTextFromResu.label,
21
+ text = _labelAndTextFromResu.text;
22
+
23
+ return {
24
+ id: r.id,
25
+ type: "box",
26
+ visible: r.label === 'metadata' ? false : true,
27
+ cls: label,
28
+ highlighted: false,
29
+ groupHighlighted: false,
30
+ x: r.box.X1,
31
+ y: r.box.Y1,
32
+ w: r.box.X2 - r.box.X1,
33
+ h: r.box.Y2 - r.box.Y1,
34
+ groupId: r.groupId,
35
+ text: text
36
+ };
37
+ });
38
+ }
39
+
40
+ function metadataEngineModelResultsToRegions(modelResults) {
41
+ return modelResults.map(function (r) {
42
+ return {
43
+ id: r.id,
44
+ type: "box",
45
+ visible: false,
46
+ cls: "metadata",
47
+ highlighted: false,
48
+ groupHighlighted: false,
49
+ x: r.box.X1,
50
+ y: r.box.Y1,
51
+ w: r.box.X2 - r.box.X1,
52
+ h: r.box.Y2 - r.box.Y1,
53
+ groupId: r.groupId,
54
+ text: r.text
55
+ };
56
+ });
57
+ }
58
+
59
+ function modelResultsToRegions(modelResults) {
60
+ var _modelResults$find, _modelResults$find2;
61
+
62
+ var extractionEngineRegions = extractionEngineModelResultsToRegions(((_modelResults$find = modelResults.find(function (mr) {
63
+ return mr.name === 'extraction-engine';
64
+ })) === null || _modelResults$find === void 0 ? void 0 : _modelResults$find.results) || []);
65
+ var metadataEngineRegions = metadataEngineModelResultsToRegions(((_modelResults$find2 = modelResults.find(function (mr) {
66
+ return mr.name === 'metadata-engine';
67
+ })) === null || _modelResults$find2 === void 0 ? void 0 : _modelResults$find2.results) || []);
68
+ return [].concat(_toConsumableArray(extractionEngineRegions), _toConsumableArray(metadataEngineRegions));
69
+ }
70
+
71
+ function photosToImages(photos) {
72
+ return photos.map(function (photo) {
73
+ return {
74
+ id: photo.id,
75
+ src: photo.fullsize.key,
76
+ thumbnail: photo.thumbnail.key,
77
+ name: photo.fullsize.key,
78
+ regions: modelResultsToRegions(photo.modelResults.v1),
79
+ metadata: photo.metadata,
80
+ lockedUntil: photo.lockedUntil
81
+ };
82
+ });
83
+ }
84
+
85
+ export default photosToImages;