@searpent/react-image-annotate 2.0.51 → 2.0.53

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.
@@ -778,7 +778,7 @@ var examplePhotos = [{
778
778
  "key": "mutation",
779
779
  "value": "hřensko"
780
780
  }],
781
- "lockedUntil": ""
781
+ "lockedUntil": "2023-01-28T11:35:00.000Z"
782
782
  }, {
783
783
  "id": "431fc636-d6d1-4e20-a35b-cc7a201c1833",
784
784
  "fullsize": {
@@ -1330,7 +1330,7 @@ var examplePhotos = [{
1330
1330
  "key": "pageNumber",
1331
1331
  "value": "2"
1332
1332
  }],
1333
- "lockedUntil": "2023-01-28T11:35:00.000Z"
1333
+ "lockedUntil": null
1334
1334
  }, {
1335
1335
  "id": "45f79ec8-fd2e-4ad8-82f6-007a2eec2b97",
1336
1336
  "fullsize": {
@@ -3,7 +3,7 @@ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
3
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
4
4
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread";
5
5
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
6
- import React, { useEffect, useReducer } from "react";
6
+ import React, { useCallback, useEffect, useReducer } from "react";
7
7
  import makeImmutable, { without } from "seamless-immutable";
8
8
  import intersection from "lodash/intersection";
9
9
  import MainLayout from "../MainLayout";
@@ -78,8 +78,6 @@ export var Annotator = function Annotator(_ref) {
78
78
  _ref$clsColors = _ref.clsColors,
79
79
  clsColors = _ref$clsColors === void 0 ? {} : _ref$clsColors,
80
80
  groupColors = _ref.groupColors,
81
- onRecalc = _ref.onRecalc,
82
- onSave = _ref.onSave,
83
81
  onSelectedImageChange = _ref.onSelectedImageChange,
84
82
  albumMetadata = _ref.albumMetadata,
85
83
  metadataConfigs = _ref.metadataConfigs,
@@ -137,7 +135,8 @@ export var Annotator = function Annotator(_ref) {
137
135
  return i.lockedUntil;
138
136
  }).map(function (i) {
139
137
  return i.id;
140
- }))
138
+ })),
139
+ toSaveImage: null
141
140
  }))),
142
141
  _useReducer2 = _slicedToArray(_useReducer, 2),
143
142
  state = _useReducer2[0],
@@ -163,98 +162,6 @@ export var Annotator = function Annotator(_ref) {
163
162
  });
164
163
  });
165
164
 
166
- var handleSaveClick =
167
- /*#__PURE__*/
168
- function () {
169
- var _ref2 = _asyncToGenerator(
170
- /*#__PURE__*/
171
- _regeneratorRuntime.mark(function _callee(e) {
172
- var createdAt;
173
- return _regeneratorRuntime.wrap(function _callee$(_context) {
174
- while (1) {
175
- switch (_context.prev = _context.next) {
176
- case 0:
177
- createdAt = new Date();
178
- e.preventDefault();
179
-
180
- if (!onSave) {
181
- _context.next = 6;
182
- break;
183
- }
184
-
185
- _context.next = 5;
186
- return onSave({
187
- images: state.images,
188
- albumMetadata: state.albumMetadata,
189
- createdAt: createdAt,
190
- selectedImage: state === null || state === void 0 ? void 0 : state.selectedImage
191
- });
192
-
193
- case 5:
194
- dispatchToReducer({
195
- type: "IMAGES_SAVED",
196
- savedAt: createdAt
197
- });
198
-
199
- case 6:
200
- case "end":
201
- return _context.stop();
202
- }
203
- }
204
- }, _callee);
205
- }));
206
-
207
- return function handleSaveClick(_x) {
208
- return _ref2.apply(this, arguments);
209
- };
210
- }();
211
-
212
- var handleRecalcClick =
213
- /*#__PURE__*/
214
- function () {
215
- var _ref3 = _asyncToGenerator(
216
- /*#__PURE__*/
217
- _regeneratorRuntime.mark(function _callee2(e) {
218
- var createdAt;
219
- return _regeneratorRuntime.wrap(function _callee2$(_context2) {
220
- while (1) {
221
- switch (_context2.prev = _context2.next) {
222
- case 0:
223
- createdAt = new Date();
224
- e.preventDefault();
225
-
226
- if (!onRecalc) {
227
- _context2.next = 6;
228
- break;
229
- }
230
-
231
- _context2.next = 5;
232
- return onRecalc({
233
- images: state.images,
234
- albumMetadata: state.albumMetadata,
235
- createdAt: createdAt,
236
- selectedImage: state === null || state === void 0 ? void 0 : state.selectedImage
237
- });
238
-
239
- case 5:
240
- dispatchToReducer({
241
- type: "IMAGES_RECALCULATED",
242
- recalculatedAt: createdAt
243
- });
244
-
245
- case 6:
246
- case "end":
247
- return _context2.stop();
248
- }
249
- }
250
- }, _callee2);
251
- }));
252
-
253
- return function handleRecalcClick(_x2) {
254
- return _ref3.apply(this, arguments);
255
- };
256
- }();
257
-
258
165
  var handleMetadataChange = function handleMetadataChange(params) {
259
166
  dispatchToReducer(_objectSpread({
260
167
  type: "UPDATE_METADATA"
@@ -266,8 +173,15 @@ export var Annotator = function Annotator(_ref) {
266
173
  type: "ADD_GROUP",
267
174
  group: group
268
175
  });
269
- }; // trigger save and recalc
176
+ };
270
177
 
178
+ var handleRecalcClicked = useCallback(function (_ref2) {
179
+ var imageId = _ref2.imageId;
180
+ dispatchToReducer({
181
+ type: "RECALC_CLICKED",
182
+ imageId: imageId
183
+ });
184
+ }, [dispatchToReducer]); // detect on page change if anything changed, if so trigger save and recalc
271
185
 
272
186
  useEffect(function () {
273
187
  var selectedImage = state.selectedImage,
@@ -277,25 +191,51 @@ export var Annotator = function Annotator(_ref) {
277
191
  if ((lastAction === null || lastAction === void 0 ? void 0 : lastAction.type) === 'SELECT_IMAGE' && selectedImage !== previouslySelectedImage) {
278
192
  var _state$images$previou, _state$images$previou2;
279
193
 
194
+ // save if previously selected image has any changes
195
+ if (((_state$images$previou = state.images[previouslySelectedImage]) === null || _state$images$previou === void 0 ? void 0 : (_state$images$previou2 = _state$images$previou.saveableActions) === null || _state$images$previou2 === void 0 ? void 0 : _state$images$previou2.length) > 0) {
196
+ var _state$images$previou3, _state$images$previou4;
197
+
198
+ // decide wheather recalc is needed
199
+ var triggerRecalc = intersection(reacalcActionsEnum, state.images[previouslySelectedImage].saveableActions).length > 0; // decide whether album metadata should be updated
200
+
201
+ var toSaveMetadata = [];
202
+
203
+ if ((_state$images$previou3 = state.images[previouslySelectedImage]) === null || _state$images$previou3 === void 0 ? void 0 : (_state$images$previou4 = _state$images$previou3.saveableActions) === null || _state$images$previou4 === void 0 ? void 0 : _state$images$previou4.includes("UPDATE_ALBUM_METADATA")) {
204
+ toSaveMetadata = state.albumMetadata;
205
+ } // set this image to be saved
206
+
207
+
208
+ dispatchToReducer({
209
+ type: "SAVE_IMAGE",
210
+ image: _objectSpread({}, state.images[previouslySelectedImage]),
211
+ triggerRecalc: triggerRecalc,
212
+ toSaveMetadata: toSaveMetadata
213
+ });
214
+ }
215
+ }
216
+ }, [state.previouslySelectedImage, state.selectedImage, state.images, state, save]); // handle save of image
217
+
218
+ useEffect(function () {
219
+ if (state.toSaveImage !== null) {
280
220
  // metadata on album level
281
221
  var saveHandler =
282
222
  /*#__PURE__*/
283
223
  function () {
284
- var _ref4 = _asyncToGenerator(
224
+ var _ref3 = _asyncToGenerator(
285
225
  /*#__PURE__*/
286
- _regeneratorRuntime.mark(function _callee3(image, triggerRecalc, albumMetadata) {
287
- var _ref5, lockedUntil;
226
+ _regeneratorRuntime.mark(function _callee(image, triggerRecalc, albumMetadata) {
227
+ var _ref4, lockedUntil;
288
228
 
289
- return _regeneratorRuntime.wrap(function _callee3$(_context3) {
229
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
290
230
  while (1) {
291
- switch (_context3.prev = _context3.next) {
231
+ switch (_context.prev = _context.next) {
292
232
  case 0:
293
233
  dispatchToReducer({
294
234
  type: "IMAGE_UPDATE_INIT",
295
235
  imageId: image.id
296
236
  });
297
- _context3.prev = 1;
298
- _context3.next = 4;
237
+ _context.prev = 1;
238
+ _context.next = 4;
299
239
  return save({
300
240
  image: image,
301
241
  triggerRecalc: triggerRecalc,
@@ -303,61 +243,50 @@ export var Annotator = function Annotator(_ref) {
303
243
  });
304
244
 
305
245
  case 4:
306
- _ref5 = _context3.sent;
307
- lockedUntil = _ref5.lockedUntil;
246
+ _ref4 = _context.sent;
247
+ lockedUntil = _ref4.lockedUntil;
308
248
  dispatchToReducer({
309
249
  type: "IMAGE_UPDATE_SUCCESS",
310
250
  imageId: image.id,
311
251
  lockedUntil: lockedUntil
312
252
  });
313
- _context3.next = 12;
253
+ _context.next = 12;
314
254
  break;
315
255
 
316
256
  case 9:
317
- _context3.prev = 9;
318
- _context3.t0 = _context3["catch"](1);
257
+ _context.prev = 9;
258
+ _context.t0 = _context["catch"](1);
319
259
  dispatchToReducer({
320
260
  type: "IMAGE_UPDATE_FAIL",
321
261
  imageId: image.id,
322
- error: _context3.t0
262
+ error: _context.t0
323
263
  });
324
264
 
325
265
  case 12:
326
266
  case "end":
327
- return _context3.stop();
267
+ return _context.stop();
328
268
  }
329
269
  }
330
- }, _callee3, null, [[1, 9]]);
270
+ }, _callee, null, [[1, 9]]);
331
271
  }));
332
272
 
333
- return function saveHandler(_x3, _x4, _x5) {
334
- return _ref4.apply(this, arguments);
273
+ return function saveHandler(_x, _x2, _x3) {
274
+ return _ref3.apply(this, arguments);
335
275
  };
336
- }(); // save if previously selected image has any changes
337
-
338
-
339
- if (((_state$images$previou = state.images[previouslySelectedImage]) === null || _state$images$previou === void 0 ? void 0 : (_state$images$previou2 = _state$images$previou.saveableActions) === null || _state$images$previou2 === void 0 ? void 0 : _state$images$previou2.length) > 0) {
340
- var _state$images$previou3, _state$images$previou4;
276
+ }();
341
277
 
342
- // decide wheather recalc is needed
343
- var triggerRecalc = intersection(reacalcActionsEnum, state.images[previouslySelectedImage].saveableActions).length > 0; // decide wheather album metadata should be updated
344
-
345
- var toSaveMetadata = [];
346
-
347
- if ((_state$images$previou3 = state.images[previouslySelectedImage]) === null || _state$images$previou3 === void 0 ? void 0 : (_state$images$previou4 = _state$images$previou3.saveableActions) === null || _state$images$previou4 === void 0 ? void 0 : _state$images$previou4.includes("UPDATE_ALBUM_METADATA")) {
348
- toSaveMetadata = state.albumMetadata;
349
- } // save image
350
-
351
-
352
- saveHandler(_objectSpread({}, state.images[previouslySelectedImage]), triggerRecalc, toSaveMetadata);
353
- }
278
+ var _state$toSaveImage = state.toSaveImage,
279
+ image = _state$toSaveImage.image,
280
+ triggerRecalc = _state$toSaveImage.triggerRecalc,
281
+ toSaveMetadata = _state$toSaveImage.toSaveMetadata;
282
+ saveHandler(image, triggerRecalc, toSaveMetadata);
354
283
  }
355
- }, [state.previouslySelectedImage, state.selectedImage, state.images, state, save]); // polling of images
284
+ }, [save, state.toSaveImage]); // polling of images
356
285
 
357
286
  useEffect(function () {
358
287
  if (state.toPollImages.length > 0) {
359
288
  var polledImages = state.toPollImages.reduce(function (acc, imageId) {
360
- function pollImage(_x6, _x7) {
289
+ function pollImage(_x4, _x5) {
361
290
  return _pollImage.apply(this, arguments);
362
291
  } // make recursive calling of polling function
363
292
 
@@ -365,20 +294,20 @@ export var Annotator = function Annotator(_ref) {
365
294
  function _pollImage() {
366
295
  _pollImage = _asyncToGenerator(
367
296
  /*#__PURE__*/
368
- _regeneratorRuntime.mark(function _callee4(fetchImage, imageId) {
297
+ _regeneratorRuntime.mark(function _callee2(fetchImage, imageId) {
369
298
  var tries,
370
- _ref6,
299
+ _ref5,
371
300
  image,
372
- _args4 = arguments;
301
+ _args2 = arguments;
373
302
 
374
- return _regeneratorRuntime.wrap(function _callee4$(_context4) {
303
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
375
304
  while (1) {
376
- switch (_context4.prev = _context4.next) {
305
+ switch (_context2.prev = _context2.next) {
377
306
  case 0:
378
- tries = _args4.length > 2 && _args4[2] !== undefined ? _args4[2] : 5;
307
+ tries = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : 5;
379
308
 
380
309
  if (!(tries === 0)) {
381
- _context4.next = 4;
310
+ _context2.next = 4;
382
311
  break;
383
312
  }
384
313
 
@@ -386,20 +315,20 @@ export var Annotator = function Annotator(_ref) {
386
315
  type: "IMAGE_POLL_TIMEOUT",
387
316
  imageId: imageId
388
317
  });
389
- return _context4.abrupt("return");
318
+ return _context2.abrupt("return");
390
319
 
391
320
  case 4:
392
- _context4.next = 6;
321
+ _context2.next = 6;
393
322
  return fetchImage({
394
323
  imageId: imageId
395
324
  });
396
325
 
397
326
  case 6:
398
- _ref6 = _context4.sent;
399
- image = _ref6.image;
327
+ _ref5 = _context2.sent;
328
+ image = _ref5.image;
400
329
 
401
330
  if (image.lockedUntil) {
402
- _context4.next = 11;
331
+ _context2.next = 11;
403
332
  break;
404
333
  }
405
334
 
@@ -407,25 +336,25 @@ export var Annotator = function Annotator(_ref) {
407
336
  type: "IMAGE_POLL_SUCCESS",
408
337
  image: image
409
338
  });
410
- return _context4.abrupt("return");
339
+ return _context2.abrupt("return");
411
340
 
412
341
  case 11:
413
- _context4.next = 13;
342
+ _context2.next = 13;
414
343
  return sleep(5000);
415
344
 
416
345
  case 13:
417
- _context4.next = 15;
346
+ _context2.next = 15;
418
347
  return pollImage(fetchImage, imageId, tries - 1);
419
348
 
420
349
  case 15:
421
- return _context4.abrupt("return", _context4.sent);
350
+ return _context2.abrupt("return", _context2.sent);
422
351
 
423
352
  case 16:
424
353
  case "end":
425
- return _context4.stop();
354
+ return _context2.stop();
426
355
  }
427
356
  }
428
- }, _callee4);
357
+ }, _callee2);
429
358
  }));
430
359
  return _pollImage.apply(this, arguments);
431
360
  }
@@ -438,18 +367,7 @@ export var Annotator = function Annotator(_ref) {
438
367
  imageIds: polledImages
439
368
  });
440
369
  }
441
- }, [fetchImage, state.toPollImages]); // // TODO: delete this when work done
442
- // useEffect(() => {
443
- // if (!state.lastAction || !["BEGIN_BOX_TRANSFORM", "CHANGE_REGION", "DELETE_REGION", "DELETE_SELECTED_REGION", "UPDATE_METADATA", "SELECT_CLASSIFICATION"].includes(state.lastAction.type)) { return }
444
- // if (onImagesChange) {
445
- // onImagesChange(state.images)
446
- // }
447
- // dispatchToReducer({
448
- // type: "IMAGES_UPDATED",
449
- // updatedAt: new Date()
450
- // })
451
- // }, [onImagesChange, state.images, state.lastAction])
452
-
370
+ }, [fetchImage, state.toPollImages]);
453
371
  useEffect(function () {
454
372
  if (selectedImage === undefined) return;
455
373
  dispatchToReducer({
@@ -460,10 +378,10 @@ export var Annotator = function Annotator(_ref) {
460
378
  }, [onImagesChange, selectedImage]);
461
379
  if (!images && !videoSrc) return 'Missing required prop "images" or "videoSrc"';
462
380
 
463
- var _ref7 = state.imagesSavedAt < state.imagesUpdatedAt ? [true, true] : [false, false],
464
- _ref8 = _slicedToArray(_ref7, 2),
465
- recalcActive = _ref8[0],
466
- saveActive = _ref8[1];
381
+ var _ref6 = state.imagesSavedAt < state.imagesUpdatedAt ? [true, true] : [false, false],
382
+ _ref7 = _slicedToArray(_ref6, 2),
383
+ recalcActive = _ref7[0],
384
+ saveActive = _ref7[1];
467
385
 
468
386
  return React.createElement(SettingsProvider, {
469
387
  clsColors: clsColors,
@@ -489,12 +407,11 @@ export var Annotator = function Annotator(_ref) {
489
407
  hideNotEditingLabel: hideNotEditingLabel,
490
408
  showEditor: showEditor,
491
409
  showPageSelector: showPageSelector,
492
- onRecalc: handleRecalcClick,
493
- onSave: handleSaveClick,
494
410
  saveActive: recalcActive,
495
411
  recalcActive: saveActive,
496
412
  onMetadataChange: handleMetadataChange,
497
- onAddGroup: handleAddGroup
413
+ onAddGroup: handleAddGroup,
414
+ onRecalcClick: handleRecalcClicked
498
415
  }));
499
416
  };
500
417
  export default Annotator;
@@ -1266,7 +1266,19 @@ export default (function (state, action) {
1266
1266
  // )
1267
1267
  }
1268
1268
 
1269
- case "IMAGE_UPDATE_INIT":
1269
+ case "SAVE_IMAGE":
1270
+ {
1271
+ var image = action.image,
1272
+ triggerRecalc = action.triggerRecalc,
1273
+ toSaveMetadata = action.toSaveMetadata;
1274
+ return setIn(state, ["toSaveImage"], {
1275
+ image: image,
1276
+ triggerRecalc: triggerRecalc,
1277
+ toSaveMetadata: toSaveMetadata
1278
+ });
1279
+ }
1280
+
1281
+ case "RECALC_CLICKED":
1270
1282
  {
1271
1283
  var imageId = action.imageId;
1272
1284
  var imageIdx = state.images.findIndex(function (i) {
@@ -1277,7 +1289,29 @@ export default (function (state, action) {
1277
1289
  throw new Error("failed to find index of image with id ".concat(imageId));
1278
1290
  }
1279
1291
 
1280
- return setIn(state, ["images", imageIdx], _objectSpread({}, state.images[imageIdx], {
1292
+ var _image = _objectSpread({}, state.images[imageIdx]);
1293
+
1294
+ return setIn(state, ["toSaveImage"], {
1295
+ image: _image,
1296
+ triggerRecalc: true,
1297
+ toSaveMetadata: []
1298
+ });
1299
+ }
1300
+
1301
+ case "IMAGE_UPDATE_INIT":
1302
+ {
1303
+ var _imageId = action.imageId;
1304
+
1305
+ var _imageIdx = state.images.findIndex(function (i) {
1306
+ return i.id === _imageId;
1307
+ });
1308
+
1309
+ if (_imageIdx < 0) {
1310
+ throw new Error("failed to find index of image with id ".concat(_imageId));
1311
+ }
1312
+
1313
+ state = setIn(state, ["toSaveImage"], null);
1314
+ return setIn(state, ["images", _imageIdx], _objectSpread({}, state.images[_imageIdx], {
1281
1315
  lockedUntil: defaultLockedUntil(),
1282
1316
  syncError: null,
1283
1317
  saveableActions: []
@@ -1286,23 +1320,23 @@ export default (function (state, action) {
1286
1320
 
1287
1321
  case "IMAGE_UPDATE_SUCCESS":
1288
1322
  {
1289
- var _imageId = action.imageId,
1323
+ var _imageId2 = action.imageId,
1290
1324
  lockedUntil = action.lockedUntil;
1291
1325
 
1292
- var _imageIdx = state.images.findIndex(function (i) {
1293
- return i.id === _imageId;
1326
+ var _imageIdx2 = state.images.findIndex(function (i) {
1327
+ return i.id === _imageId2;
1294
1328
  });
1295
1329
 
1296
- if (_imageIdx < 0) {
1297
- throw new Error("failed to find index of image with id ".concat(_imageId));
1330
+ if (_imageIdx2 < 0) {
1331
+ throw new Error("failed to find index of image with id ".concat(_imageId2));
1298
1332
  } // if there is lockedUntil set, it means we need to poll for updated
1299
1333
 
1300
1334
 
1301
1335
  if (lockedUntil) {
1302
- state = setIn(state, ["toPollImages"], uniq([].concat(_toConsumableArray(state.toPollImages), [_imageId])));
1336
+ state = setIn(state, ["toPollImages"], uniq([].concat(_toConsumableArray(state.toPollImages), [_imageId2])));
1303
1337
  }
1304
1338
 
1305
- return setIn(state, ["images", _imageIdx], _objectSpread({}, state.images[_imageIdx], {
1339
+ return setIn(state, ["images", _imageIdx2], _objectSpread({}, state.images[_imageIdx2], {
1306
1340
  lockedUntil: lockedUntil,
1307
1341
  syncError: null
1308
1342
  }));
@@ -1310,18 +1344,18 @@ export default (function (state, action) {
1310
1344
 
1311
1345
  case "IMAGE_UPDATE_FAIL":
1312
1346
  {
1313
- var _imageId2 = action.imageId,
1347
+ var _imageId3 = action.imageId,
1314
1348
  error = action.error;
1315
1349
 
1316
- var _imageIdx2 = state.images.findIndex(function (i) {
1317
- return i.id === _imageId2;
1350
+ var _imageIdx3 = state.images.findIndex(function (i) {
1351
+ return i.id === _imageId3;
1318
1352
  });
1319
1353
 
1320
- if (_imageIdx2 < 0) {
1321
- throw new Error("failed to find index of image with id ".concat(_imageId2));
1354
+ if (_imageIdx3 < 0) {
1355
+ throw new Error("failed to find index of image with id ".concat(_imageId3));
1322
1356
  }
1323
1357
 
1324
- return setIn(state, ["images", _imageIdx2], _objectSpread({}, state.images[_imageIdx2], {
1358
+ return setIn(state, ["images", _imageIdx3], _objectSpread({}, state.images[_imageIdx3], {
1325
1359
  lockedUntil: null,
1326
1360
  syncError: error
1327
1361
  }));
@@ -1337,35 +1371,35 @@ export default (function (state, action) {
1337
1371
 
1338
1372
  case "IMAGE_POLL_SUCCESS":
1339
1373
  {
1340
- var image = action.image;
1374
+ var _image2 = action.image;
1341
1375
 
1342
- var _imageIdx3 = state.images.findIndex(function (i) {
1343
- return i.id === image.id;
1376
+ var _imageIdx4 = state.images.findIndex(function (i) {
1377
+ return i.id === _image2.id;
1344
1378
  });
1345
1379
 
1346
- if (_imageIdx3 < 0) {
1347
- throw new Error("failed to find index of image with id ".concat(image.id));
1380
+ if (_imageIdx4 < 0) {
1381
+ throw new Error("failed to find index of image with id ".concat(_image2.id));
1348
1382
  }
1349
1383
 
1350
- return setIn(state, ["images", _imageIdx3], _objectSpread({}, state.images[_imageIdx3], {
1384
+ return setIn(state, ["images", _imageIdx4], _objectSpread({}, state.images[_imageIdx4], {
1351
1385
  lockedUntil: null,
1352
1386
  syncError: null
1353
- }, image));
1387
+ }, _image2));
1354
1388
  }
1355
1389
 
1356
1390
  case "IMAGE_POLL_TIMEOUT":
1357
1391
  {
1358
- var _imageId3 = action.imageId;
1392
+ var _imageId4 = action.imageId;
1359
1393
 
1360
- var _imageIdx4 = state.images.findIndex(function (i) {
1361
- return i.id === _imageId3;
1394
+ var _imageIdx5 = state.images.findIndex(function (i) {
1395
+ return i.id === _imageId4;
1362
1396
  });
1363
1397
 
1364
- if (_imageIdx4 < 0) {
1365
- throw new Error("failed to find index of image with id ".concat(_imageId3));
1398
+ if (_imageIdx5 < 0) {
1399
+ throw new Error("failed to find index of image with id ".concat(_imageId4));
1366
1400
  }
1367
1401
 
1368
- return setIn(state, ["images", _imageIdx4], _objectSpread({}, state.images[_imageIdx4], {
1402
+ return setIn(state, ["images", _imageIdx5], _objectSpread({}, state.images[_imageIdx5], {
1369
1403
  lockedUntil: null,
1370
1404
  syncError: new Error("polling timeout")
1371
1405
  }));
@@ -37,7 +37,9 @@ import regionsToBlocks from '../utils/regions-to-blocks';
37
37
  import PageSelector from "../PageSelector";
38
38
  import regionsGroups from '../utils/regions-groups';
39
39
  import RightSidebarItemsWrapper from './RightSidebarItemsWrapper';
40
- import Locker from '../Locker'; // import Fullscreen from "../Fullscreen"
40
+ import Locker from '../Locker';
41
+ import { reacalcActionsEnum } from "../utils/saveable-actions-enum";
42
+ import intersection from "lodash/intersection"; // import Fullscreen from "../Fullscreen"
41
43
 
42
44
  var emptyArr = [];
43
45
  var theme = createTheme();
@@ -85,7 +87,7 @@ var EditorWrapper = styled("div")(function (_ref4) {
85
87
  };
86
88
  });
87
89
  export var MainLayout = function MainLayout(_ref5) {
88
- var _state$images$state$s, _state$images$state$s2;
90
+ var _state$images$state$s, _state$images$state$s2, _state$images$state$s3;
89
91
 
90
92
  var state = _ref5.state,
91
93
  dispatch = _ref5.dispatch,
@@ -121,16 +123,13 @@ export var MainLayout = function MainLayout(_ref5) {
121
123
  showEditor = _ref5$showEditor === void 0 ? false : _ref5$showEditor,
122
124
  _ref5$showPageSelecto = _ref5.showPageSelector,
123
125
  showPageSelector = _ref5$showPageSelecto === void 0 ? false : _ref5$showPageSelecto,
124
- _ref5$onRecalc = _ref5.onRecalc,
125
- onRecalc = _ref5$onRecalc === void 0 ? function () {} : _ref5$onRecalc,
126
- _ref5$onSave = _ref5.onSave,
127
- onSave = _ref5$onSave === void 0 ? function () {} : _ref5$onSave,
128
126
  _ref5$recalcActive = _ref5.recalcActive,
129
127
  recalcActive = _ref5$recalcActive === void 0 ? false : _ref5$recalcActive,
130
128
  _ref5$saveActive = _ref5.saveActive,
131
129
  saveActive = _ref5$saveActive === void 0 ? false : _ref5$saveActive,
132
130
  onMetadataChange = _ref5.onMetadataChange,
133
- onAddGroup = _ref5.onAddGroup;
131
+ onAddGroup = _ref5.onAddGroup,
132
+ onRecalcClick = _ref5.onRecalcClick;
134
133
  var classes = useStyles();
135
134
  var settings = useSettings();
136
135
  var fullScreenHandle = useFullScreenHandle();
@@ -305,7 +304,8 @@ export var MainLayout = function MainLayout(_ref5) {
305
304
  })) === null || _i$metadata$find === void 0 ? void 0 : _i$metadata$find.value) || null,
306
305
  metadata: i.metadata || [],
307
306
  lockedUntil: i.lockedUntil,
308
- syncError: i.syncError || null
307
+ syncError: i.syncError || null,
308
+ isRecalcReady: intersection(reacalcActionsEnum, state.images[idx].saveableActions).length > 0
309
309
  };
310
310
  });
311
311
 
@@ -316,7 +316,7 @@ export var MainLayout = function MainLayout(_ref5) {
316
316
  });
317
317
  };
318
318
 
319
- var isSelectedImageLocked = false;
319
+ var isSelectedImageLocked = ((_state$images$state$s3 = state.images[state.selectedImage]) === null || _state$images$state$s3 === void 0 ? void 0 : _state$images$state$s3.lockedUntil) ? true : false;
320
320
  return React.createElement(ThemeProvider, {
321
321
  theme: theme
322
322
  }, React.createElement(FullScreenContainer, null, React.createElement(FullScreen, {
@@ -343,12 +343,9 @@ export var MainLayout = function MainLayout(_ref5) {
343
343
  }, showPageSelector && React.createElement(PageSelector, {
344
344
  pages: pages,
345
345
  onPageClick: handlePageClick,
346
- onRecalc: onRecalc,
347
- onSave: onSave,
348
- saveActive: saveActive,
349
- recalcActive: recalcActive,
350
346
  onMetadataChange: onMetadataChange,
351
- metadataConfigs: state.metadataConfigs || []
347
+ metadataConfigs: state.metadataConfigs || [],
348
+ onRecalcClick: onRecalcClick
352
349
  }), React.createElement(WorkspaceWrapper, null, React.createElement(Workspace, {
353
350
  style: {
354
351
  width: "auto"
@@ -14,11 +14,15 @@ function PageThumbnail(_ref) {
14
14
  metadata = _ref.metadata,
15
15
  showMetadata = _ref.showMetadata,
16
16
  imageIndex = _ref.imageIndex,
17
+ imageId = _ref.imageId,
17
18
  onMetadataChange = _ref.onMetadataChange,
18
19
  _ref$metadataConfigs = _ref.metadataConfigs,
19
20
  metadataConfigs = _ref$metadataConfigs === void 0 ? [] : _ref$metadataConfigs,
20
21
  isLocked = _ref.isLocked,
21
- error = _ref.error;
22
+ error = _ref.error,
23
+ onRecalcClick = _ref.onRecalcClick,
24
+ _ref$isRecalcReady = _ref.isRecalcReady,
25
+ isRecalcReady = _ref$isRecalcReady === void 0 ? false : _ref$isRecalcReady;
22
26
 
23
27
  var handleChange = function handleChange(e) {
24
28
  e.preventDefault();
@@ -32,6 +36,13 @@ function PageThumbnail(_ref) {
32
36
  });
33
37
  };
34
38
 
39
+ var handleRecalcClick = function handleRecalcClick(e) {
40
+ e.stopPropagation();
41
+ onRecalcClick({
42
+ imageId: imageId
43
+ });
44
+ };
45
+
35
46
  var pageNumber = metadata === null || metadata === void 0 ? void 0 : (_metadata$find = metadata.find) === null || _metadata$find === void 0 ? void 0 : (_metadata$find$call = _metadata$find.call(metadata, function (md) {
36
47
  return md.key === 'pageNumber';
37
48
  })) === null || _metadata$find$call === void 0 ? void 0 : _metadata$find$call.value;
@@ -47,7 +58,12 @@ function PageThumbnail(_ref) {
47
58
  errorMessage: error.message
48
59
  }), React.createElement("div", {
49
60
  className: "ps-page-thumbnail-image-wrapper"
50
- }, React.createElement("img", {
61
+ }, isRecalcReady && React.createElement("div", {
62
+ className: "ps-page-thumbnail-recalc-wrapper"
63
+ }, React.createElement("button", {
64
+ className: "recalc-button",
65
+ onClick: handleRecalcClick
66
+ }, "Extract")), React.createElement("img", {
51
67
  src: src,
52
68
  alt: "",
53
69
  className: "ps-page-thumbnail-image"
@@ -102,12 +118,9 @@ function isLocked(page) {
102
118
  function PageSelector(_ref3) {
103
119
  var pages = _ref3.pages,
104
120
  onPageClick = _ref3.onPageClick,
105
- onRecalc = _ref3.onRecalc,
106
- onSave = _ref3.onSave,
107
- recalcActive = _ref3.recalcActive,
108
- saveActive = _ref3.saveActive,
109
121
  onMetadataChange = _ref3.onMetadataChange,
110
- metadataConfigs = _ref3.metadataConfigs;
122
+ metadataConfigs = _ref3.metadataConfigs,
123
+ onRecalcClick = _ref3.onRecalcClick;
111
124
 
112
125
  var _useState = useState(false),
113
126
  _useState2 = _slicedToArray(_useState, 2),
@@ -120,15 +133,7 @@ function PageSelector(_ref3) {
120
133
  })
121
134
  }, React.createElement("div", {
122
135
  className: "top-buttons"
123
- }, React.createElement("button", {
124
- onClick: onRecalc,
125
- disabled: !recalcActive,
126
- className: "info"
127
- }, "Recalc"), React.createElement("button", {
128
- onClick: onSave,
129
- disabled: !saveActive,
130
- className: "success"
131
- }, "Save"), React.createElement("div", {
136
+ }, React.createElement("div", {
132
137
  className: "show-metadata-wrapper"
133
138
  }, React.createElement("label", {
134
139
  className: "switch mr-2"
@@ -158,16 +163,17 @@ function PageSelector(_ref3) {
158
163
  metadata: page.metadata,
159
164
  showMetadata: showMetadata,
160
165
  imageIndex: idx,
166
+ imageId: page.id,
161
167
  onMetadataChange: onMetadataChange,
162
- metadataConfigs: metadataConfigs
168
+ metadataConfigs: metadataConfigs,
169
+ onRecalcClick: onRecalcClick,
170
+ isRecalcReady: page.isRecalcReady
163
171
  });
164
172
  })));
165
173
  }
166
174
 
167
175
  PageSelector.defaultProps = {
168
176
  onPageClick: function onPageClick() {},
169
- onRecalc: function onRecalc() {},
170
- onSave: function onSave() {},
171
177
  recalcActive: false,
172
178
  saveActive: false,
173
179
  pageNumber: undefined
@@ -235,4 +235,30 @@ input:checked+.slider:before {
235
235
 
236
236
  .mr-2 {
237
237
  margin-right: 1rem;
238
+ }
239
+
240
+ .ps-page-thumbnail-recalc-wrapper {
241
+ width: 100%;
242
+ height: 100%;
243
+ background: linear-gradient(rgba(255, 255, 255, 0), #8898aa);
244
+ display: flex;
245
+ justify-content: center;
246
+ align-items: center;
247
+ }
248
+
249
+ .ps-page-thumbnail-recalc-wrapper>.recalc-button {
250
+ width: 80%;
251
+ height: 40%;
252
+ border: none;
253
+ background-image: linear-gradient(310deg, #377ceb, #a8b8d8);
254
+ color: white;
255
+ font-weight: 400;
256
+ border-radius: 8px !important;
257
+ transition: transform .2s;
258
+ }
259
+
260
+ .ps-page-thumbnail-recalc-wrapper>.recalc-button:hover {
261
+ cursor: pointer;
262
+ font-weight: 600;
263
+ transform: scale(1.15);
238
264
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@searpent/react-image-annotate",
3
- "version": "2.0.51",
3
+ "version": "2.0.53",
4
4
  "dependencies": {
5
5
  "@editorjs/editorjs": "^2.25.0",
6
6
  "@editorjs/paragraph": "^2.8.0",