@crystaldesign/diva-backoffice 26.7.0-rc.1 → 26.7.0-rc.10

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 (19) hide show
  1. package/build/esm/index.js +387 -169
  2. package/build/types/backoffice/src/ui/Table/BaseTable/cellRenderer/MediaViewerCell/index.d.ts.map +1 -1
  3. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/AIImageSelector/components/SortableImageRow/index.d.ts.map +1 -1
  4. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/AIImageSelector/index.d.ts +3 -3
  5. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/AIImageSelector/index.d.ts.map +1 -1
  6. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/ImageSelectionWorkspace/index.d.ts +4 -3
  7. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/ImageSelectionWorkspace/index.d.ts.map +1 -1
  8. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/MetadataPanel/index.d.ts +3 -1
  9. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/MetadataPanel/index.d.ts.map +1 -1
  10. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/hooks/useRenderJobData.d.ts +3 -1
  11. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/hooks/useRenderJobData.d.ts.map +1 -1
  12. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/index.d.ts.map +1 -1
  13. package/build/types/backoffice/src/ui/TableRenderJobs/components/UploadImageModal/index.d.ts +11 -1
  14. package/build/types/backoffice/src/ui/TableRenderJobs/components/UploadImageModal/index.d.ts.map +1 -1
  15. package/build/types/backoffice/src/ui/TableRenderJobs/hooks/useUploadRenderImage.d.ts +14 -0
  16. package/build/types/backoffice/src/ui/TableRenderJobs/hooks/useUploadRenderImage.d.ts.map +1 -0
  17. package/build/types/backoffice/src/ui/TableRenderJobs/types.d.ts +10 -3
  18. package/build/types/backoffice/src/ui/TableRenderJobs/types.d.ts.map +1 -1
  19. package/package.json +9 -9
@@ -14766,7 +14766,7 @@ function getRenderjobMamStoragePredictionItems(t) {
14766
14766
  readonly: {
14767
14767
  field: 'state',
14768
14768
  op: 'gt',
14769
- value: 3
14769
+ value: 11
14770
14770
  },
14771
14771
  allowClear: true
14772
14772
  }, {
@@ -14782,7 +14782,7 @@ function getRenderjobMamStoragePredictionItems(t) {
14782
14782
  readonly: {
14783
14783
  field: 'state',
14784
14784
  op: 'gt',
14785
- value: 3
14785
+ value: 11
14786
14786
  },
14787
14787
  allowClear: true
14788
14788
  }];
@@ -28551,9 +28551,11 @@ function MediaViewerCell (_ref) {
28551
28551
  actions.loadModelViewer();
28552
28552
  }, []);
28553
28553
 
28554
- // The field value may be a plain url or an array of urls (e.g. renderImages);
28555
- // in the array case the first entry is shown.
28556
- var rawValue = Array.isArray(children === null || children === void 0 ? void 0 : children[1]) ? children[1][0] : children === null || children === void 0 ? void 0 : children[1];
28554
+ // The field value may be a plain url or an array (e.g. renderImages); in the
28555
+ // array case the first entry is shown. Entries may be plain urls or objects
28556
+ // carrying a `url` (e.g. renderImages: { mediaItemRefId?, url }).
28557
+ var firstEntry = Array.isArray(children === null || children === void 0 ? void 0 : children[1]) ? children[1][0] : children === null || children === void 0 ? void 0 : children[1];
28558
+ var rawValue = firstEntry && _typeof(firstEntry) === 'object' ? firstEntry.url : firstEntry;
28557
28559
  if (!rawValue) {
28558
28560
  return /*#__PURE__*/jsx(Fragment, {});
28559
28561
  }
@@ -53665,7 +53667,6 @@ var thumbPlaceholder = "thumbPlaceholder-zX1-S";
53665
53667
  var info = "info-8ZlUD";
53666
53668
  var label = "label-y-wTq";
53667
53669
  var meta = "meta-Ihuqr";
53668
- var referenceTag = "referenceTag-gyKQR";
53669
53670
  var css_248z$g = ".root-7OUrP {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border: 1px solid #d9d9d9;\n border: 1px solid var(--ant-color-border, #d9d9d9);\n border-radius: 8px;\n background: #fff;\n background: var(--ant-color-bg-container, #fff);\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n\n.root-7OUrP:active {\n cursor: grabbing;\n}\n\n.rootSelected-Z8LGb {\n border-color: #1677ff;\n border-color: var(--ant-color-primary, #1677ff);\n background: #e6f4ff;\n background: var(--ant-color-primary-bg, #e6f4ff);\n}\n\n.dragHandle-xo0vD {\n display: inline-flex;\n align-items: center;\n cursor: grab;\n color: #999;\n color: var(--ant-color-text-tertiary, #999);\n touch-action: none;\n}\n\n.dragHandle-xo0vD:active {\n cursor: grabbing;\n}\n\n.badge-7hZ6T {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: 10px;\n font-size: 12px;\n font-weight: 600;\n color: #fff;\n background: #1677ff;\n background: var(--ant-color-primary, #1677ff);\n}\n\n.thumb-ePFWB {\n width: 88px;\n height: 88px;\n -o-object-fit: cover;\n object-fit: cover;\n border-radius: 6px;\n flex: 0 0 auto;\n background: #f0f0f0;\n background: var(--ant-color-fill-secondary, #f0f0f0);\n cursor: pointer;\n}\n\n.thumbPlaceholder-zX1-S {\n width: 88px;\n height: 88px;\n border-radius: 6px;\n background: #f0f0f0;\n background: var(--ant-color-fill-secondary, #f0f0f0);\n flex: 0 0 auto;\n}\n\n.info-8ZlUD {\n display: flex;\n flex-direction: column;\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.label-y-wTq {\n font-size: 14px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.meta-Ihuqr {\n font-size: 12px;\n color: #888;\n color: var(--ant-color-text-secondary, #888);\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.referenceTag-gyKQR {\n align-self: flex-start;\n margin-top: 4px;\n padding: 1px 8px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 500;\n color: #1677ff;\n color: var(--ant-color-primary, #1677ff);\n background: #e6f4ff;\n background: var(--ant-color-primary-bg, #e6f4ff);\n border: 1px solid #91caff;\n border: 1px solid var(--ant-color-primary-border, #91caff);\n white-space: nowrap;\n}\n";
53670
53671
  styleInject(css_248z$g);
53671
53672
 
@@ -53766,12 +53767,6 @@ function SortableImageRow(_ref) {
53766
53767
  className: meta,
53767
53768
  title: metaText,
53768
53769
  children: ["(", metaText, ")"]
53769
- }) : null, selected && typeof orderNumber === 'number' ? /*#__PURE__*/jsx("span", {
53770
- className: referenceTag,
53771
- children: t('backoffice.renderapprove.aiImageSelector.referenceTag', {
53772
- defaultValue: 'used as AI reference ({{order}})',
53773
- order: orderNumber
53774
- })
53775
53770
  }) : null]
53776
53771
  })]
53777
53772
  }))
@@ -53847,11 +53842,14 @@ function buildItems(slides, selectedUrls) {
53847
53842
  });
53848
53843
  });
53849
53844
  }
53850
- function orderedSelectedUrls(items) {
53845
+ function orderedSelectedImages(items) {
53851
53846
  return items.filter(function (it) {
53852
53847
  return it.selected && it.media.url != null;
53853
53848
  }).map(function (it) {
53854
- return it.media.url;
53849
+ return {
53850
+ mediaItemRefId: it.media.mediaItemRefId,
53851
+ url: it.media.url
53852
+ };
53855
53853
  });
53856
53854
  }
53857
53855
 
@@ -53894,7 +53892,7 @@ function AIImageSelector(_ref2) {
53894
53892
  }));
53895
53893
  var commit = function commit(next) {
53896
53894
  setItems(next);
53897
- onChange === null || onChange === void 0 || onChange(orderedSelectedUrls(next));
53895
+ onChange === null || onChange === void 0 || onChange(orderedSelectedImages(next));
53898
53896
  };
53899
53897
  var toggle = function toggle(key) {
53900
53898
  commit(items.map(function (it) {
@@ -53991,25 +53989,40 @@ function AIImageSelector(_ref2) {
53991
53989
  * approve / reject / upload, since there is nothing to decide yet.
53992
53990
  */
53993
53991
  function ImageSelectionWorkspace(_ref) {
53992
+ var _job$renderImages;
53994
53993
  var job = _ref.job,
53995
53994
  slides = _ref.slides,
53996
53995
  selectionDisabled = _ref.selectionDisabled,
53997
53996
  onSelectionChange = _ref.onSelectionChange,
53998
53997
  onOpenFullscreen = _ref.onOpenFullscreen,
53998
+ onUpload = _ref.onUpload,
53999
53999
  actionDisabled = _ref.actionDisabled,
54000
54000
  busy = _ref.busy,
54001
54001
  isFirst = _ref.isFirst,
54002
54002
  shortcutItems = _ref.shortcutItems,
54003
54003
  onPrev = _ref.onPrev,
54004
54004
  onNext = _ref.onNext;
54005
+ var _useTranslation = useTranslation(),
54006
+ t = _useTranslation.t;
54005
54007
  return /*#__PURE__*/jsxs(Fragment, {
54006
54008
  children: [/*#__PURE__*/jsx(AIImageSelector, {
54007
54009
  slides: slides,
54008
- selectedUrls: job.renderImages,
54010
+ selectedUrls: (_job$renderImages = job.renderImages) === null || _job$renderImages === void 0 ? void 0 : _job$renderImages.map(function (image) {
54011
+ return image.url;
54012
+ }),
54009
54013
  disabled: selectionDisabled,
54010
54014
  onChange: onSelectionChange,
54011
54015
  onOpenFullscreen: onOpenFullscreen
54012
- }, job._id), /*#__PURE__*/jsx(ActionBar, {
54016
+ }, job._id), onUpload && /*#__PURE__*/jsx(Button, {
54017
+ icon: /*#__PURE__*/jsx(UploadOutlined, {}),
54018
+ onClick: onUpload,
54019
+ disabled: selectionDisabled,
54020
+ style: {
54021
+ marginTop: 12
54022
+ },
54023
+ block: true,
54024
+ children: t('backoffice.renderapprove.aiImageSelector.uploadImage')
54025
+ }), /*#__PURE__*/jsx(ActionBar, {
54013
54026
  disabled: actionDisabled,
54014
54027
  busy: busy,
54015
54028
  isFirst: isFirst,
@@ -54410,6 +54423,7 @@ function MetadataPanel(_ref) {
54410
54423
  promptActionBusy = _ref.promptActionBusy,
54411
54424
  onPromptRestart = _ref.onPromptRestart,
54412
54425
  promptWarningMessage = _ref.promptWarningMessage,
54426
+ hidePrompt = _ref.hidePrompt,
54413
54427
  children = _ref.children;
54414
54428
  var _useTranslation = useTranslation(),
54415
54429
  t = _useTranslation.t;
@@ -54446,7 +54460,7 @@ function MetadataPanel(_ref) {
54446
54460
  var promptValue = optimisticPrompt !== null && optimisticPrompt !== void 0 ? optimisticPrompt : jobPromptValue;
54447
54461
  var promptSourceValue = promptValue !== null && promptValue !== void 0 ? promptValue : '';
54448
54462
  var hasPromptSource = promptSourceValue.trim().length > 0;
54449
- var showPromptPanel = isAiEngine(job === null || job === void 0 ? void 0 : job.engine);
54463
+ var showPromptPanel = isAiEngine(job === null || job === void 0 ? void 0 : job.engine) && !hidePrompt;
54450
54464
  var isDetailsControlled = typeof detailsOpen === 'boolean';
54451
54465
  var isPromptControlled = typeof promptOpen === 'boolean';
54452
54466
  var isDetailsOpen = isDetailsControlled ? detailsOpen : internalSidebarOpen;
@@ -55347,12 +55361,14 @@ function UploadImageModal(_ref) {
55347
55361
  var open = _ref.open,
55348
55362
  renderJob = _ref.renderJob,
55349
55363
  onClose = _ref.onClose,
55350
- onSuccess = _ref.onSuccess;
55364
+ onSuccess = _ref.onSuccess,
55365
+ uploadOverride = _ref.uploadOverride,
55366
+ skipValidation = _ref.skipValidation,
55367
+ allowedExtensions = _ref.allowedExtensions;
55351
55368
  var _useTranslation = useTranslation(),
55352
55369
  t = _useTranslation.t;
55353
55370
  var _useUploadRenderJobIm = useUploadRenderJobImage(),
55354
- upload = _useUploadRenderJobIm.upload,
55355
- uploading = _useUploadRenderJobIm.uploading;
55371
+ upload = _useUploadRenderJobIm.upload;
55356
55372
  var _useState = useState(null),
55357
55373
  _useState2 = _slicedToArray(_useState, 2),
55358
55374
  selectedFile = _useState2[0],
@@ -55365,10 +55381,14 @@ function UploadImageModal(_ref) {
55365
55381
  _useState6 = _slicedToArray(_useState5, 2),
55366
55382
  validating = _useState6[0],
55367
55383
  setValidating = _useState6[1];
55368
- var _useState7 = useState(null),
55384
+ var _useState7 = useState(false),
55369
55385
  _useState8 = _slicedToArray(_useState7, 2),
55370
- uploadError = _useState8[0],
55371
- setUploadError = _useState8[1];
55386
+ uploading = _useState8[0],
55387
+ setUploading = _useState8[1];
55388
+ var _useState9 = useState(null),
55389
+ _useState10 = _slicedToArray(_useState9, 2),
55390
+ uploadError = _useState10[0],
55391
+ setUploadError = _useState10[1];
55372
55392
  var reset = function reset() {
55373
55393
  setSelectedFile(null);
55374
55394
  setWarnings([]);
@@ -55381,35 +55401,51 @@ function UploadImageModal(_ref) {
55381
55401
  };
55382
55402
  var handleFileSelect = /*#__PURE__*/function () {
55383
55403
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(file) {
55384
- var w;
55404
+ var _file$name$split$pop$, _file$name$split$pop, ext, w;
55385
55405
  return _regeneratorRuntime.wrap(function _callee$(_context) {
55386
55406
  while (1) switch (_context.prev = _context.next) {
55387
55407
  case 0:
55388
- setSelectedFile(file);
55389
55408
  setUploadError(null);
55390
55409
  setWarnings([]);
55391
- if (!renderJob) {
55392
- _context.next = 13;
55410
+ if (!(allowedExtensions && allowedExtensions.length > 0)) {
55411
+ _context.next = 8;
55412
+ break;
55413
+ }
55414
+ ext = (_file$name$split$pop$ = (_file$name$split$pop = file.name.split('.').pop()) === null || _file$name$split$pop === void 0 ? void 0 : _file$name$split$pop.toLowerCase()) !== null && _file$name$split$pop$ !== void 0 ? _file$name$split$pop$ : '';
55415
+ if (allowedExtensions.includes(ext)) {
55416
+ _context.next = 8;
55417
+ break;
55418
+ }
55419
+ setSelectedFile(null);
55420
+ setUploadError(t('backoffice.renderapprove.uploadModal.invalidImageType', {
55421
+ defaultValue: 'Nur folgende Bildformate sind erlaubt: {{formats}}',
55422
+ formats: allowedExtensions.join(', ')
55423
+ }));
55424
+ return _context.abrupt("return", false);
55425
+ case 8:
55426
+ setSelectedFile(file);
55427
+ if (!(!skipValidation && renderJob)) {
55428
+ _context.next = 19;
55393
55429
  break;
55394
55430
  }
55395
55431
  setValidating(true);
55396
- _context.prev = 5;
55397
- _context.next = 8;
55432
+ _context.prev = 11;
55433
+ _context.next = 14;
55398
55434
  return validateImageFile(file, renderJob, t);
55399
- case 8:
55435
+ case 14:
55400
55436
  w = _context.sent;
55401
55437
  setWarnings(w);
55402
- case 10:
55403
- _context.prev = 10;
55438
+ case 16:
55439
+ _context.prev = 16;
55404
55440
  setValidating(false);
55405
- return _context.finish(10);
55406
- case 13:
55441
+ return _context.finish(16);
55442
+ case 19:
55407
55443
  return _context.abrupt("return", false);
55408
- case 14:
55444
+ case 20:
55409
55445
  case "end":
55410
55446
  return _context.stop();
55411
55447
  }
55412
- }, _callee, null, [[5,, 10, 13]]);
55448
+ }, _callee, null, [[11,, 16, 19]]);
55413
55449
  }));
55414
55450
  return function handleFileSelect(_x) {
55415
55451
  return _ref2.apply(this, arguments);
@@ -55428,25 +55464,30 @@ function UploadImageModal(_ref) {
55428
55464
  return _context2.abrupt("return");
55429
55465
  case 2:
55430
55466
  setUploadError(null);
55431
- _context2.prev = 3;
55432
- _context2.next = 6;
55433
- return upload(selectedFile, renderJob);
55434
- case 6:
55467
+ setUploading(true);
55468
+ _context2.prev = 4;
55469
+ _context2.next = 7;
55470
+ return (uploadOverride !== null && uploadOverride !== void 0 ? uploadOverride : upload)(selectedFile, renderJob);
55471
+ case 7:
55435
55472
  reset();
55436
55473
  onSuccess === null || onSuccess === void 0 || onSuccess();
55437
- _context2.next = 13;
55474
+ _context2.next = 14;
55438
55475
  break;
55439
- case 10:
55440
- _context2.prev = 10;
55441
- _context2.t0 = _context2["catch"](3);
55476
+ case 11:
55477
+ _context2.prev = 11;
55478
+ _context2.t0 = _context2["catch"](4);
55442
55479
  setUploadError((_message = _context2.t0 === null || _context2.t0 === void 0 ? void 0 : _context2.t0.message) !== null && _message !== void 0 ? _message : t('backoffice.renderapprove.uploadModal.uploadFailed', {
55443
55480
  defaultValue: 'Upload fehlgeschlagen'
55444
55481
  }));
55445
- case 13:
55482
+ case 14:
55483
+ _context2.prev = 14;
55484
+ setUploading(false);
55485
+ return _context2.finish(14);
55486
+ case 17:
55446
55487
  case "end":
55447
55488
  return _context2.stop();
55448
55489
  }
55449
- }, _callee2, null, [[3, 10]]);
55490
+ }, _callee2, null, [[4, 11, 14, 17]]);
55450
55491
  }));
55451
55492
  return function handleUpload() {
55452
55493
  return _ref3.apply(this, arguments);
@@ -55474,7 +55515,9 @@ function UploadImageModal(_ref) {
55474
55515
  children: /*#__PURE__*/jsxs(Spin, {
55475
55516
  spinning: validating || uploading,
55476
55517
  children: [/*#__PURE__*/jsxs(Upload$2.Dragger, {
55477
- accept: "image/*",
55518
+ accept: allowedExtensions && allowedExtensions.length > 0 ? allowedExtensions.map(function (e) {
55519
+ return ".".concat(e);
55520
+ }).join(',') : 'image/*',
55478
55521
  beforeUpload: handleFileSelect,
55479
55522
  maxCount: 1,
55480
55523
  showUploadList: !!selectedFile,
@@ -56165,12 +56208,12 @@ function fetchJson(_x, _x2) {
56165
56208
  return _fetchJson.apply(this, arguments);
56166
56209
  }
56167
56210
  function _fetchJson() {
56168
- _fetchJson = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(url, jwt) {
56211
+ _fetchJson = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(url, jwt) {
56169
56212
  var response;
56170
- return _regeneratorRuntime.wrap(function _callee2$(_context2) {
56171
- while (1) switch (_context2.prev = _context2.next) {
56213
+ return _regeneratorRuntime.wrap(function _callee3$(_context3) {
56214
+ while (1) switch (_context3.prev = _context3.next) {
56172
56215
  case 0:
56173
- _context2.next = 2;
56216
+ _context3.next = 2;
56174
56217
  return fetch(url, {
56175
56218
  headers: _objectSpread$g({
56176
56219
  'Content-Type': 'application/json'
@@ -56179,24 +56222,24 @@ function _fetchJson() {
56179
56222
  } : {})
56180
56223
  });
56181
56224
  case 2:
56182
- response = _context2.sent;
56225
+ response = _context3.sent;
56183
56226
  if (response.ok) {
56184
- _context2.next = 5;
56227
+ _context3.next = 5;
56185
56228
  break;
56186
56229
  }
56187
56230
  throw new DivaError("Request failed: ".concat(response.status, " ").concat(response.statusText), {
56188
56231
  code: 'RENDERAPPROVE_FETCH_FAILED'
56189
56232
  });
56190
56233
  case 5:
56191
- _context2.next = 7;
56234
+ _context3.next = 7;
56192
56235
  return response.json();
56193
56236
  case 7:
56194
- return _context2.abrupt("return", _context2.sent);
56237
+ return _context3.abrupt("return", _context3.sent);
56195
56238
  case 8:
56196
56239
  case "end":
56197
- return _context2.stop();
56240
+ return _context3.stop();
56198
56241
  }
56199
- }, _callee2);
56242
+ }, _callee3);
56200
56243
  }));
56201
56244
  return _fetchJson.apply(this, arguments);
56202
56245
  }
@@ -56233,22 +56276,22 @@ function fetchProductMedia(_x3, _x4, _x5, _x6, _x7) {
56233
56276
  return _fetchProductMedia.apply(this, arguments);
56234
56277
  }
56235
56278
  function _fetchProductMedia() {
56236
- _fetchProductMedia = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(catalogService, baseUrl, jwt, productId, excludeUrl) {
56279
+ _fetchProductMedia = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(catalogService, baseUrl, jwt, productId, excludeUrl) {
56237
56280
  var data, product, media, sorted, seen, result, _iterator2, _step2, _mapped$metadata, item, mapped, ref;
56238
- return _regeneratorRuntime.wrap(function _callee4$(_context4) {
56239
- while (1) switch (_context4.prev = _context4.next) {
56281
+ return _regeneratorRuntime.wrap(function _callee5$(_context5) {
56282
+ while (1) switch (_context5.prev = _context5.next) {
56240
56283
  case 0:
56241
- _context4.next = 2;
56284
+ _context5.next = 2;
56242
56285
  return fetchJson("".concat(catalogService, "/v1/products/").concat(encodeURIComponent(productId), "/list"), jwt);
56243
56286
  case 2:
56244
- data = _context4.sent;
56287
+ data = _context5.sent;
56245
56288
  product = Array.isArray(data) ? data[0] : undefined;
56246
56289
  media = product === null || product === void 0 ? void 0 : product.media;
56247
56290
  if (!(!Array.isArray(media) || media.length === 0)) {
56248
- _context4.next = 7;
56291
+ _context5.next = 7;
56249
56292
  break;
56250
56293
  }
56251
- return _context4.abrupt("return", []);
56294
+ return _context5.abrupt("return", []);
56252
56295
  case 7:
56253
56296
  sorted = _toConsumableArray(media).sort(function (a, b) {
56254
56297
  var pa = typeof (a === null || a === void 0 ? void 0 : a.position) === 'number' ? a.position : Number.MAX_SAFE_INTEGER;
@@ -56259,42 +56302,45 @@ function _fetchProductMedia() {
56259
56302
  if (excludeUrl) seen.add(excludeUrl);
56260
56303
  result = [];
56261
56304
  _iterator2 = _createForOfIteratorHelper$9(sorted);
56262
- _context4.prev = 12;
56305
+ _context5.prev = 12;
56263
56306
  _iterator2.s();
56264
56307
  case 14:
56265
56308
  if ((_step2 = _iterator2.n()).done) {
56266
- _context4.next = 32;
56309
+ _context5.next = 32;
56267
56310
  break;
56268
56311
  }
56269
56312
  item = _step2.value;
56270
56313
  if (!(item !== null && item !== void 0 && item.functionType && EXCLUDED_FUNCTION_TYPES.has(item.functionType))) {
56271
- _context4.next = 18;
56314
+ _context5.next = 18;
56272
56315
  break;
56273
56316
  }
56274
- return _context4.abrupt("continue", 30);
56317
+ return _context5.abrupt("continue", 30);
56275
56318
  case 18:
56276
56319
  if (!(item !== null && item !== void 0 && item.mediaType && !ALLOWED_MEDIA_TYPES.has(item.mediaType))) {
56277
- _context4.next = 20;
56320
+ _context5.next = 20;
56278
56321
  break;
56279
56322
  }
56280
- return _context4.abrupt("continue", 30);
56323
+ return _context5.abrupt("continue", 30);
56281
56324
  case 20:
56282
56325
  mapped = toMedia(item);
56283
56326
  if (!(!mapped || !mapped.url)) {
56284
- _context4.next = 23;
56327
+ _context5.next = 23;
56285
56328
  break;
56286
56329
  }
56287
- return _context4.abrupt("continue", 30);
56330
+ return _context5.abrupt("continue", 30);
56288
56331
  case 23:
56289
56332
  if (!seen.has(mapped.url)) {
56290
- _context4.next = 25;
56333
+ _context5.next = 25;
56291
56334
  break;
56292
56335
  }
56293
- return _context4.abrupt("continue", 30);
56336
+ return _context5.abrupt("continue", 30);
56294
56337
  case 25:
56295
56338
  seen.add(mapped.url);
56296
56339
  ref = typeof (item === null || item === void 0 ? void 0 : item.ref) === 'string' ? item.ref : undefined;
56297
- if (ref) mapped.id = ref;
56340
+ if (ref) {
56341
+ mapped.id = ref;
56342
+ mapped.mediaItemRefId = ref;
56343
+ }
56298
56344
  // Base metadata already available from the product list.
56299
56345
  mapped.metadata = _objectSpread$g(_objectSpread$g({}, item !== null && item !== void 0 && item.functionType ? {
56300
56346
  functionType: item.functionType
@@ -56304,38 +56350,38 @@ function _fetchProductMedia() {
56304
56350
  ref: ref
56305
56351
  });
56306
56352
  case 30:
56307
- _context4.next = 14;
56353
+ _context5.next = 14;
56308
56354
  break;
56309
56355
  case 32:
56310
- _context4.next = 37;
56356
+ _context5.next = 37;
56311
56357
  break;
56312
56358
  case 34:
56313
- _context4.prev = 34;
56314
- _context4.t0 = _context4["catch"](12);
56315
- _iterator2.e(_context4.t0);
56359
+ _context5.prev = 34;
56360
+ _context5.t0 = _context5["catch"](12);
56361
+ _iterator2.e(_context5.t0);
56316
56362
  case 37:
56317
- _context4.prev = 37;
56363
+ _context5.prev = 37;
56318
56364
  _iterator2.f();
56319
- return _context4.finish(37);
56365
+ return _context5.finish(37);
56320
56366
  case 40:
56321
- _context4.next = 42;
56367
+ _context5.next = 42;
56322
56368
  return Promise.all(result.map(/*#__PURE__*/function () {
56323
- var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(_ref6) {
56369
+ var _ref9 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(_ref8) {
56324
56370
  var media, ref, _yield$Promise$allSet3, _yield$Promise$allSet4, mediaItemRes, refRes, item, _media$metadata, payload, refDoc, _media$metadata2;
56325
- return _regeneratorRuntime.wrap(function _callee3$(_context3) {
56326
- while (1) switch (_context3.prev = _context3.next) {
56371
+ return _regeneratorRuntime.wrap(function _callee4$(_context4) {
56372
+ while (1) switch (_context4.prev = _context4.next) {
56327
56373
  case 0:
56328
- media = _ref6.media, ref = _ref6.ref;
56374
+ media = _ref8.media, ref = _ref8.ref;
56329
56375
  if (ref) {
56330
- _context3.next = 3;
56376
+ _context4.next = 3;
56331
56377
  break;
56332
56378
  }
56333
- return _context3.abrupt("return");
56379
+ return _context4.abrupt("return");
56334
56380
  case 3:
56335
- _context3.next = 5;
56381
+ _context4.next = 5;
56336
56382
  return Promise.allSettled([fetchJson("".concat(baseUrl, "/v1/mediaitemref/").concat(encodeURIComponent(ref), "/mediaitem"), jwt), fetchJson("".concat(baseUrl, "/v1/mediaitems/refs?filter=").concat(encodeURIComponent("{_id,eq,'".concat(ref, "'}"))), jwt)]);
56337
56383
  case 5:
56338
- _yield$Promise$allSet3 = _context3.sent;
56384
+ _yield$Promise$allSet3 = _context4.sent;
56339
56385
  _yield$Promise$allSet4 = _slicedToArray(_yield$Promise$allSet3, 2);
56340
56386
  mediaItemRes = _yield$Promise$allSet4[0];
56341
56387
  refRes = _yield$Promise$allSet4[1];
@@ -56355,23 +56401,23 @@ function _fetchProductMedia() {
56355
56401
  }
56356
56402
  case 11:
56357
56403
  case "end":
56358
- return _context3.stop();
56404
+ return _context4.stop();
56359
56405
  }
56360
- }, _callee3);
56406
+ }, _callee4);
56361
56407
  }));
56362
- return function (_x12) {
56363
- return _ref7.apply(this, arguments);
56408
+ return function (_x13) {
56409
+ return _ref9.apply(this, arguments);
56364
56410
  };
56365
56411
  }()));
56366
56412
  case 42:
56367
- return _context4.abrupt("return", result.map(function (r) {
56413
+ return _context5.abrupt("return", result.map(function (r) {
56368
56414
  return r.media;
56369
56415
  }));
56370
56416
  case 43:
56371
56417
  case "end":
56372
- return _context4.stop();
56418
+ return _context5.stop();
56373
56419
  }
56374
- }, _callee4, null, [[12, 34, 37, 40]]);
56420
+ }, _callee5, null, [[12, 34, 37, 40]]);
56375
56421
  }));
56376
56422
  return _fetchProductMedia.apply(this, arguments);
56377
56423
  }
@@ -56387,47 +56433,47 @@ function resolveMediaItem(_x8, _x9, _x10, _x11) {
56387
56433
  * session hook can call them without depending on the currently-loaded job.
56388
56434
  */
56389
56435
  function _resolveMediaItem() {
56390
- _resolveMediaItem = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(baseUrl, jwt, mediaItemId, mediaItemRef) {
56436
+ _resolveMediaItem = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(baseUrl, jwt, mediaItemId, mediaItemRef) {
56391
56437
  var item, media, _item, _media;
56392
- return _regeneratorRuntime.wrap(function _callee5$(_context5) {
56393
- while (1) switch (_context5.prev = _context5.next) {
56438
+ return _regeneratorRuntime.wrap(function _callee6$(_context6) {
56439
+ while (1) switch (_context6.prev = _context6.next) {
56394
56440
  case 0:
56395
56441
  if (!mediaItemRef) {
56396
- _context5.next = 7;
56442
+ _context6.next = 7;
56397
56443
  break;
56398
56444
  }
56399
- _context5.next = 3;
56445
+ _context6.next = 3;
56400
56446
  return fetchJson("".concat(baseUrl, "/v1/mediaitemref/").concat(encodeURIComponent(mediaItemRef), "/mediaitem"), jwt);
56401
56447
  case 3:
56402
- item = _context5.sent;
56448
+ item = _context6.sent;
56403
56449
  media = toMedia(item);
56404
56450
  if (!media) {
56405
- _context5.next = 7;
56451
+ _context6.next = 7;
56406
56452
  break;
56407
56453
  }
56408
- return _context5.abrupt("return", media);
56454
+ return _context6.abrupt("return", media);
56409
56455
  case 7:
56410
56456
  if (!mediaItemId) {
56411
- _context5.next = 14;
56457
+ _context6.next = 14;
56412
56458
  break;
56413
56459
  }
56414
- _context5.next = 10;
56460
+ _context6.next = 10;
56415
56461
  return fetchJson("".concat(baseUrl, "/v1/mediaitems/").concat(encodeURIComponent(mediaItemId)), jwt);
56416
56462
  case 10:
56417
- _item = _context5.sent;
56463
+ _item = _context6.sent;
56418
56464
  _media = toMedia(_item);
56419
56465
  if (!_media) {
56420
- _context5.next = 14;
56466
+ _context6.next = 14;
56421
56467
  break;
56422
56468
  }
56423
- return _context5.abrupt("return", _media);
56469
+ return _context6.abrupt("return", _media);
56424
56470
  case 14:
56425
- return _context5.abrupt("return", null);
56471
+ return _context6.abrupt("return", null);
56426
56472
  case 15:
56427
56473
  case "end":
56428
- return _context5.stop();
56474
+ return _context6.stop();
56429
56475
  }
56430
- }, _callee5);
56476
+ }, _callee6);
56431
56477
  }));
56432
56478
  return _resolveMediaItem.apply(this, arguments);
56433
56479
  }
@@ -56472,21 +56518,21 @@ function useRenderJobData(id, refreshKey) {
56472
56518
  setError(undefined);
56473
56519
  setJob(undefined);
56474
56520
  setImages({});
56475
- _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
56476
- var _fetchedJob$realTimeR, fetchedJob, left, initialSlides, mediaItemId, mediaItemRef, productId, rightPromise, productPromise, _yield$Promise$allSet, _yield$Promise$allSet2, rightResult, productResult, right, _rightResult$value, _rightResult$reason, productMedia, _productResult$reason, renderImageUrls, productByUrl, _iterator, _step, m, renderImageSet, remainingProduct, leftSlides, renderImageSlides, previewAfter, _message, message;
56477
- return _regeneratorRuntime.wrap(function _callee$(_context) {
56478
- while (1) switch (_context.prev = _context.next) {
56521
+ _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
56522
+ var _fetchedJob$realTimeR, fetchedJob, left, initialSlides, mediaItemId, mediaItemRef, productId, rightPromise, productPromise, _yield$Promise$allSet, _yield$Promise$allSet2, rightResult, productResult, right, _rightResult$value, _rightResult$reason, productMedia, _productResult$reason, renderImages, productByUrl, _iterator, _step, m, renderImageSet, remainingProduct, leftSlides, renderImageSlides, previewAfter, _message, message;
56523
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
56524
+ while (1) switch (_context2.prev = _context2.next) {
56479
56525
  case 0:
56480
- _context.prev = 0;
56481
- _context.next = 3;
56526
+ _context2.prev = 0;
56527
+ _context2.next = 3;
56482
56528
  return fetchJson("".concat(baseUrl, "/renderjobs/").concat(encodeURIComponent(id)), jwt);
56483
56529
  case 3:
56484
- fetchedJob = _context.sent;
56530
+ fetchedJob = _context2.sent;
56485
56531
  if (!cancelled) {
56486
- _context.next = 6;
56532
+ _context2.next = 6;
56487
56533
  break;
56488
56534
  }
56489
- return _context.abrupt("return");
56535
+ return _context2.abrupt("return");
56490
56536
  case 6:
56491
56537
  setJob(fetchedJob);
56492
56538
 
@@ -56508,18 +56554,18 @@ function useRenderJobData(id, refreshKey) {
56508
56554
  // failure cannot block the right panel and vice versa.
56509
56555
  rightPromise = mediaItemId || mediaItemRef ? resolveMediaItem(baseUrl, jwt, mediaItemId, mediaItemRef) : Promise.resolve(null);
56510
56556
  productPromise = catalogService && typeof productId === 'string' && productId.length > 0 ? fetchProductMedia(catalogService, baseUrl, jwt, productId, left.url) : Promise.resolve([]);
56511
- _context.next = 17;
56557
+ _context2.next = 17;
56512
56558
  return Promise.allSettled([rightPromise, productPromise]);
56513
56559
  case 17:
56514
- _yield$Promise$allSet = _context.sent;
56560
+ _yield$Promise$allSet = _context2.sent;
56515
56561
  _yield$Promise$allSet2 = _slicedToArray(_yield$Promise$allSet, 2);
56516
56562
  rightResult = _yield$Promise$allSet2[0];
56517
56563
  productResult = _yield$Promise$allSet2[1];
56518
56564
  if (!cancelled) {
56519
- _context.next = 23;
56565
+ _context2.next = 23;
56520
56566
  break;
56521
56567
  }
56522
- return _context.abrupt("return");
56568
+ return _context2.abrupt("return");
56523
56569
  case 23:
56524
56570
  if (rightResult.status === 'fulfilled') {
56525
56571
  right = (_rightResult$value = rightResult.value) !== null && _rightResult$value !== void 0 ? _rightResult$value : {
@@ -56545,8 +56591,8 @@ function useRenderJobData(id, refreshKey) {
56545
56591
  // The realtime preview is shown first only when there are no renderImages;
56546
56592
  // once renderImages exist it comes right after them, and only if it is
56547
56593
  // not already one of them.
56548
- renderImageUrls = Array.isArray(fetchedJob === null || fetchedJob === void 0 ? void 0 : fetchedJob.renderImages) ? fetchedJob.renderImages.filter(function (u) {
56549
- return typeof u === 'string' && u.length > 0;
56594
+ renderImages = Array.isArray(fetchedJob === null || fetchedJob === void 0 ? void 0 : fetchedJob.renderImages) ? fetchedJob.renderImages.filter(function (image) {
56595
+ return typeof (image === null || image === void 0 ? void 0 : image.url) === 'string' && image.url.length > 0;
56550
56596
  }) : [];
56551
56597
  productByUrl = new Map();
56552
56598
  _iterator = _createForOfIteratorHelper$9(productMedia);
@@ -56560,16 +56606,24 @@ function useRenderJobData(id, refreshKey) {
56560
56606
  } finally {
56561
56607
  _iterator.f();
56562
56608
  }
56563
- renderImageSet = new Set(renderImageUrls);
56609
+ renderImageSet = new Set(renderImages.map(function (image) {
56610
+ return image.url;
56611
+ }));
56564
56612
  remainingProduct = productMedia.filter(function (m) {
56565
56613
  return !(m.url && renderImageSet.has(m.url));
56566
56614
  });
56567
- if (renderImageUrls.length > 0) {
56568
- renderImageSlides = renderImageUrls.map(function (url) {
56615
+ if (renderImages.length > 0) {
56616
+ // Product media (rich metadata) wins on url match; otherwise build a
56617
+ // minimal slide that carries the stored MediaItemRef id so uploaded
56618
+ // images keep their ref when re-selected.
56619
+ renderImageSlides = renderImages.map(function (_ref6) {
56569
56620
  var _productByUrl$get;
56621
+ var url = _ref6.url,
56622
+ mediaItemRefId = _ref6.mediaItemRefId;
56570
56623
  return url === left.url ? left : (_productByUrl$get = productByUrl.get(url)) !== null && _productByUrl$get !== void 0 ? _productByUrl$get : {
56571
56624
  url: url,
56572
- mediaType: 'PCT'
56625
+ mediaType: 'PCT',
56626
+ mediaItemRefId: mediaItemRefId
56573
56627
  };
56574
56628
  });
56575
56629
  previewAfter = left.url != null && !renderImageSet.has(left.url) ? [left] : [];
@@ -56577,49 +56631,183 @@ function useRenderJobData(id, refreshKey) {
56577
56631
  } else {
56578
56632
  leftSlides = [left].concat(_toConsumableArray(remainingProduct));
56579
56633
  }
56634
+
56635
+ // Uploaded AI input images are not part of the product media, so their
56636
+ // display name (filename) is resolved from the MediaItemRef (best-effort).
56637
+ _context2.next = 35;
56638
+ return Promise.all(leftSlides.map(/*#__PURE__*/function () {
56639
+ var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(slide) {
56640
+ var item;
56641
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
56642
+ while (1) switch (_context.prev = _context.next) {
56643
+ case 0:
56644
+ if (!(slide.name || !slide.mediaItemRefId)) {
56645
+ _context.next = 2;
56646
+ break;
56647
+ }
56648
+ return _context.abrupt("return");
56649
+ case 2:
56650
+ _context.prev = 2;
56651
+ _context.next = 5;
56652
+ return fetchJson("".concat(baseUrl, "/v1/mediaitemref/").concat(encodeURIComponent(slide.mediaItemRefId), "/mediaitem"), jwt);
56653
+ case 5:
56654
+ item = _context.sent;
56655
+ if (typeof (item === null || item === void 0 ? void 0 : item.name) === 'string' && item.name.length > 0) slide.name = item.name;
56656
+ _context.next = 11;
56657
+ break;
56658
+ case 9:
56659
+ _context.prev = 9;
56660
+ _context.t0 = _context["catch"](2);
56661
+ case 11:
56662
+ case "end":
56663
+ return _context.stop();
56664
+ }
56665
+ }, _callee, null, [[2, 9]]);
56666
+ }));
56667
+ return function (_x12) {
56668
+ return _ref7.apply(this, arguments);
56669
+ };
56670
+ }()));
56671
+ case 35:
56672
+ if (!cancelled) {
56673
+ _context2.next = 37;
56674
+ break;
56675
+ }
56676
+ return _context2.abrupt("return");
56677
+ case 37:
56580
56678
  setImages({
56581
56679
  left: left,
56582
56680
  leftSlides: leftSlides,
56583
56681
  right: right
56584
56682
  });
56585
- _context.next = 43;
56683
+ _context2.next = 47;
56586
56684
  break;
56587
- case 36:
56588
- _context.prev = 36;
56589
- _context.t0 = _context["catch"](0);
56685
+ case 40:
56686
+ _context2.prev = 40;
56687
+ _context2.t0 = _context2["catch"](0);
56590
56688
  if (!cancelled) {
56591
- _context.next = 40;
56689
+ _context2.next = 44;
56592
56690
  break;
56593
56691
  }
56594
- return _context.abrupt("return");
56595
- case 40:
56596
- message = (_message = _context.t0 === null || _context.t0 === void 0 ? void 0 : _context.t0.message) !== null && _message !== void 0 ? _message : 'Unknown error';
56692
+ return _context2.abrupt("return");
56693
+ case 44:
56694
+ message = (_message = _context2.t0 === null || _context2.t0 === void 0 ? void 0 : _context2.t0.message) !== null && _message !== void 0 ? _message : 'Unknown error';
56597
56695
  LOG$4.error(new DivaError("Failed to load render job ".concat(id, ": ").concat(message), {
56598
56696
  code: 'RENDERAPPROVE_LOAD_JOB'
56599
56697
  }));
56600
56698
  setError(message);
56601
- case 43:
56602
- _context.prev = 43;
56699
+ case 47:
56700
+ _context2.prev = 47;
56603
56701
  if (!cancelled) setLoading(false);
56604
- return _context.finish(43);
56605
- case 46:
56702
+ return _context2.finish(47);
56703
+ case 50:
56606
56704
  case "end":
56607
- return _context.stop();
56705
+ return _context2.stop();
56608
56706
  }
56609
- }, _callee, null, [[0, 36, 43, 46]]);
56707
+ }, _callee2, null, [[0, 40, 47, 50]]);
56610
56708
  }))();
56611
56709
  return function () {
56612
56710
  cancelled = true;
56613
56711
  };
56614
56712
  }, [id, baseUrl, catalogService, jwt, t, refreshKey]);
56713
+ var applyRenderImages = useCallback(function (renderImages) {
56714
+ setJob(function (prev) {
56715
+ return prev ? _objectSpread$g(_objectSpread$g({}, prev), {}, {
56716
+ renderImages: renderImages
56717
+ }) : prev;
56718
+ });
56719
+ }, []);
56615
56720
  return useMemo(function () {
56616
56721
  return {
56617
56722
  job: job,
56618
56723
  images: images,
56619
56724
  loading: loading,
56620
- error: error
56725
+ error: error,
56726
+ applyRenderImages: applyRenderImages
56727
+ };
56728
+ }, [job, images, loading, error, applyRenderImages]);
56729
+ }
56730
+
56731
+ /**
56732
+ * Uploads an image as a MediaItem/MediaItemRef (same asset pipeline as the
56733
+ * regular RenderApprove upload) and appends it to the render job's
56734
+ * `renderImages` so it becomes one of the AI input images. Unlike
56735
+ * `useUploadRenderJobImage` it does not touch `mediaItemRef`/`fileUrl` or change
56736
+ * the render job state - the job stays in the image-selection phase.
56737
+ */
56738
+ function useUploadRenderImage() {
56739
+ var _root$configurationSt, _root$configurationSt2, _root$dataStore$jwt;
56740
+ var root = useStore();
56741
+ var baseUrl = (_root$configurationSt = (_root$configurationSt2 = root.configurationStore.apiConfig) === null || _root$configurationSt2 === void 0 ? void 0 : _root$configurationSt2.mediaService) !== null && _root$configurationSt !== void 0 ? _root$configurationSt : '';
56742
+ var jwt = (_root$dataStore$jwt = root.dataStore.jwt) !== null && _root$dataStore$jwt !== void 0 ? _root$dataStore$jwt : '';
56743
+ var patchJob = useUpdateRenderJobPatch();
56744
+ var _useState = useState(false),
56745
+ _useState2 = _slicedToArray(_useState, 2),
56746
+ uploading = _useState2[0],
56747
+ setUploading = _useState2[1];
56748
+ var _useState3 = useState(null),
56749
+ _useState4 = _slicedToArray(_useState3, 2),
56750
+ error = _useState4[0],
56751
+ setError = _useState4[1];
56752
+ var upload = useCallback(/*#__PURE__*/function () {
56753
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(file, job) {
56754
+ var _job$organization, _job$renderImages, result, newImage, renderImages, op, err;
56755
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
56756
+ while (1) switch (_context.prev = _context.next) {
56757
+ case 0:
56758
+ setUploading(true);
56759
+ setError(null);
56760
+ _context.prev = 2;
56761
+ _context.next = 5;
56762
+ return uploadMediaItem(baseUrl, jwt, {
56763
+ organizationId: (_job$organization = job.organization) !== null && _job$organization !== void 0 ? _job$organization : '',
56764
+ file: file,
56765
+ mediaType: 'PCT',
56766
+ functionType: 'SHO'
56767
+ });
56768
+ case 5:
56769
+ result = _context.sent;
56770
+ newImage = {
56771
+ mediaItemRefId: result.ref._id,
56772
+ url: result.ref.url
56773
+ };
56774
+ renderImages = [].concat(_toConsumableArray((_job$renderImages = job.renderImages) !== null && _job$renderImages !== void 0 ? _job$renderImages : []), [newImage]); // RFC 6902: `add` is rejected when the path already exists, so replace
56775
+ // when the job already carries a renderImages list.
56776
+ op = job.renderImages === undefined ? 'add' : 'replace';
56777
+ _context.next = 11;
56778
+ return patchJob(job._id, [{
56779
+ op: op,
56780
+ path: '/renderImages',
56781
+ value: renderImages
56782
+ }], true);
56783
+ case 11:
56784
+ _context.next = 18;
56785
+ break;
56786
+ case 13:
56787
+ _context.prev = 13;
56788
+ _context.t0 = _context["catch"](2);
56789
+ err = _context.t0;
56790
+ setError(err);
56791
+ throw err;
56792
+ case 18:
56793
+ _context.prev = 18;
56794
+ setUploading(false);
56795
+ return _context.finish(18);
56796
+ case 21:
56797
+ case "end":
56798
+ return _context.stop();
56799
+ }
56800
+ }, _callee, null, [[2, 13, 18, 21]]);
56801
+ }));
56802
+ return function (_x, _x2) {
56803
+ return _ref.apply(this, arguments);
56621
56804
  };
56622
- }, [job, images, loading, error]);
56805
+ }(), [baseUrl, jwt, patchJob]);
56806
+ return {
56807
+ upload: upload,
56808
+ uploading: uploading,
56809
+ error: error
56810
+ };
56623
56811
  }
56624
56812
 
56625
56813
  /** Return `false` when the shortcut should not run (e.g. modal open) so default browser behavior is preserved. */
@@ -56746,7 +56934,7 @@ function focusBackConfirmButton(button) {
56746
56934
  ok === null || ok === void 0 || ok.focus();
56747
56935
  }
56748
56936
  function RenderApprove() {
56749
- var _data$job, _data$job2, _data$images$right2, _data$images$right3, _data$images$leftSlid, _data$job3, _data$job4, _imageFullscreen$name;
56937
+ var _data$job, _data$job2, _data$images$right2, _data$images$right3, _data$images$leftSlid, _data$job3, _data$job4, _data$job5, _imageFullscreen$name;
56750
56938
  var store = useStore();
56751
56939
  var navigate = useNavigate();
56752
56940
  var _useTranslation = useTranslation(),
@@ -56788,10 +56976,16 @@ function RenderApprove() {
56788
56976
  _useState16 = _slicedToArray(_useState15, 2),
56789
56977
  uploadOpen = _useState16[0],
56790
56978
  setUploadOpen = _useState16[1];
56791
- var _useState17 = useState(0),
56979
+ var _useState17 = useState(false),
56792
56980
  _useState18 = _slicedToArray(_useState17, 2),
56793
- dataRefreshKey = _useState18[0],
56794
- setDataRefreshKey = _useState18[1];
56981
+ selectionUploadOpen = _useState18[0],
56982
+ setSelectionUploadOpen = _useState18[1];
56983
+ var _useUploadRenderImage = useUploadRenderImage(),
56984
+ uploadRenderImage = _useUploadRenderImage.upload;
56985
+ var _useState19 = useState(0),
56986
+ _useState20 = _slicedToArray(_useState19, 2),
56987
+ dataRefreshKey = _useState20[0],
56988
+ setDataRefreshKey = _useState20[1];
56795
56989
  var data = useRenderJobData(session.currentId, dataRefreshKey);
56796
56990
  var leftSwiperRef = useRef(null);
56797
56991
  var isAiJob = typeof ((_data$job = data.job) === null || _data$job === void 0 ? void 0 : _data$job.engine) === 'string' && data.job.engine.trim().toLowerCase() === 'ai';
@@ -56800,7 +56994,7 @@ function RenderApprove() {
56800
56994
  // side-by-side comparison view is shown as before.
56801
56995
  var showImageSelector = isAiJob && typeof ((_data$job2 = data.job) === null || _data$job2 === void 0 ? void 0 : _data$job2.state) === 'number' && data.job.state < RENDER_JOB_STATE.inChecking;
56802
56996
  var mode = showImageSelector ? 'select' : 'approve';
56803
- var shortcutItems = buildShortcutItems(mode, isAiJob);
56997
+ var shortcutItems = buildShortcutItems(mode, isAiJob && !showImageSelector);
56804
56998
  // On the finish screen `data.job` is gone, so `showImageSelector` flips to
56805
56999
  // false. Latch whether this session ran in image-selector mode (sessions are
56806
57000
  // homogeneous) so header/finish-screen stay consistent across that screen.
@@ -57121,10 +57315,10 @@ function RenderApprove() {
57121
57315
  };
57122
57316
 
57123
57317
  // Persists the ordered selection of input images on the render job. The
57124
- // `renderImages` array (CDN urls, in order) is the source of truth the AI
57125
- // generation consumes.
57318
+ // `renderImages` array (CDN url + MediaItemRef id, in order) is the source of
57319
+ // truth the AI generation consumes.
57126
57320
  var persistImageSelection = /*#__PURE__*/function () {
57127
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(orderedUrls) {
57321
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(renderImages) {
57128
57322
  var op;
57129
57323
  return _regeneratorRuntime.wrap(function _callee4$(_context4) {
57130
57324
  while (1) switch (_context4.prev = _context4.next) {
@@ -57135,30 +57329,33 @@ function RenderApprove() {
57135
57329
  }
57136
57330
  return _context4.abrupt("return");
57137
57331
  case 2:
57332
+ // Optimistically update the in-memory job so re-renders (and a subsequent
57333
+ // upload) use this order instead of snapping back to the last fetched one.
57334
+ data.applyRenderImages(renderImages);
57138
57335
  // RFC 6902: `add` is rejected when the path already exists (AI jobs often
57139
57336
  // ship with a default renderImages list), so replace when it's present.
57140
57337
  op = data.job.renderImages === undefined ? 'add' : 'replace';
57141
- _context4.prev = 3;
57142
- _context4.next = 6;
57338
+ _context4.prev = 4;
57339
+ _context4.next = 7;
57143
57340
  return updateRenderJobPatch(data.job._id, [{
57144
57341
  op: op,
57145
57342
  path: '/renderImages',
57146
- value: orderedUrls
57343
+ value: renderImages
57147
57344
  }]);
57148
- case 6:
57149
- _context4.next = 11;
57345
+ case 7:
57346
+ _context4.next = 12;
57150
57347
  break;
57151
- case 8:
57152
- _context4.prev = 8;
57153
- _context4.t0 = _context4["catch"](3);
57348
+ case 9:
57349
+ _context4.prev = 9;
57350
+ _context4.t0 = _context4["catch"](4);
57154
57351
  message.error(t('backoffice.renderapprove.aiImageSelector.saveFailed', {
57155
57352
  defaultValue: 'Bildauswahl konnte nicht gespeichert werden.'
57156
57353
  }));
57157
- case 11:
57354
+ case 12:
57158
57355
  case "end":
57159
57356
  return _context4.stop();
57160
57357
  }
57161
- }, _callee4, null, [[3, 8]]);
57358
+ }, _callee4, null, [[4, 9]]);
57162
57359
  }));
57163
57360
  return function persistImageSelection(_x2) {
57164
57361
  return _ref3.apply(this, arguments);
@@ -57295,12 +57492,18 @@ function RenderApprove() {
57295
57492
  promptActionBusy: promptRestarting,
57296
57493
  onPromptRestart: onPromptRestart,
57297
57494
  promptWarningMessage: !showImageSelector ? t('backoffice.renderapprove.prompt.warningMessage') : undefined,
57495
+ hidePrompt: showImageSelector,
57298
57496
  children: showImageSelector && data.job ? /*#__PURE__*/jsx(ImageSelectionWorkspace, {
57299
57497
  job: data.job,
57300
- slides: (_data$images$leftSlid = data.images.leftSlides) !== null && _data$images$leftSlid !== void 0 ? _data$images$leftSlid : [],
57498
+ slides: ((_data$images$leftSlid = data.images.leftSlides) !== null && _data$images$leftSlid !== void 0 ? _data$images$leftSlid : []).filter(function (slide) {
57499
+ return slide.mediaType !== 'AR';
57500
+ }),
57301
57501
  selectionDisabled: session.isCurrentReadOnly || session.isUpdating,
57302
57502
  onSelectionChange: persistImageSelection,
57303
57503
  onOpenFullscreen: setImageFullscreen,
57504
+ onUpload: function onUpload() {
57505
+ return setSelectionUploadOpen(true);
57506
+ },
57304
57507
  actionDisabled: data.loading || !data.job,
57305
57508
  busy: session.isUpdating || promptRestarting,
57306
57509
  isFirst: session.isFirst,
@@ -57353,6 +57556,21 @@ function RenderApprove() {
57353
57556
  return k + 1;
57354
57557
  });
57355
57558
  }
57559
+ }), /*#__PURE__*/jsx(UploadImageModal, {
57560
+ open: selectionUploadOpen,
57561
+ renderJob: (_data$job5 = data.job) !== null && _data$job5 !== void 0 ? _data$job5 : null,
57562
+ uploadOverride: uploadRenderImage,
57563
+ skipValidation: true,
57564
+ allowedExtensions: ['webp', 'png', 'jpg', 'jpeg'],
57565
+ onClose: function onClose() {
57566
+ return setSelectionUploadOpen(false);
57567
+ },
57568
+ onSuccess: function onSuccess() {
57569
+ setSelectionUploadOpen(false);
57570
+ setDataRefreshKey(function (k) {
57571
+ return k + 1;
57572
+ });
57573
+ }
57356
57574
  }), /*#__PURE__*/jsx(FullscreenViewer, {
57357
57575
  open: fullscreenSide !== null,
57358
57576
  media: fullscreenMedia,
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/ui/Table/BaseTable/cellRenderer/MediaViewerCell/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAMxC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,GAAG,CAAC;QACZ,UAAU,iBAAiB;YACzB,cAAc,EAAE,GAAG,CAAC;SACrB;KACF;CACF;AAED,MAAM,CAAC,OAAO,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,kBAAkB,qBAqFhE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/ui/Table/BaseTable/cellRenderer/MediaViewerCell/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAMxC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,GAAG,CAAC;QACZ,UAAU,iBAAiB;YACzB,cAAc,EAAE,GAAG,CAAC;SACrB;KACF;CACF;AAED,MAAM,CAAC,OAAO,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,kBAAkB,qBAuFhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/AIImageSelector/components/SortableImageRow/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,UAAU,KAAK;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,kBAAkB,CAAC;IAC1B,iFAAiF;IACjF,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAcD,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,KAAK,qBA2DxI"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/AIImageSelector/components/SortableImageRow/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,UAAU,KAAK;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,kBAAkB,CAAC;IAC1B,iFAAiF;IACjF,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAcD,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,KAAK,qBAmDxI"}
@@ -1,13 +1,13 @@
1
1
  import React from 'react';
2
- import { RenderApproveMedia } from '../../../../types';
2
+ import { RenderApproveMedia, RenderImage } from '../../../../types';
3
3
  interface Props {
4
4
  /** All available images (realtime preview + product media), order as loaded. */
5
5
  slides: RenderApproveMedia[];
6
6
  /** Persisted order/selection from the render job `renderImages` (CDN urls). */
7
7
  selectedUrls?: string[];
8
8
  disabled?: boolean;
9
- /** Fires with the ordered list of selected image urls on every user change. */
10
- onChange?: (orderedUrls: string[]) => void;
9
+ /** Fires with the ordered list of selected images (CDN url + MediaItemRef id) on every user change. */
10
+ onChange?: (orderedImages: RenderImage[]) => void;
11
11
  /** Opens an image in fullscreen (double-click on its thumbnail). */
12
12
  onOpenFullscreen?: (media: RenderApproveMedia) => void;
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/AIImageSelector/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAYvD,UAAU,KAAK;IACb,gFAAgF;IAChF,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3C,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACxD;AAoCD;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,KAAK,4BA+E5G"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/AIImageSelector/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAYpE,UAAU,KAAK;IACb,gFAAgF;IAChF,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uGAAuG;IACvG,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAClD,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACxD;AAoCD;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,KAAK,4BA+E5G"}
@@ -1,12 +1,13 @@
1
1
  import React from 'react';
2
2
  import { ShortcutItem } from '../ShortcutLegend';
3
- import { RenderApproveMedia, RenderJob } from '../../../../types';
3
+ import { RenderApproveMedia, RenderImage, RenderJob } from '../../../../types';
4
4
  interface Props {
5
5
  job: RenderJob;
6
6
  slides: RenderApproveMedia[];
7
7
  selectionDisabled?: boolean;
8
- onSelectionChange: (orderedUrls: string[]) => void;
8
+ onSelectionChange: (orderedImages: RenderImage[]) => void;
9
9
  onOpenFullscreen: (media: RenderApproveMedia) => void;
10
+ onUpload?: () => void;
10
11
  actionDisabled?: boolean;
11
12
  busy?: boolean;
12
13
  isFirst?: boolean;
@@ -19,6 +20,6 @@ interface Props {
19
20
  * product images sent to the AI. The action bar only carries navigation - no
20
21
  * approve / reject / upload, since there is nothing to decide yet.
21
22
  */
22
- export default function ImageSelectionWorkspace({ job, slides, selectionDisabled, onSelectionChange, onOpenFullscreen, actionDisabled, busy, isFirst, shortcutItems, onPrev, onNext, }: Props): React.JSX.Element;
23
+ export default function ImageSelectionWorkspace({ job, slides, selectionDisabled, onSelectionChange, onOpenFullscreen, onUpload, actionDisabled, busy, isFirst, shortcutItems, onPrev, onNext, }: Props): React.JSX.Element;
23
24
  export {};
24
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/ImageSelectionWorkspace/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAElE,UAAU,KAAK;IACb,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnD,gBAAgB,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACtD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAAC,EAC9C,GAAG,EACH,MAAM,EACN,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,IAAI,EACJ,OAAO,EACP,aAAa,EACb,MAAM,EACN,MAAM,GACP,EAAE,KAAK,qBAcP"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/ImageSelectionWorkspace/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE/E,UAAU,KAAK;IACb,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAC1D,gBAAgB,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACtD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAAC,EAC9C,GAAG,EACH,MAAM,EACN,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,QAAQ,EACR,cAAc,EACd,IAAI,EACJ,OAAO,EACP,aAAa,EACb,MAAM,EACN,MAAM,GACP,EAAE,KAAK,qBAoBP"}
@@ -13,8 +13,10 @@ interface Props {
13
13
  onPromptRestart?: (nextPrompt: string) => Promise<void>;
14
14
  /** Whether saving the prompt restarts the render production (shows a warning). */
15
15
  promptWarningMessage?: string;
16
+ /** Hides the prompt view/button entirely (e.g. during the image-selection phase). */
17
+ hidePrompt?: boolean;
16
18
  children: React.ReactNode;
17
19
  }
18
- export default function MetadataPanel({ job, fileSize, mediaType, detailsOpen, onDetailsOpenChange, promptOpen, onPromptOpenChange, promptActionDisabled, promptActionBusy, onPromptRestart, promptWarningMessage, children, }: Props): React.JSX.Element;
20
+ export default function MetadataPanel({ job, fileSize, mediaType, detailsOpen, onDetailsOpenChange, promptOpen, onPromptOpenChange, promptActionDisabled, promptActionBusy, onPromptRestart, promptWarningMessage, hidePrompt, children, }: Props): React.JSX.Element;
19
21
  export {};
20
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/MetadataPanel/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAM5D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAsC9C,UAAU,KAAK;IACb,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAgHD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,GAAG,EACH,QAAQ,EACR,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,UAAU,EACV,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,QAAQ,GACT,EAAE,KAAK,qBA4VP"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/MetadataPanel/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAM5D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAsC9C,UAAU,KAAK;IACb,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qFAAqF;IACrF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAgHD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,GAAG,EACH,QAAQ,EACR,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,UAAU,EACV,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,UAAU,EACV,QAAQ,GACT,EAAE,KAAK,qBA4VP"}
@@ -1,9 +1,11 @@
1
- import { RenderApproveImages, RenderJob } from '../../../types';
1
+ import { RenderApproveImages, RenderImage, RenderJob } from '../../../types';
2
2
  interface UseRenderJobDataResult {
3
3
  job?: RenderJob;
4
4
  images: RenderApproveImages;
5
5
  loading: boolean;
6
6
  error?: string;
7
+ /** Optimistically updates the in-memory job's renderImages (after persisting a reorder/selection) so re-renders don't snap back to the last fetched order. */
8
+ applyRenderImages: (renderImages: RenderImage[]) => void;
7
9
  }
8
10
  /**
9
11
  * Loads the render job by id together with the left (real-time render) and
@@ -1 +1 @@
1
- {"version":3,"file":"useRenderJobData.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/hooks/useRenderJobData.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAsB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIpF,UAAU,sBAAsB;IAC9B,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAgJD;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAuHjG"}
1
+ {"version":3,"file":"useRenderJobData.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/hooks/useRenderJobData.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAsB,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIjG,UAAU,sBAAsB;IAC9B,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8JAA8J;IAC9J,iBAAiB,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;CAC1D;AAmJD;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,sBAAsB,CA6IjG"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAiE3D,MAAM,CAAC,OAAO,UAAU,aAAa,sBAkfpC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAkE3D,MAAM,CAAC,OAAO,UAAU,aAAa,sBAqgBpC"}
@@ -5,7 +5,17 @@ interface Props {
5
5
  renderJob: RenderJob | null;
6
6
  onClose: () => void;
7
7
  onSuccess?: () => void;
8
+ /**
9
+ * Custom upload handler. When provided it replaces the default
10
+ * (replace-final-render) upload - used by the image-selection phase to append
11
+ * the uploaded image to `renderImages` instead.
12
+ */
13
+ uploadOverride?: (file: File, job: RenderJob) => Promise<void>;
14
+ /** Skip the render-job format/resolution deviation validation (no warnings). */
15
+ skipValidation?: boolean;
16
+ /** Restrict selectable file extensions (e.g. ['webp','png','jpg','jpeg']). Defaults to any image. */
17
+ allowedExtensions?: string[];
8
18
  }
9
- export default function UploadImageModal({ open, renderJob, onClose, onSuccess }: Props): React.JSX.Element;
19
+ export default function UploadImageModal({ open, renderJob, onClose, onSuccess, uploadOverride, skipValidation, allowedExtensions }: Props): React.JSX.Element;
10
20
  export {};
11
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/ui/TableRenderJobs/components/UploadImageModal/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAIxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,KAAK,qBA8GtF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/ui/TableRenderJobs/components/UploadImageModal/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAIxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,gFAAgF;IAChF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qGAAqG;IACrG,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,EAAE,KAAK,qBA+HzI"}
@@ -0,0 +1,14 @@
1
+ import { RenderJob } from '../types';
2
+ /**
3
+ * Uploads an image as a MediaItem/MediaItemRef (same asset pipeline as the
4
+ * regular RenderApprove upload) and appends it to the render job's
5
+ * `renderImages` so it becomes one of the AI input images. Unlike
6
+ * `useUploadRenderJobImage` it does not touch `mediaItemRef`/`fileUrl` or change
7
+ * the render job state - the job stays in the image-selection phase.
8
+ */
9
+ export default function useUploadRenderImage(): {
10
+ upload: (file: File, job: RenderJob) => Promise<void>;
11
+ uploading: boolean;
12
+ error: Error | null;
13
+ };
14
+ //# sourceMappingURL=useUploadRenderImage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUploadRenderImage.d.ts","sourceRoot":"","sources":["../../../../../../../src/ui/TableRenderJobs/hooks/useUploadRenderImage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB;mBAU3B,IAAI,OAAO,SAAS,KAAG,OAAO,CAAC,IAAI,CAAC;;;EA6BpD"}
@@ -5,6 +5,11 @@ export interface TableRenderJobsConfiguration extends BaseModulConfiguration {
5
5
  export interface RenderApproveConfiguration extends BaseModulConfiguration {
6
6
  type: 'RenderApprove';
7
7
  }
8
+ /** One AI input image: its CDN url and (when known) the originating MediaItemRef id. */
9
+ export interface RenderImage {
10
+ mediaItemRefId?: string;
11
+ url: string;
12
+ }
8
13
  /**
9
14
  * Subset of the render job payload returned by `GET /renderjobs/:id`
10
15
  * that the RenderApprove session actually uses. Extra fields from the API
@@ -36,8 +41,8 @@ export interface RenderJob {
36
41
  id: string;
37
42
  viewpointName?: string;
38
43
  }[];
39
- /** Ordered list of CDN urls sent to the AI as input images. */
40
- renderImages?: string[];
44
+ /** Ordered list of input images sent to the AI, each with its CDN url and (when known) its MediaItemRef id. */
45
+ renderImages?: RenderImage[];
41
46
  created?: number;
42
47
  [key: string]: any;
43
48
  }
@@ -56,8 +61,10 @@ export interface RenderApproveMedia {
56
61
  mimeType?: string;
57
62
  /** File size in bytes, if provided by the MediaItem. */
58
63
  fileSize?: number;
59
- /** MediaItem / MediaItemRef id, if resolved from a media record. */
64
+ /** MediaItem / MediaItemRef id, if resolved from a media record. May be a MediaItem id, so do NOT treat as a ref. */
60
65
  id?: string;
66
+ /** MediaItemRef id, set only when the slide genuinely originates from a MediaItemRef (never a MediaItem id). */
67
+ mediaItemRefId?: string;
61
68
  /** Display name of the underlying MediaItem / MediaItemRef. */
62
69
  name?: string;
63
70
  /** Free-form metadata dictionary of the MediaItem / MediaItemRef. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/TableRenderJobs/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,4BAA6B,SAAQ,sBAAsB;IAC1E,IAAI,EAAE,iBAAiB,CAAC;CACzB;AACD,MAAM,WAAW,0BAA2B,SAAQ,sBAAsB;IACxE,IAAI,EAAE,eAAe,CAAC;CACvB;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjE,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,gFAAgF;IAChF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAClC,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/TableRenderJobs/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,4BAA6B,SAAQ,sBAAsB;IAC1E,IAAI,EAAE,iBAAiB,CAAC;CACzB;AACD,MAAM,WAAW,0BAA2B,SAAQ,sBAAsB;IACxE,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,wFAAwF;AACxF,MAAM,WAAW,WAAW;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjE,+GAA+G;IAC/G,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qHAAqH;IACrH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gHAAgH;IAChH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,gFAAgF;IAChF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAClC,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crystaldesign/diva-backoffice",
3
- "version": "26.7.0-rc.1",
3
+ "version": "26.7.0-rc.10",
4
4
  "license": "COMMERCIAL",
5
5
  "devDependencies": {
6
6
  "@testing-library/jest-dom": "^6.5.0",
@@ -15,13 +15,13 @@
15
15
  "dependencies": {
16
16
  "@ant-design/icons": "6.1.0",
17
17
  "@babel/runtime": "7.24.7",
18
- "@crystaldesign/content-box": "26.7.0-rc.1",
19
- "@crystaldesign/content-item": "26.7.0-rc.1",
20
- "@crystaldesign/diva-core": "26.7.0-rc.1",
21
- "@crystaldesign/diva-utils": "26.7.0-rc.1",
22
- "@crystaldesign/media-upload": "26.7.0-rc.1",
23
- "@crystaldesign/rtf-editor": "26.7.0-rc.1",
24
- "@crystaldesign/spreadsheet": "26.7.0-rc.1",
18
+ "@crystaldesign/content-box": "26.7.0-rc.10",
19
+ "@crystaldesign/content-item": "26.7.0-rc.10",
20
+ "@crystaldesign/diva-core": "26.7.0-rc.10",
21
+ "@crystaldesign/diva-utils": "26.7.0-rc.10",
22
+ "@crystaldesign/media-upload": "26.7.0-rc.10",
23
+ "@crystaldesign/rtf-editor": "26.7.0-rc.10",
24
+ "@crystaldesign/spreadsheet": "26.7.0-rc.10",
25
25
  "@dnd-kit/core": "^6.1.0",
26
26
  "@dnd-kit/sortable": "^8.0.0",
27
27
  "@dnd-kit/utilities": "^3.2.2",
@@ -56,5 +56,5 @@
56
56
  },
57
57
  "module": "build/esm/index.js",
58
58
  "types": "./build/types/backoffice/src/index.d.ts",
59
- "gitHead": "6d0514803ba76cc244ff9ee925a5be8a872cd5e4"
59
+ "gitHead": "c56ae3ee23df841518756bd4f0c4a6b73fd4660b"
60
60
  }