@searpent/react-image-annotate 2.0.29 → 2.0.31

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.
@@ -771,10 +771,38 @@ var examplePhotos = [{
771
771
  "groupId": "6",
772
772
  "id": "346807506913198083"
773
773
  }]
774
+ }, {
775
+ "modelFamily": "metadata-engine",
776
+ "name": "metadata-engine",
777
+ "results": [{
778
+ "label": "metadata",
779
+ "score": 1,
780
+ "box": {
781
+ "X1": 0,
782
+ "X2": 1,
783
+ "Y1": 0,
784
+ "Y2": 1
785
+ },
786
+ "text": "[{\"key\":\"articleType\",\"value\":\"news\"}, {\"key\":\"section\",\"value\":\"editorial\"}]",
787
+ "groupId": "0",
788
+ "id": "aba453dd-f870-4510-ae40-a19eb52eb7d6"
789
+ }, {
790
+ "label": "metadata",
791
+ "score": 1,
792
+ "box": {
793
+ "X1": 0,
794
+ "X2": 1,
795
+ "Y1": 0,
796
+ "Y2": 1
797
+ },
798
+ "text": "[{\"key\":\"articleType\",\"value\":\"ads\"}, {\"key\":\"section\",\"value\":\"last page\"}]",
799
+ "groupId": "1",
800
+ "id": "aba453dd-f870-4510-ae40-a19eb52eb7d6"
801
+ }]
774
802
  }]
775
803
  },
776
804
  "metadata": [{
777
- "key": "page",
805
+ "key": "pageNumber",
778
806
  "value": "1"
779
807
  }, {
780
808
  "key": "section",
@@ -1331,7 +1359,7 @@ var examplePhotos = [{
1331
1359
  }]
1332
1360
  },
1333
1361
  "metadata": [{
1334
- "key": "page",
1362
+ "key": "pageNumber",
1335
1363
  "value": "2"
1336
1364
  }]
1337
1365
  }, {
@@ -2050,7 +2078,7 @@ var examplePhotos = [{
2050
2078
  }]
2051
2079
  },
2052
2080
  "metadata": [{
2053
- "key": "page",
2081
+ "key": "pageNumber",
2054
2082
  "value": "3"
2055
2083
  }]
2056
2084
  }, {
@@ -76,7 +76,8 @@ export var Annotator = function Annotator(_ref) {
76
76
  groupColors = _ref.groupColors,
77
77
  onRecalc = _ref.onRecalc,
78
78
  onSave = _ref.onSave,
79
- metadata = _ref.metadata;
79
+ albumMetadata = _ref.albumMetadata,
80
+ metadataConfigs = _ref.metadataConfigs;
80
81
 
81
82
  if (typeof selectedImage === "string") {
82
83
  selectedImage = (images || []).findIndex(function (img) {
@@ -121,7 +122,8 @@ export var Annotator = function Annotator(_ref) {
121
122
  }, {
122
123
  imagesUpdatedAt: null,
123
124
  imagesSavedAt: null,
124
- metadata: metadata
125
+ albumMetadata: albumMetadata,
126
+ metadataConfigs: metadataConfigs
125
127
  }))),
126
128
  _useReducer2 = _slicedToArray(_useReducer, 2),
127
129
  state = _useReducer2[0],
@@ -194,16 +196,10 @@ export var Annotator = function Annotator(_ref) {
194
196
  }
195
197
  };
196
198
 
197
- var handleMetadataChange = function handleMetadataChange(_ref3) {
198
- var name = _ref3.name,
199
- value = _ref3.value,
200
- imageIndex = _ref3.imageIndex;
201
- dispatchToReducer({
202
- type: "UPDATE_METADATA",
203
- name: name,
204
- value: value,
205
- imageIndex: imageIndex
206
- });
199
+ var handleMetadataChange = function handleMetadataChange(params) {
200
+ dispatchToReducer(_objectSpread({
201
+ type: "UPDATE_METADATA"
202
+ }, params));
207
203
  };
208
204
 
209
205
  var handleAddGroup = function handleAddGroup(group) {
@@ -238,10 +234,10 @@ export var Annotator = function Annotator(_ref) {
238
234
  }, [onImagesChange, selectedImage]);
239
235
  if (!images && !videoSrc) return 'Missing required prop "images" or "videoSrc"';
240
236
 
241
- var _ref4 = state.imagesSavedAt < state.imagesUpdatedAt ? [true, true] : [false, false],
242
- _ref5 = _slicedToArray(_ref4, 2),
243
- recalcActive = _ref5[0],
244
- saveActive = _ref5[1];
237
+ var _ref3 = state.imagesSavedAt < state.imagesUpdatedAt ? [true, true] : [false, false],
238
+ _ref4 = _slicedToArray(_ref3, 2),
239
+ recalcActive = _ref4[0],
240
+ saveActive = _ref4[1];
245
241
 
246
242
  return React.createElement(SettingsProvider, {
247
243
  clsColors: clsColors,
@@ -670,10 +670,7 @@ export default (function (state, action) {
670
670
  var groupSelected = true;
671
671
 
672
672
  if (isNaN(groupId)) {
673
- var _state5, _state5$images$state$;
674
-
675
- var groupIds = regionsGroups((_state5 = state) === null || _state5 === void 0 ? void 0 : (_state5$images$state$ = _state5.images[state.selectedImage]) === null || _state5$images$state$ === void 0 ? void 0 : _state5$images$state$.regions);
676
- groupId = nextGroupId(groupIds);
673
+ groupId = nextGroupId();
677
674
  groupSelected = false;
678
675
  }
679
676
 
@@ -831,12 +828,12 @@ export default (function (state, action) {
831
828
  var _x2 = action.x,
832
829
  _y2 = action.y;
833
830
 
834
- var _state6 = state,
835
- _state6$mouseDownAt = _state6.mouseDownAt,
836
- _mouseDownAt2 = _state6$mouseDownAt === void 0 ? {
831
+ var _state5 = state,
832
+ _state5$mouseDownAt = _state5.mouseDownAt,
833
+ _mouseDownAt2 = _state5$mouseDownAt === void 0 ? {
837
834
  x: _x2,
838
835
  y: _y2
839
- } : _state6$mouseDownAt;
836
+ } : _state5$mouseDownAt;
840
837
 
841
838
  if (!state.mode) return state;
842
839
  state = setIn(state, ["mouseDownAt"], null);
@@ -1077,8 +1074,8 @@ export default (function (state, action) {
1077
1074
 
1078
1075
  case "CANCEL":
1079
1076
  {
1080
- var _state7 = state,
1081
- mode = _state7.mode;
1077
+ var _state6 = state,
1078
+ mode = _state6.mode;
1082
1079
 
1083
1080
  if (mode) {
1084
1081
  switch (mode.mode) {
@@ -1162,13 +1159,14 @@ export default (function (state, action) {
1162
1159
  {
1163
1160
  var name = action.name,
1164
1161
  value = action.value,
1165
- _imageIndex = action.imageIndex;
1162
+ _imageIndex = action.imageIndex,
1163
+ _groupId2 = action.groupId;
1166
1164
 
1167
1165
  if (isNaN(_imageIndex)) {
1168
- var _state$metadata;
1166
+ var _state$albumMetadata;
1169
1167
 
1170
- // update global metadata
1171
- var metadataIndex = (_state$metadata = state.metadata) === null || _state$metadata === void 0 ? void 0 : _state$metadata.findIndex(function (mt) {
1168
+ // update global/album metadata
1169
+ var metadataIndex = (_state$albumMetadata = state.albumMetadata) === null || _state$albumMetadata === void 0 ? void 0 : _state$albumMetadata.findIndex(function (mt) {
1172
1170
  return mt.key === name;
1173
1171
  });
1174
1172
 
@@ -1177,20 +1175,50 @@ export default (function (state, action) {
1177
1175
  return;
1178
1176
  }
1179
1177
 
1180
- return setIn(state, ["metadata", metadataIndex], {
1178
+ return setIn(state, ["albumMetadata", metadataIndex], {
1181
1179
  key: name,
1182
1180
  value: value
1183
1181
  });
1184
1182
  } else {
1185
- var _state$images$_imageI, _state$images$_imageI2;
1183
+ var _state$images$_imageI3, _state$images$_imageI4;
1184
+
1185
+ // update metadata of article
1186
+ if (!isNaN(_groupId2)) {
1187
+ var _state$images$_imageI, _state$images$_imageI2;
1188
+
1189
+ var articleMetadataRegionIdx = (_state$images$_imageI = state.images[_imageIndex]) === null || _state$images$_imageI === void 0 ? void 0 : _state$images$_imageI.regions.findIndex(function (r) {
1190
+ return r.cls === 'metadata' && r.groupId === _groupId2;
1191
+ });
1192
+
1193
+ if (articleMetadataRegionIdx < 0) {
1194
+ console.error("can't find article metadata for goupId \"".concat(_groupId2, "\""));
1195
+ return;
1196
+ }
1186
1197
 
1187
- // update local metadata of imageIndex
1188
- var _metadataIndex = (_state$images$_imageI = state.images[_imageIndex]) === null || _state$images$_imageI === void 0 ? void 0 : (_state$images$_imageI2 = _state$images$_imageI.metadata) === null || _state$images$_imageI2 === void 0 ? void 0 : _state$images$_imageI2.findIndex(function (mt) {
1198
+ var articleRegionToUpdate = (_state$images$_imageI2 = state.images[_imageIndex]) === null || _state$images$_imageI2 === void 0 ? void 0 : _state$images$_imageI2.regions[articleMetadataRegionIdx];
1199
+ var articleMetadata = JSON.parse(articleRegionToUpdate.text);
1200
+ var toBeUpdatedMetadataIdx = articleMetadata.findIndex(function (i) {
1201
+ return i.key === name;
1202
+ });
1203
+
1204
+ if (toBeUpdatedMetadataIdx < 0) {
1205
+ console.error("can't find metadata field in article metadata for key \"".concat(name, "\""));
1206
+ return;
1207
+ }
1208
+
1209
+ articleMetadata[toBeUpdatedMetadataIdx].value = value;
1210
+ return setIn(state, ["images", _imageIndex, "regions", articleMetadataRegionIdx], _objectSpread({}, articleRegionToUpdate, {
1211
+ text: JSON.stringify(articleMetadata)
1212
+ }));
1213
+ } // update metadata of image
1214
+
1215
+
1216
+ var _metadataIndex = (_state$images$_imageI3 = state.images[_imageIndex]) === null || _state$images$_imageI3 === void 0 ? void 0 : (_state$images$_imageI4 = _state$images$_imageI3.metadata) === null || _state$images$_imageI4 === void 0 ? void 0 : _state$images$_imageI4.findIndex(function (mt) {
1189
1217
  return mt.key === name;
1190
1218
  });
1191
1219
 
1192
1220
  if (_metadataIndex < 0) {
1193
- console.error("can't find metadata by key \"".concat(name, "\""));
1221
+ console.error("can't find photo metadata by key \"".concat(name, "\""));
1194
1222
  return;
1195
1223
  }
1196
1224
 
@@ -46,11 +46,9 @@
46
46
  }
47
47
 
48
48
  button.MuiButtonBase-root {
49
- background-color: white !important;
50
49
  opacity: 1 !important;
51
50
  }
52
51
 
53
52
  button.MuiButtonBase-root.expanded {
54
- background-color: white !important;
55
53
  opacity: 1 !important;
56
54
  }
@@ -7,7 +7,7 @@ import { grey } from "@mui/material/colors";
7
7
  import List from "@mui/material/List";
8
8
  import ListItem from "@mui/material/ListItem";
9
9
  import ListItemText from "@mui/material/ListItemText";
10
- import isEqual from "lodash/isEqual";
10
+ import uuidToHash from '../utils/uuid-to-hash';
11
11
  var theme = createTheme();
12
12
  var useStyles = makeStyles(function (theme) {
13
13
  return {
@@ -55,7 +55,7 @@ export var GroupSelectorSidebarBox = function GroupSelectorSidebarBox(_ref) {
55
55
  style: {
56
56
  color: color
57
57
  }
58
- }, groupTitle),
58
+ }, uuidToHash(groupTitle)),
59
59
  secondary: groupSubtitle
60
60
  }));
61
61
  }))));
@@ -5,6 +5,7 @@ import FilterNoneIcon from '@mui/icons-material/FilterNone';
5
5
  import { styled } from "@mui/material/styles";
6
6
  import { createTheme, ThemeProvider } from "@mui/material/styles";
7
7
  import { grey } from "@mui/material/colors";
8
+ import uuidToHash from "../utils/uuid-to-hash";
8
9
  var theme = createTheme();
9
10
  var GroupItemDiv = styled("div")(function (_ref) {
10
11
  var theme = _ref.theme;
@@ -22,7 +23,7 @@ var GroupItemDiv = styled("div")(function (_ref) {
22
23
 
23
24
  var GroupItem = function GroupItem(_ref2) {
24
25
  var group = _ref2.group;
25
- return React.createElement(GroupItemDiv, null, group);
26
+ return React.createElement(GroupItemDiv, null, uuidToHash(group));
26
27
  };
27
28
 
28
29
  var GroupList = function GroupList(_ref3) {
@@ -11,7 +11,8 @@ function RightSidebarItemsWrapper(_ref) {
11
11
  }
12
12
  }, []);
13
13
  return React.createElement("div", {
14
- ref: elementRef
14
+ ref: elementRef,
15
+ id: "right-sidebar"
15
16
  }, children);
16
17
  }
17
18
 
@@ -265,7 +265,10 @@ export var MainLayout = function MainLayout(_ref5) {
265
265
  var nextImageHasRegions = !nextImage || nextImage.regions && nextImage.regions.length > 0; // Editor.js blocks
266
266
 
267
267
  var selectedGroupId = ((_state$images$state$s = state.images[state.selectedImage]) === null || _state$images$state$s === void 0 ? void 0 : _state$images$state$s.selectedGroupId) || null;
268
- var editorBlocks = regionsToBlocks(((_state$images$state$s2 = state.images[state.selectedImage]) === null || _state$images$state$s2 === void 0 ? void 0 : _state$images$state$s2.regions) || []);
268
+ var extractionEngineRegions = (((_state$images$state$s2 = state.images[state.selectedImage]) === null || _state$images$state$s2 === void 0 ? void 0 : _state$images$state$s2.regions) || []).filter(function (r) {
269
+ return r.cls !== 'metadata';
270
+ });
271
+ var editorBlocks = regionsToBlocks(extractionEngineRegions);
269
272
  var blocks = editorBlocks.filter(function (i) {
270
273
  var _i$data;
271
274
 
@@ -290,15 +293,15 @@ export var MainLayout = function MainLayout(_ref5) {
290
293
  };
291
294
 
292
295
  var pages = state.images.map(function (i, idx) {
293
- var _i$metadata;
296
+ var _i$metadata, _i$metadata$find;
294
297
 
295
298
  return {
296
299
  id: "".concat(idx),
297
300
  src: i.src,
298
301
  isActive: idx === state.selectedImage,
299
- pageNumber: (i === null || i === void 0 ? void 0 : (_i$metadata = i.metadata) === null || _i$metadata === void 0 ? void 0 : _i$metadata.find(function (md) {
300
- return md.key === "page";
301
- }).value) || null,
302
+ pageNumber: (i === null || i === void 0 ? void 0 : (_i$metadata = i.metadata) === null || _i$metadata === void 0 ? void 0 : (_i$metadata$find = _i$metadata.find(function (md) {
303
+ return md.key === "pageNumber";
304
+ })) === null || _i$metadata$find === void 0 ? void 0 : _i$metadata$find.value) || null,
302
305
  metadata: i.metadata || []
303
306
  };
304
307
  });
@@ -340,7 +343,8 @@ export var MainLayout = function MainLayout(_ref5) {
340
343
  onSave: onSave,
341
344
  saveActive: saveActive,
342
345
  recalcActive: recalcActive,
343
- onMetadataChange: onMetadataChange
346
+ onMetadataChange: onMetadataChange,
347
+ metadataConfigs: state.metadataConfigs || []
344
348
  }), React.createElement(WorkspaceWrapper, null, React.createElement(Workspace, {
345
349
  style: {
346
350
  width: "auto"
@@ -8,21 +8,29 @@ var MetadataItemDiv = styled("div")(function (_ref) {
8
8
  var theme = _ref.theme;
9
9
  return {
10
10
  display: "flex",
11
- flexDirection: "column",
12
- marginBottom: "1rem",
11
+ flexDirection: "row",
12
+ marginBottom: ".5em",
13
13
  "& > label": {
14
14
  fontSize: "1rem",
15
- marginBottom: ".5rem",
15
+ marginBottom: ".5em",
16
16
  textTransform: "capitalize"
17
+ },
18
+ label: {
19
+ width: "50%"
17
20
  }
18
21
  };
19
22
  });
20
23
 
21
24
  var MetadataItem = function MetadataItem(_ref2) {
25
+ var _metadataConfig$optio;
26
+
22
27
  var name = _ref2.name,
23
28
  value = _ref2.value,
24
29
  imageIndex = _ref2.imageIndex,
25
- onChange = _ref2.onChange;
30
+ groupId = _ref2.groupId,
31
+ onChange = _ref2.onChange,
32
+ _ref2$metadataConfig = _ref2.metadataConfig,
33
+ metadataConfig = _ref2$metadataConfig === void 0 ? {} : _ref2$metadataConfig;
26
34
 
27
35
  var handleChange = function handleChange(e) {
28
36
  e.preventDefault();
@@ -32,25 +40,38 @@ var MetadataItem = function MetadataItem(_ref2) {
32
40
  onChange({
33
41
  name: name,
34
42
  value: value,
35
- imageIndex: imageIndex
43
+ imageIndex: imageIndex,
44
+ groupId: groupId
36
45
  });
37
46
  };
38
47
 
39
48
  return React.createElement(MetadataItemDiv, null, React.createElement("label", {
40
49
  for: name
41
- }, name), React.createElement("input", {
50
+ }, name), React.createElement("div", null, React.createElement("input", {
42
51
  type: "text",
43
52
  value: value,
44
53
  name: name,
45
- onChange: handleChange
46
- }));
54
+ onChange: handleChange,
55
+ id: name,
56
+ list: "".concat(name, "-list")
57
+ }), React.createElement("datalist", {
58
+ id: "".concat(name, "-list")
59
+ }, metadataConfig === null || metadataConfig === void 0 ? void 0 : (_metadataConfig$optio = metadataConfig.options) === null || _metadataConfig$optio === void 0 ? void 0 : _metadataConfig$optio.map(function (opt) {
60
+ return React.createElement("option", {
61
+ key: opt,
62
+ value: opt
63
+ });
64
+ }))));
47
65
  };
48
66
 
49
67
  var MetadataList = function MetadataList(_ref3) {
50
68
  var title = _ref3.title,
51
69
  metadata = _ref3.metadata,
52
70
  imageIndex = _ref3.imageIndex,
53
- onMetadataChange = _ref3.onMetadataChange;
71
+ onMetadataChange = _ref3.onMetadataChange,
72
+ _ref3$metadataConfigs = _ref3.metadataConfigs,
73
+ metadataConfigs = _ref3$metadataConfigs === void 0 ? [] : _ref3$metadataConfigs,
74
+ groupId = _ref3.groupId;
54
75
  return React.createElement("div", null, React.createElement("h2", null, title), metadata && metadata.map(function (_ref4) {
55
76
  var key = _ref4.key,
56
77
  value = _ref4.value;
@@ -58,7 +79,11 @@ var MetadataList = function MetadataList(_ref3) {
58
79
  name: key,
59
80
  value: value,
60
81
  imageIndex: imageIndex,
61
- onChange: onMetadataChange
82
+ groupId: groupId,
83
+ onChange: onMetadataChange,
84
+ metadataConfig: metadataConfigs.find(function (i) {
85
+ return i.key === key;
86
+ })
62
87
  });
63
88
  }));
64
89
  };
@@ -98,10 +123,28 @@ var DivContainer = styled("div")(function (_ref5) {
98
123
  };
99
124
  });
100
125
  export var MetadataEditorSidebarBox = function MetadataEditorSidebarBox(_ref6) {
101
- var _state$images$state$s;
126
+ var _state$images$state$s, _state$images$state$s2, _state$images$state$s3, _state$images$state$s4;
102
127
 
103
128
  var state = _ref6.state,
104
129
  onMetadataChange = _ref6.onMetadataChange;
130
+ var metadataConfigs = state.metadataConfigs || [];
131
+ var selectedPhotoMetadata = state === null || state === void 0 ? void 0 : (_state$images$state$s = state.images[state.selectedImage]) === null || _state$images$state$s === void 0 ? void 0 : _state$images$state$s.metadata;
132
+ var selectedGroupId = state === null || state === void 0 ? void 0 : (_state$images$state$s2 = state.images[state.selectedImage]) === null || _state$images$state$s2 === void 0 ? void 0 : (_state$images$state$s3 = _state$images$state$s2.regions) === null || _state$images$state$s3 === void 0 ? void 0 : (_state$images$state$s4 = _state$images$state$s3.find(function (r) {
133
+ return r.highlighted === true;
134
+ })) === null || _state$images$state$s4 === void 0 ? void 0 : _state$images$state$s4.groupId;
135
+ var articleMetadata = [];
136
+
137
+ if (selectedGroupId !== undefined) {
138
+ var articleMetadataRegion = state === null || state === void 0 ? void 0 : state.images[state.selectedImage].regions.find(function (r) {
139
+ return r.cls === 'metadata' && "".concat(r.groupId) === selectedGroupId;
140
+ });
141
+
142
+ if (articleMetadataRegion) {
143
+ var metadata = JSON.parse(articleMetadataRegion.text);
144
+ articleMetadata = metadata;
145
+ }
146
+ }
147
+
105
148
  return React.createElement(ThemeProvider, {
106
149
  theme: theme
107
150
  }, React.createElement(SidebarBoxContainer, {
@@ -112,15 +155,35 @@ export var MetadataEditorSidebarBox = function MetadataEditorSidebarBox(_ref6) {
112
155
  }
113
156
  }),
114
157
  expandedByDefault: true
115
- }, React.createElement(DivContainer, null, React.createElement(MetadataList, {
116
- title: "Global",
117
- metadata: state.metadata,
118
- onMetadataChange: onMetadataChange
119
- }), (state === null || state === void 0 ? void 0 : (_state$images$state$s = state.images[state.selectedImage]) === null || _state$images$state$s === void 0 ? void 0 : _state$images$state$s.metadata) && React.createElement(MetadataList, {
120
- title: "Local",
121
- metadata: state.images[state.selectedImage].metadata,
158
+ }, React.createElement(DivContainer, {
159
+ style: {
160
+ height: "600px"
161
+ }
162
+ }, articleMetadata.length > 0 && React.createElement(MetadataList, {
163
+ title: "Article",
164
+ metadata: articleMetadata,
165
+ imageIndex: state.selectedImage,
166
+ groupId: selectedGroupId,
167
+ onMetadataChange: onMetadataChange,
168
+ metadataConfigs: metadataConfigs.filter(function (mfc) {
169
+ return mfc.level === 'photo_metadata-engine';
170
+ })
171
+ }), selectedPhotoMetadata && React.createElement(MetadataList, {
172
+ title: "Page",
173
+ metadata: selectedPhotoMetadata,
122
174
  imageIndex: state.selectedImage,
123
- onMetadataChange: onMetadataChange
175
+ onMetadataChange: onMetadataChange,
176
+ metadataConfigs: metadataConfigs.filter(function (mfc) {
177
+ return mfc.level === 'photo';
178
+ })
179
+ }), React.createElement(MetadataList, {
180
+ title: "Issue",
181
+ metadata: state.albumMetadata,
182
+ onMetadataChange: onMetadataChange,
183
+ id: "metadata-album",
184
+ metadataConfigs: metadataConfigs.filter(function (mfc) {
185
+ return mfc.level === 'album';
186
+ })
124
187
  }))));
125
188
  };
126
189
  export default memo(MetadataEditorSidebarBox);
@@ -12,7 +12,9 @@ function PageThumbnail(_ref) {
12
12
  metadata = _ref.metadata,
13
13
  showMetadata = _ref.showMetadata,
14
14
  imageIndex = _ref.imageIndex,
15
- onMetadataChange = _ref.onMetadataChange;
15
+ onMetadataChange = _ref.onMetadataChange,
16
+ _ref$metadataConfigs = _ref.metadataConfigs,
17
+ metadataConfigs = _ref$metadataConfigs === void 0 ? [] : _ref$metadataConfigs;
16
18
 
17
19
  var handleChange = function handleChange(e) {
18
20
  e.preventDefault();
@@ -49,6 +51,8 @@ function PageThumbnail(_ref) {
49
51
  }, pageNumber))), React.createElement("div", {
50
52
  className: "ps-page-thumbnail-metadata-wrapper"
51
53
  }, metadata.map(function (_ref2) {
54
+ var _metadataConfigs$find;
55
+
52
56
  var key = _ref2.key,
53
57
  value = _ref2.value;
54
58
  return React.createElement(React.Fragment, null, React.createElement("label", {
@@ -60,8 +64,19 @@ function PageThumbnail(_ref) {
60
64
  onChange: handleChange,
61
65
  onClick: function onClick(e) {
62
66
  return e.stopPropagation();
63
- }
64
- }));
67
+ },
68
+ id: key,
69
+ list: "".concat(key, "-list")
70
+ }), React.createElement("datalist", {
71
+ id: "".concat(key, "-list")
72
+ }, (_metadataConfigs$find = metadataConfigs.find(function (mcf) {
73
+ return mcf.key === key;
74
+ })) === null || _metadataConfigs$find === void 0 ? void 0 : _metadataConfigs$find.options.map(function (opt) {
75
+ return React.createElement("option", {
76
+ key: opt,
77
+ value: opt
78
+ });
79
+ })));
65
80
  })));
66
81
  }
67
82
 
@@ -72,7 +87,8 @@ function PageSelector(_ref3) {
72
87
  onSave = _ref3.onSave,
73
88
  recalcActive = _ref3.recalcActive,
74
89
  saveActive = _ref3.saveActive,
75
- onMetadataChange = _ref3.onMetadataChange;
90
+ onMetadataChange = _ref3.onMetadataChange,
91
+ metadataConfigs = _ref3.metadataConfigs;
76
92
 
77
93
  var _useState = useState(false),
78
94
  _useState2 = _slicedToArray(_useState, 2),
@@ -121,7 +137,8 @@ function PageSelector(_ref3) {
121
137
  metadata: page.metadata,
122
138
  showMetadata: showMetadata,
123
139
  imageIndex: page.id,
124
- onMetadataChange: onMetadataChange
140
+ onMetadataChange: onMetadataChange,
141
+ metadataConfigs: metadataConfigs
125
142
  });
126
143
  })));
127
144
  }
@@ -14,6 +14,7 @@ import CheckIcon from "@mui/icons-material/Check";
14
14
  import TextField from "@mui/material/TextField";
15
15
  import Select from "react-select";
16
16
  import CreatableSelect from "react-select/creatable";
17
+ import uuidToHash from '../utils/uuid-to-hash';
17
18
  import { asMutable } from "seamless-immutable";
18
19
  var theme = createTheme();
19
20
  var useStyles = makeStyles(function (theme) {
@@ -46,7 +47,7 @@ export var RegionLabel = function RegionLabel(_ref) {
46
47
  var allowedGroupsForSelect = allowedGroups ? allowedGroups.map(function (g) {
47
48
  return {
48
49
  value: "".concat(g),
49
- label: "".concat(g)
50
+ label: uuidToHash(g)
50
51
  };
51
52
  }) : [];
52
53
  return React.createElement(ThemeProvider, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@searpent/react-image-annotate",
3
- "version": "2.0.29",
3
+ "version": "2.0.31",
4
4
  "dependencies": {
5
5
  "@editorjs/editorjs": "^2.25.0",
6
6
  "@editorjs/paragraph": "^2.8.0",
@@ -20,8 +20,8 @@
20
20
  "material-survey": "^2.1.0",
21
21
  "mmgc1-cpp": "^1.0.50",
22
22
  "moment": "^2.23.0",
23
- "react": "^17.0.2",
24
- "react-dom": "^17.0.2",
23
+ "react": "^17.0.0",
24
+ "react-dom": "^17.0.0",
25
25
  "react-editor-js": "^2.0.6",
26
26
  "react-full-screen": "^0.3.1",
27
27
  "react-hotkeys": "^2.0.0",
@@ -40,7 +40,8 @@
40
40
  "styled-components": "^5.2.1",
41
41
  "transformation-matrix-js": "^2.7.6",
42
42
  "use-event-callback": "^0.1.0",
43
- "use-key-hook": "^1.3.0"
43
+ "use-key-hook": "^1.3.0",
44
+ "uuid": "^9.0.0"
44
45
  },
45
46
  "peerDependencies": {
46
47
  "react": "^17.0.0",
@@ -1,13 +1,7 @@
1
- import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
1
+ import { v4 as uuidv4 } from 'uuid';
2
2
 
3
- function nextGroupId(groupIds) {
4
- var numberIds = _toConsumableArray(groupIds.filter(function (i) {
5
- return !isNaN(i);
6
- }).map(function (i) {
7
- return parseInt(i);
8
- })).sort();
9
-
10
- return (numberIds[numberIds.length - 1] + 1).toString();
3
+ function nextGroupId() {
4
+ return uuidv4();
11
5
  }
12
6
 
13
7
  export default nextGroupId;
@@ -1,3 +1,5 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+
1
3
  function labelAndTextFromResultText(resultText) {
2
4
  if (!resultText) {
3
5
  return {};
@@ -12,7 +14,7 @@ function labelAndTextFromResultText(resultText) {
12
14
  };
13
15
  }
14
16
 
15
- function modelResultsToRegions(modelResults) {
17
+ function extractionEngineModelResultsToRegions(modelResults) {
16
18
  return modelResults.map(function (r) {
17
19
  var _labelAndTextFromResu = labelAndTextFromResultText(r.text),
18
20
  label = _labelAndTextFromResu.label,
@@ -21,7 +23,7 @@ function modelResultsToRegions(modelResults) {
21
23
  return {
22
24
  id: r.id,
23
25
  type: "box",
24
- visible: true,
26
+ visible: r.label === 'metadata' ? false : true,
25
27
  cls: label,
26
28
  highlighted: false,
27
29
  groupHighlighted: false,
@@ -35,6 +37,37 @@ function modelResultsToRegions(modelResults) {
35
37
  });
36
38
  }
37
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
+
38
71
  function photosToImages(photos) {
39
72
  return photos.map(function (photo) {
40
73
  return {
@@ -42,9 +75,7 @@ function photosToImages(photos) {
42
75
  src: photo.fullsize.key,
43
76
  thumbnail: photo.thumbnail.key,
44
77
  name: photo.fullsize.key,
45
- regions: modelResultsToRegions(photo.modelResults.v1.filter(function (mr) {
46
- return mr.name === 'extraction-engine';
47
- })[0].results),
78
+ regions: modelResultsToRegions(photo.modelResults.v1),
48
79
  metadata: photo.metadata
49
80
  };
50
81
  });
@@ -0,0 +1,5 @@
1
+ var uuidToHash = function uuidToHash(id) {
2
+ return id.slice(0, 8);
3
+ };
4
+
5
+ export default uuidToHash;