@searpent/react-image-annotate 2.0.75 → 2.0.77

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/.babelrc +6 -0
  2. package/.env +1 -0
  3. package/.flowconfig +2 -0
  4. package/.github/workflows/release-on-master.yml +32 -0
  5. package/.github/workflows/test.yml +16 -0
  6. package/.prettierrc +3 -0
  7. package/.releaserc.js +18 -0
  8. package/.storybook/addons.js +2 -0
  9. package/.storybook/config.js +16 -0
  10. package/LICENSE +21 -0
  11. package/package.json +1 -1
  12. package/public/favicon.ico +0 -0
  13. package/public/index.html +38 -0
  14. package/src/Annotator/bike-pic.png +0 -0
  15. package/src/Annotator/bike-pic2.png +0 -0
  16. package/src/Annotator/dab-keyframes.story.json +1 -0
  17. package/src/Annotator/exampleImages.js +48 -0
  18. package/src/Annotator/examplePhotos.js +7603 -0
  19. package/src/Annotator/index.js +380 -0
  20. package/src/Annotator/index.story.js +899 -0
  21. package/src/Annotator/poses.story.js +150 -0
  22. package/src/Annotator/reducers/combine-reducers.js +7 -0
  23. package/src/Annotator/reducers/convert-expanding-line-to-polygon.js +53 -0
  24. package/{Annotator → src/Annotator}/reducers/fix-twisted.js +5 -3
  25. package/src/Annotator/reducers/general-reducer.js +1228 -0
  26. package/src/Annotator/reducers/get-active-image.js +21 -0
  27. package/src/Annotator/reducers/get-implied-video-regions.js +115 -0
  28. package/src/Annotator/reducers/history-handler.js +60 -0
  29. package/src/Annotator/reducers/image-reducer.js +23 -0
  30. package/src/Annotator/reducers/video-reducer.js +85 -0
  31. package/src/Annotator/video.story.js +51 -0
  32. package/src/ClassSelectionMenu/index.js +112 -0
  33. package/src/Crosshairs/index.js +64 -0
  34. package/src/DebugSidebarBox/index.js +36 -0
  35. package/src/DemoSite/Editor.js +235 -0
  36. package/src/DemoSite/ErrorBoundaryDialog.js +34 -0
  37. package/src/DemoSite/index.js +41 -0
  38. package/src/DemoSite/index.story.js +10 -0
  39. package/src/DemoSite/simple-segmentation-example.json +572 -0
  40. package/{Editor → src/Editor}/annotation-plugin/annotation.css +20 -0
  41. package/src/Editor/annotation-plugin/annotation.js +546 -0
  42. package/src/Editor/index.js +50 -0
  43. package/src/Editor/readOnly.js +31 -0
  44. package/{Editor → src/Editor}/tools.js +3 -2
  45. package/src/Errorer/index.js +13 -0
  46. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  47. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  48. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  49. package/src/FullImageSegmentationAnnotator/index.js +7 -0
  50. package/src/FullImageSegmentationAnnotator/index.story.js +177 -0
  51. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  52. package/src/GroupSelectorSidebarBox/index.js +48 -0
  53. package/src/GroupsEditorSidebarBox/index.js +108 -0
  54. package/src/HelpSidebarBox/index.js +43 -0
  55. package/src/HighlightBox/index.js +143 -0
  56. package/src/HistorySidebarBox/index.js +78 -0
  57. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  58. package/src/ImageCanvas/index.js +515 -0
  59. package/src/ImageCanvas/index.story.js +314 -0
  60. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  61. package/src/ImageCanvas/region-tools.js +171 -0
  62. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  63. package/{ImageCanvas → src/ImageCanvas}/styles.js +8 -12
  64. package/src/ImageCanvas/use-mouse.js +168 -0
  65. package/src/ImageCanvas/use-project-box.js +23 -0
  66. package/src/ImageCanvas/use-wasd-mode.js +50 -0
  67. package/src/ImageMask/index.js +127 -0
  68. package/src/ImageMask/load-image.js +32 -0
  69. package/src/ImageSelectorSidebarBox/index.js +54 -0
  70. package/src/KeyframeTimeline/get-time-string.js +25 -0
  71. package/src/KeyframeTimeline/index.js +223 -0
  72. package/src/KeyframesSelectorSidebarBox/index.js +93 -0
  73. package/src/LandingPage/content.md +57 -0
  74. package/src/LandingPage/github-markdown.css +964 -0
  75. package/src/LandingPage/index.js +147 -0
  76. package/src/Locker/index.js +13 -0
  77. package/src/MainLayout/RightSidebarItemsWrapper.js +21 -0
  78. package/src/MainLayout/icon-dictionary.js +79 -0
  79. package/src/MainLayout/index.js +564 -0
  80. package/src/MainLayout/index.story.js +240 -0
  81. package/{MainLayout → src/MainLayout}/styles.js +7 -6
  82. package/src/MainLayout/types.js +171 -0
  83. package/src/MainLayout/use-implied-video-regions.js +17 -0
  84. package/src/MetadataEditorSidebarBox/index.js +160 -0
  85. package/src/PageSelector/index.js +159 -0
  86. package/src/PointDistances/index.js +90 -0
  87. package/src/PreventScrollToParents/index.js +48 -0
  88. package/src/PreventScrollToParents/index.story.js +23 -0
  89. package/src/RegionLabel/index.js +236 -0
  90. package/{RegionLabel → src/RegionLabel}/styles.js +15 -12
  91. package/src/RegionSelectAndTransformBoxes/index.js +236 -0
  92. package/src/RegionSelectorSidebarBox/index.js +220 -0
  93. package/{RegionSelectorSidebarBox → src/RegionSelectorSidebarBox}/styles.js +14 -13
  94. package/src/RegionShapes/index.js +254 -0
  95. package/src/RegionTags/index.js +136 -0
  96. package/src/SettingsDialog/index.js +58 -0
  97. package/src/SettingsProvider/index.js +57 -0
  98. package/src/Shortcuts/ShortcutField.js +44 -0
  99. package/src/Shortcuts/index.js +129 -0
  100. package/src/ShortcutsManager/index.js +162 -0
  101. package/src/Sidebar/index.js +117 -0
  102. package/src/SidebarBoxContainer/index.js +93 -0
  103. package/src/SmallToolButton/index.js +57 -0
  104. package/src/TagsSidebarBox/index.js +93 -0
  105. package/src/TaskDescriptionSidebarBox/index.js +43 -0
  106. package/src/Theme/index.js +36 -0
  107. package/src/VideoOrImageCanvasBackground/index.js +170 -0
  108. package/src/colors.js +32 -0
  109. package/src/hooks/use-colors.js +95 -0
  110. package/src/hooks/use-event-callback.js +11 -0
  111. package/src/hooks/use-exclude-pattern.js +27 -0
  112. package/src/hooks/use-load-image.js +21 -0
  113. package/src/hooks/use-window-size.js +46 -0
  114. package/{hooks → src/hooks}/xpattern.js +1 -1
  115. package/src/hooks/xpattern.png +0 -0
  116. package/src/index.js +18 -0
  117. package/src/lib.js +7 -0
  118. package/src/screenshot.png +0 -0
  119. package/src/site.css +5 -0
  120. package/src/stories.js +2 -0
  121. package/src/utils/blocks-to-article.js +61 -0
  122. package/{utils → src/utils}/blocks-to-article.test.js +8 -5
  123. package/{utils → src/utils}/default-locked-until.js +1 -2
  124. package/{utils → src/utils}/filter-only-unique.js +1 -1
  125. package/src/utils/get-from-local-storage.js +7 -0
  126. package/src/utils/get-hotkey-help-text.js +11 -0
  127. package/src/utils/get-landmarks-with-transform.js +23 -0
  128. package/src/utils/photosToImages.js +67 -0
  129. package/src/utils/regions-groups.js +19 -0
  130. package/src/utils/regions-to-blocks.js +16 -0
  131. package/src/utils/saveable-actions-enum.js +5 -0
  132. package/src/utils/set-in-local-storage.js +6 -0
  133. package/src/utils/sleep.js +3 -0
  134. package/src/utils/uuid-to-hash.js +5 -0
  135. package/Annotator/exampleImages.js +0 -41
  136. package/Annotator/examplePhotos.js +0 -6980
  137. package/Annotator/index.js +0 -417
  138. package/Annotator/reducers/combine-reducers.js +0 -14
  139. package/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -73
  140. package/Annotator/reducers/general-reducer.js +0 -1430
  141. package/Annotator/reducers/get-active-image.js +0 -27
  142. package/Annotator/reducers/get-implied-video-regions.js +0 -180
  143. package/Annotator/reducers/history-handler.js +0 -38
  144. package/Annotator/reducers/image-reducer.js +0 -20
  145. package/Annotator/reducers/video-reducer.js +0 -88
  146. package/ClassSelectionMenu/index.js +0 -140
  147. package/Crosshairs/index.js +0 -53
  148. package/DebugSidebarBox/index.js +0 -20
  149. package/DemoSite/Editor.js +0 -194
  150. package/DemoSite/ErrorBoundaryDialog.js +0 -64
  151. package/DemoSite/index.js +0 -40
  152. package/Editor/annotation-plugin/annotation.js +0 -647
  153. package/Editor/index.js +0 -93
  154. package/Editor/readOnly.js +0 -73
  155. package/Errorer/index.js +0 -11
  156. package/FullImageSegmentationAnnotator/index.js +0 -7
  157. package/GroupSelectorSidebarBox/index.js +0 -63
  158. package/GroupsEditorSidebarBox/index.js +0 -138
  159. package/HelpSidebarBox/index.js +0 -58
  160. package/HighlightBox/index.js +0 -102
  161. package/HistorySidebarBox/index.js +0 -71
  162. package/ImageCanvas/index.js +0 -441
  163. package/ImageCanvas/region-tools.js +0 -165
  164. package/ImageCanvas/use-mouse.js +0 -180
  165. package/ImageCanvas/use-project-box.js +0 -27
  166. package/ImageCanvas/use-wasd-mode.js +0 -62
  167. package/ImageMask/index.js +0 -133
  168. package/ImageMask/load-image.js +0 -25
  169. package/ImageSelectorSidebarBox/index.js +0 -60
  170. package/KeyframeTimeline/get-time-string.js +0 -27
  171. package/KeyframeTimeline/index.js +0 -233
  172. package/KeyframesSelectorSidebarBox/index.js +0 -93
  173. package/LandingPage/index.js +0 -159
  174. package/Locker/index.js +0 -11
  175. package/MainLayout/RightSidebarItemsWrapper.js +0 -19
  176. package/MainLayout/icon-dictionary.js +0 -104
  177. package/MainLayout/index.js +0 -526
  178. package/MainLayout/types.js +0 -0
  179. package/MainLayout/use-implied-video-regions.js +0 -13
  180. package/MetadataEditorSidebarBox/index.js +0 -231
  181. package/PageSelector/index.js +0 -180
  182. package/PointDistances/index.js +0 -73
  183. package/PreventScrollToParents/index.js +0 -51
  184. package/RegionLabel/index.js +0 -232
  185. package/RegionSelectAndTransformBoxes/index.js +0 -169
  186. package/RegionSelectorSidebarBox/index.js +0 -254
  187. package/RegionShapes/index.js +0 -294
  188. package/RegionTags/index.js +0 -144
  189. package/SettingsDialog/index.js +0 -52
  190. package/SettingsProvider/index.js +0 -60
  191. package/Shortcuts/ShortcutField.js +0 -46
  192. package/Shortcuts/index.js +0 -133
  193. package/ShortcutsManager/index.js +0 -155
  194. package/Sidebar/index.js +0 -69
  195. package/SidebarBoxContainer/index.js +0 -93
  196. package/SmallToolButton/index.js +0 -42
  197. package/TagsSidebarBox/index.js +0 -105
  198. package/TaskDescriptionSidebarBox/index.js +0 -58
  199. package/Theme/index.js +0 -30
  200. package/VideoOrImageCanvasBackground/index.js +0 -151
  201. package/colors.js +0 -14
  202. package/hooks/use-colors.js +0 -97
  203. package/hooks/use-event-callback.js +0 -10
  204. package/hooks/use-exclude-pattern.js +0 -24
  205. package/hooks/use-load-image.js +0 -26
  206. package/hooks/use-window-size.js +0 -46
  207. package/index.js +0 -3
  208. package/lib.js +0 -3
  209. package/stories.js +0 -5
  210. package/utils/blocks-to-article.js +0 -60
  211. package/utils/get-from-local-storage.js +0 -7
  212. package/utils/get-hotkey-help-text.js +0 -9
  213. package/utils/get-landmarks-with-transform.js +0 -40
  214. package/utils/photosToImages.js +0 -85
  215. package/utils/regions-groups.js +0 -28
  216. package/utils/regions-to-blocks.js +0 -18
  217. package/utils/saveable-actions-enum.js +0 -3
  218. package/utils/set-in-local-storage.js +0 -3
  219. package/utils/sleep.js +0 -7
  220. package/utils/uuid-to-hash.js +0 -5
  221. /package/{Errorer → src/Errorer}/errorer.css +0 -0
  222. /package/{Locker → src/Locker}/locker.css +0 -0
  223. /package/{PageSelector → src/PageSelector}/page-selector.css +0 -0
  224. /package/{utils → src/utils}/next-group-id.js +0 -0
@@ -0,0 +1,236 @@
1
+ import React, { Fragment, memo } from "react"
2
+ import HighlightBox from "../HighlightBox"
3
+ import { styled } from "@mui/material/styles"
4
+ import { createTheme, ThemeProvider } from "@mui/material/styles"
5
+ import PreventScrollToParents from "../PreventScrollToParents"
6
+ import Tooltip from "@mui/material/Tooltip"
7
+
8
+ const theme = createTheme()
9
+ const TransformGrabber = styled("div")(({ theme }) => ({
10
+ width: 8,
11
+ height: 8,
12
+ zIndex: 10,
13
+ backgroundColor: "#454545",
14
+ border: "2px solid black",
15
+ borderRadius: "50%",
16
+ position: "absolute",
17
+ }))
18
+
19
+ const boxCursorMap = [
20
+ ["nw-resize", "n-resize", "ne-resize"],
21
+ ["w-resize", "grab", "e-resize"],
22
+ ["sw-resize", "s-resize", "se-resize"],
23
+ ]
24
+
25
+ const arePropsEqual = (prev, next) => {
26
+ return (
27
+ prev.region === next.region &&
28
+ prev.dragWithPrimary === next.dragWithPrimary &&
29
+ prev.createWithPrimary === next.createWithPrimary &&
30
+ prev.zoomWithPrimary === next.zoomWithPrimary &&
31
+ prev.mat === next.mat
32
+ )
33
+ }
34
+
35
+ export const RegionSelectAndTransformBox = memo(
36
+ ({
37
+ region: r,
38
+ mouseEvents,
39
+ projectRegionBox,
40
+ dragWithPrimary,
41
+ createWithPrimary,
42
+ zoomWithPrimary,
43
+ onBeginMovePoint,
44
+ onSelectRegion,
45
+ layoutParams,
46
+ fullImageSegmentationMode = false,
47
+ mat,
48
+ onBeginBoxTransform,
49
+ onBeginMovePolygonPoint,
50
+ onBeginMoveKeypoint,
51
+ onAddPolygonPoint,
52
+ showHighlightBox,
53
+ }) => {
54
+ const pbox = projectRegionBox(r)
55
+ const { iw, ih } = layoutParams.current
56
+ return (
57
+ <ThemeProvider theme={theme}>
58
+ <Fragment>
59
+ <PreventScrollToParents>
60
+ {showHighlightBox && r.type !== "polygon" && (
61
+ <HighlightBox
62
+ region={r}
63
+ mouseEvents={mouseEvents}
64
+ dragWithPrimary={dragWithPrimary}
65
+ createWithPrimary={createWithPrimary}
66
+ zoomWithPrimary={zoomWithPrimary}
67
+ onBeginMovePoint={onBeginMovePoint}
68
+ onSelectRegion={onSelectRegion}
69
+ pbox={pbox}
70
+ />
71
+ )}
72
+ {r.type === "box" &&
73
+ !dragWithPrimary &&
74
+ !zoomWithPrimary &&
75
+ !r.locked &&
76
+ r.highlighted &&
77
+ mat.a < 1.2 &&
78
+ [
79
+ [0, 0],
80
+ [0.5, 0],
81
+ [1, 0],
82
+ [1, 0.5],
83
+ [1, 1],
84
+ [0.5, 1],
85
+ [0, 1],
86
+ [0, 0.5],
87
+ [0.5, 0.5],
88
+ ].map(([px, py], i) => (
89
+ <TransformGrabber
90
+ key={i}
91
+ {...mouseEvents}
92
+ onMouseDown={(e) => {
93
+ if (e.button === 0)
94
+ return onBeginBoxTransform(r, [px * 2 - 1, py * 2 - 1])
95
+ mouseEvents.onMouseDown(e)
96
+ }}
97
+ style={{
98
+ left: pbox.x - 4 - 2 + pbox.w * px,
99
+ top: pbox.y - 4 - 2 + pbox.h * py,
100
+ cursor: boxCursorMap[py * 2][px * 2],
101
+ borderRadius: px === 0.5 && py === 0.5 ? 4 : undefined,
102
+ }}
103
+ />
104
+ ))}
105
+ {r.type === "polygon" &&
106
+ !dragWithPrimary &&
107
+ !zoomWithPrimary &&
108
+ !r.locked &&
109
+ r.highlighted &&
110
+ r.points.map(([px, py], i) => {
111
+ const proj = mat
112
+ .clone()
113
+ .inverse()
114
+ .applyToPoint(px * iw, py * ih)
115
+ return (
116
+ <TransformGrabber
117
+ key={i}
118
+ {...mouseEvents}
119
+ onMouseDown={(e) => {
120
+ if (e.button === 0 && (!r.open || i === 0))
121
+ return onBeginMovePolygonPoint(r, i)
122
+ mouseEvents.onMouseDown(e)
123
+ }}
124
+ style={{
125
+ cursor: !r.open
126
+ ? "move"
127
+ : i === 0
128
+ ? "pointer"
129
+ : undefined,
130
+ zIndex: 10,
131
+ pointerEvents:
132
+ r.open && i === r.points.length - 1
133
+ ? "none"
134
+ : undefined,
135
+ left: proj.x - 4,
136
+ top: proj.y - 4,
137
+ }}
138
+ />
139
+ )
140
+ })}
141
+ {r.type === "polygon" &&
142
+ r.highlighted &&
143
+ !dragWithPrimary &&
144
+ !zoomWithPrimary &&
145
+ !r.locked &&
146
+ !r.open &&
147
+ r.points.length > 1 &&
148
+ r.points
149
+ .map((p1, i) => [p1, r.points[(i + 1) % r.points.length]])
150
+ .map(([p1, p2]) => [(p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2])
151
+ .map((pa, i) => {
152
+ const proj = mat
153
+ .clone()
154
+ .inverse()
155
+ .applyToPoint(pa[0] * iw, pa[1] * ih)
156
+ return (
157
+ <TransformGrabber
158
+ key={i}
159
+ {...mouseEvents}
160
+ onMouseDown={(e) => {
161
+ if (e.button === 0)
162
+ return onAddPolygonPoint(r, pa, i + 1)
163
+ mouseEvents.onMouseDown(e)
164
+ }}
165
+ style={{
166
+ cursor: "copy",
167
+ zIndex: 10,
168
+ left: proj.x - 4,
169
+ top: proj.y - 4,
170
+ border: "2px dotted #fff",
171
+ opacity: 0.5,
172
+ }}
173
+ />
174
+ )
175
+ })}
176
+ {r.type === "keypoints" &&
177
+ !dragWithPrimary &&
178
+ !zoomWithPrimary &&
179
+ !r.locked &&
180
+ r.highlighted &&
181
+ Object.entries(r.points).map(
182
+ ([keypointId, { x: px, y: py }], i) => {
183
+ const proj = mat
184
+ .clone()
185
+ .inverse()
186
+ .applyToPoint(px * iw, py * ih)
187
+ return (
188
+ <Tooltip title={keypointId} key={i}>
189
+ <TransformGrabber
190
+ key={i}
191
+ {...mouseEvents}
192
+ onMouseDown={(e) => {
193
+ if (e.button === 0 && (!r.open || i === 0))
194
+ return onBeginMoveKeypoint(r, keypointId)
195
+ mouseEvents.onMouseDown(e)
196
+ }}
197
+ style={{
198
+ cursor: !r.open
199
+ ? "move"
200
+ : i === 0
201
+ ? "pointer"
202
+ : undefined,
203
+ zIndex: 10,
204
+ pointerEvents:
205
+ r.open && i === r.points.length - 1
206
+ ? "none"
207
+ : undefined,
208
+ left: proj.x - 4,
209
+ top: proj.y - 4,
210
+ }}
211
+ />
212
+ </Tooltip>
213
+ )
214
+ }
215
+ )}
216
+ </PreventScrollToParents>
217
+ </Fragment>
218
+ </ThemeProvider>
219
+ )
220
+ },
221
+ arePropsEqual
222
+ )
223
+
224
+ export const RegionSelectAndTransformBoxes = memo(
225
+ (props) => {
226
+ return props.regions
227
+ .filter((r) => r.visible || r.visible === undefined)
228
+ .filter((r) => !r.locked)
229
+ .map((r, i) => {
230
+ return <RegionSelectAndTransformBox key={r.id} {...props} region={r} />
231
+ })
232
+ },
233
+ (n, p) => n.regions === p.regions && n.mat === p.mat
234
+ )
235
+
236
+ export default RegionSelectAndTransformBoxes
@@ -0,0 +1,220 @@
1
+ // @flow
2
+
3
+ import React, { Fragment, useState, memo } from "react"
4
+ import SidebarBoxContainer from "../SidebarBoxContainer"
5
+ import { makeStyles } from "@mui/styles"
6
+ import { createTheme, ThemeProvider } from "@mui/material/styles"
7
+ import { styled } from "@mui/material/styles"
8
+ import { grey } from "@mui/material/colors"
9
+ import RegionIcon from "@mui/icons-material/PictureInPicture"
10
+ import Grid from "@mui/material/Grid"
11
+ import ReorderIcon from "@mui/icons-material/SwapVert"
12
+ import PieChartIcon from "@mui/icons-material/PieChart"
13
+ import TrashIcon from "@mui/icons-material/Delete"
14
+ import LockIcon from "@mui/icons-material/Lock"
15
+ import UnlockIcon from "@mui/icons-material/LockOpen"
16
+ import VisibleIcon from "@mui/icons-material/Visibility"
17
+ import VisibleOffIcon from "@mui/icons-material/VisibilityOff"
18
+ import styles from "./styles"
19
+ import classnames from "classnames"
20
+ import isEqual from "lodash/isEqual"
21
+ import useColors from "../hooks/use-colors"
22
+
23
+ const theme = createTheme()
24
+ const useStyles = makeStyles((theme) => styles)
25
+
26
+ const HeaderSep = styled("div")(({ theme }) => ({
27
+ borderTop: `1px solid ${grey[200]}`,
28
+ marginTop: 2,
29
+ marginBottom: 2,
30
+ }))
31
+
32
+ const Chip = ({ color, text }) => {
33
+ const classes = useStyles()
34
+ return (
35
+ <span className={classes.chip}>
36
+ <div className="color" style={{ backgroundColor: color }} />
37
+ <div className="text">{text}</div>
38
+ </span>
39
+ )
40
+ }
41
+
42
+ const RowLayout = ({
43
+ header,
44
+ highlighted,
45
+ order,
46
+ classification,
47
+ area,
48
+ tags,
49
+ trash,
50
+ lock,
51
+ visible,
52
+ onClick,
53
+ }) => {
54
+ const classes = useStyles()
55
+ const [mouseOver, changeMouseOver] = useState(false)
56
+ return (
57
+ <div
58
+ onClick={onClick}
59
+ onMouseEnter={() => changeMouseOver(true)}
60
+ onMouseLeave={() => changeMouseOver(false)}
61
+ className={classnames(classes.row, { header, highlighted })}
62
+ >
63
+ <Grid container alignItems="center">
64
+ <Grid item xs={2}>
65
+ <div style={{ textAlign: "right", paddingRight: 10 }}>{order}</div>
66
+ </Grid>
67
+ <Grid item xs={5}>
68
+ {classification}
69
+ </Grid>
70
+ <Grid item xs={2}>
71
+ <div style={{ textAlign: "right", paddingRight: 6 }}>{area}</div>
72
+ </Grid>
73
+ <Grid item xs={1}>
74
+ {trash}
75
+ </Grid>
76
+ <Grid item xs={1}>
77
+ {lock}
78
+ </Grid>
79
+ <Grid item xs={1}>
80
+ {visible}
81
+ </Grid>
82
+ </Grid>
83
+ </div>
84
+ )
85
+ }
86
+
87
+ const RowHeader = () => {
88
+ return (
89
+ <RowLayout
90
+ header
91
+ highlighted={false}
92
+ order={<ReorderIcon className="icon" />}
93
+ classification={<div style={{ paddingLeft: 10 }}>Class</div>}
94
+ area={<PieChartIcon className="icon" />}
95
+ trash={<TrashIcon className="icon" />}
96
+ lock={<LockIcon className="icon" />}
97
+ visible={<VisibleIcon className="icon" />}
98
+ />
99
+ )
100
+ }
101
+
102
+ const MemoRowHeader = memo(RowHeader)
103
+
104
+ const Row = ({
105
+ region: r,
106
+ highlighted,
107
+ onSelectRegion,
108
+ onDeleteRegion,
109
+ onChangeRegion,
110
+ visible,
111
+ locked,
112
+ color,
113
+ cls,
114
+ index,
115
+ }) => {
116
+ const { groupColor } = useColors()
117
+ const gc = groupColor(r.groupId)
118
+
119
+ return (
120
+ <RowLayout
121
+ header={false}
122
+ highlighted={highlighted}
123
+ onClick={() => onSelectRegion(r)}
124
+ order={`#${index + 1}`}
125
+ classification={<Chip text={cls || ""} color={color || gc || "lime"} />}
126
+ area=""
127
+ trash={<TrashIcon onClick={() => onDeleteRegion(r)} className="icon2" />}
128
+ lock={
129
+ r.locked ? (
130
+ <LockIcon
131
+ onClick={() => onChangeRegion({ ...r, locked: false })}
132
+ className="icon2"
133
+ />
134
+ ) : (
135
+ <UnlockIcon
136
+ onClick={() => onChangeRegion({ ...r, locked: true })}
137
+ className="icon2"
138
+ />
139
+ )
140
+ }
141
+ visible={
142
+ r.visible || r.visible === undefined ? (
143
+ <VisibleIcon
144
+ onClick={() => onChangeRegion({ ...r, visible: false })}
145
+ className="icon2"
146
+ />
147
+ ) : (
148
+ <VisibleOffIcon
149
+ onClick={() => onChangeRegion({ ...r, visible: true })}
150
+ className="icon2"
151
+ />
152
+ )
153
+ }
154
+ />
155
+ )
156
+ }
157
+
158
+ const MemoRow = memo(
159
+ Row,
160
+ (prevProps, nextProps) =>
161
+ prevProps.highlighted === nextProps.highlighted &&
162
+ prevProps.visible === nextProps.visible &&
163
+ prevProps.locked === nextProps.locked &&
164
+ prevProps.id === nextProps.id &&
165
+ prevProps.index === nextProps.index &&
166
+ prevProps.cls === nextProps.cls &&
167
+ prevProps.color === nextProps.color
168
+ )
169
+
170
+ const emptyArr = []
171
+
172
+ export const RegionSelectorSidebarBox = ({
173
+ regions = emptyArr,
174
+ onDeleteRegion,
175
+ onChangeRegion,
176
+ onSelectRegion,
177
+ }) => {
178
+ const classes = useStyles()
179
+ return (
180
+ <ThemeProvider theme={theme}>
181
+ <SidebarBoxContainer
182
+ title="Regions"
183
+ subTitle=""
184
+ icon={<RegionIcon style={{ color: grey[700] }} />}
185
+ expandedByDefault
186
+ >
187
+ <div className={classes.container}>
188
+ <MemoRowHeader />
189
+ <HeaderSep />
190
+ {regions.map((r, i) => (
191
+ <MemoRow
192
+ key={r.id}
193
+ {...r}
194
+ region={r}
195
+ index={i}
196
+ onSelectRegion={onSelectRegion}
197
+ onDeleteRegion={onDeleteRegion}
198
+ onChangeRegion={onChangeRegion}
199
+ />
200
+ ))}
201
+ </div>
202
+ </SidebarBoxContainer>
203
+ </ThemeProvider>
204
+ )
205
+ }
206
+
207
+ const mapUsedRegionProperties = (r) => [
208
+ r.id,
209
+ r.color,
210
+ r.locked,
211
+ r.visible,
212
+ r.highlighted,
213
+ ]
214
+
215
+ export default memo(RegionSelectorSidebarBox, (prevProps, nextProps) =>
216
+ isEqual(
217
+ (prevProps.regions || emptyArr).map(mapUsedRegionProperties),
218
+ (nextProps.regions || emptyArr).map(mapUsedRegionProperties)
219
+ )
220
+ )
@@ -1,4 +1,5 @@
1
- import { grey, blue, orange, purple } from "@mui/material/colors";
1
+ import { grey, blue, orange, purple } from "@mui/material/colors"
2
+
2
3
  export default {
3
4
  container: {
4
5
  fontSize: 11,
@@ -7,7 +8,7 @@ export default {
7
8
  "& .icon": {
8
9
  marginTop: 4,
9
10
  width: 16,
10
- height: 16
11
+ height: 16,
11
12
  },
12
13
  "& .icon2": {
13
14
  opacity: 0.5,
@@ -16,23 +17,23 @@ export default {
16
17
  transition: "200ms opacity",
17
18
  "&:hover": {
18
19
  cursor: "pointer",
19
- opacity: 1
20
- }
21
- }
20
+ opacity: 1,
21
+ },
22
+ },
22
23
  },
23
24
  row: {
24
25
  padding: 4,
25
26
  cursor: "pointer",
26
27
  "&.header:hover": {
27
- backgroundColor: "#fff"
28
+ backgroundColor: "#fff",
28
29
  },
29
30
  "&.highlighted": {
30
- backgroundColor: blue[100]
31
+ backgroundColor: blue[100],
31
32
  },
32
33
  "&:hover": {
33
34
  backgroundColor: blue[50],
34
- color: grey[800]
35
- }
35
+ color: grey[800],
36
+ },
36
37
  },
37
38
  chip: {
38
39
  display: "flex",
@@ -46,8 +47,8 @@ export default {
46
47
  borderRadius: 5,
47
48
  width: 10,
48
49
  height: 10,
49
- marginRight: 4
50
+ marginRight: 4,
50
51
  },
51
- "& .text": {}
52
- }
53
- };
52
+ "& .text": {},
53
+ },
54
+ }