@crystaldesign/diva-backoffice 26.12.0-beta.21 → 26.12.0-beta.23

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.
@@ -13816,7 +13816,12 @@ function loadConfiguration(t, root, config, lang, apiConfig) {
13816
13816
  }, 'von', {
13817
13817
  field: 'authorByName'
13818
13818
  }],
13819
+ // Recognised render-pipeline failures carry a code that is translated into plain language; the
13820
+ // reported message follows it, so an unclassified failure still shows what the pipeline said.
13819
13821
  content: [{
13822
+ field: 'messageCode',
13823
+ translationPrefix: 'renderjob.error'
13824
+ }, {
13820
13825
  field: 'message'
13821
13826
  }]
13822
13827
  }
@@ -27821,6 +27826,9 @@ var ListWrapper = function ListWrapper(props, ref) {
27821
27826
  }),
27822
27827
  description: item.description
27823
27828
  }), /*#__PURE__*/jsx("div", {
27829
+ style: {
27830
+ whiteSpace: 'pre-wrap'
27831
+ },
27824
27832
  children: item.content
27825
27833
  }), /*#__PURE__*/jsx("div", {
27826
27834
  style: {
@@ -73969,6 +73977,124 @@ function SessionHeader(_ref) {
73969
73977
  });
73970
73978
  }
73971
73979
 
73980
+ /**
73981
+ * Numeric render-job states used by the RenderApprove session.
73982
+ * Mirrors `RenderJobState` in `node-apps/diva-media/src/infra/db/models/RenderJobModel.ts`
73983
+ * (kept as plain literals to avoid a cross-package import).
73984
+ */
73985
+ var RENDER_JOB_STATE = {
73986
+ paymentClarified: 2,
73987
+ readyForProduction: 3,
73988
+ readyForRenderer: 5,
73989
+ inChecking: 7,
73990
+ approved: 8,
73991
+ rejected: 9,
73992
+ error: 11,
73993
+ finished: 12
73994
+ };
73995
+
73996
+ /**
73997
+ * Mandatory rejection reasons per acceptance criteria / Story 5 (7 categories).
73998
+ * `value` is sent as the `message` payload of `PATCH /renderjobs/:id/state`.
73999
+ */
74000
+ var REJECTION_REASONS = [{
74001
+ value: 'qualityInsufficient',
74002
+ labelKey: 'backoffice.renderapprove.rejectionReasons.qualityInsufficient'
74003
+ }, {
74004
+ value: 'wrongPerspective',
74005
+ labelKey: 'backoffice.renderapprove.rejectionReasons.wrongPerspective'
74006
+ }, {
74007
+ value: 'lightingIssues',
74008
+ labelKey: 'backoffice.renderapprove.rejectionReasons.lightingIssues'
74009
+ }, {
74010
+ value: 'materialIssues',
74011
+ labelKey: 'backoffice.renderapprove.rejectionReasons.materialIssues'
74012
+ }, {
74013
+ value: 'geometryIssues',
74014
+ labelKey: 'backoffice.renderapprove.rejectionReasons.geometryIssues'
74015
+ }, {
74016
+ value: 'compositionIssues',
74017
+ labelKey: 'backoffice.renderapprove.rejectionReasons.compositionIssues'
74018
+ }, {
74019
+ value: 'other',
74020
+ labelKey: 'backoffice.renderapprove.rejectionReasons.other'
74021
+ }];
74022
+ function getRejectionReasonLabelKey(reason) {
74023
+ var _match$labelKey;
74024
+ var match = REJECTION_REASONS.find(function (entry) {
74025
+ return entry.value === reason;
74026
+ });
74027
+ return (_match$labelKey = match === null || match === void 0 ? void 0 : match.labelKey) !== null && _match$labelKey !== void 0 ? _match$labelKey : 'backoffice.renderapprove.rejectionReasons.other';
74028
+ }
74029
+
74030
+ /**
74031
+ * Keyboard shortcut identifiers used by `useKeyboardShortcuts`.
74032
+ * Layout: Arrow Right = Approve, Arrow Left = Reject, Arrow Down = Skip.
74033
+ * Optional navigation shortcuts use PageUp/PageDown. Space = Fullscreen,
74034
+ * Escape closes Modal / Fullscreen, Ctrl/Cmd+Z undoes the last action
74035
+ * within the undo window.
74036
+ *
74037
+ * `code` matches `KeyboardEvent.code` (layout-stable); `mod` requires
74038
+ * Ctrl (Windows/Linux) or Cmd (macOS) to be held during the keypress.
74039
+ */
74040
+
74041
+ var KEY_MAP = {
74042
+ approve: {
74043
+ code: 'Enter'
74044
+ },
74045
+ reject: {
74046
+ code: 'Backspace'
74047
+ },
74048
+ prev: {
74049
+ code: 'ArrowLeft'
74050
+ },
74051
+ next: {
74052
+ code: 'ArrowRight'
74053
+ },
74054
+ swiperPrev: {
74055
+ code: 'KeyA'
74056
+ },
74057
+ swiperNext: {
74058
+ code: 'KeyD'
74059
+ },
74060
+ // A/D already drive the left swiper, so the variant swiper gets its own pair.
74061
+ variantPrev: {
74062
+ code: 'KeyQ'
74063
+ },
74064
+ variantNext: {
74065
+ code: 'KeyE'
74066
+ },
74067
+ compare: {
74068
+ code: 'KeyC'
74069
+ },
74070
+ details: {
74071
+ code: 'KeyD',
74072
+ mod: true
74073
+ },
74074
+ prompt: {
74075
+ code: 'KeyI',
74076
+ mod: true
74077
+ },
74078
+ fullscreen: {
74079
+ code: 'Space'
74080
+ },
74081
+ close: {
74082
+ code: 'Escape'
74083
+ },
74084
+ undo: {
74085
+ code: 'KeyZ',
74086
+ mod: true
74087
+ }
74088
+ };
74089
+ /**
74090
+ * Default lifetime of the Phase 4 undo notification (ms).
74091
+ * Kept here so it can be referenced from multiple hooks/components.
74092
+ */
74093
+ var UNDO_TIMEOUT_MS = 5000;
74094
+
74095
+ function _createForOfIteratorHelper$k(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$k(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
74096
+ function _unsupportedIterableToArray$k(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$k(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$k(r, a) : void 0; } }
74097
+ function _arrayLikeToArray$k(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
73972
74098
  /** Mime types of images a browser cannot render in an `<img>` element. */
73973
74099
  var NON_RENDERABLE_MIME_TYPES = new Set(['image/tiff', 'image/tif']);
73974
74100
 
@@ -73993,6 +74119,47 @@ function getViewerUrl(media) {
73993
74119
  return (_media$url = media.url) !== null && _media$url !== void 0 ? _media$url : null;
73994
74120
  }
73995
74121
 
74122
+ /** One entry of a render job's state history, as delivered by diva-media. */
74123
+
74124
+ /** Most recent state-history entry of the given state that carries a message. */
74125
+ function latestEntryWithMessage(history, state) {
74126
+ if (!Array.isArray(history)) return undefined;
74127
+ var best;
74128
+ var _iterator = _createForOfIteratorHelper$k(history),
74129
+ _step;
74130
+ try {
74131
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
74132
+ var _entry$created, _best$created;
74133
+ var entry = _step.value;
74134
+ if ((entry === null || entry === void 0 ? void 0 : entry.state) !== state) continue;
74135
+ if (typeof entry.message !== 'string' || entry.message.length === 0) continue;
74136
+ if (!best || ((_entry$created = entry.created) !== null && _entry$created !== void 0 ? _entry$created : 0) >= ((_best$created = best.created) !== null && _best$created !== void 0 ? _best$created : 0)) best = entry;
74137
+ }
74138
+ } catch (err) {
74139
+ _iterator.e(err);
74140
+ } finally {
74141
+ _iterator.f();
74142
+ }
74143
+ return best;
74144
+ }
74145
+
74146
+ /** Message (reason + comment) of the most recent rejection in a job's state history. */
74147
+ function latestRejectMessage(history) {
74148
+ var _latestEntryWithMessa;
74149
+ return (_latestEntryWithMessa = latestEntryWithMessage(history, RENDER_JOB_STATE.rejected)) === null || _latestEntryWithMessa === void 0 ? void 0 : _latestEntryWithMessa.message;
74150
+ }
74151
+
74152
+ /**
74153
+ * Most recent failure in a job's state history.
74154
+ *
74155
+ * The reported reason is the only thing a user gets to see about a job the render pipeline could not
74156
+ * process, so both the message and its code are returned - the code is translated, the message is the
74157
+ * fallback for an unrecognised failure.
74158
+ */
74159
+ function latestErrorEntry(history) {
74160
+ return latestEntryWithMessage(history, RENDER_JOB_STATE.error);
74161
+ }
74162
+
73996
74163
  var root$b = "root-bbDdW";
73997
74164
  var header$1 = "header--owh8";
73998
74165
  var content$1 = "content-q2m1c";
@@ -74859,9 +75026,9 @@ styleInject(css_248z$n);
74859
75026
 
74860
75027
  function ownKeys$D(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
74861
75028
  function _objectSpread$D(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$D(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$D(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
74862
- function _createForOfIteratorHelper$k(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$k(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
74863
- function _unsupportedIterableToArray$k(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$k(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$k(r, a) : void 0; } }
74864
- function _arrayLikeToArray$k(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
75029
+ function _createForOfIteratorHelper$j(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$j(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
75030
+ function _unsupportedIterableToArray$j(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$j(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$j(r, a) : void 0; } }
75031
+ function _arrayLikeToArray$j(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
74865
75032
  /**
74866
75033
  * Builds the initial item list. When `selectedUrls` (the persisted
74867
75034
  * `renderImages`) are present, the matching slides are selected and ordered
@@ -74884,7 +75051,7 @@ function buildItems(slides, selectedUrls) {
74884
75051
  }));
74885
75052
  var selected = [];
74886
75053
  var rest = [];
74887
- var _iterator = _createForOfIteratorHelper$k(withMeta),
75054
+ var _iterator = _createForOfIteratorHelper$j(withMeta),
74888
75055
  _step;
74889
75056
  try {
74890
75057
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -74995,7 +75162,7 @@ function AIImageSelector(_ref2) {
74995
75162
  // Running order number among the selected items, in list order.
74996
75163
  var counter = 0;
74997
75164
  var orderByKey = new Map();
74998
- var _iterator2 = _createForOfIteratorHelper$k(items),
75165
+ var _iterator2 = _createForOfIteratorHelper$j(items),
74999
75166
  _step2;
75000
75167
  try {
75001
75168
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
@@ -75222,120 +75389,6 @@ function InputImagesModal(_ref) {
75222
75389
  });
75223
75390
  }
75224
75391
 
75225
- /**
75226
- * Numeric render-job states used by the RenderApprove session.
75227
- * Mirrors `RenderJobState` in `node-apps/diva-media/src/infra/db/models/RenderJobModel.ts`
75228
- * (kept as plain literals to avoid a cross-package import).
75229
- */
75230
- var RENDER_JOB_STATE = {
75231
- paymentClarified: 2,
75232
- readyForProduction: 3,
75233
- readyForRenderer: 5,
75234
- inChecking: 7,
75235
- approved: 8,
75236
- rejected: 9,
75237
- finished: 12
75238
- };
75239
-
75240
- /**
75241
- * Mandatory rejection reasons per acceptance criteria / Story 5 (7 categories).
75242
- * `value` is sent as the `message` payload of `PATCH /renderjobs/:id/state`.
75243
- */
75244
- var REJECTION_REASONS = [{
75245
- value: 'qualityInsufficient',
75246
- labelKey: 'backoffice.renderapprove.rejectionReasons.qualityInsufficient'
75247
- }, {
75248
- value: 'wrongPerspective',
75249
- labelKey: 'backoffice.renderapprove.rejectionReasons.wrongPerspective'
75250
- }, {
75251
- value: 'lightingIssues',
75252
- labelKey: 'backoffice.renderapprove.rejectionReasons.lightingIssues'
75253
- }, {
75254
- value: 'materialIssues',
75255
- labelKey: 'backoffice.renderapprove.rejectionReasons.materialIssues'
75256
- }, {
75257
- value: 'geometryIssues',
75258
- labelKey: 'backoffice.renderapprove.rejectionReasons.geometryIssues'
75259
- }, {
75260
- value: 'compositionIssues',
75261
- labelKey: 'backoffice.renderapprove.rejectionReasons.compositionIssues'
75262
- }, {
75263
- value: 'other',
75264
- labelKey: 'backoffice.renderapprove.rejectionReasons.other'
75265
- }];
75266
- function getRejectionReasonLabelKey(reason) {
75267
- var _match$labelKey;
75268
- var match = REJECTION_REASONS.find(function (entry) {
75269
- return entry.value === reason;
75270
- });
75271
- return (_match$labelKey = match === null || match === void 0 ? void 0 : match.labelKey) !== null && _match$labelKey !== void 0 ? _match$labelKey : 'backoffice.renderapprove.rejectionReasons.other';
75272
- }
75273
-
75274
- /**
75275
- * Keyboard shortcut identifiers used by `useKeyboardShortcuts`.
75276
- * Layout: Arrow Right = Approve, Arrow Left = Reject, Arrow Down = Skip.
75277
- * Optional navigation shortcuts use PageUp/PageDown. Space = Fullscreen,
75278
- * Escape closes Modal / Fullscreen, Ctrl/Cmd+Z undoes the last action
75279
- * within the undo window.
75280
- *
75281
- * `code` matches `KeyboardEvent.code` (layout-stable); `mod` requires
75282
- * Ctrl (Windows/Linux) or Cmd (macOS) to be held during the keypress.
75283
- */
75284
-
75285
- var KEY_MAP = {
75286
- approve: {
75287
- code: 'Enter'
75288
- },
75289
- reject: {
75290
- code: 'Backspace'
75291
- },
75292
- prev: {
75293
- code: 'ArrowLeft'
75294
- },
75295
- next: {
75296
- code: 'ArrowRight'
75297
- },
75298
- swiperPrev: {
75299
- code: 'KeyA'
75300
- },
75301
- swiperNext: {
75302
- code: 'KeyD'
75303
- },
75304
- // A/D already drive the left swiper, so the variant swiper gets its own pair.
75305
- variantPrev: {
75306
- code: 'KeyQ'
75307
- },
75308
- variantNext: {
75309
- code: 'KeyE'
75310
- },
75311
- compare: {
75312
- code: 'KeyC'
75313
- },
75314
- details: {
75315
- code: 'KeyD',
75316
- mod: true
75317
- },
75318
- prompt: {
75319
- code: 'KeyI',
75320
- mod: true
75321
- },
75322
- fullscreen: {
75323
- code: 'Space'
75324
- },
75325
- close: {
75326
- code: 'Escape'
75327
- },
75328
- undo: {
75329
- code: 'KeyZ',
75330
- mod: true
75331
- }
75332
- };
75333
- /**
75334
- * Default lifetime of the Phase 4 undo notification (ms).
75335
- * Kept here so it can be referenced from multiple hooks/components.
75336
- */
75337
- var UNDO_TIMEOUT_MS = 5000;
75338
-
75339
75392
  var container$3 = "container-PmByk";
75340
75393
  var header = "header-ESR-S";
75341
75394
  var title = "title-g5pl0";
@@ -75374,7 +75427,7 @@ var statusTriggerLocked = "statusTriggerLocked-5u8lc";
75374
75427
  var statusIcon = "statusIcon-rpMzy";
75375
75428
  var menuDot = "menuDot-ybea1";
75376
75429
  var footer = "footer-HdZwL";
75377
- var css_248z$l = ".container-PmByk {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n gap: 14px;\n overflow: auto;\n padding: 16px 20px;\n}\n\n.header-ESR-S {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.title-g5pl0 {\n font-size: 16px;\n font-weight: 600;\n}\n\n.subtitle-wYnId {\n color: #8c8c8c;\n font-size: 13px;\n}\n\n.tiles-4NW82 {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.tile-vHlQ9 {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n border: 1px solid #f0f0f0;\n border-radius: 8px;\n background: #fff;\n cursor: pointer;\n font: inherit;\n color: inherit;\n transition: border-color 0.15s, background 0.15s;\n}\n\n.tile-vHlQ9:hover {\n border-color: #1677ff;\n}\n\n.tile-vHlQ9.focus-visible-am0Va {\n outline: 2px solid #1677ff;\n outline-offset: 2px;\n}\n\n.tile-vHlQ9:focus-visible {\n outline: 2px solid #1677ff;\n outline-offset: 2px;\n}\n\n.tileActive-Kl6AW {\n border-color: #1677ff;\n background: #e6f4ff;\n}\n\n.clearFilter-KsvRj {\n align-self: center;\n border: none;\n background: none;\n color: #1677ff;\n cursor: pointer;\n font: inherit;\n font-size: 12px;\n padding: 0 4px;\n}\n\n.clearFilter-KsvRj:hover {\n text-decoration: underline;\n}\n\n.dot-x41U9 {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex: none;\n}\n\n.dotApproved-jidKD {\n background: #52c41a;\n}\n\n.dotRejected-9TFUi {\n background: #ff4d4f;\n}\n\n.dotOpen-eHbi0 {\n background: #faad14;\n}\n\n.dotFinished-Id6hR {\n background: #722ed1;\n}\n\n.dotPayment-Fzk7U {\n background: #13c2c2;\n}\n\n.dotReadyForProduction-yIYkt {\n background: #1677ff;\n}\n\n.tileNum-9DGoc {\n font-size: 16px;\n font-weight: 600;\n font-feature-settings: \"tnum\";\n font-variant-numeric: tabular-nums;\n}\n\n.tileLabel-nG0xD {\n color: #8c8c8c;\n font-size: 12px;\n}\n\n.toolbar-jJDio {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.selInfo-r4QBF {\n color: #8c8c8c;\n font-size: 13px;\n}\n\n.spacer-g69QI {\n flex: 1;\n}\n\n.thumb-Wd6Zw {\n width: 74px;\n height: 54px;\n border-radius: 6px;\n overflow: hidden;\n border: 1px solid #f0f0f0;\n background: #fafafa;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n cursor: pointer;\n}\n\n.thumbStatic-kc-Qn {\n cursor: default;\n}\n\n.thumbImg-ViR1y {\n width: 100%;\n height: 100%;\n -o-object-fit: cover;\n object-fit: cover;\n display: block;\n}\n\n.thumbPlaceholder-gp0b2 {\n color: #bfbfbf;\n font-size: 18px;\n}\n\n.badge-bYA4m {\n position: absolute;\n left: 4px;\n bottom: 4px;\n background: rgba(0, 0, 0, 0.6);\n color: #fff;\n font-size: 10px;\n font-weight: 600;\n line-height: 1;\n padding: 2px 5px;\n border-radius: 3px;\n}\n\n.videoBadge--DvZy {\n position: absolute;\n color: #fff;\n font-size: 22px;\n filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.5));\n}\n\n.prodName-t5Dom {\n font-weight: 600;\n}\n\n.info--EMmi {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.infoLines-HenMK {\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: 2px;\n}\n\n.infoLine-EyUqw {\n font-size: 12px;\n color: #8c8c8c;\n}\n\n.infoLabel-JfxNQ {\n color: #bfbfbf;\n}\n\n.reason-wzttm {\n margin-top: 4px;\n max-width: 220px;\n font-size: 12px;\n color: #8c8c8c;\n white-space: normal;\n}\n\n.prodSub-cZZSl {\n color: #8c8c8c;\n font-size: 12px;\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n margin-top: 2px;\n}\n\n.sku-7EODQ {\n font-family: monospace;\n}\n\n.statusTrigger-oGuEq {\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.statusTriggerLocked-5u8lc {\n cursor: default;\n}\n\n.statusIcon-rpMzy {\n font-size: 10px;\n color: #8c8c8c;\n}\n\n.menuDot-ybea1 {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n margin-right: 8px;\n vertical-align: middle;\n}\n\n.footer-HdZwL {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n flex-wrap: wrap;\n padding-top: 4px;\n}\n\n/* Dark mode */\n.darkmode .tile-vHlQ9 {\n background: #1f1f1f;\n border-color: #434343;\n}\n\n.darkmode .tileActive-Kl6AW {\n border-color: #3c89e8;\n background: rgba(60, 137, 232, 0.16);\n}\n\n.darkmode .thumb-Wd6Zw {\n background: #262626;\n border-color: #434343;\n}\n\n.darkmode .subtitle-wYnId,\n.darkmode .tileLabel-nG0xD,\n.darkmode .selInfo-r4QBF,\n.darkmode .prodSub-cZZSl,\n.darkmode .infoLine-EyUqw,\n.darkmode .reason-wzttm {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.darkmode .infoLabel-JfxNQ {\n color: rgba(255, 255, 255, 0.35);\n}\n";
75430
+ var css_248z$l = ".container-PmByk {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n gap: 14px;\n overflow: auto;\n padding: 16px 20px;\n}\n\n.header-ESR-S {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.title-g5pl0 {\n font-size: 16px;\n font-weight: 600;\n}\n\n.subtitle-wYnId {\n color: #8c8c8c;\n font-size: 13px;\n}\n\n.tiles-4NW82 {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.tile-vHlQ9 {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n border: 1px solid #f0f0f0;\n border-radius: 8px;\n background: #fff;\n cursor: pointer;\n font: inherit;\n color: inherit;\n transition: border-color 0.15s, background 0.15s;\n}\n\n.tile-vHlQ9:hover {\n border-color: #1677ff;\n}\n\n.tile-vHlQ9.focus-visible-am0Va {\n outline: 2px solid #1677ff;\n outline-offset: 2px;\n}\n\n.tile-vHlQ9:focus-visible {\n outline: 2px solid #1677ff;\n outline-offset: 2px;\n}\n\n.tileActive-Kl6AW {\n border-color: #1677ff;\n background: #e6f4ff;\n}\n\n.clearFilter-KsvRj {\n align-self: center;\n border: none;\n background: none;\n color: #1677ff;\n cursor: pointer;\n font: inherit;\n font-size: 12px;\n padding: 0 4px;\n}\n\n.clearFilter-KsvRj:hover {\n text-decoration: underline;\n}\n\n.dot-x41U9 {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex: none;\n}\n\n.dotApproved-jidKD {\n background: #52c41a;\n}\n\n.dotRejected-9TFUi {\n background: #ff4d4f;\n}\n\n.dotOpen-eHbi0 {\n background: #faad14;\n}\n\n.dotFinished-Id6hR {\n background: #722ed1;\n}\n\n.dotPayment-Fzk7U {\n background: #13c2c2;\n}\n\n.dotReadyForProduction-yIYkt {\n background: #1677ff;\n}\n\n.tileNum-9DGoc {\n font-size: 16px;\n font-weight: 600;\n font-feature-settings: \"tnum\";\n font-variant-numeric: tabular-nums;\n}\n\n.tileLabel-nG0xD {\n color: #8c8c8c;\n font-size: 12px;\n}\n\n.toolbar-jJDio {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.selInfo-r4QBF {\n color: #8c8c8c;\n font-size: 13px;\n}\n\n.spacer-g69QI {\n flex: 1;\n}\n\n.thumb-Wd6Zw {\n width: 74px;\n height: 54px;\n border-radius: 6px;\n overflow: hidden;\n border: 1px solid #f0f0f0;\n background: #fafafa;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n cursor: pointer;\n}\n\n.thumbStatic-kc-Qn {\n cursor: default;\n}\n\n.thumbImg-ViR1y {\n width: 100%;\n height: 100%;\n -o-object-fit: cover;\n object-fit: cover;\n display: block;\n}\n\n.thumbPlaceholder-gp0b2 {\n color: #bfbfbf;\n font-size: 18px;\n}\n\n.badge-bYA4m {\n position: absolute;\n left: 4px;\n bottom: 4px;\n background: rgba(0, 0, 0, 0.6);\n color: #fff;\n font-size: 10px;\n font-weight: 600;\n line-height: 1;\n padding: 2px 5px;\n border-radius: 3px;\n}\n\n.videoBadge--DvZy {\n position: absolute;\n color: #fff;\n font-size: 22px;\n filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.5));\n}\n\n.prodName-t5Dom {\n font-weight: 600;\n}\n\n.info--EMmi {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.infoLines-HenMK {\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: 2px;\n}\n\n.infoLine-EyUqw {\n font-size: 12px;\n color: #8c8c8c;\n}\n\n.infoLabel-JfxNQ {\n color: #bfbfbf;\n}\n\n.reason-wzttm {\n margin-top: 4px;\n max-width: 220px;\n font-size: 12px;\n color: #8c8c8c;\n white-space: normal;\n /* A failure reason can be a whole render log - without the clamp one row would blow up the table.\n The full text stays reachable through the element's tooltip. */\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.prodSub-cZZSl {\n color: #8c8c8c;\n font-size: 12px;\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n margin-top: 2px;\n}\n\n.sku-7EODQ {\n font-family: monospace;\n}\n\n.statusTrigger-oGuEq {\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.statusTriggerLocked-5u8lc {\n cursor: default;\n}\n\n.statusIcon-rpMzy {\n font-size: 10px;\n color: #8c8c8c;\n}\n\n.menuDot-ybea1 {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n margin-right: 8px;\n vertical-align: middle;\n}\n\n.footer-HdZwL {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n flex-wrap: wrap;\n padding-top: 4px;\n}\n\n/* Dark mode */\n.darkmode .tile-vHlQ9 {\n background: #1f1f1f;\n border-color: #434343;\n}\n\n.darkmode .tileActive-Kl6AW {\n border-color: #3c89e8;\n background: rgba(60, 137, 232, 0.16);\n}\n\n.darkmode .thumb-Wd6Zw {\n background: #262626;\n border-color: #434343;\n}\n\n.darkmode .subtitle-wYnId,\n.darkmode .tileLabel-nG0xD,\n.darkmode .selInfo-r4QBF,\n.darkmode .prodSub-cZZSl,\n.darkmode .infoLine-EyUqw,\n.darkmode .reason-wzttm {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.darkmode .infoLabel-JfxNQ {\n color: rgba(255, 255, 255, 0.35);\n}\n";
75378
75431
  styleInject(css_248z$l);
75379
75432
 
75380
75433
  var PAYMENT_CLARIFIED = RENDER_JOB_STATE.paymentClarified,
@@ -75382,6 +75435,7 @@ var PAYMENT_CLARIFIED = RENDER_JOB_STATE.paymentClarified,
75382
75435
  READY_FOR_RENDERER = RENDER_JOB_STATE.readyForRenderer,
75383
75436
  APPROVED = RENDER_JOB_STATE.approved,
75384
75437
  REJECTED = RENDER_JOB_STATE.rejected,
75438
+ ERROR = RENDER_JOB_STATE.error,
75385
75439
  INCHECKING = RENDER_JOB_STATE.inChecking,
75386
75440
  FINISHED = RENDER_JOB_STATE.finished;
75387
75441
 
@@ -75957,9 +76011,24 @@ function SessionOverview(_ref3) {
75957
76011
  }
75958
76012
  })]
75959
76013
  })
75960
- }), r.state === REJECTED && r.rejectMessage ? /*#__PURE__*/jsx("div", {
76014
+ }), r.state === REJECTED && r.rejectMessage ?
76015
+ /*#__PURE__*/
76016
+ // Shares the clamped cell with the error message below, so the full reason needs the same tooltip.
76017
+ jsx("div", {
75961
76018
  className: reason,
76019
+ title: r.rejectMessage,
75962
76020
  children: r.rejectMessage
76021
+ }) : null, r.state === ERROR && r.errorMessage ?
76022
+ /*#__PURE__*/
76023
+ // A recognised failure gets its plain-language text in front of the reported message -
76024
+ // never instead of it, so a wrong classification cannot hide the only diagnosis there is.
76025
+ // The clamped cell keeps the full text reachable as a tooltip.
76026
+ jsx("div", {
76027
+ className: reason,
76028
+ title: r.errorMessage,
76029
+ children: [r.errorMessageCode ? t("renderjob.error.".concat(r.errorMessageCode), {
76030
+ defaultValue: ''
76031
+ }) : '', r.errorMessage].filter(Boolean).join(' — ')
75963
76032
  }) : null]
75964
76033
  });
75965
76034
  }
@@ -76433,9 +76502,9 @@ styleInject(css_248z$j);
76433
76502
 
76434
76503
  function ownKeys$C(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
76435
76504
  function _objectSpread$C(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$C(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$C(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
76436
- function _createForOfIteratorHelper$j(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$j(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
76437
- function _unsupportedIterableToArray$j(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$j(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$j(r, a) : void 0; } }
76438
- function _arrayLikeToArray$j(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
76505
+ function _createForOfIteratorHelper$i(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$i(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
76506
+ function _unsupportedIterableToArray$i(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$i(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$i(r, a) : void 0; } }
76507
+ function _arrayLikeToArray$i(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
76439
76508
  var BYTES_IN_KIB = 1024;
76440
76509
 
76441
76510
  /** A job without an explicit `nrOfVariants` behaves like a single variant. */
@@ -76542,7 +76611,7 @@ function buildDetailsPatch(job, fields, draft) {
76542
76611
  value: next
76543
76612
  });
76544
76613
  };
76545
- var _iterator = _createForOfIteratorHelper$j(fields),
76614
+ var _iterator = _createForOfIteratorHelper$i(fields),
76546
76615
  _step;
76547
76616
  try {
76548
76617
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -78719,9 +78788,9 @@ function useRenderApproveSession(_ref) {
78719
78788
 
78720
78789
  function ownKeys$x(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
78721
78790
  function _objectSpread$x(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$x(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$x(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
78722
- function _createForOfIteratorHelper$i(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$i(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
78723
- function _unsupportedIterableToArray$i(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$i(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$i(r, a) : void 0; } }
78724
- function _arrayLikeToArray$i(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
78791
+ function _createForOfIteratorHelper$h(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$h(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
78792
+ function _unsupportedIterableToArray$h(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$h(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$h(r, a) : void 0; } }
78793
+ function _arrayLikeToArray$h(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
78725
78794
  var LOG$b = getLogger('Backoffice', 'RenderApprove');
78726
78795
  function getMediaItemId(job) {
78727
78796
  var list = job === null || job === void 0 ? void 0 : job.mediaItems;
@@ -78854,7 +78923,7 @@ function _fetchProductMedia() {
78854
78923
  seen = new Set();
78855
78924
  if (excludeUrl) seen.add(excludeUrl);
78856
78925
  result = [];
78857
- _iterator2 = _createForOfIteratorHelper$i(sorted);
78926
+ _iterator2 = _createForOfIteratorHelper$h(sorted);
78858
78927
  _context4.prev = 12;
78859
78928
  _iterator2.s();
78860
78929
  case 14:
@@ -79058,7 +79127,7 @@ function buildLeftSlides(left, renderImages, productMedia) {
79058
79127
  });
79059
79128
  if (renderImages.length === 0) return [left].concat(_toConsumableArray(remainingProduct));
79060
79129
  var productByUrl = new Map();
79061
- var _iterator = _createForOfIteratorHelper$i(productMedia),
79130
+ var _iterator = _createForOfIteratorHelper$h(productMedia),
79062
79131
  _step;
79063
79132
  try {
79064
79133
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
@@ -79450,34 +79519,9 @@ function useRenderJobData(id, refreshKey) {
79450
79519
 
79451
79520
  function ownKeys$w(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
79452
79521
  function _objectSpread$w(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$w(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$w(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
79453
- function _createForOfIteratorHelper$h(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$h(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
79454
- function _unsupportedIterableToArray$h(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$h(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$h(r, a) : void 0; } }
79455
- function _arrayLikeToArray$h(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
79456
79522
  var LOG$a = getLogger('Backoffice', 'RenderApprove');
79457
79523
  var METADATA_CHUNK_SIZE = 100;
79458
79524
  var RESULT_CONCURRENCY = 6;
79459
- /** Message of the most recent rejection (state 9) in the job's state history. */
79460
- function latestRejectMessage(history) {
79461
- var _best;
79462
- if (!Array.isArray(history)) return undefined;
79463
- var best;
79464
- var _iterator = _createForOfIteratorHelper$h(history),
79465
- _step;
79466
- try {
79467
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
79468
- var _entry$created, _best$created;
79469
- var entry = _step.value;
79470
- if ((entry === null || entry === void 0 ? void 0 : entry.state) !== RENDER_JOB_STATE.rejected) continue;
79471
- if (typeof entry.message !== 'string' || entry.message.length === 0) continue;
79472
- if (!best || ((_entry$created = entry.created) !== null && _entry$created !== void 0 ? _entry$created : 0) >= ((_best$created = best.created) !== null && _best$created !== void 0 ? _best$created : 0)) best = entry;
79473
- }
79474
- } catch (err) {
79475
- _iterator.e(err);
79476
- } finally {
79477
- _iterator.f();
79478
- }
79479
- return (_best = best) === null || _best === void 0 ? void 0 : _best.message;
79480
- }
79481
79525
  function buildOverviewUrl(baseUrl, ids) {
79482
79526
  var params = new URLSearchParams();
79483
79527
  params.set('limit', String(ids.length));
@@ -79670,6 +79714,7 @@ function useSessionOverviewData(ids, enabled) {
79670
79714
  base = ids.map(function (id) {
79671
79715
  var _raw$productName, _raw$organizationName, _raw$realTimeRenderUr;
79672
79716
  var raw = byId.get(id);
79717
+ var errorEntry = latestErrorEntry(raw === null || raw === void 0 ? void 0 : raw.stateHistory);
79673
79718
  return {
79674
79719
  id: id,
79675
79720
  state: typeof (raw === null || raw === void 0 ? void 0 : raw.state) === 'number' ? raw.state : -1,
@@ -79685,6 +79730,8 @@ function useSessionOverviewData(ids, enabled) {
79685
79730
  catalogName: raw === null || raw === void 0 ? void 0 : raw.catalogName,
79686
79731
  organizationName: (_raw$organizationName = raw === null || raw === void 0 ? void 0 : raw.organizationName) !== null && _raw$organizationName !== void 0 ? _raw$organizationName : raw === null || raw === void 0 ? void 0 : raw.organization,
79687
79732
  rejectMessage: latestRejectMessage(raw === null || raw === void 0 ? void 0 : raw.stateHistory),
79733
+ errorMessage: errorEntry === null || errorEntry === void 0 ? void 0 : errorEntry.message,
79734
+ errorMessageCode: errorEntry === null || errorEntry === void 0 ? void 0 : errorEntry.messageCode,
79688
79735
  preview: {
79689
79736
  url: (_raw$realTimeRenderUr = raw === null || raw === void 0 ? void 0 : raw.realTimeRenderUrl) !== null && _raw$realTimeRenderUr !== void 0 ? _raw$realTimeRenderUr : null,
79690
79737
  mediaType: 'PCT',
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stateHistoryMessages.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateHistoryMessages.test.d.ts","sourceRoot":"","sources":["../../../../../../../../src/tests/unit/ui/TableRenderJobs/stateHistoryMessages.test.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/List/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAQnD,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;;YAE2D,MAAM,IAAI;;YAAV,MAAM,IAAI;;AAoDtE,wBAAuD;AAEvD,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/List/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAQnD,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;;YAE2D,MAAM,IAAI;;YAAV,MAAM,IAAI;;AAqDtE,wBAAuD;AAEvD,cAAc,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/SessionOverview/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAW5D,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AA8DlE,UAAU,KAAK;IACb,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,iEAAiE;IACjE,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,8CAA8C;IAC9C,WAAW,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjD,qDAAqD;IACrD,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC7D,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;CACrB;AAwFD,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EACtC,KAAK,EACL,OAAO,EACP,KAAK,EACL,YAAY,EACZ,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,UAAU,GACX,EAAE,KAAK,qBA4dP"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/components/SessionOverview/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAW5D,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AA+DlE,UAAU,KAAK;IACb,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,iEAAiE;IACjE,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,8CAA8C;IAC9C,WAAW,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjD,qDAAqD;IACrD,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC7D,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;CACrB;AAwFD,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EACtC,KAAK,EACL,OAAO,EACP,KAAK,EACL,YAAY,EACZ,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,UAAU,GACX,EAAE,KAAK,qBA2eP"}
@@ -16,6 +16,10 @@ export interface OverviewItem {
16
16
  organizationName?: string;
17
17
  /** Message (reason + comment) of the most recent rejection, from the state history. */
18
18
  rejectMessage?: string;
19
+ /** Message of the most recent failure, from the state history. */
20
+ errorMessage?: string;
21
+ /** Code of the most recent failure, if the render pipeline reported a recognised one. */
22
+ errorMessageCode?: string;
19
23
  /** Realtime render preview (cheap, taken directly from the job document). */
20
24
  preview: RenderApproveMedia;
21
25
  /** Resolved result medium (mediaItem). Undefined until resolved or when none exists. */
@@ -1 +1 @@
1
- {"version":3,"file":"useSessionOverviewData.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/hooks/useSessionOverviewData.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK/D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,OAAO,EAAE,kBAAkB,CAAC;IAC5B,wFAAwF;IACxF,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,8EAA8E;IAC9E,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mGAAmG;IACnG,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,kEAAkE;IAClE,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;CAC5D;AAyFD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,mBAAmB,CAqInG"}
1
+ {"version":3,"file":"useSessionOverviewData.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/ui/TableRenderJobs/components/RenderApprove/hooks/useSessionOverviewData.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAM/D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6EAA6E;IAC7E,OAAO,EAAE,kBAAkB,CAAC;IAC5B,wFAAwF;IACxF,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,8EAA8E;IAC9E,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mGAAmG;IACnG,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,kEAAkE;IAClE,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;CAC5D;AA6ED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,mBAAmB,CAwInG"}
@@ -10,6 +10,7 @@ export declare const RENDER_JOB_STATE: {
10
10
  readonly inChecking: 7;
11
11
  readonly approved: 8;
12
12
  readonly rejected: 9;
13
+ readonly error: 11;
13
14
  readonly finished: 12;
14
15
  };
15
16
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/TableRenderJobs/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;CAQnB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;EAQpB,CAAC;AAEX,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgBmC,CAAC;AAExD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,OAAO,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/TableRenderJobs/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;CASnB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;EAQpB,CAAC;AAEX,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgBmC,CAAC;AAExD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,OAAO,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,eAAe,OAAO,CAAC"}
@@ -11,4 +11,22 @@ import { RenderApproveMedia } from './types';
11
11
  * @returns the displayable url, or `null` when no renderable source exists
12
12
  */
13
13
  export declare function getViewerUrl(media?: RenderApproveMedia): string | null;
14
+ /** One entry of a render job's state history, as delivered by diva-media. */
15
+ export interface StateHistoryEntry {
16
+ state?: number;
17
+ message?: string;
18
+ /** Code of a recognised render-pipeline failure, set by diva-media alongside the message. */
19
+ messageCode?: string;
20
+ created?: number;
21
+ }
22
+ /** Message (reason + comment) of the most recent rejection in a job's state history. */
23
+ export declare function latestRejectMessage(history?: StateHistoryEntry[]): string | undefined;
24
+ /**
25
+ * Most recent failure in a job's state history.
26
+ *
27
+ * The reported reason is the only thing a user gets to see about a job the render pipeline could not
28
+ * process, so both the message and its code are returned - the code is translated, the message is the
29
+ * fallback for an unrecognised failure.
30
+ */
31
+ export declare function latestErrorEntry(history?: StateHistoryEntry[]): StateHistoryEntry | undefined;
14
32
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../../src/ui/TableRenderJobs/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAK7C;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAMtE;AAED,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6FAA6F;IAC7F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAcD,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,iBAAiB,EAAE,GAAG,MAAM,GAAG,SAAS,CAErF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,GAAG,SAAS,CAE7F"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crystaldesign/diva-backoffice",
3
- "version": "26.12.0-beta.21",
3
+ "version": "26.12.0-beta.23",
4
4
  "description": "Ant Design backoffice shell: configuration plus the IDM and enricher editors.",
5
5
  "license": "COMMERCIAL",
6
6
  "devDependencies": {
@@ -16,14 +16,14 @@
16
16
  "dependencies": {
17
17
  "@ant-design/icons": "6.3.4",
18
18
  "@babel/runtime": "7.24.7",
19
- "@crystaldesign/content-box": "26.12.0-beta.21",
20
- "@crystaldesign/content-item": "26.12.0-beta.21",
21
- "@crystaldesign/diva-agent": "26.12.0-beta.21",
22
- "@crystaldesign/diva-core": "26.12.0-beta.21",
23
- "@crystaldesign/diva-utils": "26.12.0-beta.21",
24
- "@crystaldesign/media-upload": "26.12.0-beta.21",
25
- "@crystaldesign/rtf-editor": "26.12.0-beta.21",
26
- "@crystaldesign/spreadsheet": "26.12.0-beta.21",
19
+ "@crystaldesign/content-box": "26.12.0-beta.23",
20
+ "@crystaldesign/content-item": "26.12.0-beta.23",
21
+ "@crystaldesign/diva-agent": "26.12.0-beta.23",
22
+ "@crystaldesign/diva-core": "26.12.0-beta.23",
23
+ "@crystaldesign/diva-utils": "26.12.0-beta.23",
24
+ "@crystaldesign/media-upload": "26.12.0-beta.23",
25
+ "@crystaldesign/rtf-editor": "26.12.0-beta.23",
26
+ "@crystaldesign/spreadsheet": "26.12.0-beta.23",
27
27
  "@dnd-kit/core": "^6.1.0",
28
28
  "@dnd-kit/sortable": "^8.0.0",
29
29
  "@dnd-kit/utilities": "^3.2.2",
@@ -57,5 +57,5 @@
57
57
  },
58
58
  "module": "build/esm/index.js",
59
59
  "types": "./build/types/backoffice/src/index.d.ts",
60
- "gitHead": "52982e2f775ade23b2f3a4c930d5a66d47366220"
60
+ "gitHead": "560ab323936803b8cd7388cb1047f344cce2ed5c"
61
61
  }