contentoh-components-library 21.6.55 → 21.6.56

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.
Files changed (82) hide show
  1. package/.claude/launch.json +14 -0
  2. package/.env.test +1 -0
  3. package/dist/ai/prompts/attribute.prompt.js +28 -0
  4. package/dist/ai/prompts/description.prompt.js +33 -0
  5. package/dist/ai/schemas/attribute.schema.js +35 -0
  6. package/dist/ai/schemas/description.schema.js +27 -0
  7. package/dist/components/atoms/AssetPreview/AssetPreview.stories.js +118 -0
  8. package/dist/components/atoms/AssetPreview/index.js +150 -0
  9. package/dist/components/atoms/AssetPreview/styles.js +28 -0
  10. package/dist/components/atoms/IconFile/index.js +85 -2
  11. package/dist/components/atoms/IconFile/styles.js +1 -1
  12. package/dist/components/atoms/ProductImage/ProductImage.stories.js +70 -2
  13. package/dist/components/atoms/ProductImage/index.js +100 -27
  14. package/dist/components/atoms/ProductImage/styles.js +3 -1
  15. package/dist/components/molecules/EditionActiveImage/index.js +4 -2
  16. package/dist/components/molecules/GalleryAssetElement/GalleryAssetElement.stories.js +147 -0
  17. package/dist/components/molecules/GalleryAssetElement/index.js +178 -0
  18. package/dist/components/molecules/GalleryAssetElement/styles.js +26 -0
  19. package/dist/components/molecules/GalleryElement/index.js +13 -4
  20. package/dist/components/molecules/GalleryHeader/index.js +96 -24
  21. package/dist/components/molecules/GalleryHeader/styles.js +4 -1
  22. package/dist/components/molecules/GalleryTrayTabs/GalleryTrayTabs.stories.js +56 -0
  23. package/dist/components/molecules/GalleryTrayTabs/index.js +60 -0
  24. package/dist/components/molecules/GalleryTrayTabs/styles.js +20 -0
  25. package/dist/components/molecules/ImageSelector/index.js +1 -0
  26. package/dist/components/organisms/DigitalAssetsTray/DigitalAssetsTray.stories.js +171 -0
  27. package/dist/components/organisms/DigitalAssetsTray/index.js +211 -0
  28. package/dist/components/organisms/DigitalAssetsTray/styles.js +22 -0
  29. package/dist/components/organisms/ImagePreviewer/index.js +1 -0
  30. package/dist/components/organisms/ProductImageModal/index.js +3 -2
  31. package/dist/components/pages/RetailerProductEdition/context/provider-product-edition.context.js +330 -15
  32. package/dist/components/pages/RetailerProductEdition/context/provider-product-edition.reducer.js +12 -2
  33. package/dist/components/pages/RetailerProductEdition/index.js +606 -425
  34. package/dist/components/pages/RetailerProductEdition/stories/ImageEditor.stories.js +1 -0
  35. package/dist/global-files/data.js +16 -3
  36. package/dist/global-files/digital-assets/assetTypes.js +480 -0
  37. package/dist/global-files/digital-assets/assets.actions.js +64 -0
  38. package/dist/global-files/digital-assets/assets.adapter.js +304 -0
  39. package/dist/global-files/digital-assets/assets.mock.js +136 -0
  40. package/dist/global-files/digital-assets/assets.reducer.js +220 -0
  41. package/dist/global-files/digital-assets/uploadAssets.js +179 -0
  42. package/dist/global-files/digital-assets/useDigitalAssets.js +522 -0
  43. package/dist/index.js +142 -90
  44. package/docs/activos-digitales.md +273 -0
  45. package/package.json +1 -1
  46. package/src/components/atoms/AssetPreview/AssetPreview.stories.js +78 -0
  47. package/src/components/atoms/AssetPreview/index.js +119 -0
  48. package/src/components/atoms/AssetPreview/styles.js +190 -0
  49. package/src/components/atoms/IconFile/index.js +28 -1
  50. package/src/components/atoms/IconFile/styles.js +8 -0
  51. package/src/components/atoms/ProductImage/ProductImage.stories.js +38 -0
  52. package/src/components/atoms/ProductImage/index.js +95 -20
  53. package/src/components/atoms/ProductImage/styles.js +92 -7
  54. package/src/components/molecules/EditionActiveImage/index.js +2 -2
  55. package/src/components/molecules/GalleryAssetElement/GalleryAssetElement.stories.js +102 -0
  56. package/src/components/molecules/GalleryAssetElement/index.js +162 -0
  57. package/src/components/molecules/GalleryAssetElement/styles.js +159 -0
  58. package/src/components/molecules/GalleryElement/index.js +9 -0
  59. package/src/components/molecules/GalleryHeader/index.js +65 -13
  60. package/src/components/molecules/GalleryHeader/styles.js +2 -1
  61. package/src/components/molecules/GalleryTrayTabs/GalleryTrayTabs.stories.js +32 -0
  62. package/src/components/molecules/GalleryTrayTabs/index.js +41 -0
  63. package/src/components/molecules/GalleryTrayTabs/styles.js +52 -0
  64. package/src/components/molecules/ImageSelector/index.js +1 -0
  65. package/src/components/organisms/DigitalAssetsTray/DigitalAssetsTray.stories.js +101 -0
  66. package/src/components/organisms/DigitalAssetsTray/index.js +189 -0
  67. package/src/components/organisms/DigitalAssetsTray/styles.js +183 -0
  68. package/src/components/organisms/ImagePreviewer/index.js +1 -0
  69. package/src/components/organisms/ProductImageModal/index.js +1 -0
  70. package/src/components/pages/RetailerProductEdition/context/provider-product-edition.context.jsx +201 -0
  71. package/src/components/pages/RetailerProductEdition/context/provider-product-edition.reducer.js +12 -0
  72. package/src/components/pages/RetailerProductEdition/index.js +356 -139
  73. package/src/components/pages/RetailerProductEdition/stories/ImageEditor.stories.js +1 -0
  74. package/src/global-files/data.js +17 -2
  75. package/src/global-files/digital-assets/assetTypes.js +419 -0
  76. package/src/global-files/digital-assets/assets.actions.js +50 -0
  77. package/src/global-files/digital-assets/assets.adapter.js +229 -0
  78. package/src/global-files/digital-assets/assets.mock.js +122 -0
  79. package/src/global-files/digital-assets/assets.reducer.js +197 -0
  80. package/src/global-files/digital-assets/uploadAssets.js +109 -0
  81. package/src/global-files/digital-assets/useDigitalAssets.js +329 -0
  82. package/src/index.js +4 -0
@@ -19,10 +19,10 @@ var _objectSpread5 = _interopRequireDefault(require("@babel/runtime/helpers/esm/
19
19
 
20
20
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
21
21
 
22
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
23
-
24
22
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/asyncToGenerator"));
25
23
 
24
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
25
+
26
26
  var _react = require("react");
27
27
 
28
28
  var _axios = _interopRequireDefault(require("axios"));
@@ -41,6 +41,10 @@ var _data = require("../../../global-files/data");
41
41
 
42
42
  var _customHooks = require("../../../global-files/customHooks");
43
43
 
44
+ var _useDigitalAssets = require("../../../global-files/digital-assets/useDigitalAssets");
45
+
46
+ var _assets = require("../../../global-files/digital-assets/assets.reducer");
47
+
44
48
  var _GeneralButton = require("../../atoms/GeneralButton");
45
49
 
46
50
  var _GenericModal = require("../../atoms/GenericModal");
@@ -55,6 +59,8 @@ var _GalleryElement = require("../../molecules/GalleryElement");
55
59
 
56
60
  var _GalleryHeader = require("../../molecules/GalleryHeader");
57
61
 
62
+ var _GalleryTrayTabs = require("../../molecules/GalleryTrayTabs");
63
+
58
64
  var _HeaderTop = require("../../molecules/HeaderTop");
59
65
 
60
66
  var _index = require("../../molecules/TagAndInput/index");
@@ -65,6 +71,8 @@ var _FullTabsMenu = require("../../organisms/FullTabsMenu");
65
71
 
66
72
  var _ImageDataTable = require("../../organisms/ImageDataTable");
67
73
 
74
+ var _DigitalAssetsTray = require("../../organisms/DigitalAssetsTray");
75
+
68
76
  var _ImagePreviewer = require("../../organisms/ImagePreviewer");
69
77
 
70
78
  var _InputGroup = require("../../organisms/InputGroup");
@@ -132,118 +140,8 @@ function obtenerDuracionVideoBase64(base64Data) {
132
140
  });
133
141
  }
134
142
 
135
- function convertirVideoABase64(url) {
136
- return new Promise(function (resolve, reject) {
137
- var xhr = new XMLHttpRequest();
138
- xhr.open("GET", url, true);
139
- xhr.responseType = "blob";
140
-
141
- xhr.onload = function () {
142
- if (xhr.status === 200) {
143
- var blob = xhr.response;
144
- var reader = new FileReader();
145
-
146
- reader.onloadend = function () {
147
- resolve(reader.result);
148
- };
149
-
150
- reader.readAsDataURL(blob);
151
- } else {
152
- reject(new Error("Error al cargar el video"));
153
- }
154
- };
155
-
156
- xhr.onerror = function () {
157
- reject(new Error("Error de red al cargar el video"));
158
- };
159
-
160
- xhr.send();
161
- });
162
- } // Para videos ya guardados, `getImage` deja en `src` una URL del
163
- // redimensionador de imágenes que no sirve para mp4. Descargamos el video
164
- // desde S3 (srcDB) y generamos un thumbnail JPEG para mostrarlo en la galería.
165
-
166
-
167
- function regenerateVideoThumbnails(_x) {
168
- return _regenerateVideoThumbnails.apply(this, arguments);
169
- }
170
-
171
- function _regenerateVideoThumbnails() {
172
- _regenerateVideoThumbnails = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee21(values) {
173
- return _regenerator.default.wrap(function _callee21$(_context21) {
174
- while (1) {
175
- switch (_context21.prev = _context21.next) {
176
- case 0:
177
- if (Array.isArray(values)) {
178
- _context21.next = 2;
179
- break;
180
- }
181
-
182
- return _context21.abrupt("return", values);
183
-
184
- case 2:
185
- return _context21.abrupt("return", Promise.all(values.map( /*#__PURE__*/function () {
186
- var _ref25 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee20(value) {
187
- var base64, videoSrc, thumbnail;
188
- return _regenerator.default.wrap(function _callee20$(_context20) {
189
- while (1) {
190
- switch (_context20.prev = _context20.next) {
191
- case 0:
192
- if (!((value === null || value === void 0 ? void 0 : value.ext) !== "mp4" || !(value !== null && value !== void 0 && value.srcDB))) {
193
- _context20.next = 2;
194
- break;
195
- }
196
-
197
- return _context20.abrupt("return", value);
198
-
199
- case 2:
200
- _context20.prev = 2;
201
- _context20.next = 5;
202
- return convertirVideoABase64("https://" + process.env.REACT_APP_IMAGES_BUCKET + ".s3.amazonaws.com/" + value.srcDB);
203
-
204
- case 5:
205
- base64 = _context20.sent;
206
- videoSrc = "data:video/mp4;base64," + base64.split(",")[1];
207
- _context20.next = 9;
208
- return (0, _generateThumnail.default)(videoSrc, 2);
209
-
210
- case 9:
211
- thumbnail = _context20.sent;
212
- return _context20.abrupt("return", (0, _objectSpread5.default)((0, _objectSpread5.default)({}, value), {}, {
213
- src: thumbnail
214
- }));
215
-
216
- case 13:
217
- _context20.prev = 13;
218
- _context20.t0 = _context20["catch"](2);
219
- console.error("Error al generar thumbnail del video:", _context20.t0);
220
- return _context20.abrupt("return", value);
221
-
222
- case 17:
223
- case "end":
224
- return _context20.stop();
225
- }
226
- }
227
- }, _callee20, null, [[2, 13]]);
228
- }));
229
-
230
- return function (_x10) {
231
- return _ref25.apply(this, arguments);
232
- };
233
- }())));
234
-
235
- case 3:
236
- case "end":
237
- return _context21.stop();
238
- }
239
- }
240
- }, _callee21);
241
- }));
242
- return _regenerateVideoThumbnails.apply(this, arguments);
243
- }
244
-
245
143
  var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
246
- var _state$product10, _family$variants, _state$product11, _state$product15, _state$errors, _pendingPropagation$k, _family$variants2, _variantGroup$members3, _variantGroup$group, _state$product19, _state$product20, _state$product21, _state$active_retaile7, _state$product22, _state$product23, _state$product24, _variantGroup$group2, _location$state, _location$state2, _state$active_retaile8, _state$active_retaile9, _state$images_values$2, _state$images_values10, _state$images_values11, _state$product25, _state$active_retaile10, _family$variants3, _family$variants4, _variantGroup$members4, _variantGroup$members5, _state$active_percent, _state$active_percent2, _state$active_percent3, _state$active_retaile11, _state$active_retaile12, _state$active_retaile13, _state$product31, _state$services3, _state$services3$data, _state$product32, _state$product33, _state$datasheets_inp, _state$datasheets_inp2, _state$product34, _state$images_values12, _state$comment;
144
+ var _state$product$id_art, _state$product, _state$product11, _family$variants, _state$product12, _state$product16, _state$errors, _pendingPropagation$k, _family$variants2, _variantGroup$members3, _variantGroup$group, _state$product20, _state$product21, _state$product22, _state$active_retaile7, _state$product23, _state$product24, _state$product25, _variantGroup$group2, _location$state, _location$state2, _state$active_retaile8, _state$active_retaile9, _state$images_values$2, _state$images_values10, _state$images_values11, _state$images_values12, _state$images_values13, _state$product26, _state$active_retaile10, _family$variants3, _family$variants4, _variantGroup$members4, _variantGroup$members5, _state$active_percent, _state$active_percent2, _state$active_percent3, _state$active_retaile11, _state$active_retaile12, _state$active_retaile13, _state$product32, _state$services3, _state$services3$data, _state$product33, _state$product34, _state$datasheets_inp, _state$datasheets_inp2, _state$product35, _state$images_values$3, _state$images_values14, _state$images_values15, _state$images_values16, _state$images_values17, _state$comment;
247
145
 
248
146
  var tabsSections = _ref.tabsSections,
249
147
  _ref$productSelected = _ref.productSelected,
@@ -251,7 +149,9 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
251
149
  _ref$user = _ref.user,
252
150
  user = _ref$user === void 0 ? {} : _ref$user,
253
151
  token = _ref.token,
254
- location = _ref.location;
152
+ location = _ref.location,
153
+ _ref$enableDigitalAss = _ref.enableDigitalAssets,
154
+ enableDigitalAssets = _ref$enableDigitalAss === void 0 ? false : _ref$enableDigitalAss;
255
155
 
256
156
  var _useProviderProductEd = (0, _providerProductEdition.useProviderProductEdition)(),
257
157
  state = _useProviderProductEd.state,
@@ -260,6 +160,8 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
260
160
  saveDescriptions = _useProviderProductEd.saveDescriptions,
261
161
  updateImages = _useProviderProductEd.updateImages,
262
162
  deleteImages = _useProviderProductEd.deleteImages,
163
+ saveAssets = _useProviderProductEd.saveAssets,
164
+ registerUploadedAssets = _useProviderProductEd.registerUploadedAssets,
263
165
  handleOnDownloadImages = _useProviderProductEd.handleOnDownloadImages,
264
166
  createComment = _useProviderProductEd.createComment;
265
167
 
@@ -526,7 +428,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
526
428
  }, _callee, null, [[5, 18]]);
527
429
  }));
528
430
 
529
- return function (_x2) {
431
+ return function (_x) {
530
432
  return _ref2.apply(this, arguments);
531
433
  };
532
434
  }();
@@ -549,6 +451,66 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
549
451
  _useState54 = (0, _slicedToArray2.default)(_useState53, 2),
550
452
  openChangeStatusModal = _useState54[0],
551
453
  setOpenChangeStatusModal = _useState54[1];
454
+ /*
455
+ Bandeja de activos digitales. La lista vive en el reducer de la ficha
456
+ (`state.assets_values`), igual que las imágenes, para que el guardado del
457
+ contexto pueda leerla. El hook solo aporta validación y ciclo de vida.
458
+ Sigue vacía porque todavía no hay de dónde leerla: cuando exista el endpoint
459
+ se llama a `replaceAll` desde `loadData` y el resto de la pantalla no cambia.
460
+ */
461
+
462
+
463
+ var _useState55 = (0, _react.useState)([]),
464
+ _useState56 = (0, _slicedToArray2.default)(_useState55, 2),
465
+ assetNotices = _useState56[0],
466
+ setAssetNotices = _useState56[1];
467
+
468
+ var digitalAssets = (0, _useDigitalAssets.useDigitalAssets)({
469
+ assets: state.assets_values,
470
+ dispatch: dispatch,
471
+ notices: assetNotices,
472
+ setNotices: setAssetNotices,
473
+ // Con los dos, la subida a S3 arranca sola al soltar los archivos. Sin
474
+ // ellos —en Storybook, por ejemplo— la bandeja funciona igual pero no sube.
475
+ articleId: (_state$product$id_art = (_state$product = state.product) === null || _state$product === void 0 ? void 0 : _state$product.id_article) !== null && _state$product$id_art !== void 0 ? _state$product$id_art : null,
476
+ token: token,
477
+ // Al terminar la subida el activo queda registrado solo, sin esperar al
478
+ // botón de guardar: con la barra llena, nadie supone que falta un paso.
479
+ onUploaded: function onUploaded(uploaded) {
480
+ return registerUploadedAssets(token, uploaded);
481
+ }
482
+ });
483
+
484
+ var _useState57 = (0, _react.useState)(_GalleryTrayTabs.TRAYS.IMAGES),
485
+ _useState58 = (0, _slicedToArray2.default)(_useState57, 2),
486
+ activeTray = _useState58[0],
487
+ setActiveTray = _useState58[1];
488
+
489
+ var currentTray = enableDigitalAssets ? activeTray : _GalleryTrayTabs.TRAYS.IMAGES;
490
+ /*
491
+ De qué artículo se cargaron ya los activos.
492
+ `loadData` se vuelve a ejecutar cada vez que cambia la cadena activa, pero los
493
+ activos son generales: no dependen de la cadena ni de la versión, así que la
494
+ respuesta sería idéntica. Volver a cargarlos borraría los archivos que el
495
+ usuario acaba de soltar y todavía no guarda —sin aviso y sin forma de
496
+ recuperarlos—. Por eso se cargan una sola vez por artículo.
497
+ */
498
+
499
+ var assetsLoadedFor = (0, _react.useRef)(null);
500
+
501
+ var handleOnSetSelectedAssets = function handleOnSetSelectedAssets(assets) {
502
+ return dispatch({
503
+ type: "SET_SELECTED_ASSETS",
504
+ payload: assets
505
+ });
506
+ };
507
+
508
+ var handleOnSetAllAssetsChecked = function handleOnSetAllAssetsChecked(isChecked) {
509
+ return dispatch({
510
+ type: "TOGGLE_CHECK_ALL_ASSETS",
511
+ payload: isChecked
512
+ });
513
+ };
552
514
 
553
515
  var thumbs = function thumbs() {
554
516
  var _state$images_values, _state$images_values$, _state$images_values4, _state$images_values5, _state$images_values6, _state$images_values7, _state$images_values8, _state$images_values9;
@@ -603,6 +565,9 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
603
565
  },
604
566
  updateApprovedInputsImages: function updateApprovedInputsImages(item) {
605
567
  return console.log("updateApprovedInputsImages", item);
568
+ },
569
+ onSelect: function onSelect() {
570
+ return handleOnChangeCurrentImage(index);
606
571
  }
607
572
  }, index);
608
573
  });
@@ -719,7 +684,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
719
684
 
720
685
  var loadAuditableData = /*#__PURE__*/function () {
721
686
  var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
722
- var _state$product, _state$product2, _state$product3;
687
+ var _state$product2, _state$product3, _state$product4;
723
688
 
724
689
  var auditServices;
725
690
  return _regenerator.default.wrap(function _callee3$(_context3) {
@@ -727,7 +692,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
727
692
  switch (_context3.prev = _context3.next) {
728
693
  case 0:
729
694
  _context3.next = 2;
730
- return (0, _data.getRetailerServices)((_state$product = state.product) === null || _state$product === void 0 ? void 0 : _state$product.id_article, (_state$product2 = state.product) === null || _state$product2 === void 0 ? void 0 : _state$product2.categoryName, parseInt((_state$product3 = state.product) === null || _state$product3 === void 0 ? void 0 : _state$product3.id_category), auditableVersion.version, token);
695
+ return (0, _data.getRetailerServices)((_state$product2 = state.product) === null || _state$product2 === void 0 ? void 0 : _state$product2.id_article, (_state$product3 = state.product) === null || _state$product3 === void 0 ? void 0 : _state$product3.categoryName, parseInt((_state$product4 = state.product) === null || _state$product4 === void 0 ? void 0 : _state$product4.id_category), auditableVersion.version, token);
731
696
 
732
697
  case 2:
733
698
  auditServices = _context3.sent;
@@ -771,7 +736,9 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
771
736
  _services$,
772
737
  _retailerDatasheets$d,
773
738
  _state$active_retaile2,
774
- _state$product4,
739
+ _services$0$inputs,
740
+ _services$2,
741
+ _state$product5,
775
742
  id_article,
776
743
  version,
777
744
  id_order,
@@ -800,8 +767,6 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
800
767
  descriptionsActiveRetailer,
801
768
  activeRetailerId,
802
769
  filteredValues,
803
- orderedValuesWithThumbs,
804
- filteredValuesWithThumbs,
805
770
  _args4 = arguments;
806
771
 
807
772
  return _regenerator.default.wrap(function _callee4$(_context4) {
@@ -819,7 +784,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
819
784
  type: "SET_ERRORS",
820
785
  payload: []
821
786
  });
822
- _state$product4 = state.product, id_article = _state$product4.id_article, version = _state$product4.version, id_order = _state$product4.id_order;
787
+ _state$product5 = state.product, id_article = _state$product5.id_article, version = _state$product5.version, id_order = _state$product5.id_order;
823
788
  _state$active_retaile = state.active_retailer, category = _state$active_retaile.category, id_category = _state$active_retaile.id_category, id_retailer = _state$active_retaile.id_retailer; // Payloads y headers
824
789
 
825
790
  data = [{
@@ -959,26 +924,15 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
959
924
  return Number(input.id_retailer) === Number(activeRetailerId) && Number(input.id_image) === Number(value.image_id);
960
925
  });
961
926
  });
962
- }); // Regenerar thumbnails de videos guardados para que se muestren.
963
-
964
- _context4.next = 35;
965
- return regenerateVideoThumbnails(orderedValues);
966
-
967
- case 35:
968
- orderedValuesWithThumbs = _context4.sent;
969
- _context4.next = 38;
970
- return regenerateVideoThumbnails(filteredValues);
927
+ }); // Dispatch consolidado
971
928
 
972
- case 38:
973
- filteredValuesWithThumbs = _context4.sent;
974
- // Dispatch consolidado
975
929
  dispatch({
976
930
  type: "SET_SERVICES",
977
931
  payload: {
978
932
  datasheets: services[0],
979
933
  descriptions: services[1],
980
934
  images: (0, _objectSpread5.default)((0, _objectSpread5.default)({}, services[2]), {}, {
981
- values: orderedValuesWithThumbs
935
+ values: orderedValues
982
936
  })
983
937
  }
984
938
  });
@@ -1000,7 +954,12 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1000
954
 
1001
955
  dispatch({
1002
956
  type: "SET_DATASHEETS_INPUTS",
1003
- payload: [datasheetsActiveRetailer, services[0].inputs]
957
+ // `services[0]?` por lo mismo que el fallback de arriba: la lectura de
958
+ // fichas puede volver sin datos para esa cadena y categoría. Arriba ya
959
+ // se contemplaba; aquí no, y como este dispatch va ANTES de
960
+ // SET_IMAGES_VALUES, reventar aquí dejaba la ficha cargando para
961
+ // siempre — con las imágenes ya traídas y sin pintar.
962
+ payload: [datasheetsActiveRetailer, (_services$0$inputs = (_services$2 = services[0]) === null || _services$2 === void 0 ? void 0 : _services$2.inputs) !== null && _services$0$inputs !== void 0 ? _services$0$inputs : {}]
1004
963
  });
1005
964
  dispatch({
1006
965
  type: "SET_DESCRIPTIONS_INPUTS",
@@ -1009,9 +968,20 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1009
968
  dispatch({
1010
969
  type: "SET_IMAGES_VALUES",
1011
970
  payload: (0, _objectSpread5.default)((0, _objectSpread5.default)({}, services[2]), {}, {
1012
- values: filteredValuesWithThumbs
971
+ values: filteredValues
1013
972
  })
1014
- }); // Calcular campos requeridos sin valor
973
+ });
974
+ /*
975
+ Activos digitales. `services[2].assets` todavía no existe en la
976
+ respuesta del backend: hasta que exista, esto no hace nada, y el día que
977
+ llegue la bandeja se llena sola sin tocar nada más.
978
+ */
979
+
980
+ if (Array.isArray(services[2].assets) && assetsLoadedFor.current !== id_article) {
981
+ assetsLoadedFor.current = id_article;
982
+ digitalAssets.replaceAll(services[2].assets);
983
+ } // Calcular campos requeridos sin valor
984
+
1015
985
 
1016
986
  dispatch({
1017
987
  type: "SET_MISSING_REQUIRED_FIELDS",
@@ -1022,11 +992,11 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1022
992
  loadAuditableData();
1023
993
  }
1024
994
 
1025
- _context4.next = 54;
995
+ _context4.next = 49;
1026
996
  break;
1027
997
 
1028
- case 50:
1029
- _context4.prev = 50;
998
+ case 45:
999
+ _context4.prev = 45;
1030
1000
  _context4.t0 = _context4["catch"](2);
1031
1001
  console.log("Error loading data: ", _context4.t0);
1032
1002
  dispatch({
@@ -1034,20 +1004,20 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1034
1004
  payload: [_context4.t0.message]
1035
1005
  });
1036
1006
 
1037
- case 54:
1038
- _context4.prev = 54;
1007
+ case 49:
1008
+ _context4.prev = 49;
1039
1009
  dispatch({
1040
1010
  type: "SET_LOADING",
1041
1011
  payload: false
1042
1012
  });
1043
- return _context4.finish(54);
1013
+ return _context4.finish(49);
1044
1014
 
1045
- case 57:
1015
+ case 52:
1046
1016
  case "end":
1047
1017
  return _context4.stop();
1048
1018
  }
1049
1019
  }
1050
- }, _callee4, null, [[2, 50, 54, 57]]);
1020
+ }, _callee4, null, [[2, 45, 49, 52]]);
1051
1021
  }));
1052
1022
 
1053
1023
  return function loadData() {
@@ -1110,9 +1080,9 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1110
1080
  };
1111
1081
 
1112
1082
  var isAuditorAssigned = function isAuditorAssigned() {
1113
- var _state$product5;
1083
+ var _state$product6;
1114
1084
 
1115
- return ((_state$product5 = state.product) === null || _state$product5 === void 0 ? void 0 : _state$product5.id_auditor) === (user === null || user === void 0 ? void 0 : user.id_user);
1085
+ return ((_state$product6 = state.product) === null || _state$product6 === void 0 ? void 0 : _state$product6.id_auditor) === (user === null || user === void 0 ? void 0 : user.id_user);
1116
1086
  };
1117
1087
  /**
1118
1088
  * ¿Ocupo este slot EN ESTE producto?
@@ -1125,9 +1095,9 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1125
1095
 
1126
1096
 
1127
1097
  var isAssignedAs = function isAssignedAs(rol, concept) {
1128
- var _state$product6;
1098
+ var _state$product7;
1129
1099
 
1130
- var assigned = (_state$product6 = state.product) === null || _state$product6 === void 0 ? void 0 : _state$product6["id_".concat(concept, "_").concat(rol)];
1100
+ var assigned = (_state$product7 = state.product) === null || _state$product7 === void 0 ? void 0 : _state$product7["id_".concat(concept, "_").concat(rol)];
1131
1101
  return !!assigned && assigned === (user === null || user === void 0 ? void 0 : user.id_user);
1132
1102
  };
1133
1103
 
@@ -1203,28 +1173,42 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1203
1173
  })[0]) === null || _statusByRetailer$fil === void 0 ? void 0 : _statusByRetailer$fil.status) || "-";
1204
1174
  return currentStatus;
1205
1175
  };
1176
+ /*
1177
+ Guarda los activos y recarga si algo se escribió.
1178
+ La recarga no es opcional: un activo recién creado sigue en memoria con su
1179
+ id temporal y sin el id de la base. Sin volver a leer, el siguiente guardado
1180
+ lo mandaría otra vez como nuevo y se duplicaría. Poner el ref en `null` es
1181
+ lo que permite que `loadData` lo vuelva a traer —normalmente los activos se
1182
+ cargan una sola vez por artículo—.
1183
+ */
1206
1184
 
1207
- var handleOnClickSaveImages = /*#__PURE__*/function () {
1208
- var _ref9 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {
1209
- var _state$product7, _state$product7$servi;
1210
1185
 
1186
+ var handleOnSaveAssets = /*#__PURE__*/function () {
1187
+ var _ref9 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5() {
1188
+ var guardado;
1211
1189
  return _regenerator.default.wrap(function _callee5$(_context5) {
1212
1190
  while (1) {
1213
1191
  switch (_context5.prev = _context5.next) {
1214
1192
  case 0:
1215
- if (!(((_state$product7 = state.product) === null || _state$product7 === void 0 ? void 0 : (_state$product7$servi = _state$product7.services) === null || _state$product7$servi === void 0 ? void 0 : _state$product7$servi.images) === 1)) {
1193
+ _context5.next = 2;
1194
+ return saveAssets(token);
1195
+
1196
+ case 2:
1197
+ guardado = _context5.sent;
1198
+
1199
+ if (guardado) {
1216
1200
  _context5.next = 5;
1217
1201
  break;
1218
1202
  }
1219
1203
 
1220
- _context5.next = 3;
1221
- return updateImages(token);
1204
+ return _context5.abrupt("return");
1222
1205
 
1223
- case 3:
1224
- _context5.next = 5;
1206
+ case 5:
1207
+ assetsLoadedFor.current = null;
1208
+ _context5.next = 8;
1225
1209
  return loadData(false);
1226
1210
 
1227
- case 5:
1211
+ case 8:
1228
1212
  case "end":
1229
1213
  return _context5.stop();
1230
1214
  }
@@ -1232,10 +1216,55 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1232
1216
  }, _callee5);
1233
1217
  }));
1234
1218
 
1235
- return function handleOnClickSaveImages() {
1219
+ return function handleOnSaveAssets() {
1236
1220
  return _ref9.apply(this, arguments);
1237
1221
  };
1238
1222
  }();
1223
+
1224
+ var handleOnClickSaveImages = /*#__PURE__*/function () {
1225
+ var _ref10 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6() {
1226
+ var _state$product8, _state$product8$servi;
1227
+
1228
+ return _regenerator.default.wrap(function _callee6$(_context6) {
1229
+ while (1) {
1230
+ switch (_context6.prev = _context6.next) {
1231
+ case 0:
1232
+ if (!(currentTray === _GalleryTrayTabs.TRAYS.ASSETS)) {
1233
+ _context6.next = 4;
1234
+ break;
1235
+ }
1236
+
1237
+ _context6.next = 3;
1238
+ return handleOnSaveAssets();
1239
+
1240
+ case 3:
1241
+ return _context6.abrupt("return");
1242
+
1243
+ case 4:
1244
+ if (!(((_state$product8 = state.product) === null || _state$product8 === void 0 ? void 0 : (_state$product8$servi = _state$product8.services) === null || _state$product8$servi === void 0 ? void 0 : _state$product8$servi.images) === 1)) {
1245
+ _context6.next = 9;
1246
+ break;
1247
+ }
1248
+
1249
+ _context6.next = 7;
1250
+ return updateImages(token);
1251
+
1252
+ case 7:
1253
+ _context6.next = 9;
1254
+ return loadData(false);
1255
+
1256
+ case 9:
1257
+ case "end":
1258
+ return _context6.stop();
1259
+ }
1260
+ }
1261
+ }, _callee6);
1262
+ }));
1263
+
1264
+ return function handleOnClickSaveImages() {
1265
+ return _ref10.apply(this, arguments);
1266
+ };
1267
+ }();
1239
1268
  /*
1240
1269
  Trae la familia: los hijos del producto, o sus hermanos si el abierto es
1241
1270
  una de ellas. Se pide al abrir la sección y no al montar la pantalla: la
@@ -1244,31 +1273,31 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1244
1273
 
1245
1274
 
1246
1275
  var loadFamily = /*#__PURE__*/function () {
1247
- var _ref10 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6() {
1276
+ var _ref11 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7() {
1248
1277
  var forzar,
1249
- _state$product8,
1278
+ _state$product9,
1250
1279
  res,
1251
1280
  data,
1252
- _args6 = arguments;
1281
+ _args7 = arguments;
1253
1282
 
1254
- return _regenerator.default.wrap(function _callee6$(_context6) {
1283
+ return _regenerator.default.wrap(function _callee7$(_context7) {
1255
1284
  while (1) {
1256
- switch (_context6.prev = _context6.next) {
1285
+ switch (_context7.prev = _context7.next) {
1257
1286
  case 0:
1258
- forzar = _args6.length > 0 && _args6[0] !== undefined ? _args6[0] : false;
1287
+ forzar = _args7.length > 0 && _args7[0] !== undefined ? _args7[0] : false;
1259
1288
 
1260
1289
  if (!(family && !forzar)) {
1261
- _context6.next = 3;
1290
+ _context7.next = 3;
1262
1291
  break;
1263
1292
  }
1264
1293
 
1265
- return _context6.abrupt("return", family);
1294
+ return _context7.abrupt("return", family);
1266
1295
 
1267
1296
  case 3:
1268
- _context6.prev = 3;
1269
- _context6.next = 6;
1297
+ _context7.prev = 3;
1298
+ _context7.next = 6;
1270
1299
  return _axios.default.post("".concat(process.env.REACT_APP_VARIANTS_ENDPOINT, "/family"), {
1271
- articleId: (_state$product8 = state.product) === null || _state$product8 === void 0 ? void 0 : _state$product8.id_article
1300
+ articleId: (_state$product9 = state.product) === null || _state$product9 === void 0 ? void 0 : _state$product9.id_article
1272
1301
  }, {
1273
1302
  headers: {
1274
1303
  Authorization: token
@@ -1276,32 +1305,32 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1276
1305
  });
1277
1306
 
1278
1307
  case 6:
1279
- res = _context6.sent;
1308
+ res = _context7.sent;
1280
1309
  data = (0, _api.readPayload)(res);
1281
1310
  setFamily(data);
1282
- return _context6.abrupt("return", data);
1311
+ return _context7.abrupt("return", data);
1283
1312
 
1284
1313
  case 12:
1285
- _context6.prev = 12;
1286
- _context6.t0 = _context6["catch"](3);
1287
- console.error("loadFamily: ", _context6.t0);
1314
+ _context7.prev = 12;
1315
+ _context7.t0 = _context7["catch"](3);
1316
+ console.error("loadFamily: ", _context7.t0);
1288
1317
  setFamily({
1289
1318
  variants: [],
1290
1319
  parent: null,
1291
1320
  error: true
1292
1321
  });
1293
- return _context6.abrupt("return", null);
1322
+ return _context7.abrupt("return", null);
1294
1323
 
1295
1324
  case 17:
1296
1325
  case "end":
1297
- return _context6.stop();
1326
+ return _context7.stop();
1298
1327
  }
1299
1328
  }
1300
- }, _callee6, null, [[3, 12]]);
1329
+ }, _callee7, null, [[3, 12]]);
1301
1330
  }));
1302
1331
 
1303
1332
  return function loadFamily() {
1304
- return _ref10.apply(this, arguments);
1333
+ return _ref11.apply(this, arguments);
1305
1334
  };
1306
1335
  }();
1307
1336
  /*
@@ -1318,16 +1347,16 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1318
1347
 
1319
1348
 
1320
1349
  (0, _react.useEffect)(function () {
1321
- var _state$product9;
1350
+ var _state$product10;
1322
1351
 
1323
- if (!((_state$product9 = state.product) !== null && _state$product9 !== void 0 && _state$product9.id_article)) return;
1352
+ if (!((_state$product10 = state.product) !== null && _state$product10 !== void 0 && _state$product10.id_article)) return;
1324
1353
  loadFamily(true); // eslint-disable-next-line react-hooks/exhaustive-deps
1325
- }, [(_state$product10 = state.product) === null || _state$product10 === void 0 ? void 0 : _state$product10.id_article]); // El conteo sale de la familia recién consultada, no del producto.
1354
+ }, [(_state$product11 = state.product) === null || _state$product11 === void 0 ? void 0 : _state$product11.id_article]); // El conteo sale de la familia recién consultada, no del producto.
1326
1355
 
1327
1356
  var hijosDelProducto = family !== null && family !== void 0 && family.error ? 0 : ((_family$variants = family === null || family === void 0 ? void 0 : family.variants) !== null && _family$variants !== void 0 ? _family$variants : []).filter(function (v) {
1328
1357
  return !v.isCurrent;
1329
1358
  }).length;
1330
- var esHijoDeOtro = family !== null && family !== void 0 && family.error ? !!((_state$product11 = state.product) !== null && _state$product11 !== void 0 && _state$product11.parentArticleId) : !!(family !== null && family !== void 0 && family.parent);
1359
+ var esHijoDeOtro = family !== null && family !== void 0 && family.error ? !!((_state$product12 = state.product) !== null && _state$product12 !== void 0 && _state$product12.parentArticleId) : !!(family !== null && family !== void 0 && family.parent);
1331
1360
  /*
1332
1361
  Un hijo no se agrupa como variante (decisión de producto, 2026-09-25).
1333
1362
  Agrupar declara «estos son el mismo producto en otra presentación», y un
@@ -1369,14 +1398,14 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1369
1398
  */
1370
1399
 
1371
1400
  var handleOnUnlinked = function handleOnUnlinked(result) {
1372
- var _state$product$varian, _state$product12, _updatedProduct$varia;
1401
+ var _state$product$varian, _state$product13, _updatedProduct$varia;
1373
1402
 
1374
1403
  if (!result) return;
1375
1404
  var updatedProduct = result.mode === "self" ? (0, _objectSpread5.default)((0, _objectSpread5.default)({}, state.product), {}, {
1376
1405
  parentArticleId: null,
1377
1406
  variantsCount: 0
1378
1407
  }) : (0, _objectSpread5.default)((0, _objectSpread5.default)({}, state.product), {}, {
1379
- variantsCount: Math.max(((_state$product$varian = (_state$product12 = state.product) === null || _state$product12 === void 0 ? void 0 : _state$product12.variantsCount) !== null && _state$product$varian !== void 0 ? _state$product$varian : 1) - 1, 0)
1408
+ variantsCount: Math.max(((_state$product$varian = (_state$product13 = state.product) === null || _state$product13 === void 0 ? void 0 : _state$product13.variantsCount) !== null && _state$product$varian !== void 0 ? _state$product$varian : 1) - 1, 0)
1380
1409
  });
1381
1410
  dispatch({
1382
1411
  type: "SET_PRODUCT",
@@ -1428,31 +1457,31 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1428
1457
 
1429
1458
 
1430
1459
  var loadVariantGroup = /*#__PURE__*/function () {
1431
- var _ref11 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7() {
1460
+ var _ref12 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8() {
1432
1461
  var forzar,
1433
- _state$product13,
1462
+ _state$product14,
1434
1463
  res,
1435
1464
  data,
1436
- _args7 = arguments;
1465
+ _args8 = arguments;
1437
1466
 
1438
- return _regenerator.default.wrap(function _callee7$(_context7) {
1467
+ return _regenerator.default.wrap(function _callee8$(_context8) {
1439
1468
  while (1) {
1440
- switch (_context7.prev = _context7.next) {
1469
+ switch (_context8.prev = _context8.next) {
1441
1470
  case 0:
1442
- forzar = _args7.length > 0 && _args7[0] !== undefined ? _args7[0] : false;
1471
+ forzar = _args8.length > 0 && _args8[0] !== undefined ? _args8[0] : false;
1443
1472
 
1444
1473
  if (!(variantGroup && !forzar)) {
1445
- _context7.next = 3;
1474
+ _context8.next = 3;
1446
1475
  break;
1447
1476
  }
1448
1477
 
1449
- return _context7.abrupt("return", variantGroup);
1478
+ return _context8.abrupt("return", variantGroup);
1450
1479
 
1451
1480
  case 3:
1452
- _context7.prev = 3;
1453
- _context7.next = 6;
1481
+ _context8.prev = 3;
1482
+ _context8.next = 6;
1454
1483
  return _axios.default.post("".concat(process.env.REACT_APP_VARIANTS_ENDPOINT, "/group"), {
1455
- articleId: (_state$product13 = state.product) === null || _state$product13 === void 0 ? void 0 : _state$product13.id_article
1484
+ articleId: (_state$product14 = state.product) === null || _state$product14 === void 0 ? void 0 : _state$product14.id_article
1456
1485
  }, {
1457
1486
  headers: {
1458
1487
  Authorization: token
@@ -1460,54 +1489,54 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1460
1489
  });
1461
1490
 
1462
1491
  case 6:
1463
- res = _context7.sent;
1492
+ res = _context8.sent;
1464
1493
  data = (0, _api.readPayload)(res);
1465
1494
  setVariantGroup(data);
1466
- return _context7.abrupt("return", data);
1495
+ return _context8.abrupt("return", data);
1467
1496
 
1468
1497
  case 12:
1469
- _context7.prev = 12;
1470
- _context7.t0 = _context7["catch"](3);
1471
- console.error("loadVariantGroup: ", _context7.t0);
1498
+ _context8.prev = 12;
1499
+ _context8.t0 = _context8["catch"](3);
1500
+ console.error("loadVariantGroup: ", _context8.t0);
1472
1501
  setVariantGroup({
1473
1502
  group: null,
1474
1503
  members: [],
1475
1504
  error: true
1476
1505
  });
1477
- return _context7.abrupt("return", null);
1506
+ return _context8.abrupt("return", null);
1478
1507
 
1479
1508
  case 17:
1480
1509
  case "end":
1481
- return _context7.stop();
1510
+ return _context8.stop();
1482
1511
  }
1483
1512
  }
1484
- }, _callee7, null, [[3, 12]]);
1513
+ }, _callee8, null, [[3, 12]]);
1485
1514
  }));
1486
1515
 
1487
1516
  return function loadVariantGroup() {
1488
- return _ref11.apply(this, arguments);
1517
+ return _ref12.apply(this, arguments);
1489
1518
  };
1490
1519
  }();
1491
1520
 
1492
1521
  (0, _react.useEffect)(function () {
1493
- var _state$product14;
1522
+ var _state$product15;
1494
1523
 
1495
- if (!((_state$product14 = state.product) !== null && _state$product14 !== void 0 && _state$product14.id_article)) return;
1524
+ if (!((_state$product15 = state.product) !== null && _state$product15 !== void 0 && _state$product15.id_article)) return;
1496
1525
  loadVariantGroup(true); // eslint-disable-next-line react-hooks/exhaustive-deps
1497
- }, [(_state$product15 = state.product) === null || _state$product15 === void 0 ? void 0 : _state$product15.id_article]);
1526
+ }, [(_state$product16 = state.product) === null || _state$product16 === void 0 ? void 0 : _state$product16.id_article]);
1498
1527
 
1499
1528
  var handleOnLeaveGroup = /*#__PURE__*/function () {
1500
- var _ref12 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8() {
1501
- var _state$product16, res;
1529
+ var _ref13 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9() {
1530
+ var _state$product17, res;
1502
1531
 
1503
- return _regenerator.default.wrap(function _callee8$(_context8) {
1532
+ return _regenerator.default.wrap(function _callee9$(_context9) {
1504
1533
  while (1) {
1505
- switch (_context8.prev = _context8.next) {
1534
+ switch (_context9.prev = _context9.next) {
1506
1535
  case 0:
1507
- _context8.prev = 0;
1508
- _context8.next = 3;
1536
+ _context9.prev = 0;
1537
+ _context9.next = 3;
1509
1538
  return _axios.default.post("".concat(process.env.REACT_APP_VARIANTS_ENDPOINT, "/leave"), {
1510
- articleId: (_state$product16 = state.product) === null || _state$product16 === void 0 ? void 0 : _state$product16.id_article
1539
+ articleId: (_state$product17 = state.product) === null || _state$product17 === void 0 ? void 0 : _state$product17.id_article
1511
1540
  }, {
1512
1541
  headers: {
1513
1542
  Authorization: token
@@ -1515,16 +1544,16 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1515
1544
  });
1516
1545
 
1517
1546
  case 3:
1518
- res = _context8.sent;
1547
+ res = _context9.sent;
1519
1548
  setVariantGroup((0, _api.readPayload)(res));
1520
1549
  setShowGroup(false);
1521
- _context8.next = 12;
1550
+ _context9.next = 12;
1522
1551
  break;
1523
1552
 
1524
1553
  case 8:
1525
- _context8.prev = 8;
1526
- _context8.t0 = _context8["catch"](0);
1527
- console.error("leaveVariantGroup: ", _context8.t0);
1554
+ _context9.prev = 8;
1555
+ _context9.t0 = _context9["catch"](0);
1556
+ console.error("leaveVariantGroup: ", _context9.t0);
1528
1557
  dispatch({
1529
1558
  type: "SET_MODAL",
1530
1559
  payload: {
@@ -1549,29 +1578,29 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1549
1578
 
1550
1579
  case 12:
1551
1580
  case "end":
1552
- return _context8.stop();
1581
+ return _context9.stop();
1553
1582
  }
1554
1583
  }
1555
- }, _callee8, null, [[0, 8]]);
1584
+ }, _callee9, null, [[0, 8]]);
1556
1585
  }));
1557
1586
 
1558
1587
  return function handleOnLeaveGroup() {
1559
- return _ref12.apply(this, arguments);
1588
+ return _ref13.apply(this, arguments);
1560
1589
  };
1561
1590
  }();
1562
1591
 
1563
1592
  var openFamilyMember = /*#__PURE__*/function () {
1564
- var _ref13 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9(articleId) {
1565
- var _readPayload, res, _ref14, data, encontrado;
1593
+ var _ref14 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10(articleId) {
1594
+ var _readPayload, res, _ref15, data, encontrado;
1566
1595
 
1567
- return _regenerator.default.wrap(function _callee9$(_context9) {
1596
+ return _regenerator.default.wrap(function _callee10$(_context10) {
1568
1597
  while (1) {
1569
- switch (_context9.prev = _context9.next) {
1598
+ switch (_context10.prev = _context10.next) {
1570
1599
  case 0:
1571
1600
  setLoadingVariant(articleId);
1572
1601
  setAvisoFamilia(null);
1573
- _context9.prev = 2;
1574
- _context9.next = 5;
1602
+ _context10.prev = 2;
1603
+ _context10.next = 5;
1575
1604
  return _axios.default.get("".concat(process.env.REACT_APP_ORDERED_SERVICES_ENDPOINT), {
1576
1605
  params: {
1577
1606
  filterByIdArticle: articleId,
@@ -1583,11 +1612,11 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1583
1612
  });
1584
1613
 
1585
1614
  case 5:
1586
- res = _context9.sent;
1615
+ res = _context10.sent;
1587
1616
  // read-order-services responde { total, data: [...] }. La vista trae una
1588
1617
  // fila por orden, así que puede haber varias del mismo artículo; llegan
1589
1618
  // ordenadas por order_id DESC y la primera es la orden más reciente.
1590
- _ref14 = (_readPayload = (0, _api.readPayload)(res)) !== null && _readPayload !== void 0 ? _readPayload : {}, data = _ref14.data;
1619
+ _ref15 = (_readPayload = (0, _api.readPayload)(res)) !== null && _readPayload !== void 0 ? _readPayload : {}, data = _ref15.data;
1591
1620
  encontrado = (data !== null && data !== void 0 ? data : []).find(function (item) {
1592
1621
  var _item$article;
1593
1622
 
@@ -1595,12 +1624,12 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1595
1624
  });
1596
1625
 
1597
1626
  if (encontrado) {
1598
- _context9.next = 11;
1627
+ _context10.next = 11;
1599
1628
  break;
1600
1629
  }
1601
1630
 
1602
1631
  setAvisoFamilia("Ese producto no está en ninguna orden de trabajo, así que no se puede abrir desde aquí.");
1603
- return _context9.abrupt("return");
1632
+ return _context10.abrupt("return");
1604
1633
 
1605
1634
  case 11:
1606
1635
  sessionStorage.setItem("productSelected", JSON.stringify(encontrado));
@@ -1611,30 +1640,30 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1611
1640
  product: [encontrado]
1612
1641
  }));
1613
1642
  window.location.assign("/EditProducts");
1614
- _context9.next = 21;
1643
+ _context10.next = 21;
1615
1644
  break;
1616
1645
 
1617
1646
  case 17:
1618
- _context9.prev = 17;
1619
- _context9.t0 = _context9["catch"](2);
1620
- console.error("openFamilyMember: ", _context9.t0);
1647
+ _context10.prev = 17;
1648
+ _context10.t0 = _context10["catch"](2);
1649
+ console.error("openFamilyMember: ", _context10.t0);
1621
1650
  setAvisoFamilia("No se pudo abrir ese producto. Intenta de nuevo.");
1622
1651
 
1623
1652
  case 21:
1624
- _context9.prev = 21;
1653
+ _context10.prev = 21;
1625
1654
  setLoadingVariant(null);
1626
- return _context9.finish(21);
1655
+ return _context10.finish(21);
1627
1656
 
1628
1657
  case 24:
1629
1658
  case "end":
1630
- return _context9.stop();
1659
+ return _context10.stop();
1631
1660
  }
1632
1661
  }
1633
- }, _callee9, null, [[2, 17, 21, 24]]);
1662
+ }, _callee10, null, [[2, 17, 21, 24]]);
1634
1663
  }));
1635
1664
 
1636
- return function openFamilyMember(_x3) {
1637
- return _ref13.apply(this, arguments);
1665
+ return function openFamilyMember(_x2) {
1666
+ return _ref14.apply(this, arguments);
1638
1667
  };
1639
1668
  }();
1640
1669
  /*
@@ -1645,11 +1674,11 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1645
1674
 
1646
1675
 
1647
1676
  var handleOnLinkedVariants = function handleOnLinkedVariants(result) {
1648
- var _state$product$varian2, _state$product17, _result$linked, _result$parentArticle;
1677
+ var _state$product$varian2, _state$product18, _result$linked, _result$parentArticle;
1649
1678
 
1650
1679
  if (!result) return;
1651
1680
  var updatedProduct = result.mode === "children" ? (0, _objectSpread5.default)((0, _objectSpread5.default)({}, state.product), {}, {
1652
- variantsCount: ((_state$product$varian2 = (_state$product17 = state.product) === null || _state$product17 === void 0 ? void 0 : _state$product17.variantsCount) !== null && _state$product$varian2 !== void 0 ? _state$product$varian2 : 0) + ((_result$linked = result.linked) !== null && _result$linked !== void 0 ? _result$linked : []).length
1681
+ variantsCount: ((_state$product$varian2 = (_state$product18 = state.product) === null || _state$product18 === void 0 ? void 0 : _state$product18.variantsCount) !== null && _state$product$varian2 !== void 0 ? _state$product$varian2 : 0) + ((_result$linked = result.linked) !== null && _result$linked !== void 0 ? _result$linked : []).length
1653
1682
  }) : (0, _objectSpread5.default)((0, _objectSpread5.default)({}, state.product), {}, {
1654
1683
  parentArticleId: (_result$parentArticle = result.parentArticleId) !== null && _result$parentArticle !== void 0 ? _result$parentArticle : null,
1655
1684
  variantsCount: 0
@@ -1723,31 +1752,31 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1723
1752
 
1724
1753
 
1725
1754
  var handleOnRestoreInheritance = /*#__PURE__*/function () {
1726
- var _ref15 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10(attributeId) {
1727
- var _state$product18;
1755
+ var _ref16 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee11(attributeId) {
1756
+ var _state$product19;
1728
1757
 
1729
1758
  var kind,
1730
1759
  esDescripcion,
1731
1760
  res,
1732
1761
  data,
1733
- _args10 = arguments;
1734
- return _regenerator.default.wrap(function _callee10$(_context10) {
1762
+ _args11 = arguments;
1763
+ return _regenerator.default.wrap(function _callee11$(_context11) {
1735
1764
  while (1) {
1736
- switch (_context10.prev = _context10.next) {
1765
+ switch (_context11.prev = _context11.next) {
1737
1766
  case 0:
1738
- kind = _args10.length > 1 && _args10[1] !== undefined ? _args10[1] : "attribute";
1767
+ kind = _args11.length > 1 && _args11[1] !== undefined ? _args11[1] : "attribute";
1739
1768
 
1740
- if (!(!attributeId || !((_state$product18 = state.product) !== null && _state$product18 !== void 0 && _state$product18.id_article))) {
1741
- _context10.next = 3;
1769
+ if (!(!attributeId || !((_state$product19 = state.product) !== null && _state$product19 !== void 0 && _state$product19.id_article))) {
1770
+ _context11.next = 3;
1742
1771
  break;
1743
1772
  }
1744
1773
 
1745
- return _context10.abrupt("return");
1774
+ return _context11.abrupt("return");
1746
1775
 
1747
1776
  case 3:
1748
1777
  esDescripcion = kind === "description";
1749
- _context10.prev = 4;
1750
- _context10.next = 7;
1778
+ _context11.prev = 4;
1779
+ _context11.next = 7;
1751
1780
  return _axios.default.post("".concat(process.env.REACT_APP_VARIANTS_ENDPOINT, "/restore"), (0, _objectSpread5.default)({
1752
1781
  articleId: state.product.id_article
1753
1782
  }, esDescripcion ? {
@@ -1761,11 +1790,11 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1761
1790
  });
1762
1791
 
1763
1792
  case 7:
1764
- res = _context10.sent;
1793
+ res = _context11.sent;
1765
1794
  data = (0, _api.readPayload)(res);
1766
1795
 
1767
1796
  if (!esDescripcion) {
1768
- _context10.next = 12;
1797
+ _context11.next = 12;
1769
1798
  break;
1770
1799
  }
1771
1800
 
@@ -1779,7 +1808,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1779
1808
  };
1780
1809
  })
1781
1810
  });
1782
- return _context10.abrupt("return");
1811
+ return _context11.abrupt("return");
1783
1812
 
1784
1813
  case 12:
1785
1814
  dispatch({
@@ -1792,24 +1821,24 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1792
1821
  };
1793
1822
  })
1794
1823
  });
1795
- _context10.next = 18;
1824
+ _context11.next = 18;
1796
1825
  break;
1797
1826
 
1798
1827
  case 15:
1799
- _context10.prev = 15;
1800
- _context10.t0 = _context10["catch"](4);
1801
- console.error("restoreInheritance: ", _context10.t0);
1828
+ _context11.prev = 15;
1829
+ _context11.t0 = _context11["catch"](4);
1830
+ console.error("restoreInheritance: ", _context11.t0);
1802
1831
 
1803
1832
  case 18:
1804
1833
  case "end":
1805
- return _context10.stop();
1834
+ return _context11.stop();
1806
1835
  }
1807
1836
  }
1808
- }, _callee10, null, [[4, 15]]);
1837
+ }, _callee11, null, [[4, 15]]);
1809
1838
  }));
1810
1839
 
1811
- return function handleOnRestoreInheritance(_x4) {
1812
- return _ref15.apply(this, arguments);
1840
+ return function handleOnRestoreInheritance(_x3) {
1841
+ return _ref16.apply(this, arguments);
1813
1842
  };
1814
1843
  }();
1815
1844
  /*
@@ -1868,23 +1897,23 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1868
1897
  };
1869
1898
 
1870
1899
  var handleOnClickSave = /*#__PURE__*/function () {
1871
- var _ref16 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee11() {
1900
+ var _ref17 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee12() {
1872
1901
  var _variantGroup$members, _familiaDesc$variants, _familiaDesc, cambiosDesc, companerasDesc, familiaDesc, hijosDesc, _familia, _familia$variants, _variantGroup$members2, cambios, familia, esHijo, hijos, companeras;
1873
1902
 
1874
- return _regenerator.default.wrap(function _callee11$(_context11) {
1903
+ return _regenerator.default.wrap(function _callee12$(_context12) {
1875
1904
  while (1) {
1876
- switch (_context11.prev = _context11.next) {
1905
+ switch (_context12.prev = _context12.next) {
1877
1906
  case 0:
1878
1907
  if (!(state.saving || preparandoPropagacion)) {
1879
- _context11.next = 2;
1908
+ _context12.next = 2;
1880
1909
  break;
1881
1910
  }
1882
1911
 
1883
- return _context11.abrupt("return");
1912
+ return _context12.abrupt("return");
1884
1913
 
1885
1914
  case 2:
1886
- _context11.t0 = state.active_tab;
1887
- _context11.next = _context11.t0 === "Descripción" ? 5 : _context11.t0 === "Ficha técnica" ? 27 : _context11.t0 === "Imágenes" ? 53 : 56;
1915
+ _context12.t0 = state.active_tab;
1916
+ _context12.next = _context12.t0 === "Descripción" ? 5 : _context12.t0 === "Ficha técnica" ? 27 : _context12.t0 === "Imágenes" ? 53 : 60;
1888
1917
  break;
1889
1918
 
1890
1919
  case 5:
@@ -1900,30 +1929,30 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1900
1929
  });
1901
1930
 
1902
1931
  if (!(esHijoDeOtro || cambiosDesc.length === 0)) {
1903
- _context11.next = 11;
1932
+ _context12.next = 11;
1904
1933
  break;
1905
1934
  }
1906
1935
 
1907
- _context11.next = 10;
1936
+ _context12.next = 10;
1908
1937
  return saveDescriptions(token);
1909
1938
 
1910
1939
  case 10:
1911
- return _context11.abrupt("break", 57);
1940
+ return _context12.abrupt("break", 61);
1912
1941
 
1913
1942
  case 11:
1914
1943
  setPreparandoPropagacion(true);
1915
1944
  familiaDesc = null;
1916
- _context11.prev = 13;
1917
- _context11.next = 16;
1945
+ _context12.prev = 13;
1946
+ _context12.next = 16;
1918
1947
  return loadFamily(true);
1919
1948
 
1920
1949
  case 16:
1921
- familiaDesc = _context11.sent;
1950
+ familiaDesc = _context12.sent;
1922
1951
 
1923
1952
  case 17:
1924
- _context11.prev = 17;
1953
+ _context12.prev = 17;
1925
1954
  setPreparandoPropagacion(false);
1926
- return _context11.finish(17);
1955
+ return _context12.finish(17);
1927
1956
 
1928
1957
  case 20:
1929
1958
  hijosDesc = ((_familiaDesc$variants = (_familiaDesc = familiaDesc) === null || _familiaDesc === void 0 ? void 0 : _familiaDesc.variants) !== null && _familiaDesc$variants !== void 0 ? _familiaDesc$variants : []).filter(function (v) {
@@ -1931,7 +1960,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1931
1960
  });
1932
1961
 
1933
1962
  if (!(hijosDesc.length > 0 || companerasDesc.length > 0)) {
1934
- _context11.next = 24;
1963
+ _context12.next = 24;
1935
1964
  break;
1936
1965
  }
1937
1966
 
@@ -1939,28 +1968,28 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1939
1968
  cambios: cambiosDesc,
1940
1969
  kind: "description"
1941
1970
  });
1942
- return _context11.abrupt("return");
1971
+ return _context12.abrupt("return");
1943
1972
 
1944
1973
  case 24:
1945
- _context11.next = 26;
1974
+ _context12.next = 26;
1946
1975
  return saveDescriptions(token);
1947
1976
 
1948
1977
  case 26:
1949
- return _context11.abrupt("break", 57);
1978
+ return _context12.abrupt("break", 61);
1950
1979
 
1951
1980
  case 27:
1952
1981
  cambios = cambiosDeFichaTecnica();
1953
1982
 
1954
1983
  if (!(cambios.length === 0)) {
1955
- _context11.next = 32;
1984
+ _context12.next = 32;
1956
1985
  break;
1957
1986
  }
1958
1987
 
1959
- _context11.next = 31;
1988
+ _context12.next = 31;
1960
1989
  return saveDatasheets(token);
1961
1990
 
1962
1991
  case 31:
1963
- return _context11.abrupt("break", 57);
1992
+ return _context12.abrupt("break", 61);
1964
1993
 
1965
1994
  case 32:
1966
1995
  /*
@@ -1979,21 +2008,21 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
1979
2008
  */
1980
2009
  setPreparandoPropagacion(true);
1981
2010
  familia = null;
1982
- _context11.prev = 34;
1983
- _context11.next = 37;
2011
+ _context12.prev = 34;
2012
+ _context12.next = 37;
1984
2013
  return loadFamily(true);
1985
2014
 
1986
2015
  case 37:
1987
- familia = _context11.sent;
2016
+ familia = _context12.sent;
1988
2017
 
1989
2018
  case 38:
1990
- _context11.prev = 38;
2019
+ _context12.prev = 38;
1991
2020
  setPreparandoPropagacion(false);
1992
- return _context11.finish(38);
2021
+ return _context12.finish(38);
1993
2022
 
1994
2023
  case 41:
1995
2024
  if (!(!familia || familia.error)) {
1996
- _context11.next = 44;
2025
+ _context12.next = 44;
1997
2026
  break;
1998
2027
  }
1999
2028
 
@@ -2030,7 +2059,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2030
2059
  }]
2031
2060
  }
2032
2061
  });
2033
- return _context11.abrupt("return");
2062
+ return _context12.abrupt("return");
2034
2063
 
2035
2064
  case 44:
2036
2065
  /*
@@ -2058,7 +2087,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2058
2087
  // él no queda ningún destino posible.
2059
2088
 
2060
2089
  if (!(!esHijo && (hijos.length > 0 || companeras.length > 0))) {
2061
- _context11.next = 50;
2090
+ _context12.next = 50;
2062
2091
  break;
2063
2092
  }
2064
2093
 
@@ -2066,39 +2095,51 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2066
2095
  cambios: cambios,
2067
2096
  kind: "datasheet"
2068
2097
  });
2069
- return _context11.abrupt("return");
2098
+ return _context12.abrupt("return");
2070
2099
 
2071
2100
  case 50:
2072
- _context11.next = 52;
2101
+ _context12.next = 52;
2073
2102
  return saveDatasheets(token);
2074
2103
 
2075
2104
  case 52:
2076
- return _context11.abrupt("break", 57);
2105
+ return _context12.abrupt("break", 61);
2077
2106
 
2078
2107
  case 53:
2079
- _context11.next = 55;
2080
- return updateImages(token);
2108
+ if (!(currentTray === _GalleryTrayTabs.TRAYS.ASSETS)) {
2109
+ _context12.next = 57;
2110
+ break;
2111
+ }
2081
2112
 
2082
- case 55:
2083
- return _context11.abrupt("break", 57);
2113
+ _context12.next = 56;
2114
+ return handleOnSaveAssets();
2084
2115
 
2085
2116
  case 56:
2086
- return _context11.abrupt("break", 57);
2117
+ return _context12.abrupt("return");
2087
2118
 
2088
2119
  case 57:
2089
- _context11.next = 59;
2090
- return loadData(false);
2120
+ _context12.next = 59;
2121
+ return updateImages(token);
2091
2122
 
2092
2123
  case 59:
2124
+ return _context12.abrupt("break", 61);
2125
+
2126
+ case 60:
2127
+ return _context12.abrupt("break", 61);
2128
+
2129
+ case 61:
2130
+ _context12.next = 63;
2131
+ return loadData(false);
2132
+
2133
+ case 63:
2093
2134
  case "end":
2094
- return _context11.stop();
2135
+ return _context12.stop();
2095
2136
  }
2096
2137
  }
2097
- }, _callee11, null, [[13,, 17, 20], [34,, 38, 41]]);
2138
+ }, _callee12, null, [[13,, 17, 20], [34,, 38, 41]]);
2098
2139
  }));
2099
2140
 
2100
2141
  return function handleOnClickSave() {
2101
- return _ref16.apply(this, arguments);
2142
+ return _ref17.apply(this, arguments);
2102
2143
  };
2103
2144
  }();
2104
2145
 
@@ -2115,8 +2156,106 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2115
2156
  payload: items
2116
2157
  });
2117
2158
  };
2159
+ /*
2160
+ Descarga de activos: los seleccionados, o todos si no hay selección — el
2161
+ mismo criterio que usa la descarga de imágenes.
2162
+ Solo se descarga lo que ya está en S3. Un activo recién soltado vive como
2163
+ referencia al archivo del disco del usuario: "descargarlo" le devolvería el
2164
+ archivo que él mismo acaba de elegir, lo cual no tiene sentido.
2165
+ */
2166
+
2167
+
2168
+ var handleOnDownloadAssets = function handleOnDownloadAssets() {
2169
+ var seleccion = state.selected_assets.length ? state.selected_assets : state.assets_values;
2170
+ var descargables = seleccion.filter(function (asset) {
2171
+ return asset.id && asset.url;
2172
+ });
2173
+
2174
+ if (descargables.length === 0) {
2175
+ dispatch({
2176
+ type: "SET_MODAL",
2177
+ payload: {
2178
+ show: true,
2179
+ title: "Nada que descargar",
2180
+ message: "Los activos seleccionados todavía no se han guardado. Guárdalos primero.",
2181
+ image: _genericModalWarning.default
2182
+ }
2183
+ });
2184
+ return;
2185
+ }
2186
+
2187
+ descargables.forEach(function (asset) {
2188
+ return (0, _fileSaver.saveAs)(asset.url, asset.name);
2189
+ });
2190
+ };
2191
+ /*
2192
+ Borrado en lote de activos.
2193
+ A diferencia de las imágenes, que se borran contra el backend en el momento,
2194
+ los activos se quitan de la bandeja y su baja viaja en el mismo PUT del
2195
+ guardado (`deleteAssets`). Es lo que permite al usuario deshacerse de un
2196
+ borrado por error: basta con no guardar. El mensaje lo dice, para que nadie
2197
+ se quede pensando que ya se aplicó.
2198
+ */
2199
+
2200
+
2201
+ var handleOnAskToDeleteAssets = function handleOnAskToDeleteAssets() {
2202
+ if (state.selected_assets.length === 0) {
2203
+ dispatch({
2204
+ type: "SET_MODAL",
2205
+ payload: {
2206
+ show: true,
2207
+ title: "Eliminar activos digitales",
2208
+ message: "No has seleccionado ningún activo para eliminar.",
2209
+ image: _genericModalWarning.default
2210
+ }
2211
+ });
2212
+ return;
2213
+ }
2214
+
2215
+ var seleccionados = state.selected_assets;
2216
+ dispatch({
2217
+ type: "SET_MODAL",
2218
+ payload: {
2219
+ show: true,
2220
+ title: "Eliminar activos digitales",
2221
+ message: "Se quitar\xE1n ".concat(seleccionados.length, " activo(s) de la bandeja. El borrado se aplica al guardar."),
2222
+ image: _genericModalWarning.default,
2223
+ buttons: [{
2224
+ text: "Cancelar",
2225
+ buttonType: "general-white-button",
2226
+ action: function action() {
2227
+ return dispatch({
2228
+ type: "SET_MODAL",
2229
+ payload: {
2230
+ show: false
2231
+ }
2232
+ });
2233
+ }
2234
+ }, {
2235
+ text: "Eliminar",
2236
+ buttonType: "general-button-default",
2237
+ action: function action() {
2238
+ dispatch({
2239
+ type: "SET_MODAL",
2240
+ payload: {
2241
+ show: false
2242
+ }
2243
+ });
2244
+ seleccionados.forEach(function (asset) {
2245
+ return digitalAssets.removeAsset(asset);
2246
+ });
2247
+ }
2248
+ }]
2249
+ }
2250
+ });
2251
+ };
2118
2252
 
2119
2253
  var handleOnAskToDeleteImages = function handleOnAskToDeleteImages() {
2254
+ if (currentTray === _GalleryTrayTabs.TRAYS.ASSETS) {
2255
+ handleOnAskToDeleteAssets();
2256
+ return;
2257
+ }
2258
+
2120
2259
  if (state.selected_images.length === 0) {
2121
2260
  dispatch({
2122
2261
  type: "SET_MODAL",
@@ -2166,24 +2305,24 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2166
2305
  };
2167
2306
 
2168
2307
  var handleOnApproveSingleService = /*#__PURE__*/function () {
2169
- var _ref17 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee12() {
2170
- return _regenerator.default.wrap(function _callee12$(_context12) {
2308
+ var _ref18 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee13() {
2309
+ return _regenerator.default.wrap(function _callee13$(_context13) {
2171
2310
  while (1) {
2172
- switch (_context12.prev = _context12.next) {
2311
+ switch (_context13.prev = _context13.next) {
2173
2312
  case 0:
2174
- _context12.next = 2;
2313
+ _context13.next = 2;
2175
2314
  return sendSingleEvaluation("A");
2176
2315
 
2177
2316
  case 2:
2178
2317
  case "end":
2179
- return _context12.stop();
2318
+ return _context13.stop();
2180
2319
  }
2181
2320
  }
2182
- }, _callee12);
2321
+ }, _callee13);
2183
2322
  }));
2184
2323
 
2185
2324
  return function handleOnApproveSingleService() {
2186
- return _ref17.apply(this, arguments);
2325
+ return _ref18.apply(this, arguments);
2187
2326
  };
2188
2327
  }();
2189
2328
 
@@ -2192,21 +2331,21 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2192
2331
  };
2193
2332
 
2194
2333
  var sendSingleEvaluation = /*#__PURE__*/function () {
2195
- var _ref18 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee13(result) {
2334
+ var _ref19 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee14(result) {
2196
2335
  var _state$product$id_ord, _state$active_retaile6;
2197
2336
 
2198
2337
  var concept, articleId, orderId, sectionStatusKey, evalStatus, retailerId, data, res, message, icon, activeTab, newStatuses, serviceStatus, articleStatus, updatedStatusByRetailer, updatedProduct, specialistDone, _objectSpread2, _state$services_data2, _JSON$parse2, newStatus, newOrderStatus, newArticleStatus, _articleStatus, updatedStatusByRetailerForSend, _updatedProduct, updatedServicesData, sessionProduct, _objectSpread3, productInSession, updatedProductInSession;
2199
2338
 
2200
- return _regenerator.default.wrap(function _callee13$(_context13) {
2339
+ return _regenerator.default.wrap(function _callee14$(_context14) {
2201
2340
  while (1) {
2202
- switch (_context13.prev = _context13.next) {
2341
+ switch (_context14.prev = _context14.next) {
2203
2342
  case 0:
2204
2343
  if (!state.saving) {
2205
- _context13.next = 2;
2344
+ _context14.next = 2;
2206
2345
  break;
2207
2346
  }
2208
2347
 
2209
- return _context13.abrupt("return");
2348
+ return _context14.abrupt("return");
2210
2349
 
2211
2350
  case 2:
2212
2351
  dispatch({
@@ -2227,16 +2366,16 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2227
2366
  retailerId: retailerId
2228
2367
  };
2229
2368
  activeTab = state.active_tab;
2230
- _context13.prev = 11;
2369
+ _context14.prev = 11;
2231
2370
 
2232
2371
  if (!result) {
2233
- _context13.next = 28;
2372
+ _context14.next = 28;
2234
2373
  break;
2235
2374
  }
2236
2375
 
2237
2376
  data.result = result;
2238
2377
  data.retailerId = retailerId;
2239
- _context13.next = 17;
2378
+ _context14.next = 17;
2240
2379
  return _axios.default.put("".concat(process.env.REACT_APP_EVALUATION_ENDPOINT), data, {
2241
2380
  headers: {
2242
2381
  Authorization: token
@@ -2244,7 +2383,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2244
2383
  });
2245
2384
 
2246
2385
  case 17:
2247
- res = _context13.sent;
2386
+ res = _context14.sent;
2248
2387
  newStatuses = JSON.parse(res.data.body);
2249
2388
  serviceStatus = newStatuses.newServiceStatus[articleId]["".concat(concept, "Status")];
2250
2389
  articleStatus = newStatuses.newArticleStatus[articleId];
@@ -2275,7 +2414,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2275
2414
  image: _genericModalCheck.default
2276
2415
  }
2277
2416
  });
2278
- _context13.next = 33;
2417
+ _context14.next = 33;
2279
2418
  break;
2280
2419
 
2281
2420
  case 28:
@@ -2291,7 +2430,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2291
2430
  icon = _genericModalCheck.default;
2292
2431
  }
2293
2432
 
2294
- _context13.next = 32;
2433
+ _context14.next = 32;
2295
2434
  return _axios.default.put("".concat(process.env.REACT_APP_SEND_EVAL), data, {
2296
2435
  headers: {
2297
2436
  Authorization: token
@@ -2299,7 +2438,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2299
2438
  });
2300
2439
 
2301
2440
  case 32:
2302
- res = _context13.sent;
2441
+ res = _context14.sent;
2303
2442
 
2304
2443
  case 33:
2305
2444
  if (res.data.statusCode === 200) {
@@ -2384,13 +2523,13 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2384
2523
  });
2385
2524
  }
2386
2525
 
2387
- _context13.next = 40;
2526
+ _context14.next = 40;
2388
2527
  break;
2389
2528
 
2390
2529
  case 36:
2391
- _context13.prev = 36;
2392
- _context13.t0 = _context13["catch"](11);
2393
- console.error("Error sending evaluation:", _context13.t0);
2530
+ _context14.prev = 36;
2531
+ _context14.t0 = _context14["catch"](11);
2532
+ console.error("Error sending evaluation:", _context14.t0);
2394
2533
  dispatch({
2395
2534
  type: "SET_MODAL",
2396
2535
  payload: {
@@ -2402,45 +2541,45 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2402
2541
  });
2403
2542
 
2404
2543
  case 40:
2405
- _context13.prev = 40;
2544
+ _context14.prev = 40;
2406
2545
  dispatch({
2407
2546
  type: "SET_SAVING",
2408
2547
  payload: false
2409
2548
  });
2410
- return _context13.finish(40);
2549
+ return _context14.finish(40);
2411
2550
 
2412
2551
  case 43:
2413
2552
  case "end":
2414
- return _context13.stop();
2553
+ return _context14.stop();
2415
2554
  }
2416
2555
  }
2417
- }, _callee13, null, [[11, 36, 40, 43]]);
2556
+ }, _callee14, null, [[11, 36, 40, 43]]);
2418
2557
  }));
2419
2558
 
2420
- return function sendSingleEvaluation(_x5) {
2421
- return _ref18.apply(this, arguments);
2559
+ return function sendSingleEvaluation(_x4) {
2560
+ return _ref19.apply(this, arguments);
2422
2561
  };
2423
2562
  }();
2424
2563
 
2425
2564
  var handleOnApproveAllServices = /*#__PURE__*/function () {
2426
- var _ref19 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee14() {
2427
- return _regenerator.default.wrap(function _callee14$(_context14) {
2565
+ var _ref20 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee15() {
2566
+ return _regenerator.default.wrap(function _callee15$(_context15) {
2428
2567
  while (1) {
2429
- switch (_context14.prev = _context14.next) {
2568
+ switch (_context15.prev = _context15.next) {
2430
2569
  case 0:
2431
- _context14.next = 2;
2570
+ _context15.next = 2;
2432
2571
  return sendBulkEvaluation("A");
2433
2572
 
2434
2573
  case 2:
2435
2574
  case "end":
2436
- return _context14.stop();
2575
+ return _context15.stop();
2437
2576
  }
2438
2577
  }
2439
- }, _callee14);
2578
+ }, _callee15);
2440
2579
  }));
2441
2580
 
2442
2581
  return function handleOnApproveAllServices() {
2443
- return _ref19.apply(this, arguments);
2582
+ return _ref20.apply(this, arguments);
2444
2583
  };
2445
2584
  }();
2446
2585
 
@@ -2450,18 +2589,18 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2450
2589
  };
2451
2590
 
2452
2591
  var sendBulkEvaluation = /*#__PURE__*/function () {
2453
- var _ref20 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee15(result) {
2592
+ var _ref21 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee16(result) {
2454
2593
  var _state$services_data3, evaluationArray, conceptArray, status, updatedStatusByRetailer, updatedProduct, updatedServicesData;
2455
2594
 
2456
- return _regenerator.default.wrap(function _callee15$(_context15) {
2595
+ return _regenerator.default.wrap(function _callee16$(_context16) {
2457
2596
  while (1) {
2458
- switch (_context15.prev = _context15.next) {
2597
+ switch (_context16.prev = _context16.next) {
2459
2598
  case 0:
2460
2599
  dispatch({
2461
2600
  type: "SET_SAVING",
2462
2601
  payload: true
2463
2602
  });
2464
- _context15.prev = 1;
2603
+ _context16.prev = 1;
2465
2604
  evaluationArray = [];
2466
2605
  conceptArray = (0, _utils.getConceptsByRole)(user.id_role);
2467
2606
  (_state$services_data3 = state.services_data) === null || _state$services_data3 === void 0 ? void 0 : _state$services_data3.forEach(function (ret, idx) {
@@ -2486,12 +2625,12 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2486
2625
  }));
2487
2626
  }
2488
2627
  });
2489
- _context15.next = 7;
2628
+ _context16.next = 7;
2490
2629
  return Promise.all(evaluationArray);
2491
2630
 
2492
2631
  case 7:
2493
2632
  if (!(evaluationArray.length === 0)) {
2494
- _context15.next = 10;
2633
+ _context16.next = 10;
2495
2634
  break;
2496
2635
  }
2497
2636
 
@@ -2504,7 +2643,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2504
2643
  image: _errorModal.default
2505
2644
  }
2506
2645
  });
2507
- return _context15.abrupt("return");
2646
+ return _context16.abrupt("return");
2508
2647
 
2509
2648
  case 10:
2510
2649
  status = "".concat(result, "A"); // Actualizar el statusByRetailer para todos los retailers y conceptos
@@ -2558,41 +2697,41 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2558
2697
  image: _genericModalCheck.default
2559
2698
  }
2560
2699
  });
2561
- _context15.next = 22;
2700
+ _context16.next = 22;
2562
2701
  break;
2563
2702
 
2564
2703
  case 19:
2565
- _context15.prev = 19;
2566
- _context15.t0 = _context15["catch"](1);
2567
- console.error("Error in bulk evaluation:", _context15.t0);
2704
+ _context16.prev = 19;
2705
+ _context16.t0 = _context16["catch"](1);
2706
+ console.error("Error in bulk evaluation:", _context16.t0);
2568
2707
 
2569
2708
  case 22:
2570
- _context15.prev = 22;
2709
+ _context16.prev = 22;
2571
2710
  dispatch({
2572
2711
  type: "SET_SAVING",
2573
2712
  payload: false
2574
2713
  });
2575
- return _context15.finish(22);
2714
+ return _context16.finish(22);
2576
2715
 
2577
2716
  case 25:
2578
2717
  case "end":
2579
- return _context15.stop();
2718
+ return _context16.stop();
2580
2719
  }
2581
2720
  }
2582
- }, _callee15, null, [[1, 19, 22, 25]]);
2721
+ }, _callee16, null, [[1, 19, 22, 25]]);
2583
2722
  }));
2584
2723
 
2585
- return function sendBulkEvaluation(_x6) {
2586
- return _ref20.apply(this, arguments);
2724
+ return function sendBulkEvaluation(_x5) {
2725
+ return _ref21.apply(this, arguments);
2587
2726
  };
2588
2727
  }();
2589
2728
 
2590
2729
  var handleOnChangeAssignations = /*#__PURE__*/function () {
2591
- var _ref21 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee16(assignationType, assignationId) {
2730
+ var _ref22 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee17(assignationType, assignationId) {
2592
2731
  var concept, data, updatedProduct;
2593
- return _regenerator.default.wrap(function _callee16$(_context16) {
2732
+ return _regenerator.default.wrap(function _callee17$(_context17) {
2594
2733
  while (1) {
2595
- switch (_context16.prev = _context16.next) {
2734
+ switch (_context17.prev = _context17.next) {
2596
2735
  case 0:
2597
2736
  concept = (0, _utils.getConceptByTab)(state.active_tab);
2598
2737
  data = {
@@ -2603,7 +2742,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2603
2742
  concept: concept,
2604
2743
  userId: assignationId
2605
2744
  };
2606
- _context16.next = 4;
2745
+ _context17.next = 4;
2607
2746
  return (0, _axios.default)({
2608
2747
  method: "post",
2609
2748
  url: process.env.REACT_APP_ASSIGNATIONS_ENDPOINT,
@@ -2622,14 +2761,14 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2622
2761
 
2623
2762
  case 6:
2624
2763
  case "end":
2625
- return _context16.stop();
2764
+ return _context17.stop();
2626
2765
  }
2627
2766
  }
2628
- }, _callee16);
2767
+ }, _callee17);
2629
2768
  }));
2630
2769
 
2631
- return function handleOnChangeAssignations(_x7, _x8) {
2632
- return _ref21.apply(this, arguments);
2770
+ return function handleOnChangeAssignations(_x6, _x7) {
2771
+ return _ref22.apply(this, arguments);
2633
2772
  };
2634
2773
  }();
2635
2774
 
@@ -2664,16 +2803,16 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2664
2803
  };
2665
2804
 
2666
2805
  var handleOnSubmitComment = /*#__PURE__*/function () {
2667
- var _ref22 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee17(e) {
2806
+ var _ref23 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee18(e) {
2668
2807
  var commentText;
2669
- return _regenerator.default.wrap(function _callee17$(_context17) {
2808
+ return _regenerator.default.wrap(function _callee18$(_context18) {
2670
2809
  while (1) {
2671
- switch (_context17.prev = _context17.next) {
2810
+ switch (_context18.prev = _context18.next) {
2672
2811
  case 0:
2673
2812
  e.preventDefault();
2674
2813
  commentText = document.querySelector("#commentary-box .ql-container .ql-editor > p").innerHTML;
2675
- _context17.prev = 2;
2676
- _context17.next = 5;
2814
+ _context18.prev = 2;
2815
+ _context18.next = 5;
2677
2816
  return createComment(commentText, token);
2678
2817
 
2679
2818
  case 5:
@@ -2686,13 +2825,13 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2686
2825
  image: _genericModalCheck.default
2687
2826
  }
2688
2827
  });
2689
- _context17.next = 12;
2828
+ _context18.next = 12;
2690
2829
  break;
2691
2830
 
2692
2831
  case 8:
2693
- _context17.prev = 8;
2694
- _context17.t0 = _context17["catch"](2);
2695
- console.error("Error saving comment:", _context17.t0);
2832
+ _context18.prev = 8;
2833
+ _context18.t0 = _context18["catch"](2);
2834
+ console.error("Error saving comment:", _context18.t0);
2696
2835
  dispatch({
2697
2836
  type: "SET_MODAL",
2698
2837
  payload: {
@@ -2705,14 +2844,14 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
2705
2844
 
2706
2845
  case 12:
2707
2846
  case "end":
2708
- return _context17.stop();
2847
+ return _context18.stop();
2709
2848
  }
2710
2849
  }
2711
- }, _callee17, null, [[2, 8]]);
2850
+ }, _callee18, null, [[2, 8]]);
2712
2851
  }));
2713
2852
 
2714
- return function handleOnSubmitComment(_x9) {
2715
- return _ref22.apply(this, arguments);
2853
+ return function handleOnSubmitComment(_x8) {
2854
+ return _ref23.apply(this, arguments);
2716
2855
  };
2717
2856
  }();
2718
2857
 
@@ -3024,7 +3163,19 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3024
3163
  })]
3025
3164
  })
3026
3165
  });
3027
- if (state.loading || !state.services || !state.product) return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
3166
+ /*
3167
+ `images_values` entra al guard junto a `services` y `product`.
3168
+ React 17 no agrupa los dispatch que van después de un `await`: cada uno
3169
+ re-renderiza al instante. En `loadData` el orden es SET_SERVICES →
3170
+ …_INPUTS → SET_IMAGES_VALUES, así que había renders intermedios con
3171
+ `services` ya puesto —el guard los dejaba pasar— y el resto todavía en null.
3172
+ El cuerpo de abajo lee `datasheets_inputs[1]`, `descriptions_inputs[0]` y
3173
+ `images_values.values` sin protección, y tumbaba la pantalla entera.
3174
+ Se comprueba `images_values` y no cada uno: es el ÚLTIMO que `loadData`
3175
+ despacha, así que si ya está, los anteriores también.
3176
+ */
3177
+
3178
+ if (state.loading || !state.services || !state.product || !state.images_values) return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
3028
3179
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(ProductEditionSkeleton, {})
3029
3180
  });
3030
3181
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_AiProductEdition.AiProductEditionProvider, {
@@ -3076,9 +3227,9 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3076
3227
  }
3077
3228
  }
3078
3229
  }), showLinkVariants && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LinkVariantsModal.LinkVariantsModal, {
3079
- articleId: (_state$product19 = state.product) === null || _state$product19 === void 0 ? void 0 : _state$product19.id_article,
3080
- articleName: (_state$product20 = state.product) === null || _state$product20 === void 0 ? void 0 : _state$product20.name,
3081
- articleUpc: (_state$product21 = state.product) === null || _state$product21 === void 0 ? void 0 : _state$product21.upc,
3230
+ articleId: (_state$product20 = state.product) === null || _state$product20 === void 0 ? void 0 : _state$product20.id_article,
3231
+ articleName: (_state$product21 = state.product) === null || _state$product21 === void 0 ? void 0 : _state$product21.name,
3232
+ articleUpc: (_state$product22 = state.product) === null || _state$product22 === void 0 ? void 0 : _state$product22.upc,
3082
3233
  activeRetailerId: (_state$active_retaile7 = state.active_retailer) === null || _state$active_retaile7 === void 0 ? void 0 : _state$active_retaile7.id_retailer,
3083
3234
  token: token,
3084
3235
  onClose: function onClose() {
@@ -3086,9 +3237,9 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3086
3237
  },
3087
3238
  onLinked: handleOnLinkedVariants
3088
3239
  }), showGroupModal && /*#__PURE__*/(0, _jsxRuntime.jsx)(_VariantGroupModal.VariantGroupModal, {
3089
- articleId: (_state$product22 = state.product) === null || _state$product22 === void 0 ? void 0 : _state$product22.id_article,
3090
- articleName: (_state$product23 = state.product) === null || _state$product23 === void 0 ? void 0 : _state$product23.name,
3091
- articleUpc: (_state$product24 = state.product) === null || _state$product24 === void 0 ? void 0 : _state$product24.upc,
3240
+ articleId: (_state$product23 = state.product) === null || _state$product23 === void 0 ? void 0 : _state$product23.id_article,
3241
+ articleName: (_state$product24 = state.product) === null || _state$product24 === void 0 ? void 0 : _state$product24.name,
3242
+ articleUpc: (_state$product25 = state.product) === null || _state$product25 === void 0 ? void 0 : _state$product25.upc,
3092
3243
  currentGroup: (_variantGroup$group2 = variantGroup === null || variantGroup === void 0 ? void 0 : variantGroup.group) !== null && _variantGroup$group2 !== void 0 ? _variantGroup$group2 : null,
3093
3244
  token: token,
3094
3245
  onClose: function onClose() {
@@ -3124,21 +3275,21 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3124
3275
  type: "pink",
3125
3276
  label: "Aceptar",
3126
3277
  size: 12,
3127
- onClick: /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee18() {
3278
+ onClick: /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee19() {
3128
3279
  var elements, isMessageEmpty, container, existingAlert, alert, fullMessage;
3129
- return _regenerator.default.wrap(function _callee18$(_context18) {
3280
+ return _regenerator.default.wrap(function _callee19$(_context19) {
3130
3281
  while (1) {
3131
- switch (_context18.prev = _context18.next) {
3282
+ switch (_context19.prev = _context19.next) {
3132
3283
  case 0:
3133
3284
  elements = document.querySelectorAll("#modal-message-box .ql-container .ql-editor > p");
3134
3285
 
3135
3286
  if (!(!elements || elements.length === 0)) {
3136
- _context18.next = 4;
3287
+ _context19.next = 4;
3137
3288
  break;
3138
3289
  }
3139
3290
 
3140
3291
  console.error("Elemento no encontrado");
3141
- return _context18.abrupt("return");
3292
+ return _context19.abrupt("return");
3142
3293
 
3143
3294
  case 4:
3144
3295
  isMessageEmpty = Array.from(elements).every(function (el) {
@@ -3147,7 +3298,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3147
3298
  });
3148
3299
 
3149
3300
  if (!isMessageEmpty) {
3150
- _context18.next = 10;
3301
+ _context19.next = 10;
3151
3302
  break;
3152
3303
  }
3153
3304
 
@@ -3162,13 +3313,13 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3162
3313
  container.appendChild(alert);
3163
3314
  }
3164
3315
 
3165
- return _context18.abrupt("return");
3316
+ return _context19.abrupt("return");
3166
3317
 
3167
3318
  case 10:
3168
3319
  fullMessage = Array.from(elements).map(function (element) {
3169
3320
  return element.innerHTML;
3170
3321
  }).join("").replace(/<br\s*\/?>/gi, "\n");
3171
- _context18.next = 13;
3322
+ _context19.next = 13;
3172
3323
  return createComment(fullMessage, token);
3173
3324
 
3174
3325
  case 13:
@@ -3177,10 +3328,10 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3177
3328
 
3178
3329
  case 15:
3179
3330
  case "end":
3180
- return _context18.stop();
3331
+ return _context19.stop();
3181
3332
  }
3182
3333
  }
3183
- }, _callee18);
3334
+ }, _callee19);
3184
3335
  }))
3185
3336
  }, "btn-Aceptar")]
3186
3337
  }), state.modal.show && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GenericModal.GenericModal, {
@@ -3248,17 +3399,27 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3248
3399
  className: "data-container",
3249
3400
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
3250
3401
  className: "image-data-panel",
3251
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ImagePreviewer.ImagePreviewer, {
3252
- activeImage: (_state$images_values$2 = state.images_values.values[state.current_image]) !== null && _state$images_values$2 !== void 0 ? _state$images_values$2 : {},
3402
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ImagePreviewer.ImagePreviewer
3403
+ /*
3404
+ `images_values` puede ser null en pleno render.
3405
+ React 17 no agrupa los dispatch que van después de un `await`:
3406
+ cada uno re-renderiza al instante. En `loadData`, `SET_SERVICES`
3407
+ se despacha antes que `SET_IMAGES_VALUES`, así que hay un render
3408
+ en el que `services` ya existe —y por eso el guard de arriba deja
3409
+ pasar— pero las imágenes todavía no. Sin las interrogaciones,
3410
+ ese render intermedio tumba la pantalla entera.
3411
+ */
3412
+ , {
3413
+ activeImage: (_state$images_values$2 = (_state$images_values10 = state.images_values) === null || _state$images_values10 === void 0 ? void 0 : (_state$images_values11 = _state$images_values10.values) === null || _state$images_values11 === void 0 ? void 0 : _state$images_values11[state.current_image]) !== null && _state$images_values$2 !== void 0 ? _state$images_values$2 : {},
3253
3414
  imagesArray: state.images_values || [],
3254
3415
  setActiveImage: handleOnChangeCurrentImage,
3255
3416
  setShowModal: handleOnShowModalGallery
3256
3417
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ImageDataTable.ImageDataTable // states
3257
3418
  , {
3258
3419
  lists: state.images_values || [],
3259
- activeImage: (_state$images_values10 = state.images_values) !== null && _state$images_values10 !== void 0 && _state$images_values10.values ? (_state$images_values11 = state.images_values) === null || _state$images_values11 === void 0 ? void 0 : _state$images_values11.values[state.current_image] : {},
3420
+ activeImage: (_state$images_values12 = state.images_values) !== null && _state$images_values12 !== void 0 && _state$images_values12.values ? (_state$images_values13 = state.images_values) === null || _state$images_values13 === void 0 ? void 0 : _state$images_values13.values[state.current_image] : {},
3260
3421
  assignationsImages: state.collaborator_assignations["Imágenes"],
3261
- imagesStatus: ((_state$product25 = state.product) === null || _state$product25 === void 0 ? void 0 : _state$product25.images_status) || "-",
3422
+ imagesStatus: ((_state$product26 = state.product) === null || _state$product26 === void 0 ? void 0 : _state$product26.images_status) || "-",
3262
3423
  retailerSelected: (_state$active_retaile10 = state.active_retailer) === null || _state$active_retaile10 === void 0 ? void 0 : _state$active_retaile10.id_retailer,
3263
3424
  isRetailer: isRetailer,
3264
3425
  version: state.product.version,
@@ -3346,13 +3507,13 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3346
3507
  className: "desvincular",
3347
3508
  title: "Dejar de ser hijo de este producto",
3348
3509
  onClick: function onClick() {
3349
- var _state$product26, _state$product27, _state$product28;
3510
+ var _state$product27, _state$product28, _state$product29;
3350
3511
 
3351
3512
  return setPorDesvincular({
3352
3513
  mode: "self",
3353
- childArticleId: (_state$product26 = state.product) === null || _state$product26 === void 0 ? void 0 : _state$product26.id_article,
3354
- childName: (_state$product27 = state.product) === null || _state$product27 === void 0 ? void 0 : _state$product27.name,
3355
- childUpc: (_state$product28 = state.product) === null || _state$product28 === void 0 ? void 0 : _state$product28.upc,
3514
+ childArticleId: (_state$product27 = state.product) === null || _state$product27 === void 0 ? void 0 : _state$product27.id_article,
3515
+ childName: (_state$product28 = state.product) === null || _state$product28 === void 0 ? void 0 : _state$product28.name,
3516
+ childUpc: (_state$product29 = state.product) === null || _state$product29 === void 0 ? void 0 : _state$product29.upc,
3356
3517
  parentName: family.parent.name,
3357
3518
  parentUpc: family.parent.upc
3358
3519
  });
@@ -3384,15 +3545,15 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3384
3545
  className: "desvincular",
3385
3546
  title: "Desvincular este hijo",
3386
3547
  onClick: function onClick() {
3387
- var _state$product29, _state$product30;
3548
+ var _state$product30, _state$product31;
3388
3549
 
3389
3550
  return setPorDesvincular({
3390
3551
  mode: "child",
3391
3552
  childArticleId: variant.articleId,
3392
3553
  childName: variant.name,
3393
3554
  childUpc: variant.upc,
3394
- parentName: (_state$product29 = state.product) === null || _state$product29 === void 0 ? void 0 : _state$product29.name,
3395
- parentUpc: (_state$product30 = state.product) === null || _state$product30 === void 0 ? void 0 : _state$product30.upc
3555
+ parentName: (_state$product30 = state.product) === null || _state$product30 === void 0 ? void 0 : _state$product30.name,
3556
+ parentUpc: (_state$product31 = state.product) === null || _state$product31 === void 0 ? void 0 : _state$product31.upc
3396
3557
  });
3397
3558
  },
3398
3559
  children: "Desvincular"
@@ -3513,8 +3674,10 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3513
3674
  ,
3514
3675
  setShowVersionSelector: setShowVersionSelector // setSelectedImages={setSelectedImages} prop pasada asi: FullTabsMenu -> TabsMenu Pero en TabsMenu no se espera ninguna prop setSelectedImages
3515
3676
  // actions
3677
+ // El botón actúa sobre la bandeja visible: en activos descargaba
3678
+ // las imágenes del producto, que no es lo que el usuario pidió.
3516
3679
  ,
3517
- downloadImages: handleOnDownloadImages,
3680
+ downloadImages: currentTray === _GalleryTrayTabs.TRAYS.ASSETS ? handleOnDownloadAssets : handleOnDownloadImages,
3518
3681
  askToDeleteImages: handleOnAskToDeleteImages,
3519
3682
  showSaveButton: isAuditorAssigned() || isUserAssignedToService(),
3520
3683
  onClickSave: handleOnClickSave // validations
@@ -3524,7 +3687,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3524
3687
  className: "services-information-container " + (imageLayout && state.active_tab === "Imágenes" ? "image-services" : ""),
3525
3688
  id: "services-information-container",
3526
3689
  children: state.saving ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Loading.Loading, {}) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
3527
- children: [state.active_tab === "Descripción" && (((_state$product31 = state.product) === null || _state$product31 === void 0 ? void 0 : _state$product31.description_status) !== "NS" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_InputGroup.InputGroup, {
3690
+ children: [state.active_tab === "Descripción" && (((_state$product32 = state.product) === null || _state$product32 === void 0 ? void 0 : _state$product32.description_status) !== "NS" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_InputGroup.InputGroup, {
3528
3691
  activeSection: state.active_tab,
3529
3692
  inputGroup: state.descriptions_inputs[0],
3530
3693
  updatedDescriptions: state.updated_descriptions_inputs
@@ -3533,7 +3696,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3533
3696
  ,
3534
3697
  variant: (_state$services3 = state.services) === null || _state$services3 === void 0 ? void 0 : (_state$services3$data = _state$services3.datasheets) === null || _state$services3$data === void 0 ? void 0 : _state$services3$data.variant,
3535
3698
  onRestoreInheritance: handleOnRestoreInheritance,
3536
- articleId: (_state$product32 = state.product) === null || _state$product32 === void 0 ? void 0 : _state$product32.id_article,
3699
+ articleId: (_state$product33 = state.product) === null || _state$product33 === void 0 ? void 0 : _state$product33.id_article,
3537
3700
  version: state.product.version,
3538
3701
  auditInputGroup: auditDescriptions[0],
3539
3702
  setUpdatedDescriptions: handleOnSetUpdatedDescriptions,
@@ -3542,7 +3705,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3542
3705
  }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_ScreenHeader.ScreenHeader, {
3543
3706
  text: "No cuentas con este servicio",
3544
3707
  headerType: "input-name-header"
3545
- })), state.active_tab === "Ficha técnica" && (((_state$product33 = state.product) === null || _state$product33 === void 0 ? void 0 : _state$product33.datasheet_status) !== "NS" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
3708
+ })), state.active_tab === "Ficha técnica" && (((_state$product34 = state.product) === null || _state$product34 === void 0 ? void 0 : _state$product34.datasheet_status) !== "NS" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
3546
3709
  children: (_state$datasheets_inp = state.datasheets_inputs[0]) === null || _state$datasheets_inp === void 0 ? void 0 : (_state$datasheets_inp2 = _state$datasheets_inp.data) === null || _state$datasheets_inp2 === void 0 ? void 0 : _state$datasheets_inp2.map(function (dataGroup, index) {
3547
3710
  var _state$services4, _state$services4$data;
3548
3711
 
@@ -3563,15 +3726,33 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3563
3726
  }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_ScreenHeader.ScreenHeader, {
3564
3727
  text: "No cuentas con este servicio",
3565
3728
  headerType: "input-name-header"
3566
- })), state.active_tab === "Imágenes" && (((_state$product34 = state.product) === null || _state$product34 === void 0 ? void 0 : _state$product34.images_status) !== "NS" ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
3567
- children: [!imageLayout && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GalleryHeader.GalleryHeader, {
3729
+ })), state.active_tab === "Imágenes" && (((_state$product35 = state.product) === null || _state$product35 === void 0 ? void 0 : _state$product35.images_status) !== "NS" ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
3730
+ children: [enableDigitalAssets && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GalleryTrayTabs.GalleryTrayTabs, {
3731
+ activeTray: currentTray,
3732
+ setActiveTray: setActiveTray,
3733
+ imagesCount: (_state$images_values$3 = (_state$images_values14 = state.images_values) === null || _state$images_values14 === void 0 ? void 0 : (_state$images_values15 = _state$images_values14.values) === null || _state$images_values15 === void 0 ? void 0 : _state$images_values15.length) !== null && _state$images_values$3 !== void 0 ? _state$images_values$3 : 0,
3734
+ assetsCount: digitalAssets.assets.length
3735
+ }), currentTray === _GalleryTrayTabs.TRAYS.ASSETS && /*#__PURE__*/(0, _jsxRuntime.jsx)("section", {
3736
+ className: "container",
3737
+ style: {
3738
+ position: "relative"
3739
+ },
3740
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_DigitalAssetsTray.DigitalAssetsTray, (0, _objectSpread5.default)((0, _objectSpread5.default)({}, digitalAssets), {}, {
3741
+ unsaved: (0, _assets.countUnsavedAssets)(state),
3742
+ gridLayout: imageLayout,
3743
+ readOnly: !isAuditorAssigned() && !isUserAssignedToService(),
3744
+ selectedAssets: state.selected_assets,
3745
+ setSelectedAssets: handleOnSetSelectedAssets,
3746
+ setCheckAll: handleOnSetAllAssetsChecked
3747
+ }))
3748
+ }), currentTray === _GalleryTrayTabs.TRAYS.IMAGES && !imageLayout && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GalleryHeader.GalleryHeader, {
3568
3749
  checkAll: state.all_image_checked // Determina si el checkbox "Seleccionar todo" está marcado
3569
3750
  ,
3570
3751
  setCheckAll: handleOnSetCheckAll // Toggler de true o false para el checkbox "Seleccionar todo"
3571
3752
  ,
3572
3753
  setSelectedImages: handleOnSetSelectedImages // shotThd={shotThd} // No se usa?
3573
3754
 
3574
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("section", {
3755
+ }), currentTray === _GalleryTrayTabs.TRAYS.IMAGES && /*#__PURE__*/(0, _jsxRuntime.jsxs)("section", {
3575
3756
  className: "container",
3576
3757
  style: {
3577
3758
  position: "relative"
@@ -3587,7 +3768,7 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3587
3768
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)("aside", {
3588
3769
  children: thumbs()
3589
3770
  })]
3590
- })), ((_state$images_values12 = state.images_values) === null || _state$images_values12 === void 0 ? void 0 : _state$images_values12.values.length) === 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
3771
+ })), ((_state$images_values16 = state.images_values) === null || _state$images_values16 === void 0 ? void 0 : (_state$images_values17 = _state$images_values16.values) === null || _state$images_values17 === void 0 ? void 0 : _state$images_values17.length) === 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
3591
3772
  style: {
3592
3773
  position: "absolute",
3593
3774
  top: "50%",
@@ -3655,20 +3836,20 @@ var RetailerProductEditionView = function RetailerProductEditionView(_ref) {
3655
3836
  reviewed: crossComment
3656
3837
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_GeneralButton.Button, {
3657
3838
  buttonType: "circular-button accept-button",
3658
- onClick: /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee19() {
3659
- return _regenerator.default.wrap(function _callee19$(_context19) {
3839
+ onClick: /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee20() {
3840
+ return _regenerator.default.wrap(function _callee20$(_context20) {
3660
3841
  while (1) {
3661
- switch (_context19.prev = _context19.next) {
3842
+ switch (_context20.prev = _context20.next) {
3662
3843
  case 0:
3663
3844
  setCrossComment(true);
3664
3845
  commentRevised();
3665
3846
 
3666
3847
  case 2:
3667
3848
  case "end":
3668
- return _context19.stop();
3849
+ return _context20.stop();
3669
3850
  }
3670
3851
  }
3671
- }, _callee19);
3852
+ }, _callee20);
3672
3853
  }))
3673
3854
  })]
3674
3855
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {