@searpent/react-image-annotate 2.0.75 → 2.0.76

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 +877 -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/src/Editor/annotation-plugin/annotation.js +536 -0
  41. package/src/Editor/index.js +50 -0
  42. package/src/Editor/readOnly.js +21 -0
  43. package/{Editor → src/Editor}/tools.js +3 -2
  44. package/src/Errorer/index.js +13 -0
  45. package/src/FullImageSegmentationAnnotator/hard1.story.jpg +0 -0
  46. package/src/FullImageSegmentationAnnotator/hard2.story.jpg +0 -0
  47. package/src/FullImageSegmentationAnnotator/hard3.story.jpg +0 -0
  48. package/src/FullImageSegmentationAnnotator/index.js +7 -0
  49. package/src/FullImageSegmentationAnnotator/index.story.js +177 -0
  50. package/src/FullImageSegmentationAnnotator/orange.story.png +0 -0
  51. package/src/GroupSelectorSidebarBox/index.js +48 -0
  52. package/src/GroupsEditorSidebarBox/index.js +108 -0
  53. package/src/HelpSidebarBox/index.js +43 -0
  54. package/src/HighlightBox/index.js +143 -0
  55. package/src/HistorySidebarBox/index.js +78 -0
  56. package/src/ImageCanvas/dancing-man.story.jpg +0 -0
  57. package/src/ImageCanvas/index.js +515 -0
  58. package/src/ImageCanvas/index.story.js +314 -0
  59. package/src/ImageCanvas/mouse_mask.story.png +0 -0
  60. package/src/ImageCanvas/region-tools.js +171 -0
  61. package/src/ImageCanvas/seves_desk.story.jpg +0 -0
  62. package/{ImageCanvas → src/ImageCanvas}/styles.js +8 -12
  63. package/src/ImageCanvas/use-mouse.js +168 -0
  64. package/src/ImageCanvas/use-project-box.js +23 -0
  65. package/src/ImageCanvas/use-wasd-mode.js +50 -0
  66. package/src/ImageMask/index.js +127 -0
  67. package/src/ImageMask/load-image.js +32 -0
  68. package/src/ImageSelectorSidebarBox/index.js +54 -0
  69. package/src/KeyframeTimeline/get-time-string.js +25 -0
  70. package/src/KeyframeTimeline/index.js +223 -0
  71. package/src/KeyframesSelectorSidebarBox/index.js +93 -0
  72. package/src/LandingPage/content.md +57 -0
  73. package/src/LandingPage/github-markdown.css +964 -0
  74. package/src/LandingPage/index.js +147 -0
  75. package/src/Locker/index.js +13 -0
  76. package/src/MainLayout/RightSidebarItemsWrapper.js +21 -0
  77. package/src/MainLayout/icon-dictionary.js +79 -0
  78. package/src/MainLayout/index.js +564 -0
  79. package/src/MainLayout/index.story.js +240 -0
  80. package/{MainLayout → src/MainLayout}/styles.js +7 -6
  81. package/src/MainLayout/types.js +171 -0
  82. package/src/MainLayout/use-implied-video-regions.js +17 -0
  83. package/src/MetadataEditorSidebarBox/index.js +160 -0
  84. package/src/PageSelector/index.js +159 -0
  85. package/src/PointDistances/index.js +90 -0
  86. package/src/PreventScrollToParents/index.js +48 -0
  87. package/src/PreventScrollToParents/index.story.js +23 -0
  88. package/src/RegionLabel/index.js +236 -0
  89. package/{RegionLabel → src/RegionLabel}/styles.js +15 -12
  90. package/src/RegionSelectAndTransformBoxes/index.js +236 -0
  91. package/src/RegionSelectorSidebarBox/index.js +220 -0
  92. package/{RegionSelectorSidebarBox → src/RegionSelectorSidebarBox}/styles.js +14 -13
  93. package/src/RegionShapes/index.js +254 -0
  94. package/src/RegionTags/index.js +136 -0
  95. package/src/SettingsDialog/index.js +58 -0
  96. package/src/SettingsProvider/index.js +57 -0
  97. package/src/Shortcuts/ShortcutField.js +44 -0
  98. package/src/Shortcuts/index.js +129 -0
  99. package/src/ShortcutsManager/index.js +162 -0
  100. package/src/Sidebar/index.js +117 -0
  101. package/src/SidebarBoxContainer/index.js +93 -0
  102. package/src/SmallToolButton/index.js +57 -0
  103. package/src/TagsSidebarBox/index.js +93 -0
  104. package/src/TaskDescriptionSidebarBox/index.js +43 -0
  105. package/src/Theme/index.js +36 -0
  106. package/src/VideoOrImageCanvasBackground/index.js +170 -0
  107. package/src/colors.js +32 -0
  108. package/src/hooks/use-colors.js +75 -0
  109. package/src/hooks/use-event-callback.js +11 -0
  110. package/src/hooks/use-exclude-pattern.js +27 -0
  111. package/src/hooks/use-load-image.js +21 -0
  112. package/src/hooks/use-window-size.js +46 -0
  113. package/{hooks → src/hooks}/xpattern.js +1 -1
  114. package/src/hooks/xpattern.png +0 -0
  115. package/src/index.js +18 -0
  116. package/src/lib.js +7 -0
  117. package/src/screenshot.png +0 -0
  118. package/src/site.css +5 -0
  119. package/src/stories.js +2 -0
  120. package/src/utils/blocks-to-article.js +61 -0
  121. package/{utils → src/utils}/blocks-to-article.test.js +8 -5
  122. package/{utils → src/utils}/default-locked-until.js +1 -2
  123. package/{utils → src/utils}/filter-only-unique.js +1 -1
  124. package/src/utils/get-from-local-storage.js +7 -0
  125. package/src/utils/get-hotkey-help-text.js +11 -0
  126. package/src/utils/get-landmarks-with-transform.js +23 -0
  127. package/src/utils/photosToImages.js +67 -0
  128. package/src/utils/regions-groups.js +19 -0
  129. package/src/utils/regions-to-blocks.js +16 -0
  130. package/src/utils/saveable-actions-enum.js +5 -0
  131. package/src/utils/set-in-local-storage.js +6 -0
  132. package/src/utils/sleep.js +3 -0
  133. package/src/utils/uuid-to-hash.js +5 -0
  134. package/Annotator/exampleImages.js +0 -41
  135. package/Annotator/examplePhotos.js +0 -6980
  136. package/Annotator/index.js +0 -417
  137. package/Annotator/reducers/combine-reducers.js +0 -14
  138. package/Annotator/reducers/convert-expanding-line-to-polygon.js +0 -73
  139. package/Annotator/reducers/general-reducer.js +0 -1430
  140. package/Annotator/reducers/get-active-image.js +0 -27
  141. package/Annotator/reducers/get-implied-video-regions.js +0 -180
  142. package/Annotator/reducers/history-handler.js +0 -38
  143. package/Annotator/reducers/image-reducer.js +0 -20
  144. package/Annotator/reducers/video-reducer.js +0 -88
  145. package/ClassSelectionMenu/index.js +0 -140
  146. package/Crosshairs/index.js +0 -53
  147. package/DebugSidebarBox/index.js +0 -20
  148. package/DemoSite/Editor.js +0 -194
  149. package/DemoSite/ErrorBoundaryDialog.js +0 -64
  150. package/DemoSite/index.js +0 -40
  151. package/Editor/annotation-plugin/annotation.js +0 -647
  152. package/Editor/index.js +0 -93
  153. package/Editor/readOnly.js +0 -73
  154. package/Errorer/index.js +0 -11
  155. package/FullImageSegmentationAnnotator/index.js +0 -7
  156. package/GroupSelectorSidebarBox/index.js +0 -63
  157. package/GroupsEditorSidebarBox/index.js +0 -138
  158. package/HelpSidebarBox/index.js +0 -58
  159. package/HighlightBox/index.js +0 -102
  160. package/HistorySidebarBox/index.js +0 -71
  161. package/ImageCanvas/index.js +0 -441
  162. package/ImageCanvas/region-tools.js +0 -165
  163. package/ImageCanvas/use-mouse.js +0 -180
  164. package/ImageCanvas/use-project-box.js +0 -27
  165. package/ImageCanvas/use-wasd-mode.js +0 -62
  166. package/ImageMask/index.js +0 -133
  167. package/ImageMask/load-image.js +0 -25
  168. package/ImageSelectorSidebarBox/index.js +0 -60
  169. package/KeyframeTimeline/get-time-string.js +0 -27
  170. package/KeyframeTimeline/index.js +0 -233
  171. package/KeyframesSelectorSidebarBox/index.js +0 -93
  172. package/LandingPage/index.js +0 -159
  173. package/Locker/index.js +0 -11
  174. package/MainLayout/RightSidebarItemsWrapper.js +0 -19
  175. package/MainLayout/icon-dictionary.js +0 -104
  176. package/MainLayout/index.js +0 -526
  177. package/MainLayout/types.js +0 -0
  178. package/MainLayout/use-implied-video-regions.js +0 -13
  179. package/MetadataEditorSidebarBox/index.js +0 -231
  180. package/PageSelector/index.js +0 -180
  181. package/PointDistances/index.js +0 -73
  182. package/PreventScrollToParents/index.js +0 -51
  183. package/RegionLabel/index.js +0 -232
  184. package/RegionSelectAndTransformBoxes/index.js +0 -169
  185. package/RegionSelectorSidebarBox/index.js +0 -254
  186. package/RegionShapes/index.js +0 -294
  187. package/RegionTags/index.js +0 -144
  188. package/SettingsDialog/index.js +0 -52
  189. package/SettingsProvider/index.js +0 -60
  190. package/Shortcuts/ShortcutField.js +0 -46
  191. package/Shortcuts/index.js +0 -133
  192. package/ShortcutsManager/index.js +0 -155
  193. package/Sidebar/index.js +0 -69
  194. package/SidebarBoxContainer/index.js +0 -93
  195. package/SmallToolButton/index.js +0 -42
  196. package/TagsSidebarBox/index.js +0 -105
  197. package/TaskDescriptionSidebarBox/index.js +0 -58
  198. package/Theme/index.js +0 -30
  199. package/VideoOrImageCanvasBackground/index.js +0 -151
  200. package/colors.js +0 -14
  201. package/hooks/use-colors.js +0 -97
  202. package/hooks/use-event-callback.js +0 -10
  203. package/hooks/use-exclude-pattern.js +0 -24
  204. package/hooks/use-load-image.js +0 -26
  205. package/hooks/use-window-size.js +0 -46
  206. package/index.js +0 -3
  207. package/lib.js +0 -3
  208. package/stories.js +0 -5
  209. package/utils/blocks-to-article.js +0 -60
  210. package/utils/get-from-local-storage.js +0 -7
  211. package/utils/get-hotkey-help-text.js +0 -9
  212. package/utils/get-landmarks-with-transform.js +0 -40
  213. package/utils/photosToImages.js +0 -85
  214. package/utils/regions-groups.js +0 -28
  215. package/utils/regions-to-blocks.js +0 -18
  216. package/utils/saveable-actions-enum.js +0 -3
  217. package/utils/set-in-local-storage.js +0 -3
  218. package/utils/sleep.js +0 -7
  219. package/utils/uuid-to-hash.js +0 -5
  220. /package/{Editor → src/Editor}/annotation-plugin/annotation.css +0 -0
  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
+ }