@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.
- package/Annotator/examplePhotos.js +31 -3
- package/Annotator/index.js +12 -16
- package/Annotator/reducers/general-reducer.js +47 -19
- package/Editor/annotation-plugin/annotation.css +0 -2
- package/GroupSelectorSidebarBox/index.js +2 -2
- package/GroupsEditorSidebarBox/index.js +2 -1
- package/MainLayout/RightSidebarItemsWrapper.js +2 -1
- package/MainLayout/index.js +10 -6
- package/MetadataEditorSidebarBox/index.js +82 -19
- package/PageSelector/index.js +22 -5
- package/RegionLabel/index.js +2 -1
- package/package.json +5 -4
- package/utils/next-group-id.js +3 -9
- package/utils/photosToImages.js +36 -5
- package/utils/uuid-to-hash.js +5 -0
|
@@ -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": "
|
|
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": "
|
|
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": "
|
|
2081
|
+
"key": "pageNumber",
|
|
2054
2082
|
"value": "3"
|
|
2055
2083
|
}]
|
|
2056
2084
|
}, {
|
package/Annotator/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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(
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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
|
|
242
|
-
|
|
243
|
-
recalcActive =
|
|
244
|
-
saveActive =
|
|
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
|
-
|
|
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
|
|
835
|
-
|
|
836
|
-
_mouseDownAt2 =
|
|
831
|
+
var _state5 = state,
|
|
832
|
+
_state5$mouseDownAt = _state5.mouseDownAt,
|
|
833
|
+
_mouseDownAt2 = _state5$mouseDownAt === void 0 ? {
|
|
837
834
|
x: _x2,
|
|
838
835
|
y: _y2
|
|
839
|
-
} :
|
|
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
|
|
1081
|
-
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$
|
|
1166
|
+
var _state$albumMetadata;
|
|
1169
1167
|
|
|
1170
|
-
// update global metadata
|
|
1171
|
-
var metadataIndex = (_state$
|
|
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, ["
|
|
1178
|
+
return setIn(state, ["albumMetadata", metadataIndex], {
|
|
1181
1179
|
key: name,
|
|
1182
1180
|
value: value
|
|
1183
1181
|
});
|
|
1184
1182
|
} else {
|
|
1185
|
-
var _state$images$
|
|
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
|
-
|
|
1188
|
-
|
|
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
|
|
|
@@ -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
|
|
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) {
|
package/MainLayout/index.js
CHANGED
|
@@ -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
|
|
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 === "
|
|
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: "
|
|
12
|
-
marginBottom: "
|
|
11
|
+
flexDirection: "row",
|
|
12
|
+
marginBottom: ".5em",
|
|
13
13
|
"& > label": {
|
|
14
14
|
fontSize: "1rem",
|
|
15
|
-
marginBottom: ".
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
120
|
-
title: "
|
|
121
|
-
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);
|
package/PageSelector/index.js
CHANGED
|
@@ -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
|
}
|
package/RegionLabel/index.js
CHANGED
|
@@ -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:
|
|
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.
|
|
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.
|
|
24
|
-
"react-dom": "^17.0.
|
|
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",
|
package/utils/next-group-id.js
CHANGED
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
2
|
|
|
3
|
-
function nextGroupId(
|
|
4
|
-
|
|
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;
|
package/utils/photosToImages.js
CHANGED
|
@@ -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
|
|
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
|
|
46
|
-
return mr.name === 'extraction-engine';
|
|
47
|
-
})[0].results),
|
|
78
|
+
regions: modelResultsToRegions(photo.modelResults.v1),
|
|
48
79
|
metadata: photo.metadata
|
|
49
80
|
};
|
|
50
81
|
});
|