@searpent/react-image-annotate 2.0.3 → 2.0.6
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 +6976 -0
- package/Annotator/index.js +104 -11
- package/Annotator/reducers/general-reducer.js +95 -1
- package/Editor/annotation-plugin/annotation.js +613 -0
- package/Editor/index.js +57 -0
- package/Editor/tools.js +5 -0
- package/ImageCanvas/index.js +7 -2
- package/MainLayout/index.js +146 -43
- package/MetadataEditorSidebarBox/index.js +126 -0
- package/PageSelector/index.js +67 -0
- package/RegionLabel/index.js +16 -2
- package/RegionShapes/index.js +31 -11
- package/RegionTags/index.js +6 -2
- package/SettingsProvider/index.js +8 -3
- package/hooks/use-colors.js +101 -0
- package/package.json +4 -1
- package/utils/filter-only-unique.js +5 -0
- package/utils/photosToImages.js +53 -0
- package/utils/regions-to-blocks.js +16 -0
package/Annotator/index.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
2
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
1
3
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread";
|
|
2
4
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
3
5
|
import React, { useEffect, useReducer } from "react";
|
|
@@ -63,8 +65,16 @@ export var Annotator = function Annotator(_ref) {
|
|
|
63
65
|
onImagesChange = _ref.onImagesChange,
|
|
64
66
|
groups = _ref.groups,
|
|
65
67
|
onGroupSelect = _ref.onGroupSelect,
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
hideHistory = _ref.hideHistory,
|
|
69
|
+
hideNotEditingLabel = _ref.hideNotEditingLabel,
|
|
70
|
+
showEditor = _ref.showEditor,
|
|
71
|
+
showPageSelector = _ref.showPageSelector,
|
|
72
|
+
clsColors = _ref.clsColors,
|
|
73
|
+
groupColors = _ref.groupColors,
|
|
74
|
+
onRecalc = _ref.onRecalc,
|
|
75
|
+
onSave = _ref.onSave,
|
|
76
|
+
allowedGroups = _ref.allowedGroups,
|
|
77
|
+
metadata = _ref.metadata;
|
|
68
78
|
|
|
69
79
|
if (typeof selectedImage === "string") {
|
|
70
80
|
selectedImage = (images || []).findIndex(function (img) {
|
|
@@ -105,6 +115,10 @@ export var Annotator = function Annotator(_ref) {
|
|
|
105
115
|
} : {
|
|
106
116
|
videoSrc: videoSrc,
|
|
107
117
|
keyframes: keyframes
|
|
118
|
+
}, {
|
|
119
|
+
imagesUpdatedAt: null,
|
|
120
|
+
imagesSavedAt: null,
|
|
121
|
+
metadata: metadata
|
|
108
122
|
}))),
|
|
109
123
|
_useReducer2 = _slicedToArray(_useReducer, 2),
|
|
110
124
|
state = _useReducer2[0],
|
|
@@ -129,23 +143,94 @@ export var Annotator = function Annotator(_ref) {
|
|
|
129
143
|
cls: cls
|
|
130
144
|
});
|
|
131
145
|
});
|
|
146
|
+
|
|
147
|
+
var handleSaveClick =
|
|
148
|
+
/*#__PURE__*/
|
|
149
|
+
function () {
|
|
150
|
+
var _ref2 = _asyncToGenerator(
|
|
151
|
+
/*#__PURE__*/
|
|
152
|
+
_regeneratorRuntime.mark(function _callee(e) {
|
|
153
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
154
|
+
while (1) {
|
|
155
|
+
switch (_context.prev = _context.next) {
|
|
156
|
+
case 0:
|
|
157
|
+
e.preventDefault();
|
|
158
|
+
|
|
159
|
+
if (onSave) {
|
|
160
|
+
onSave();
|
|
161
|
+
dispatchToReducer({
|
|
162
|
+
type: "IMAGES_SAVED",
|
|
163
|
+
savedAt: new Date()
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
case 2:
|
|
168
|
+
case "end":
|
|
169
|
+
return _context.stop();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}, _callee);
|
|
173
|
+
}));
|
|
174
|
+
|
|
175
|
+
return function handleSaveClick(_x) {
|
|
176
|
+
return _ref2.apply(this, arguments);
|
|
177
|
+
};
|
|
178
|
+
}();
|
|
179
|
+
|
|
180
|
+
var handleRecalcClick = function handleRecalcClick(e) {
|
|
181
|
+
e.preventDefault();
|
|
182
|
+
|
|
183
|
+
if (onRecalc) {
|
|
184
|
+
onRecalc();
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
var handleMetadataChange = function handleMetadataChange(_ref3) {
|
|
189
|
+
var name = _ref3.name,
|
|
190
|
+
value = _ref3.value,
|
|
191
|
+
imageIndex = _ref3.imageIndex;
|
|
192
|
+
dispatchToReducer({
|
|
193
|
+
type: "UPDATE_METADATA",
|
|
194
|
+
name: name,
|
|
195
|
+
value: value,
|
|
196
|
+
imageIndex: imageIndex
|
|
197
|
+
});
|
|
198
|
+
}; // trigger this on every BBox manipulation (there is currently no way to detect adding of new box!)
|
|
199
|
+
|
|
200
|
+
|
|
132
201
|
useEffect(function () {
|
|
202
|
+
if (!state.lastAction || !["BEGIN_BOX_TRANSFORM", "CHANGE_REGION", "DELETE_REGION"].includes(state.lastAction.type)) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
|
|
133
206
|
if (onImagesChange) {
|
|
134
|
-
onImagesChange(
|
|
135
|
-
selectedImage: selectedImage,
|
|
136
|
-
images: state.images
|
|
137
|
-
});
|
|
207
|
+
onImagesChange(state.images);
|
|
138
208
|
}
|
|
139
209
|
|
|
210
|
+
dispatchToReducer({
|
|
211
|
+
type: "IMAGES_UPDATED",
|
|
212
|
+
updatedAt: new Date()
|
|
213
|
+
});
|
|
214
|
+
}, [onImagesChange, state.images, state.lastAction]);
|
|
215
|
+
useEffect(function () {
|
|
140
216
|
if (selectedImage === undefined) return;
|
|
141
217
|
dispatchToReducer({
|
|
142
218
|
type: "SELECT_IMAGE",
|
|
143
219
|
imageIndex: selectedImage,
|
|
144
220
|
image: state.images[selectedImage]
|
|
145
|
-
});
|
|
146
|
-
}, [onImagesChange, selectedImage
|
|
221
|
+
}); // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
222
|
+
}, [onImagesChange, selectedImage]);
|
|
147
223
|
if (!images && !videoSrc) return 'Missing required prop "images" or "videoSrc"';
|
|
148
|
-
|
|
224
|
+
|
|
225
|
+
var _ref4 = state.imagesSavedAt < state.imagesUpdatedAt ? [true, true] : [false, false],
|
|
226
|
+
_ref5 = _slicedToArray(_ref4, 2),
|
|
227
|
+
recalcActive = _ref5[0],
|
|
228
|
+
saveActive = _ref5[1];
|
|
229
|
+
|
|
230
|
+
return React.createElement(SettingsProvider, {
|
|
231
|
+
clsColors: clsColors,
|
|
232
|
+
groupColors: groupColors
|
|
233
|
+
}, React.createElement(MainLayout, {
|
|
149
234
|
RegionEditLabel: RegionEditLabel,
|
|
150
235
|
alwaysShowNextButton: Boolean(onNextImage),
|
|
151
236
|
alwaysShowPrevButton: Boolean(onPrevImage),
|
|
@@ -162,8 +247,16 @@ export var Annotator = function Annotator(_ref) {
|
|
|
162
247
|
hideSave: hideSave,
|
|
163
248
|
groups: groups,
|
|
164
249
|
onGroupSelect: onGroupSelect,
|
|
165
|
-
|
|
166
|
-
|
|
250
|
+
hideHistory: hideHistory,
|
|
251
|
+
hideNotEditingLabel: hideNotEditingLabel,
|
|
252
|
+
showEditor: showEditor,
|
|
253
|
+
showPageSelector: showPageSelector,
|
|
254
|
+
onRecalc: handleRecalcClick,
|
|
255
|
+
onSave: handleSaveClick,
|
|
256
|
+
saveActive: recalcActive,
|
|
257
|
+
recalcActive: saveActive,
|
|
258
|
+
allowedGroups: allowedGroups,
|
|
259
|
+
onMetadataChange: handleMetadataChange
|
|
167
260
|
}));
|
|
168
261
|
};
|
|
169
262
|
export default Annotator;
|
|
@@ -13,6 +13,7 @@ import convertExpandingLineToPolygon from "./convert-expanding-line-to-polygon";
|
|
|
13
13
|
import clamp from "clamp";
|
|
14
14
|
import getLandmarksWithTransform from "../../utils/get-landmarks-with-transform";
|
|
15
15
|
import setInLocalStorage from "../../utils/set-in-local-storage";
|
|
16
|
+
import onlyUnique from "../../utils/filter-only-unique";
|
|
16
17
|
|
|
17
18
|
var getRandomId = function getRandomId() {
|
|
18
19
|
return Math.random().toString().split(".")[1];
|
|
@@ -183,10 +184,25 @@ export default (function (state, action) {
|
|
|
183
184
|
var regions = _toConsumableArray(activeImage.regions || []).map(function (r) {
|
|
184
185
|
return _objectSpread({}, r, {
|
|
185
186
|
highlighted: r.id === region.id,
|
|
187
|
+
groupHighlighted: r.groupId && r.groupId === region.groupId ? true : false,
|
|
186
188
|
editingLabels: r.id === region.id
|
|
187
189
|
});
|
|
188
190
|
});
|
|
189
191
|
|
|
192
|
+
var selectedGroupIds = regions.filter(function (i) {
|
|
193
|
+
return i.highlighted;
|
|
194
|
+
}).map(function (r) {
|
|
195
|
+
return r.groupId || '';
|
|
196
|
+
}).filter(onlyUnique);
|
|
197
|
+
|
|
198
|
+
if (selectedGroupIds.length === 1) {
|
|
199
|
+
state = setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["selectedGroupId"]), selectedGroupIds[0]);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (selectedGroupIds.length === 0) {
|
|
203
|
+
state = setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["selectedGroupId"]), null);
|
|
204
|
+
}
|
|
205
|
+
|
|
190
206
|
return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), regions);
|
|
191
207
|
}
|
|
192
208
|
|
|
@@ -762,9 +778,10 @@ export default (function (state, action) {
|
|
|
762
778
|
}
|
|
763
779
|
|
|
764
780
|
var _regions = _toConsumableArray(getIn(state, pathToActiveImage).regions || []).map(function (r) {
|
|
765
|
-
return setIn(r, ["editingLabels"], false).setIn(["highlighted"], false);
|
|
781
|
+
return setIn(r, ["editingLabels"], false).setIn(["highlighted"], false).setIn(["groupHighlighted"], false);
|
|
766
782
|
}).concat(newRegion ? [newRegion] : []);
|
|
767
783
|
|
|
784
|
+
state = setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["selectedGroupId"]), null);
|
|
768
785
|
return setIn(state, [].concat(_toConsumableArray(pathToActiveImage), ["regions"]), _regions);
|
|
769
786
|
}
|
|
770
787
|
|
|
@@ -1050,6 +1067,83 @@ export default (function (state, action) {
|
|
|
1050
1067
|
break;
|
|
1051
1068
|
}
|
|
1052
1069
|
|
|
1070
|
+
case "UPDATE_REGIONS":
|
|
1071
|
+
{
|
|
1072
|
+
var imageIndex = action.imageIndex,
|
|
1073
|
+
_newRegions = action.regions;
|
|
1074
|
+
var updatedRegions = state.images[imageIndex].regions.map(function (r) {
|
|
1075
|
+
var updatedRegion = _newRegions.find(function (i) {
|
|
1076
|
+
return i.id === r.id;
|
|
1077
|
+
});
|
|
1078
|
+
|
|
1079
|
+
if (!updatedRegion) {
|
|
1080
|
+
return r;
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
return _objectSpread({}, r, {
|
|
1084
|
+
cls: updatedRegion.cls,
|
|
1085
|
+
text: updatedRegion.text
|
|
1086
|
+
});
|
|
1087
|
+
}); // TODO: add mutation of order and deletion of regions - SI-1967
|
|
1088
|
+
|
|
1089
|
+
return setIn(state, ["images", imageIndex, "regions"], updatedRegions);
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
case "IMAGES_UPDATED":
|
|
1093
|
+
{
|
|
1094
|
+
var updatedAt = action.updatedAt;
|
|
1095
|
+
return setIn(state, ["imagesUpdatedAt"], updatedAt);
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
case "IMAGES_SAVED":
|
|
1099
|
+
{
|
|
1100
|
+
var savedAt = action.savedAt;
|
|
1101
|
+
return setIn(state, ["imagesSavedAt"], savedAt);
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
case "UPDATE_METADATA":
|
|
1105
|
+
{
|
|
1106
|
+
var name = action.name,
|
|
1107
|
+
value = action.value,
|
|
1108
|
+
_imageIndex = action.imageIndex;
|
|
1109
|
+
|
|
1110
|
+
if (isNaN(_imageIndex)) {
|
|
1111
|
+
var _state$metadata;
|
|
1112
|
+
|
|
1113
|
+
// update global metadata
|
|
1114
|
+
var metadataIndex = (_state$metadata = state.metadata) === null || _state$metadata === void 0 ? void 0 : _state$metadata.findIndex(function (mt) {
|
|
1115
|
+
return mt.key === name;
|
|
1116
|
+
});
|
|
1117
|
+
|
|
1118
|
+
if (metadataIndex < 0) {
|
|
1119
|
+
console.error("can't find metadata by key \"".concat(name, "\""));
|
|
1120
|
+
return;
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
return setIn(state, ["metadata", metadataIndex], {
|
|
1124
|
+
key: name,
|
|
1125
|
+
value: value
|
|
1126
|
+
});
|
|
1127
|
+
} else {
|
|
1128
|
+
var _state$images$_imageI, _state$images$_imageI2;
|
|
1129
|
+
|
|
1130
|
+
// update local metadata of imageIndex
|
|
1131
|
+
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) {
|
|
1132
|
+
return mt.key === name;
|
|
1133
|
+
});
|
|
1134
|
+
|
|
1135
|
+
if (_metadataIndex < 0) {
|
|
1136
|
+
console.error("can't find metadata by key \"".concat(name, "\""));
|
|
1137
|
+
return;
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
return setIn(state, ["images", _imageIndex, "metadata", _metadataIndex], {
|
|
1141
|
+
key: name,
|
|
1142
|
+
value: value
|
|
1143
|
+
});
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1053
1147
|
default:
|
|
1054
1148
|
break;
|
|
1055
1149
|
}
|