@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.
@@ -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
- selectedGroupId = _ref.selectedGroupId,
67
- hideHistory = _ref.hideHistory;
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, state.images]);
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
- return React.createElement(SettingsProvider, null, React.createElement(MainLayout, {
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
- selectedGroupId: selectedGroupId,
166
- hideHistory: hideHistory
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
  }