@crystaldesign/diva-backoffice 26.9.0-rc.6 → 26.9.0-rc.8

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 (18) hide show
  1. package/build/esm/index.js +345 -259
  2. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/ApprovalWorkspace/index.d.ts +1 -2
  3. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/ApprovalWorkspace/index.d.ts.map +1 -1
  4. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/FullscreenViewer/index.d.ts.map +1 -1
  5. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/ImagePanel/index.d.ts +2 -2
  6. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/ImagePanel/index.d.ts.map +1 -1
  7. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/LeftSlider/index.d.ts +1 -2
  8. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/LeftSlider/index.d.ts.map +1 -1
  9. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/SideBySideViewer/index.d.ts +1 -2
  10. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/components/SideBySideViewer/index.d.ts.map +1 -1
  11. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/hooks/useRenderJobData.d.ts +6 -0
  12. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/hooks/useRenderJobData.d.ts.map +1 -1
  13. package/build/types/backoffice/src/ui/TableRenderJobs/components/RenderApprove/index.d.ts.map +1 -1
  14. package/build/types/backoffice/src/ui/TableRenderJobs/types.d.ts +2 -0
  15. package/build/types/backoffice/src/ui/TableRenderJobs/types.d.ts.map +1 -1
  16. package/build/types/backoffice/src/ui/TableRenderJobs/utils.d.ts +14 -0
  17. package/build/types/backoffice/src/ui/TableRenderJobs/utils.d.ts.map +1 -0
  18. package/package.json +9 -9
@@ -54530,6 +54530,30 @@ function SessionHeader(_ref) {
54530
54530
  });
54531
54531
  }
54532
54532
 
54533
+ /** Mime types of images a browser cannot render in an `<img>` element. */
54534
+ var NON_RENDERABLE_MIME_TYPES = new Set(['image/tiff', 'image/tif']);
54535
+
54536
+ /**
54537
+ * Resolves the url a browser can actually display for a media entry.
54538
+ *
54539
+ * Render jobs with `fileFormat: 'tif'` produce TIFF results, which no browser
54540
+ * renders natively. The storage generates PNG variants for them, so the `big`
54541
+ * variant (falling back to `gal`, then the thumbnail) is displayed instead of
54542
+ * the raw `cdnUrl`. Mirrors the handling in the media item table cells.
54543
+ *
54544
+ * @param media the media entry to resolve, may be undefined while loading
54545
+ * @returns the displayable url, or `null` when no renderable source exists
54546
+ */
54547
+ function getViewerUrl(media) {
54548
+ var _media$url;
54549
+ if (!media) return null;
54550
+ if (media.mimeType && NON_RENDERABLE_MIME_TYPES.has(media.mimeType.toLowerCase())) {
54551
+ var _ref, _ref2, _ref3, _media$variants$big, _media$variants, _media$variants2, _media$variants3;
54552
+ return (_ref = (_ref2 = (_ref3 = (_media$variants$big = (_media$variants = media.variants) === null || _media$variants === void 0 ? void 0 : _media$variants.big) !== null && _media$variants$big !== void 0 ? _media$variants$big : (_media$variants2 = media.variants) === null || _media$variants2 === void 0 ? void 0 : _media$variants2.gal) !== null && _ref3 !== void 0 ? _ref3 : (_media$variants3 = media.variants) === null || _media$variants3 === void 0 ? void 0 : _media$variants3.std) !== null && _ref2 !== void 0 ? _ref2 : media.thumbnailUrl) !== null && _ref !== void 0 ? _ref : null;
54553
+ }
54554
+ return (_media$url = media.url) !== null && _media$url !== void 0 ? _media$url : null;
54555
+ }
54556
+
54533
54557
  var root$8 = "root-bbDdW";
54534
54558
  var header$1 = "header--owh8";
54535
54559
  var content$1 = "content-q2m1c";
@@ -54545,10 +54569,8 @@ function isAr$1(media) {
54545
54569
  return (media === null || media === void 0 ? void 0 : media.mediaType) === 'AR';
54546
54570
  }
54547
54571
  function ImagePanel(_ref) {
54548
- var _media$url;
54549
54572
  var title = _ref.title,
54550
54573
  media = _ref.media,
54551
- loading = _ref.loading,
54552
54574
  alt = _ref.alt,
54553
54575
  onOpenFullscreen = _ref.onOpenFullscreen,
54554
54576
  headerActions = _ref.headerActions;
@@ -54560,20 +54582,22 @@ function ImagePanel(_ref) {
54560
54582
  _useState2 = _slicedToArray(_useState, 2),
54561
54583
  status = _useState2[0],
54562
54584
  setStatus = _useState2[1];
54585
+ // TIFF results are not renderable in an <img>, so a PNG variant is shown instead.
54586
+ var viewerUrl = getViewerUrl(media);
54563
54587
  useEffect(function () {
54564
54588
  if (isAr$1(media)) {
54565
54589
  void actions.loadModelViewer();
54566
54590
  }
54567
- }, [actions, media === null || media === void 0 ? void 0 : media.url, media === null || media === void 0 ? void 0 : media.mediaType]);
54591
+ }, [actions, viewerUrl, media === null || media === void 0 ? void 0 : media.mediaType]);
54568
54592
  useEffect(function () {
54569
- if (typeof (media === null || media === void 0 ? void 0 : media.url) === 'string' && media.url.length > 0) {
54593
+ if (typeof viewerUrl === 'string' && viewerUrl.length > 0) {
54570
54594
  setStatus('loading');
54571
54595
  } else {
54572
54596
  setStatus('idle');
54573
54597
  }
54574
- }, [media === null || media === void 0 ? void 0 : media.url]);
54575
- var isResolving = loading || media === undefined;
54576
- var hasNoSource = !isResolving && ((media === null || media === void 0 ? void 0 : media.url) === null || (media === null || media === void 0 ? void 0 : media.url) === '' || (media === null || media === void 0 ? void 0 : media.url) === undefined);
54598
+ }, [viewerUrl]);
54599
+ var isResolving = media === undefined;
54600
+ var hasNoSource = !isResolving && (viewerUrl === null || viewerUrl === '');
54577
54601
  var showAr = !isResolving && !hasNoSource && isAr$1(media);
54578
54602
  var showImage = !isResolving && !hasNoSource && !showAr;
54579
54603
  var showPlaceholder = hasNoSource || showImage && status === 'error';
@@ -54602,13 +54626,13 @@ function ImagePanel(_ref) {
54602
54626
  }), headerActions]
54603
54627
  }), /*#__PURE__*/jsxs("div", {
54604
54628
  className: classNames(content$1, showAr ? contentAr : contentImage),
54605
- children: [showAr && (media === null || media === void 0 ? void 0 : media.url) &&
54629
+ children: [showAr && viewerUrl &&
54606
54630
  /*#__PURE__*/
54607
54631
  // Size is applied inline because model-viewer is a custom element
54608
54632
  // and className forwarding can be inconsistent with CSS modules in
54609
54633
  // some React/web-component integrations.
54610
54634
  jsx("model-viewer", {
54611
- src: media.url,
54635
+ src: viewerUrl,
54612
54636
  alt: alt !== null && alt !== void 0 ? alt : title,
54613
54637
  "camera-controls": true,
54614
54638
  "touch-action": "pan-y",
@@ -54622,8 +54646,8 @@ function ImagePanel(_ref) {
54622
54646
  minHeight: 320,
54623
54647
  display: 'block'
54624
54648
  }
54625
- }, media.url), showImage && /*#__PURE__*/jsx("img", {
54626
- src: (_media$url = media === null || media === void 0 ? void 0 : media.url) !== null && _media$url !== void 0 ? _media$url : undefined,
54649
+ }, viewerUrl), showImage && /*#__PURE__*/jsx("img", {
54650
+ src: viewerUrl !== null && viewerUrl !== void 0 ? viewerUrl : undefined,
54627
54651
  alt: alt !== null && alt !== void 0 ? alt : title,
54628
54652
  onLoad: function onLoad() {
54629
54653
  return setStatus('loaded');
@@ -54660,7 +54684,6 @@ styleInject(css_248z$l);
54660
54684
  */
54661
54685
  function LeftSlider(_ref) {
54662
54686
  var slides = _ref.slides,
54663
- loading = _ref.loading,
54664
54687
  onOpenFullscreenFirst = _ref.onOpenFullscreenFirst,
54665
54688
  onSwiperInit = _ref.onSwiperInit;
54666
54689
  var _useTranslation = useTranslation(),
@@ -54699,7 +54722,6 @@ function LeftSlider(_ref) {
54699
54722
  children: /*#__PURE__*/jsx(ImagePanel, {
54700
54723
  title: title,
54701
54724
  media: media,
54702
- loading: loading,
54703
54725
  alt: alt,
54704
54726
  onOpenFullscreen: isPreview ? onOpenFullscreenFirst : undefined
54705
54727
  })
@@ -54725,7 +54747,6 @@ styleInject(css_248z$k);
54725
54747
  function SideBySideViewer(_ref) {
54726
54748
  var _images$leftSlides;
54727
54749
  var images = _ref.images,
54728
- loading = _ref.loading,
54729
54750
  readonlyDecision = _ref.readonlyDecision,
54730
54751
  onOpenFullscreenLeft = _ref.onOpenFullscreenLeft,
54731
54752
  onOpenFullscreenRight = _ref.onOpenFullscreenRight,
@@ -54780,19 +54801,16 @@ function SideBySideViewer(_ref) {
54780
54801
  className: viewerPanels,
54781
54802
  children: [useSwiper ? /*#__PURE__*/jsx(LeftSlider, {
54782
54803
  slides: slides,
54783
- loading: loading,
54784
54804
  onOpenFullscreenFirst: showOverlay ? undefined : onOpenFullscreenLeft,
54785
54805
  onSwiperInit: onLeftSwiperInit
54786
54806
  }) : /*#__PURE__*/jsx(ImagePanel, {
54787
54807
  title: t('backoffice.renderapprove.viewer.previewTitle'),
54788
54808
  media: images.left,
54789
- loading: loading,
54790
54809
  alt: t('backoffice.renderapprove.viewer.previewAlt'),
54791
54810
  onOpenFullscreen: showOverlay ? undefined : onOpenFullscreenLeft
54792
54811
  }), /*#__PURE__*/jsx(ImagePanel, {
54793
54812
  title: t('backoffice.renderapprove.viewer.resultTitle'),
54794
54813
  media: images.right,
54795
- loading: loading,
54796
54814
  alt: t('backoffice.renderapprove.viewer.resultAlt'),
54797
54815
  onOpenFullscreen: showOverlay ? undefined : onOpenFullscreenRight,
54798
54816
  headerActions: resultHeaderActions
@@ -54968,7 +54986,6 @@ function ActionBar(_ref) {
54968
54986
  */
54969
54987
  function ApprovalWorkspace(_ref) {
54970
54988
  var images = _ref.images,
54971
- loading = _ref.loading,
54972
54989
  readonlyDecision = _ref.readonlyDecision,
54973
54990
  onOpenFullscreenLeft = _ref.onOpenFullscreenLeft,
54974
54991
  onOpenFullscreenRight = _ref.onOpenFullscreenRight,
@@ -54987,7 +55004,6 @@ function ApprovalWorkspace(_ref) {
54987
55004
  return /*#__PURE__*/jsxs(Fragment, {
54988
55005
  children: [/*#__PURE__*/jsx(SideBySideViewer, {
54989
55006
  images: images,
54990
- loading: loading,
54991
55007
  readonlyDecision: readonlyDecision,
54992
55008
  onOpenFullscreenLeft: onOpenFullscreenLeft,
54993
55009
  onOpenFullscreenRight: onOpenFullscreenRight,
@@ -57120,7 +57136,6 @@ function isAr(media) {
57120
57136
  return (media === null || media === void 0 ? void 0 : media.mediaType) === 'AR';
57121
57137
  }
57122
57138
  function FullscreenViewer(_ref) {
57123
- var _media$url;
57124
57139
  var open = _ref.open,
57125
57140
  media = _ref.media,
57126
57141
  title = _ref.title,
@@ -57130,12 +57145,21 @@ function FullscreenViewer(_ref) {
57130
57145
  var _useTranslation = useTranslation(),
57131
57146
  t = _useTranslation.t;
57132
57147
  var ar = isAr(media);
57148
+ // TIFF results are not renderable in an <img>, so a PNG variant is shown instead.
57149
+ var viewerUrl = getViewerUrl(media);
57150
+ var _useState = useState(false),
57151
+ _useState2 = _slicedToArray(_useState, 2),
57152
+ failed = _useState2[0],
57153
+ setFailed = _useState2[1];
57133
57154
  useEffect(function () {
57134
57155
  if (open && ar) {
57135
57156
  void actions.loadModelViewer();
57136
57157
  }
57137
57158
  }, [actions, ar, open]);
57138
- var hasSource = typeof (media === null || media === void 0 ? void 0 : media.url) === 'string' && media.url.length > 0;
57159
+ useEffect(function () {
57160
+ setFailed(false);
57161
+ }, [viewerUrl]);
57162
+ var hasSource = typeof viewerUrl === 'string' && viewerUrl.length > 0;
57139
57163
  return /*#__PURE__*/jsxs(Modal$2, {
57140
57164
  open: open,
57141
57165
  onCancel: onClose,
@@ -57148,15 +57172,15 @@ function FullscreenViewer(_ref) {
57148
57172
  destroyOnHidden: true,
57149
57173
  centered: true,
57150
57174
  wrapClassName: fullscreenModal,
57151
- children: [!hasSource && /*#__PURE__*/jsx(Empty, {
57175
+ children: [(!hasSource || failed) && /*#__PURE__*/jsx(Empty, {
57152
57176
  description: t('backoffice.renderapprove.errors.imageNotAvailable'),
57153
57177
  image: Empty.PRESENTED_IMAGE_SIMPLE
57154
- }), hasSource && ar && (media === null || media === void 0 ? void 0 : media.url) &&
57178
+ }), hasSource && ar && viewerUrl &&
57155
57179
  /*#__PURE__*/
57156
57180
  // model-viewer is a custom element. Inline sizing keeps rendering
57157
57181
  // stable even when className forwarding to web components varies.
57158
57182
  jsx("model-viewer", {
57159
- src: media.url,
57183
+ src: viewerUrl,
57160
57184
  alt: title !== null && title !== void 0 ? title : t('backoffice.renderapprove.viewer.fullscreenModelAlt'),
57161
57185
  "camera-controls": true,
57162
57186
  "touch-action": "pan-y",
@@ -57169,10 +57193,13 @@ function FullscreenViewer(_ref) {
57169
57193
  height: '100%',
57170
57194
  display: 'block'
57171
57195
  }
57172
- }, media.url), hasSource && !ar && /*#__PURE__*/jsx("img", {
57173
- src: (_media$url = media === null || media === void 0 ? void 0 : media.url) !== null && _media$url !== void 0 ? _media$url : undefined,
57196
+ }, viewerUrl), hasSource && !ar && !failed && /*#__PURE__*/jsx("img", {
57197
+ src: viewerUrl !== null && viewerUrl !== void 0 ? viewerUrl : undefined,
57174
57198
  alt: title !== null && title !== void 0 ? title : t('backoffice.renderapprove.viewer.fullscreenPreviewAlt'),
57175
- className: image
57199
+ className: image,
57200
+ onError: function onError() {
57201
+ return setFailed(true);
57202
+ }
57176
57203
  })]
57177
57204
  });
57178
57205
  }
@@ -58484,12 +58511,12 @@ function fetchJson(_x, _x2) {
58484
58511
  return _fetchJson.apply(this, arguments);
58485
58512
  }
58486
58513
  function _fetchJson() {
58487
- _fetchJson = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(url, jwt) {
58514
+ _fetchJson = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(url, jwt) {
58488
58515
  var response;
58489
- return _regeneratorRuntime.wrap(function _callee3$(_context3) {
58490
- while (1) switch (_context3.prev = _context3.next) {
58516
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
58517
+ while (1) switch (_context2.prev = _context2.next) {
58491
58518
  case 0:
58492
- _context3.next = 2;
58519
+ _context2.next = 2;
58493
58520
  return fetch(url, {
58494
58521
  headers: _objectSpread$h({
58495
58522
  'Content-Type': 'application/json'
@@ -58498,24 +58525,24 @@ function _fetchJson() {
58498
58525
  } : {})
58499
58526
  });
58500
58527
  case 2:
58501
- response = _context3.sent;
58528
+ response = _context2.sent;
58502
58529
  if (response.ok) {
58503
- _context3.next = 5;
58530
+ _context2.next = 5;
58504
58531
  break;
58505
58532
  }
58506
58533
  throw new DivaError("Request failed: ".concat(response.status, " ").concat(response.statusText), {
58507
58534
  code: 'RENDERAPPROVE_FETCH_FAILED'
58508
58535
  });
58509
58536
  case 5:
58510
- _context3.next = 7;
58537
+ _context2.next = 7;
58511
58538
  return response.json();
58512
58539
  case 7:
58513
- return _context3.abrupt("return", _context3.sent);
58540
+ return _context2.abrupt("return", _context2.sent);
58514
58541
  case 8:
58515
58542
  case "end":
58516
- return _context3.stop();
58543
+ return _context2.stop();
58517
58544
  }
58518
- }, _callee3);
58545
+ }, _callee2);
58519
58546
  }));
58520
58547
  return _fetchJson.apply(this, arguments);
58521
58548
  }
@@ -58532,7 +58559,8 @@ function toMedia(item) {
58532
58559
  fileSize: typeof item.fileSize === 'number' ? item.fileSize : undefined,
58533
58560
  id: (_item$_id = item._id) !== null && _item$_id !== void 0 ? _item$_id : item.id,
58534
58561
  name: typeof item.name === 'string' ? item.name : undefined,
58535
- metadata: item.metadata && _typeof(item.metadata) === 'object' ? item.metadata : undefined
58562
+ metadata: item.metadata && _typeof(item.metadata) === 'object' ? item.metadata : undefined,
58563
+ variants: item.variants && _typeof(item.variants) === 'object' ? item.variants : undefined
58536
58564
  };
58537
58565
  }
58538
58566
  var EXCLUDED_FUNCTION_TYPES = new Set(['LOG', 'OPV']);
@@ -58552,22 +58580,22 @@ function fetchProductMedia(_x3, _x4, _x5, _x6, _x7) {
58552
58580
  return _fetchProductMedia.apply(this, arguments);
58553
58581
  }
58554
58582
  function _fetchProductMedia() {
58555
- _fetchProductMedia = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(catalogService, baseUrl, jwt, productId, excludeUrl) {
58583
+ _fetchProductMedia = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(catalogService, baseUrl, jwt, productId, excludeUrl) {
58556
58584
  var data, product, media, sorted, seen, result, _iterator2, _step2, _mapped$metadata, item, mapped, ref;
58557
- return _regeneratorRuntime.wrap(function _callee5$(_context5) {
58558
- while (1) switch (_context5.prev = _context5.next) {
58585
+ return _regeneratorRuntime.wrap(function _callee4$(_context4) {
58586
+ while (1) switch (_context4.prev = _context4.next) {
58559
58587
  case 0:
58560
- _context5.next = 2;
58588
+ _context4.next = 2;
58561
58589
  return fetchJson("".concat(catalogService, "/v1/products/").concat(encodeURIComponent(productId), "/list"), jwt);
58562
58590
  case 2:
58563
- data = _context5.sent;
58591
+ data = _context4.sent;
58564
58592
  product = Array.isArray(data) ? data[0] : undefined;
58565
58593
  media = product === null || product === void 0 ? void 0 : product.media;
58566
58594
  if (!(!Array.isArray(media) || media.length === 0)) {
58567
- _context5.next = 7;
58595
+ _context4.next = 7;
58568
58596
  break;
58569
58597
  }
58570
- return _context5.abrupt("return", []);
58598
+ return _context4.abrupt("return", []);
58571
58599
  case 7:
58572
58600
  sorted = _toConsumableArray(media).sort(function (a, b) {
58573
58601
  var pa = typeof (a === null || a === void 0 ? void 0 : a.position) === 'number' ? a.position : Number.MAX_SAFE_INTEGER;
@@ -58578,38 +58606,38 @@ function _fetchProductMedia() {
58578
58606
  if (excludeUrl) seen.add(excludeUrl);
58579
58607
  result = [];
58580
58608
  _iterator2 = _createForOfIteratorHelper$b(sorted);
58581
- _context5.prev = 12;
58609
+ _context4.prev = 12;
58582
58610
  _iterator2.s();
58583
58611
  case 14:
58584
58612
  if ((_step2 = _iterator2.n()).done) {
58585
- _context5.next = 32;
58613
+ _context4.next = 32;
58586
58614
  break;
58587
58615
  }
58588
58616
  item = _step2.value;
58589
58617
  if (!(item !== null && item !== void 0 && item.functionType && EXCLUDED_FUNCTION_TYPES.has(item.functionType))) {
58590
- _context5.next = 18;
58618
+ _context4.next = 18;
58591
58619
  break;
58592
58620
  }
58593
- return _context5.abrupt("continue", 30);
58621
+ return _context4.abrupt("continue", 30);
58594
58622
  case 18:
58595
58623
  if (!(item !== null && item !== void 0 && item.mediaType && !ALLOWED_MEDIA_TYPES.has(item.mediaType))) {
58596
- _context5.next = 20;
58624
+ _context4.next = 20;
58597
58625
  break;
58598
58626
  }
58599
- return _context5.abrupt("continue", 30);
58627
+ return _context4.abrupt("continue", 30);
58600
58628
  case 20:
58601
58629
  mapped = toMedia(item);
58602
58630
  if (!(!mapped || !mapped.url)) {
58603
- _context5.next = 23;
58631
+ _context4.next = 23;
58604
58632
  break;
58605
58633
  }
58606
- return _context5.abrupt("continue", 30);
58634
+ return _context4.abrupt("continue", 30);
58607
58635
  case 23:
58608
58636
  if (!seen.has(mapped.url)) {
58609
- _context5.next = 25;
58637
+ _context4.next = 25;
58610
58638
  break;
58611
58639
  }
58612
- return _context5.abrupt("continue", 30);
58640
+ return _context4.abrupt("continue", 30);
58613
58641
  case 25:
58614
58642
  seen.add(mapped.url);
58615
58643
  ref = typeof (item === null || item === void 0 ? void 0 : item.ref) === 'string' ? item.ref : undefined;
@@ -58626,47 +58654,53 @@ function _fetchProductMedia() {
58626
58654
  ref: ref
58627
58655
  });
58628
58656
  case 30:
58629
- _context5.next = 14;
58657
+ _context4.next = 14;
58630
58658
  break;
58631
58659
  case 32:
58632
- _context5.next = 37;
58660
+ _context4.next = 37;
58633
58661
  break;
58634
58662
  case 34:
58635
- _context5.prev = 34;
58636
- _context5.t0 = _context5["catch"](12);
58637
- _iterator2.e(_context5.t0);
58663
+ _context4.prev = 34;
58664
+ _context4.t0 = _context4["catch"](12);
58665
+ _iterator2.e(_context4.t0);
58638
58666
  case 37:
58639
- _context5.prev = 37;
58667
+ _context4.prev = 37;
58640
58668
  _iterator2.f();
58641
- return _context5.finish(37);
58669
+ return _context4.finish(37);
58642
58670
  case 40:
58643
- _context5.next = 42;
58671
+ _context4.next = 42;
58644
58672
  return Promise.all(result.map(/*#__PURE__*/function () {
58645
- var _ref9 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(_ref8) {
58646
- var media, ref, _yield$Promise$allSet3, _yield$Promise$allSet4, mediaItemRes, refRes, item, _media$metadata, payload, refDoc, _media$metadata2;
58647
- return _regeneratorRuntime.wrap(function _callee4$(_context4) {
58648
- while (1) switch (_context4.prev = _context4.next) {
58673
+ var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(_ref7) {
58674
+ var media, ref, _yield$Promise$allSet, _yield$Promise$allSet2, mediaItemRes, refRes, _media$variants, _ref9, _item$thumbnailUrl2, _item$variants2, item, _media$metadata, payload, refDoc, _media$metadata2;
58675
+ return _regeneratorRuntime.wrap(function _callee3$(_context3) {
58676
+ while (1) switch (_context3.prev = _context3.next) {
58649
58677
  case 0:
58650
- media = _ref8.media, ref = _ref8.ref;
58678
+ media = _ref7.media, ref = _ref7.ref;
58651
58679
  if (ref) {
58652
- _context4.next = 3;
58680
+ _context3.next = 3;
58653
58681
  break;
58654
58682
  }
58655
- return _context4.abrupt("return");
58683
+ return _context3.abrupt("return");
58656
58684
  case 3:
58657
- _context4.next = 5;
58685
+ _context3.next = 5;
58658
58686
  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)]);
58659
58687
  case 5:
58660
- _yield$Promise$allSet3 = _context4.sent;
58661
- _yield$Promise$allSet4 = _slicedToArray(_yield$Promise$allSet3, 2);
58662
- mediaItemRes = _yield$Promise$allSet4[0];
58663
- refRes = _yield$Promise$allSet4[1];
58688
+ _yield$Promise$allSet = _context3.sent;
58689
+ _yield$Promise$allSet2 = _slicedToArray(_yield$Promise$allSet, 2);
58690
+ mediaItemRes = _yield$Promise$allSet2[0];
58691
+ refRes = _yield$Promise$allSet2[1];
58664
58692
  if (mediaItemRes.status === 'fulfilled') {
58665
58693
  item = mediaItemRes.value;
58666
58694
  if (item !== null && item !== void 0 && item.metadata && _typeof(item.metadata) === 'object') {
58667
58695
  media.metadata = _objectSpread$h(_objectSpread$h({}, (_media$metadata = media.metadata) !== null && _media$metadata !== void 0 ? _media$metadata : {}), item.metadata);
58668
58696
  }
58669
58697
  if ((!media.name || media.name.length === 0) && typeof (item === null || item === void 0 ? void 0 : item.name) === 'string') media.name = item.name;
58698
+ // The catalog entry carries no file information, so mime type, variants and
58699
+ // thumbnail come from the MediaItem - `getViewerUrl` needs mime type and
58700
+ // variants to show the PNG stand-in for a TIFF.
58701
+ if (!media.mimeType && typeof (item === null || item === void 0 ? void 0 : item.mimeType) === 'string') media.mimeType = item.mimeType;
58702
+ if (item !== null && item !== void 0 && item.variants && _typeof(item.variants) === 'object') media.variants = _objectSpread$h(_objectSpread$h({}, (_media$variants = media.variants) !== null && _media$variants !== void 0 ? _media$variants : {}), item.variants);
58703
+ if (!media.thumbnailUrl) media.thumbnailUrl = (_ref9 = (_item$thumbnailUrl2 = item === null || item === void 0 ? void 0 : item.thumbnailUrl) !== null && _item$thumbnailUrl2 !== void 0 ? _item$thumbnailUrl2 : item === null || item === void 0 || (_item$variants2 = item.variants) === null || _item$variants2 === void 0 ? void 0 : _item$variants2.gal) !== null && _ref9 !== void 0 ? _ref9 : null;
58670
58704
  }
58671
58705
  if (refRes.status === 'fulfilled') {
58672
58706
  payload = refRes.value;
@@ -58677,23 +58711,23 @@ function _fetchProductMedia() {
58677
58711
  }
58678
58712
  case 11:
58679
58713
  case "end":
58680
- return _context4.stop();
58714
+ return _context3.stop();
58681
58715
  }
58682
- }, _callee4);
58716
+ }, _callee3);
58683
58717
  }));
58684
- return function (_x13) {
58685
- return _ref9.apply(this, arguments);
58718
+ return function (_x15) {
58719
+ return _ref8.apply(this, arguments);
58686
58720
  };
58687
58721
  }()));
58688
58722
  case 42:
58689
- return _context5.abrupt("return", result.map(function (r) {
58723
+ return _context4.abrupt("return", result.map(function (r) {
58690
58724
  return r.media;
58691
58725
  }));
58692
58726
  case 43:
58693
58727
  case "end":
58694
- return _context5.stop();
58728
+ return _context4.stop();
58695
58729
  }
58696
- }, _callee5, null, [[12, 34, 37, 40]]);
58730
+ }, _callee4, null, [[12, 34, 37, 40]]);
58697
58731
  }));
58698
58732
  return _fetchProductMedia.apply(this, arguments);
58699
58733
  }
@@ -58702,58 +58736,184 @@ function resolveMediaItem(_x8, _x9, _x10, _x11) {
58702
58736
  }
58703
58737
 
58704
58738
  /**
58705
- * Loads the render job by id together with the left (real-time render) and
58706
- * right (resolved media item) images. Each id change cancels the previous
58707
- * fetch via an abort flag so stale responses cannot overwrite newer state.
58739
+ * Assembles the left swiper slides. The render job's `renderImages` (AI input
58740
+ * images, ordered) drive the order: each is resolved to the rich product media
58741
+ * when the url matches, to the preview, or to a minimal media otherwise (which
58742
+ * carries the stored MediaItemRef id so uploaded images keep their ref when
58743
+ * re-selected). Product media already represented by a renderImage is not shown
58744
+ * again (dedup by url). The realtime preview leads only when there are no
58745
+ * renderImages; once they exist it comes right after them, and only if it is
58746
+ * not already one of them.
58708
58747
  *
58709
- * State mutations (approve/reject) live in `useUpdateRenderJobState` so the
58710
- * session hook can call them without depending on the currently-loaded job.
58748
+ * Called with an empty `productMedia` it yields exactly the prefix of the final
58749
+ * list, so slides are only ever appended - never reordered - once the product
58750
+ * media arrives.
58711
58751
  */
58712
58752
  function _resolveMediaItem() {
58713
- _resolveMediaItem = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(baseUrl, jwt, mediaItemId, mediaItemRef) {
58753
+ _resolveMediaItem = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(baseUrl, jwt, mediaItemId, mediaItemRef) {
58714
58754
  var item, media, _item, _media;
58715
- return _regeneratorRuntime.wrap(function _callee6$(_context6) {
58716
- while (1) switch (_context6.prev = _context6.next) {
58755
+ return _regeneratorRuntime.wrap(function _callee5$(_context5) {
58756
+ while (1) switch (_context5.prev = _context5.next) {
58717
58757
  case 0:
58718
58758
  if (!mediaItemRef) {
58719
- _context6.next = 7;
58759
+ _context5.next = 7;
58720
58760
  break;
58721
58761
  }
58722
- _context6.next = 3;
58762
+ _context5.next = 3;
58723
58763
  return fetchJson("".concat(baseUrl, "/v1/mediaitemref/").concat(encodeURIComponent(mediaItemRef), "/mediaitem"), jwt);
58724
58764
  case 3:
58725
- item = _context6.sent;
58765
+ item = _context5.sent;
58726
58766
  media = toMedia(item);
58727
58767
  if (!media) {
58728
- _context6.next = 7;
58768
+ _context5.next = 7;
58729
58769
  break;
58730
58770
  }
58731
- return _context6.abrupt("return", media);
58771
+ return _context5.abrupt("return", media);
58732
58772
  case 7:
58733
58773
  if (!mediaItemId) {
58734
- _context6.next = 14;
58774
+ _context5.next = 14;
58735
58775
  break;
58736
58776
  }
58737
- _context6.next = 10;
58777
+ _context5.next = 10;
58738
58778
  return fetchJson("".concat(baseUrl, "/v1/mediaitems/").concat(encodeURIComponent(mediaItemId)), jwt);
58739
58779
  case 10:
58740
- _item = _context6.sent;
58780
+ _item = _context5.sent;
58741
58781
  _media = toMedia(_item);
58742
58782
  if (!_media) {
58743
- _context6.next = 14;
58783
+ _context5.next = 14;
58744
58784
  break;
58745
58785
  }
58746
- return _context6.abrupt("return", _media);
58786
+ return _context5.abrupt("return", _media);
58747
58787
  case 14:
58748
- return _context6.abrupt("return", null);
58788
+ return _context5.abrupt("return", null);
58749
58789
  case 15:
58750
58790
  case "end":
58751
- return _context6.stop();
58791
+ return _context5.stop();
58752
58792
  }
58753
- }, _callee6);
58793
+ }, _callee5);
58754
58794
  }));
58755
58795
  return _resolveMediaItem.apply(this, arguments);
58756
58796
  }
58797
+ function buildLeftSlides(left, renderImages, productMedia) {
58798
+ var renderImageUrls = new Set(renderImages.map(function (image) {
58799
+ return image.url;
58800
+ }));
58801
+ var remainingProduct = productMedia.filter(function (media) {
58802
+ return !(media.url && renderImageUrls.has(media.url));
58803
+ });
58804
+ if (renderImages.length === 0) return [left].concat(_toConsumableArray(remainingProduct));
58805
+ var productByUrl = new Map();
58806
+ var _iterator = _createForOfIteratorHelper$b(productMedia),
58807
+ _step;
58808
+ try {
58809
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
58810
+ var media = _step.value;
58811
+ if (media.url) productByUrl.set(media.url, media);
58812
+ }
58813
+ } catch (err) {
58814
+ _iterator.e(err);
58815
+ } finally {
58816
+ _iterator.f();
58817
+ }
58818
+ var renderImageSlides = renderImages.map(function (_ref5) {
58819
+ var _productByUrl$get;
58820
+ var url = _ref5.url,
58821
+ mediaItemRefId = _ref5.mediaItemRefId;
58822
+ return url === left.url ? left : (_productByUrl$get = productByUrl.get(url)) !== null && _productByUrl$get !== void 0 ? _productByUrl$get : {
58823
+ url: url,
58824
+ mediaType: 'PCT',
58825
+ mediaItemRefId: mediaItemRefId
58826
+ };
58827
+ });
58828
+ var previewAfter = left.url != null && !renderImageUrls.has(left.url) ? [left] : [];
58829
+ return [].concat(_toConsumableArray(renderImageSlides), previewAfter, _toConsumableArray(remainingProduct));
58830
+ }
58831
+
58832
+ /**
58833
+ * Uploaded AI input images are not part of the product media, so their display
58834
+ * name (filename) is resolved from the MediaItemRef (best-effort, per slide).
58835
+ * Returns the input array unchanged when there is nothing to resolve.
58836
+ */
58837
+ function withResolvedSlideNames(_x12, _x13, _x14) {
58838
+ return _withResolvedSlideNames.apply(this, arguments);
58839
+ }
58840
+ /**
58841
+ * Loads the render job by id together with the left (real-time render) and
58842
+ * right (resolved media item) images. Each id change cancels the previous
58843
+ * fetch via an abort flag so stale responses cannot overwrite newer state.
58844
+ *
58845
+ * Everything is revealed in stages, because a job switch otherwise shows
58846
+ * nothing until the slowest request of the whole chain is done: the preview and
58847
+ * the `renderImages` slides come straight from the job document, the result
58848
+ * image is one further request away, and only the product media (one catalog
58849
+ * call plus two media calls per image) and the slide names arrive late.
58850
+ *
58851
+ * State mutations (approve/reject) live in `useUpdateRenderJobState` so the
58852
+ * session hook can call them without depending on the currently-loaded job.
58853
+ */
58854
+ function _withResolvedSlideNames() {
58855
+ _withResolvedSlideNames = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee7(baseUrl, jwt, slides) {
58856
+ return _regeneratorRuntime.wrap(function _callee7$(_context7) {
58857
+ while (1) switch (_context7.prev = _context7.next) {
58858
+ case 0:
58859
+ if (slides.some(function (slide) {
58860
+ return !slide.name && slide.mediaItemRefId;
58861
+ })) {
58862
+ _context7.next = 2;
58863
+ break;
58864
+ }
58865
+ return _context7.abrupt("return", slides);
58866
+ case 2:
58867
+ return _context7.abrupt("return", Promise.all(slides.map(/*#__PURE__*/function () {
58868
+ var _ref10 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(slide) {
58869
+ var item;
58870
+ return _regeneratorRuntime.wrap(function _callee6$(_context6) {
58871
+ while (1) switch (_context6.prev = _context6.next) {
58872
+ case 0:
58873
+ if (!(slide.name || !slide.mediaItemRefId)) {
58874
+ _context6.next = 2;
58875
+ break;
58876
+ }
58877
+ return _context6.abrupt("return", slide);
58878
+ case 2:
58879
+ _context6.prev = 2;
58880
+ _context6.next = 5;
58881
+ return fetchJson("".concat(baseUrl, "/v1/mediaitemref/").concat(encodeURIComponent(slide.mediaItemRefId), "/mediaitem"), jwt);
58882
+ case 5:
58883
+ item = _context6.sent;
58884
+ if (!(typeof (item === null || item === void 0 ? void 0 : item.name) === 'string' && item.name.length > 0)) {
58885
+ _context6.next = 8;
58886
+ break;
58887
+ }
58888
+ return _context6.abrupt("return", _objectSpread$h(_objectSpread$h({}, slide), {}, {
58889
+ name: item.name
58890
+ }));
58891
+ case 8:
58892
+ _context6.next = 12;
58893
+ break;
58894
+ case 10:
58895
+ _context6.prev = 10;
58896
+ _context6.t0 = _context6["catch"](2);
58897
+ case 12:
58898
+ return _context6.abrupt("return", slide);
58899
+ case 13:
58900
+ case "end":
58901
+ return _context6.stop();
58902
+ }
58903
+ }, _callee6, null, [[2, 10]]);
58904
+ }));
58905
+ return function (_x16) {
58906
+ return _ref10.apply(this, arguments);
58907
+ };
58908
+ }())));
58909
+ case 3:
58910
+ case "end":
58911
+ return _context7.stop();
58912
+ }
58913
+ }, _callee7);
58914
+ }));
58915
+ return _withResolvedSlideNames.apply(this, arguments);
58916
+ }
58757
58917
  function useRenderJobData(id, refreshKey) {
58758
58918
  var _root$configurationSt, _root$configurationSt2;
58759
58919
  var root = useStore();
@@ -58795,21 +58955,21 @@ function useRenderJobData(id, refreshKey) {
58795
58955
  setError(undefined);
58796
58956
  setJob(undefined);
58797
58957
  setImages({});
58798
- _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
58799
- 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;
58800
- return _regeneratorRuntime.wrap(function _callee2$(_context2) {
58801
- while (1) switch (_context2.prev = _context2.next) {
58958
+ _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
58959
+ var _fetchedJob$realTimeR, fetchedJob, left, renderImages, leftSlides, mediaItemId, mediaItemRef, productId, rightTask, productTask, named, _message, message;
58960
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
58961
+ while (1) switch (_context.prev = _context.next) {
58802
58962
  case 0:
58803
- _context2.prev = 0;
58804
- _context2.next = 3;
58963
+ _context.prev = 0;
58964
+ _context.next = 3;
58805
58965
  return fetchJson("".concat(baseUrl, "/renderjobs/").concat(encodeURIComponent(id)), jwt);
58806
58966
  case 3:
58807
- fetchedJob = _context2.sent;
58967
+ fetchedJob = _context.sent;
58808
58968
  if (!cancelled) {
58809
- _context2.next = 6;
58969
+ _context.next = 6;
58810
58970
  break;
58811
58971
  }
58812
- return _context2.abrupt("return");
58972
+ return _context.abrupt("return");
58813
58973
  case 6:
58814
58974
  setJob(fetchedJob);
58815
58975
 
@@ -58819,169 +58979,97 @@ function useRenderJobData(id, refreshKey) {
58819
58979
  mediaType: 'PCT',
58820
58980
  isPreview: true
58821
58981
  };
58822
- initialSlides = [left];
58982
+ renderImages = Array.isArray(fetchedJob === null || fetchedJob === void 0 ? void 0 : fetchedJob.renderImages) ? fetchedJob.renderImages.filter(function (image) {
58983
+ return typeof (image === null || image === void 0 ? void 0 : image.url) === 'string' && image.url.length > 0;
58984
+ }) : []; // Stage 1: preview and AI input images are known from the job document.
58985
+ leftSlides = buildLeftSlides(left, renderImages, []);
58823
58986
  setImages({
58824
58987
  left: left,
58825
- leftSlides: initialSlides,
58988
+ leftSlides: leftSlides,
58826
58989
  right: undefined
58827
58990
  });
58828
58991
  mediaItemId = getMediaItemId(fetchedJob);
58829
58992
  mediaItemRef = fetchedJob === null || fetchedJob === void 0 ? void 0 : fetchedJob.mediaItemRef;
58830
58993
  productId = fetchedJob === null || fetchedJob === void 0 ? void 0 : fetchedJob.product; // Load right image and product media in parallel so a product fetch
58831
- // failure cannot block the right panel and vice versa.
58832
- rightPromise = mediaItemId || mediaItemRef ? resolveMediaItem(baseUrl, jwt, mediaItemId, mediaItemRef) : Promise.resolve(null);
58833
- productPromise = catalogService && typeof productId === 'string' && productId.length > 0 ? fetchProductMedia(catalogService, baseUrl, jwt, productId, left.url) : Promise.resolve([]);
58834
- _context2.next = 17;
58835
- return Promise.allSettled([rightPromise, productPromise]);
58836
- case 17:
58837
- _yield$Promise$allSet = _context2.sent;
58838
- _yield$Promise$allSet2 = _slicedToArray(_yield$Promise$allSet, 2);
58839
- rightResult = _yield$Promise$allSet2[0];
58840
- productResult = _yield$Promise$allSet2[1];
58841
- if (!cancelled) {
58842
- _context2.next = 23;
58843
- break;
58844
- }
58845
- return _context2.abrupt("return");
58846
- case 23:
58847
- if (rightResult.status === 'fulfilled') {
58848
- right = (_rightResult$value = rightResult.value) !== null && _rightResult$value !== void 0 ? _rightResult$value : {
58849
- url: null
58850
- };
58851
- } else {
58852
- LOG$5.warn("Could not resolve right image for job ".concat(id, ": ").concat((_rightResult$reason = rightResult.reason) === null || _rightResult$reason === void 0 ? void 0 : _rightResult$reason.message));
58853
- right = {
58854
- url: null
58855
- };
58856
- }
58857
- productMedia = [];
58858
- if (productResult.status === 'fulfilled') {
58859
- productMedia = productResult.value;
58860
- } else {
58861
- LOG$5.warn("Could not load product media for job ".concat(id, ": ").concat((_productResult$reason = productResult.reason) === null || _productResult$reason === void 0 ? void 0 : _productResult$reason.message));
58862
- }
58863
-
58864
- // The render job's `renderImages` (AI input images, ordered) drive the
58865
- // slide order: each is resolved to the rich product media when the url
58866
- // matches, to the preview, or a minimal media otherwise. Product media
58867
- // already represented by a renderImage is not shown again (dedup by url).
58868
- // The realtime preview is shown first only when there are no renderImages;
58869
- // once renderImages exist it comes right after them, and only if it is
58870
- // not already one of them.
58871
- renderImages = Array.isArray(fetchedJob === null || fetchedJob === void 0 ? void 0 : fetchedJob.renderImages) ? fetchedJob.renderImages.filter(function (image) {
58872
- return typeof (image === null || image === void 0 ? void 0 : image.url) === 'string' && image.url.length > 0;
58873
- }) : [];
58874
- productByUrl = new Map();
58875
- _iterator = _createForOfIteratorHelper$b(productMedia);
58876
- try {
58877
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
58878
- m = _step.value;
58879
- if (m.url) productByUrl.set(m.url, m);
58880
- }
58881
- } catch (err) {
58882
- _iterator.e(err);
58883
- } finally {
58884
- _iterator.f();
58885
- }
58886
- renderImageSet = new Set(renderImages.map(function (image) {
58887
- return image.url;
58888
- }));
58889
- remainingProduct = productMedia.filter(function (m) {
58890
- return !(m.url && renderImageSet.has(m.url));
58994
+ // failure cannot block the right panel and vice versa - and publish
58995
+ // each of them on its own, so the result image is never held back by
58996
+ // the (much slower) product media fan-out.
58997
+ rightTask = (mediaItemId || mediaItemRef ? resolveMediaItem(baseUrl, jwt, mediaItemId, mediaItemRef) : Promise.resolve(null))["catch"](function (reason) {
58998
+ LOG$5.warn("Could not resolve right image for job ".concat(id, ": ").concat(reason === null || reason === void 0 ? void 0 : reason.message));
58999
+ return null;
59000
+ }).then(function (right) {
59001
+ if (cancelled) return;
59002
+ // The result image is on screen, so the decision actions are released here.
59003
+ setImages(function (prev) {
59004
+ return _objectSpread$h(_objectSpread$h({}, prev), {}, {
59005
+ right: right !== null && right !== void 0 ? right : {
59006
+ url: null
59007
+ }
59008
+ });
59009
+ });
59010
+ setLoading(false);
58891
59011
  });
58892
- if (renderImages.length > 0) {
58893
- // Product media (rich metadata) wins on url match; otherwise build a
58894
- // minimal slide that carries the stored MediaItemRef id so uploaded
58895
- // images keep their ref when re-selected.
58896
- renderImageSlides = renderImages.map(function (_ref6) {
58897
- var _productByUrl$get;
58898
- var url = _ref6.url,
58899
- mediaItemRefId = _ref6.mediaItemRefId;
58900
- return url === left.url ? left : (_productByUrl$get = productByUrl.get(url)) !== null && _productByUrl$get !== void 0 ? _productByUrl$get : {
58901
- url: url,
58902
- mediaType: 'PCT',
58903
- mediaItemRefId: mediaItemRefId
58904
- };
59012
+ productTask = (catalogService && typeof productId === 'string' && productId.length > 0 ? fetchProductMedia(catalogService, baseUrl, jwt, productId, left.url) : Promise.resolve([]))["catch"](function (reason) {
59013
+ LOG$5.warn("Could not load product media for job ".concat(id, ": ").concat(reason === null || reason === void 0 ? void 0 : reason.message));
59014
+ return [];
59015
+ }).then(function (productMedia) {
59016
+ if (cancelled || productMedia.length === 0) return;
59017
+ leftSlides = buildLeftSlides(left, renderImages, productMedia);
59018
+ setImages(function (prev) {
59019
+ return _objectSpread$h(_objectSpread$h({}, prev), {}, {
59020
+ leftSlides: leftSlides
59021
+ });
58905
59022
  });
58906
- previewAfter = left.url != null && !renderImageSet.has(left.url) ? [left] : [];
58907
- leftSlides = [].concat(_toConsumableArray(renderImageSlides), previewAfter, _toConsumableArray(remainingProduct));
58908
- } else {
58909
- leftSlides = [left].concat(_toConsumableArray(remainingProduct));
58910
- }
58911
-
58912
- // Uploaded AI input images are not part of the product media, so their
58913
- // display name (filename) is resolved from the MediaItemRef (best-effort).
58914
- _context2.next = 35;
58915
- return Promise.all(leftSlides.map(/*#__PURE__*/function () {
58916
- var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(slide) {
58917
- var item;
58918
- return _regeneratorRuntime.wrap(function _callee$(_context) {
58919
- while (1) switch (_context.prev = _context.next) {
58920
- case 0:
58921
- if (!(slide.name || !slide.mediaItemRefId)) {
58922
- _context.next = 2;
58923
- break;
58924
- }
58925
- return _context.abrupt("return");
58926
- case 2:
58927
- _context.prev = 2;
58928
- _context.next = 5;
58929
- return fetchJson("".concat(baseUrl, "/v1/mediaitemref/").concat(encodeURIComponent(slide.mediaItemRefId), "/mediaitem"), jwt);
58930
- case 5:
58931
- item = _context.sent;
58932
- if (typeof (item === null || item === void 0 ? void 0 : item.name) === 'string' && item.name.length > 0) slide.name = item.name;
58933
- _context.next = 11;
58934
- break;
58935
- case 9:
58936
- _context.prev = 9;
58937
- _context.t0 = _context["catch"](2);
58938
- case 11:
58939
- case "end":
58940
- return _context.stop();
58941
- }
58942
- }, _callee, null, [[2, 9]]);
58943
- }));
58944
- return function (_x12) {
58945
- return _ref7.apply(this, arguments);
58946
- };
58947
- }()));
58948
- case 35:
59023
+ });
59024
+ _context.next = 18;
59025
+ return Promise.all([rightTask, productTask]);
59026
+ case 18:
58949
59027
  if (!cancelled) {
58950
- _context2.next = 37;
59028
+ _context.next = 20;
58951
59029
  break;
58952
59030
  }
58953
- return _context2.abrupt("return");
58954
- case 37:
58955
- setImages({
58956
- left: left,
58957
- leftSlides: leftSlides,
58958
- right: right
59031
+ return _context.abrupt("return");
59032
+ case 20:
59033
+ _context.next = 22;
59034
+ return withResolvedSlideNames(baseUrl, jwt, leftSlides);
59035
+ case 22:
59036
+ named = _context.sent;
59037
+ if (!(cancelled || named === leftSlides)) {
59038
+ _context.next = 25;
59039
+ break;
59040
+ }
59041
+ return _context.abrupt("return");
59042
+ case 25:
59043
+ setImages(function (prev) {
59044
+ return _objectSpread$h(_objectSpread$h({}, prev), {}, {
59045
+ leftSlides: named
59046
+ });
58959
59047
  });
58960
- _context2.next = 47;
59048
+ _context.next = 35;
58961
59049
  break;
58962
- case 40:
58963
- _context2.prev = 40;
58964
- _context2.t0 = _context2["catch"](0);
59050
+ case 28:
59051
+ _context.prev = 28;
59052
+ _context.t0 = _context["catch"](0);
58965
59053
  if (!cancelled) {
58966
- _context2.next = 44;
59054
+ _context.next = 32;
58967
59055
  break;
58968
59056
  }
58969
- return _context2.abrupt("return");
58970
- case 44:
58971
- message = (_message = _context2.t0 === null || _context2.t0 === void 0 ? void 0 : _context2.t0.message) !== null && _message !== void 0 ? _message : 'Unknown error';
59057
+ return _context.abrupt("return");
59058
+ case 32:
59059
+ message = (_message = _context.t0 === null || _context.t0 === void 0 ? void 0 : _context.t0.message) !== null && _message !== void 0 ? _message : 'Unknown error';
58972
59060
  LOG$5.error(new DivaError("Failed to load render job ".concat(id, ": ").concat(message), {
58973
59061
  code: 'RENDERAPPROVE_LOAD_JOB'
58974
59062
  }));
58975
59063
  setError(message);
58976
- case 47:
58977
- _context2.prev = 47;
59064
+ case 35:
59065
+ _context.prev = 35;
58978
59066
  if (!cancelled) setLoading(false);
58979
- return _context2.finish(47);
58980
- case 50:
59067
+ return _context.finish(35);
59068
+ case 38:
58981
59069
  case "end":
58982
- return _context2.stop();
59070
+ return _context.stop();
58983
59071
  }
58984
- }, _callee2, null, [[0, 40, 47, 50]]);
59072
+ }, _callee, null, [[0, 28, 35, 38]]);
58985
59073
  }))();
58986
59074
  return function () {
58987
59075
  cancelled = true;
@@ -59645,7 +59733,7 @@ function focusBackConfirmButton(button) {
59645
59733
  ok === null || ok === void 0 || ok.focus();
59646
59734
  }
59647
59735
  function RenderApprove() {
59648
- var _data$job, _data$job2, _data$images$right2, _data$images$right3, _data$images$leftSlid, _data$job3, _data$job4, _data$job5, _data$job6, _imageFullscreen$name;
59736
+ var _data$job, _data$job2, _data$images$right, _data$images$right2, _data$images$leftSlid, _data$job3, _data$job4, _data$job5, _data$job6, _imageFullscreen$name;
59649
59737
  var store = useStore();
59650
59738
  var navigate = useNavigate();
59651
59739
  var _useTranslation = useTranslation(),
@@ -59763,7 +59851,7 @@ function RenderApprove() {
59763
59851
  var fullscreenMedia = fullscreenSide === 'left' ? data.images.left : fullscreenSide === 'right' ? data.images.right : undefined;
59764
59852
  var openFullscreen = function openFullscreen(side) {
59765
59853
  var media = side === 'left' ? data.images.left : data.images.right;
59766
- if (!media || typeof media.url !== 'string' || media.url.length === 0) return;
59854
+ if (!getViewerUrl(media)) return;
59767
59855
  setFullscreenSide(side);
59768
59856
  };
59769
59857
  var closeFullscreen = function closeFullscreen() {
@@ -59773,16 +59861,15 @@ function RenderApprove() {
59773
59861
  // Space toggle: prefers the result image (right), falls back to the
59774
59862
  // preview otherwise. When nothing is available the action is a no-op.
59775
59863
  var toggleFullscreen = function toggleFullscreen() {
59776
- var _data$images$right, _data$images$left;
59777
59864
  if (fullscreenSide) {
59778
59865
  closeFullscreen();
59779
59866
  return;
59780
59867
  }
59781
- if ((_data$images$right = data.images.right) !== null && _data$images$right !== void 0 && _data$images$right.url) {
59868
+ if (getViewerUrl(data.images.right)) {
59782
59869
  openFullscreen('right');
59783
59870
  return;
59784
59871
  }
59785
- if ((_data$images$left = data.images.left) !== null && _data$images$left !== void 0 && _data$images$left.url) {
59872
+ if (getViewerUrl(data.images.left)) {
59786
59873
  openFullscreen('left');
59787
59874
  }
59788
59875
  };
@@ -60379,8 +60466,8 @@ function RenderApprove() {
60379
60466
  })
60380
60467
  }), /*#__PURE__*/jsx(MetadataPanel, {
60381
60468
  job: data.job,
60382
- fileSize: (_data$images$right2 = data.images.right) === null || _data$images$right2 === void 0 ? void 0 : _data$images$right2.fileSize,
60383
- mediaType: (_data$images$right3 = data.images.right) === null || _data$images$right3 === void 0 ? void 0 : _data$images$right3.mediaType,
60469
+ fileSize: (_data$images$right = data.images.right) === null || _data$images$right === void 0 ? void 0 : _data$images$right.fileSize,
60470
+ mediaType: (_data$images$right2 = data.images.right) === null || _data$images$right2 === void 0 ? void 0 : _data$images$right2.mediaType,
60384
60471
  detailsOpen: detailsOpen,
60385
60472
  onDetailsOpenChange: setDetailsOpen,
60386
60473
  promptOpen: promptOpen,
@@ -60409,7 +60496,6 @@ function RenderApprove() {
60409
60496
  onNext: session.goNext
60410
60497
  }) : /*#__PURE__*/jsx(ApprovalWorkspace, {
60411
60498
  images: data.images,
60412
- loading: data.loading,
60413
60499
  readonlyDecision: !session.skipProcessedJobs ? session.currentDecision : undefined,
60414
60500
  onOpenFullscreenLeft: function onOpenFullscreenLeft() {
60415
60501
  return openFullscreen('left');
@@ -5,7 +5,6 @@ import { SessionAction } from '../../hooks/useRenderApproveSession';
5
5
  import { RenderApproveImages } from '../../../../types';
6
6
  interface Props {
7
7
  images: RenderApproveImages;
8
- loading?: boolean;
9
8
  readonlyDecision?: SessionAction;
10
9
  onOpenFullscreenLeft: () => void;
11
10
  onOpenFullscreenRight: () => void;
@@ -26,6 +25,6 @@ interface Props {
26
25
  * Abnahme (approval) use case: side-by-side comparison of preview and result
27
26
  * plus the full decision action bar (approve / reject / upload).
28
27
  */
29
- export default function ApprovalWorkspace({ images, loading, readonlyDecision, onOpenFullscreenLeft, onOpenFullscreenRight, onLeftSwiperInit, actionDisabled, busy, readOnly, isFirst, shortcutItems, onApprove, onReject, onPrev, onNext, onUpload, onSetReadyForProduction, }: Props): React.JSX.Element;
28
+ export default function ApprovalWorkspace({ images, readonlyDecision, onOpenFullscreenLeft, onOpenFullscreenRight, onLeftSwiperInit, actionDisabled, busy, readOnly, isFirst, shortcutItems, onApprove, onReject, onPrev, onNext, onUpload, onSetReadyForProduction, }: Props): React.JSX.Element;
30
29
  export {};
31
30
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/ApprovalWorkspace/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,UAAU,KAAK;IACb,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,aAAa,CAAC;IACjC,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAClC,gBAAgB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;CACtC;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EACxC,MAAM,EACN,OAAO,EACP,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,aAAa,EACb,SAAS,EACT,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,uBAAuB,GACxB,EAAE,KAAK,qBA2BP"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/ApprovalWorkspace/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,UAAU,KAAK;IACb,MAAM,EAAE,mBAAmB,CAAC;IAC5B,gBAAgB,CAAC,EAAE,aAAa,CAAC;IACjC,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAClC,gBAAgB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;CACtC;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EACxC,MAAM,EACN,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,aAAa,EACb,SAAS,EACT,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,uBAAuB,GACxB,EAAE,KAAK,qBA0BP"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/FullscreenViewer/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAGzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,GAAG,CAAC;QACZ,UAAU,iBAAiB;YACzB,cAAc,EAAE,GAAG,CAAC;SACrB;KACF;CACF;AAED,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAMD,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,qBAiD9E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/FullscreenViewer/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAIvD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,GAAG,CAAC;QACZ,UAAU,iBAAiB;YACzB,cAAc,EAAE,GAAG,CAAC;SACrB;KACF;CACF;AAED,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAMD,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,qBA6D9E"}
@@ -9,12 +9,12 @@ declare global {
9
9
  }
10
10
  interface Props {
11
11
  title: string;
12
+ /** `undefined` means "not resolved yet" and renders the spinner. */
12
13
  media?: RenderApproveMedia;
13
- loading?: boolean;
14
14
  alt?: string;
15
15
  onOpenFullscreen?: () => void;
16
16
  headerActions?: React.ReactNode;
17
17
  }
18
- export default function ImagePanel({ title, media, loading, alt, onOpenFullscreen, headerActions }: Props): React.JSX.Element;
18
+ export default function ImagePanel({ title, media, alt, onOpenFullscreen, headerActions }: Props): React.JSX.Element;
19
19
  export {};
20
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/ImagePanel/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,GAAG,CAAC;QACZ,UAAU,iBAAiB;YACzB,cAAc,EAAE,GAAG,CAAC;SACrB;KACF;CACF;AAED,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACjC;AAQD,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,EAAE,aAAa,EAAE,EAAE,KAAK,qBA0FxG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/ImagePanel/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAIvD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,GAAG,CAAC;QACZ,UAAU,iBAAiB;YACzB,cAAc,EAAE,GAAG,CAAC;SACrB;KACF;CACF;AAED,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACjC;AAQD,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,aAAa,EAAE,EAAE,KAAK,qBA4F/F"}
@@ -6,7 +6,6 @@ import 'swiper/css/navigation';
6
6
  import 'swiper/css/pagination';
7
7
  interface Props {
8
8
  slides: RenderApproveMedia[];
9
- loading?: boolean;
10
9
  /** Fullscreen handler used only for the realtime preview slide. */
11
10
  onOpenFullscreenFirst?: () => void;
12
11
  /** Receives the Swiper instance so the parent can drive prev/next from keyboard shortcuts. */
@@ -20,6 +19,6 @@ interface Props {
20
19
  * Swiper's keyboard module is intentionally disabled because Arrow Left/Right
21
20
  * are owned by `useKeyboardShortcuts` for navigating between render jobs.
22
21
  */
23
- export default function LeftSlider({ slides, loading, onOpenFullscreenFirst, onSwiperInit }: Props): React.JSX.Element;
22
+ export default function LeftSlider({ slides, onOpenFullscreenFirst, onSwiperInit }: Props): React.JSX.Element;
24
23
  export {};
25
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/LeftSlider/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AAKpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,YAAY,CAAC;AACpB,OAAO,uBAAuB,CAAC;AAC/B,OAAO,uBAAuB,CAAC;AAE/B,UAAU,KAAK;IACb,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mEAAmE;IACnE,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,8FAA8F;IAC9F,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC9C;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,EAAE,KAAK,qBAsCjG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/LeftSlider/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AAKpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,YAAY,CAAC;AACpB,OAAO,uBAAuB,CAAC;AAC/B,OAAO,uBAAuB,CAAC;AAE/B,UAAU,KAAK;IACb,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,mEAAmE;IACnE,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,8FAA8F;IAC9F,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC9C;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,YAAY,EAAE,EAAE,KAAK,qBAsCxF"}
@@ -4,7 +4,6 @@ import { SessionAction } from '../../hooks/useRenderApproveSession';
4
4
  import { RenderApproveImages } from '../../../../types';
5
5
  interface Props {
6
6
  images: RenderApproveImages;
7
- loading?: boolean;
8
7
  readonlyDecision?: SessionAction;
9
8
  onOpenFullscreenLeft?: () => void;
10
9
  onOpenFullscreenRight?: () => void;
@@ -14,6 +13,6 @@ interface Props {
14
13
  onSetReadyForProduction?: () => void;
15
14
  actionsDisabled?: boolean;
16
15
  }
17
- export default function SideBySideViewer({ images, loading, readonlyDecision, onOpenFullscreenLeft, onOpenFullscreenRight, onLeftSwiperInit, onUpload, onSetReadyForProduction, actionsDisabled, }: Props): React.JSX.Element;
16
+ export default function SideBySideViewer({ images, readonlyDecision, onOpenFullscreenLeft, onOpenFullscreenRight, onLeftSwiperInit, onUpload, onSetReadyForProduction, actionsDisabled, }: Props): React.JSX.Element;
18
17
  export {};
19
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/SideBySideViewer/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AAMpD,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAcxD,UAAU,KAAK;IACb,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,aAAa,CAAC;IACjC,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,MAAM,EACN,OAAO,EACP,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,QAAQ,EACR,uBAAuB,EACvB,eAAe,GAChB,EAAE,KAAK,qBAoFP"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/SideBySideViewer/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AAMpD,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAcxD,UAAU,KAAK;IACb,MAAM,EAAE,mBAAmB,CAAC;IAC5B,gBAAgB,CAAC,EAAE,aAAa,CAAC;IACjC,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,MAAM,EACN,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,QAAQ,EACR,uBAAuB,EACvB,eAAe,GAChB,EAAE,KAAK,qBA6EP"}
@@ -14,6 +14,12 @@ export declare function resolveMediaItem(baseUrl: string, jwt: string | undefine
14
14
  * right (resolved media item) images. Each id change cancels the previous
15
15
  * fetch via an abort flag so stale responses cannot overwrite newer state.
16
16
  *
17
+ * Everything is revealed in stages, because a job switch otherwise shows
18
+ * nothing until the slowest request of the whole chain is done: the preview and
19
+ * the `renderImages` slides come straight from the job document, the result
20
+ * image is one further request away, and only the product media (one catalog
21
+ * call plus two media calls per image) and the slide names arrive late.
22
+ *
17
23
  * State mutations (approve/reject) live in `useUpdateRenderJobState` so the
18
24
  * session hook can call them without depending on the currently-loaded job.
19
25
  */
@@ -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,EAAE,kBAAkB,EAAE,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;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAM7E;AAuHD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAapC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,sBAAsB,CA6IjG"}
1
+ {"version":3,"file":"useRenderJobData.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/hooks/useRenderJobData.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,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;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAM7E;AA8HD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAapC;AAoDD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAiHjG"}
@@ -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;AAqD3D,MAAM,CAAC,OAAO,UAAU,aAAa,sBA4mBpC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAsD3D,MAAM,CAAC,OAAO,UAAU,aAAa,sBA2mBpC"}
@@ -69,6 +69,8 @@ export interface RenderApproveMedia {
69
69
  name?: string;
70
70
  /** Free-form metadata dictionary of the MediaItem / MediaItemRef. */
71
71
  metadata?: Record<string, any>;
72
+ /** Storage-generated image variants keyed by size (e.g. `big`, `gal`). For TIFFs these are PNGs. */
73
+ variants?: Record<string, string>;
72
74
  /** True for the realtime render preview slide (independent of its position). */
73
75
  isPreview?: boolean;
74
76
  }
@@ -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,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"}
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,oGAAoG;IACpG,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,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"}
@@ -0,0 +1,14 @@
1
+ import { RenderApproveMedia } from './types';
2
+ /**
3
+ * Resolves the url a browser can actually display for a media entry.
4
+ *
5
+ * Render jobs with `fileFormat: 'tif'` produce TIFF results, which no browser
6
+ * renders natively. The storage generates PNG variants for them, so the `big`
7
+ * variant (falling back to `gal`, then the thumbnail) is displayed instead of
8
+ * the raw `cdnUrl`. Mirrors the handling in the media item table cells.
9
+ *
10
+ * @param media the media entry to resolve, may be undefined while loading
11
+ * @returns the displayable url, or `null` when no renderable source exists
12
+ */
13
+ export declare function getViewerUrl(media?: RenderApproveMedia): string | null;
14
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/TableRenderJobs/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAK7C;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAMtE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crystaldesign/diva-backoffice",
3
- "version": "26.9.0-rc.6",
3
+ "version": "26.9.0-rc.8",
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.9.0-rc.6",
19
- "@crystaldesign/content-item": "26.9.0-rc.6",
20
- "@crystaldesign/diva-core": "26.9.0-rc.6",
21
- "@crystaldesign/diva-utils": "26.9.0-rc.6",
22
- "@crystaldesign/media-upload": "26.9.0-rc.6",
23
- "@crystaldesign/rtf-editor": "26.9.0-rc.6",
24
- "@crystaldesign/spreadsheet": "26.9.0-rc.6",
18
+ "@crystaldesign/content-box": "26.9.0-rc.8",
19
+ "@crystaldesign/content-item": "26.9.0-rc.8",
20
+ "@crystaldesign/diva-core": "26.9.0-rc.8",
21
+ "@crystaldesign/diva-utils": "26.9.0-rc.8",
22
+ "@crystaldesign/media-upload": "26.9.0-rc.8",
23
+ "@crystaldesign/rtf-editor": "26.9.0-rc.8",
24
+ "@crystaldesign/spreadsheet": "26.9.0-rc.8",
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": "7a05eccf1bafacddb52774c578d95e5946672a6b"
59
+ "gitHead": "6fbfc9e2ee635edcd5b279101c3118ad0756f12c"
60
60
  }