contentoh-components-library 21.6.55 → 21.6.57

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 (112) hide show
  1. package/.claude/launch.json +14 -0
  2. package/.env.test +1 -0
  3. package/dist/ai/prompts/attribute.prompt.js +28 -0
  4. package/dist/ai/prompts/description.prompt.js +33 -0
  5. package/dist/ai/schemas/attribute.schema.js +35 -0
  6. package/dist/ai/schemas/description.schema.js +27 -0
  7. package/dist/components/atoms/AsignationOption/index.js +1 -0
  8. package/dist/components/atoms/AsignationOption/styles.js +1 -1
  9. package/dist/components/atoms/AssetPreview/AssetPreview.stories.js +118 -0
  10. package/dist/components/atoms/AssetPreview/index.js +150 -0
  11. package/dist/components/atoms/AssetPreview/styles.js +28 -0
  12. package/dist/components/atoms/IconFile/index.js +85 -2
  13. package/dist/components/atoms/IconFile/styles.js +1 -1
  14. package/dist/components/atoms/ProductImage/ProductImage.stories.js +70 -2
  15. package/dist/components/atoms/ProductImage/index.js +100 -27
  16. package/dist/components/atoms/ProductImage/styles.js +3 -1
  17. package/dist/components/molecules/EditionActiveImage/index.js +4 -2
  18. package/dist/components/molecules/GalleryAssetElement/GalleryAssetElement.stories.js +147 -0
  19. package/dist/components/molecules/GalleryAssetElement/index.js +178 -0
  20. package/dist/components/molecules/GalleryAssetElement/styles.js +26 -0
  21. package/dist/components/molecules/GalleryElement/index.js +13 -4
  22. package/dist/components/molecules/GalleryHeader/index.js +96 -24
  23. package/dist/components/molecules/GalleryHeader/styles.js +4 -1
  24. package/dist/components/molecules/GalleryTrayTabs/GalleryTrayTabs.stories.js +56 -0
  25. package/dist/components/molecules/GalleryTrayTabs/index.js +60 -0
  26. package/dist/components/molecules/GalleryTrayTabs/styles.js +20 -0
  27. package/dist/components/molecules/ImageSelector/index.js +1 -0
  28. package/dist/components/molecules/RetailerSelector/RetailerSelector.stories.js +23 -2
  29. package/dist/components/molecules/RetailerSelector/index.js +7 -2
  30. package/dist/components/molecules/RetailerSelectorv2/index.js +6 -2
  31. package/dist/components/organisms/DigitalAssetsTray/DigitalAssetsTray.stories.js +235 -0
  32. package/dist/components/organisms/DigitalAssetsTray/index.js +219 -0
  33. package/dist/components/organisms/DigitalAssetsTray/styles.js +22 -0
  34. package/dist/components/organisms/ImagePreviewer/index.js +1 -0
  35. package/dist/components/organisms/ProductImageModal/index.js +3 -2
  36. package/dist/components/pages/CreatorsProductEdition/CreatorsProductEditionView.js +905 -0
  37. package/dist/components/pages/CreatorsProductEdition/constants.js +19 -0
  38. package/dist/components/pages/CreatorsProductEdition/hooks/useCreatorsProductEdition.js +2967 -0
  39. package/dist/components/pages/CreatorsProductEdition/index.js +33 -0
  40. package/dist/components/pages/CreatorsProductEdition/mocks/api.fixtures.js +537 -0
  41. package/dist/components/pages/CreatorsProductEdition/mocks/mockApi.js +251 -0
  42. package/dist/components/pages/CreatorsProductEdition/sections/CommentBox.js +311 -0
  43. package/dist/components/pages/CreatorsProductEdition/sections/ImagePanel.js +421 -0
  44. package/dist/components/pages/CreatorsProductEdition/sections/ImagesSection.js +473 -0
  45. package/dist/components/pages/CreatorsProductEdition/sections/ProductHeader.js +379 -0
  46. package/dist/components/pages/CreatorsProductEdition/sections/ProductMedia.js +138 -0
  47. package/dist/components/pages/CreatorsProductEdition/sections/RetailerMenu.js +162 -0
  48. package/dist/components/pages/CreatorsProductEdition/sections/ServiceActions.js +542 -0
  49. package/dist/components/pages/CreatorsProductEdition/sections/StatusChip.js +50 -0
  50. package/dist/components/pages/CreatorsProductEdition/sections/TabsBar.js +247 -0
  51. package/dist/components/pages/CreatorsProductEdition/sections/VariantsPanel.js +389 -0
  52. package/dist/components/pages/CreatorsProductEdition/sections/tokens.js +90 -0
  53. package/dist/components/pages/CreatorsProductEdition/stories/CreatorsProductEdition.stories.js +168 -0
  54. package/dist/components/pages/CreatorsProductEdition/stories/CreatorsProductEditionAPI.stories.js +74 -0
  55. package/dist/components/pages/CreatorsProductEdition/styles.js +46 -0
  56. package/dist/components/pages/RetailerProductEdition/context/provider-product-edition.context.js +330 -15
  57. package/dist/components/pages/RetailerProductEdition/context/provider-product-edition.reducer.js +12 -2
  58. package/dist/components/pages/RetailerProductEdition/index.js +606 -425
  59. package/dist/components/pages/RetailerProductEdition/stories/ImageEditor.stories.js +1 -0
  60. package/dist/global-files/data.js +16 -3
  61. package/dist/global-files/digital-assets/assetTypes.js +517 -0
  62. package/dist/global-files/digital-assets/assets.actions.js +64 -0
  63. package/dist/global-files/digital-assets/assets.adapter.js +304 -0
  64. package/dist/global-files/digital-assets/assets.mock.js +136 -0
  65. package/dist/global-files/digital-assets/assets.reducer.js +220 -0
  66. package/dist/global-files/digital-assets/uploadAssets.js +202 -0
  67. package/dist/global-files/digital-assets/useDigitalAssets.js +535 -0
  68. package/dist/index.js +142 -90
  69. package/docs/activos-digitales.md +273 -0
  70. package/package.json +1 -1
  71. package/src/components/atoms/AsignationOption/index.js +1 -1
  72. package/src/components/atoms/AsignationOption/styles.js +9 -0
  73. package/src/components/atoms/AssetPreview/AssetPreview.stories.js +78 -0
  74. package/src/components/atoms/AssetPreview/index.js +119 -0
  75. package/src/components/atoms/AssetPreview/styles.js +190 -0
  76. package/src/components/atoms/IconFile/index.js +28 -1
  77. package/src/components/atoms/IconFile/styles.js +8 -0
  78. package/src/components/atoms/ProductImage/ProductImage.stories.js +38 -0
  79. package/src/components/atoms/ProductImage/index.js +95 -20
  80. package/src/components/atoms/ProductImage/styles.js +92 -7
  81. package/src/components/molecules/EditionActiveImage/index.js +2 -2
  82. package/src/components/molecules/GalleryAssetElement/GalleryAssetElement.stories.js +102 -0
  83. package/src/components/molecules/GalleryAssetElement/index.js +162 -0
  84. package/src/components/molecules/GalleryAssetElement/styles.js +163 -0
  85. package/src/components/molecules/GalleryElement/index.js +9 -0
  86. package/src/components/molecules/GalleryHeader/index.js +65 -13
  87. package/src/components/molecules/GalleryHeader/styles.js +2 -1
  88. package/src/components/molecules/GalleryTrayTabs/GalleryTrayTabs.stories.js +32 -0
  89. package/src/components/molecules/GalleryTrayTabs/index.js +41 -0
  90. package/src/components/molecules/GalleryTrayTabs/styles.js +52 -0
  91. package/src/components/molecules/ImageSelector/index.js +1 -0
  92. package/src/components/molecules/RetailerSelector/RetailerSelector.stories.js +15 -1
  93. package/src/components/molecules/RetailerSelector/index.js +8 -1
  94. package/src/components/molecules/RetailerSelectorv2/index.js +7 -1
  95. package/src/components/organisms/DigitalAssetsTray/DigitalAssetsTray.stories.js +164 -0
  96. package/src/components/organisms/DigitalAssetsTray/index.js +193 -0
  97. package/src/components/organisms/DigitalAssetsTray/styles.js +183 -0
  98. package/src/components/organisms/ImagePreviewer/index.js +1 -0
  99. package/src/components/organisms/ProductImageModal/index.js +1 -0
  100. package/src/components/pages/RetailerProductEdition/context/provider-product-edition.context.jsx +201 -0
  101. package/src/components/pages/RetailerProductEdition/context/provider-product-edition.reducer.js +12 -0
  102. package/src/components/pages/RetailerProductEdition/index.js +356 -139
  103. package/src/components/pages/RetailerProductEdition/stories/ImageEditor.stories.js +1 -0
  104. package/src/global-files/data.js +17 -2
  105. package/src/global-files/digital-assets/assetTypes.js +451 -0
  106. package/src/global-files/digital-assets/assets.actions.js +50 -0
  107. package/src/global-files/digital-assets/assets.adapter.js +229 -0
  108. package/src/global-files/digital-assets/assets.mock.js +122 -0
  109. package/src/global-files/digital-assets/assets.reducer.js +197 -0
  110. package/src/global-files/digital-assets/uploadAssets.js +124 -0
  111. package/src/global-files/digital-assets/useDigitalAssets.js +340 -0
  112. package/src/index.js +4 -0
@@ -0,0 +1,379 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.ProductHeader = void 0;
9
+
10
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
13
+
14
+ var _react = require("react");
15
+
16
+ var _material = require("@mui/material");
17
+
18
+ var _LocalPolice = _interopRequireDefault(require("@mui/icons-material/LocalPolice"));
19
+
20
+ var _LocalPoliceOutlined = _interopRequireDefault(require("@mui/icons-material/LocalPoliceOutlined"));
21
+
22
+ var _acceptIcon = _interopRequireDefault(require("../../../../assets/images/generalButton/acceptIcon.svg"));
23
+
24
+ var _rejectIcon = _interopRequireDefault(require("../../../../assets/images/generalButton/rejectIcon.svg"));
25
+
26
+ var _nullIcon = _interopRequireDefault(require("../../../../assets/images/generalButton/nullIcon.svg"));
27
+
28
+ var _RetailerMenu = require("./RetailerMenu");
29
+
30
+ var _StatusChip = require("./StatusChip");
31
+
32
+ var _tokens = require("./tokens");
33
+
34
+ var _jsxRuntime = require("react/jsx-runtime");
35
+
36
+ /*
37
+ Cabecera del producto: nombre, estatus, completitud, fecha, datos (UPC, SKU,
38
+ categoría, proveedor), selector de cadena y botón de evaluación.
39
+
40
+ Reemplaza a `organisms/FullProductNameHeader` (y a sus hijos ProductNameHeader,
41
+ FeaturesBar, AvatarAndValidation, ValidationPanel) con los mismos props y el
42
+ mismo comportamiento, hecho con MUI y responsivo: en pantallas chicas las
43
+ filas se acomodan en varias líneas en vez de salirse.
44
+ */
45
+ var getTime = function getTime(date) {
46
+ return date ? new Date(date).toLocaleDateString() : "";
47
+ };
48
+
49
+ var FeatureTag = function FeatureTag(_ref) {
50
+ var feature = _ref.feature,
51
+ value = _ref.value;
52
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
53
+ component: "span",
54
+ sx: {
55
+ display: "inline-flex",
56
+ alignItems: "baseline",
57
+ gap: "5px",
58
+ maxWidth: "100%",
59
+ minHeight: 26,
60
+ px: "5px",
61
+ py: "4px",
62
+ boxSizing: "border-box",
63
+ bgcolor: _tokens.COLORS.s2,
64
+ borderRadius: "3px"
65
+ },
66
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Typography, {
67
+ component: "span",
68
+ sx: {
69
+ fontFamily: _tokens.FONTS.Raleway_500,
70
+ fontSize: 14,
71
+ lineHeight: "18px",
72
+ color: _tokens.COLORS.original_magenta,
73
+ flexShrink: 0
74
+ },
75
+ children: feature
76
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Typography, {
77
+ component: "span",
78
+ sx: {
79
+ fontFamily: _tokens.FONTS.AvenirNext,
80
+ fontSize: 12,
81
+ lineHeight: "16px",
82
+ letterSpacing: "-0.015em",
83
+ color: _tokens.COLORS.color_gray,
84
+ minWidth: 0,
85
+ overflowWrap: "anywhere"
86
+ },
87
+ children: value
88
+ })]
89
+ });
90
+ };
91
+
92
+ var CompletenessBadges = function CompletenessBadges(_ref2) {
93
+ var percent = _ref2.percent;
94
+ var rounded = Math.round(percent !== null && percent !== void 0 ? percent : 0);
95
+ var complete = rounded >= 100;
96
+ var showPercent = percent || percent === 0;
97
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
98
+ children: [percent ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
99
+ arrow: true,
100
+ title: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
101
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("b", {
102
+ children: "Campos requeridos"
103
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("br", {}), "Este nuevo icono te indicar\xE1 cuando completes todos los campos requeridos"]
104
+ }),
105
+ children: complete ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_LocalPolice.default, {
106
+ sx: {
107
+ fontSize: 30,
108
+ color: _tokens.COLORS.color_pink,
109
+ cursor: "pointer"
110
+ }
111
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_LocalPoliceOutlined.default, {
112
+ sx: {
113
+ fontSize: 30,
114
+ color: _tokens.COLORS.s3,
115
+ cursor: "pointer"
116
+ }
117
+ })
118
+ }) : null, showPercent && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
119
+ arrow: true,
120
+ title: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
121
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("b", {
122
+ children: "Porcentaje de requeridos"
123
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("br", {}), "Este porcentaje indica la completitud de los atributos requeridos para todos los servicios."]
124
+ }),
125
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
126
+ component: "span",
127
+ sx: {
128
+ px: "6px",
129
+ height: 27,
130
+ lineHeight: "27px",
131
+ borderRadius: "15px",
132
+ bgcolor: complete ? _tokens.COLORS.color_pink : _tokens.COLORS.s3,
133
+ color: _tokens.COLORS.white,
134
+ fontFamily: _tokens.FONTS.AvenirNext,
135
+ fontWeight: 600,
136
+ fontSize: 14
137
+ },
138
+ children: [rounded, "%"]
139
+ })
140
+ })]
141
+ });
142
+ };
143
+
144
+ var EvaluationMenu = function EvaluationMenu(_ref3) {
145
+ var approve = _ref3.approve,
146
+ reject = _ref3.reject,
147
+ approveAll = _ref3.approveAll,
148
+ rejectAll = _ref3.rejectAll,
149
+ showApproveRejectAll = _ref3.showApproveRejectAll;
150
+
151
+ var _useState = (0, _react.useState)(null),
152
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
153
+ anchor = _useState2[0],
154
+ setAnchor = _useState2[1];
155
+
156
+ var close = function close() {
157
+ return setAnchor(null);
158
+ }; // Como en ValidationPanel: cada opción dispara su acción y el panel se cierra.
159
+
160
+
161
+ var option = function option(icon, label, action) {
162
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.MenuItem, {
163
+ onClick: function onClick() {
164
+ close();
165
+ action && action();
166
+ },
167
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemIcon, {
168
+ sx: {
169
+ minWidth: 30
170
+ },
171
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("img", {
172
+ src: icon,
173
+ alt: "",
174
+ width: 20,
175
+ height: 20
176
+ })
177
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemText, {
178
+ primary: label,
179
+ primaryTypographyProps: {
180
+ sx: {
181
+ fontFamily: _tokens.FONTS.AvenirNext,
182
+ fontSize: 13,
183
+ color: _tokens.COLORS.s5,
184
+ whiteSpace: "normal"
185
+ }
186
+ }
187
+ })]
188
+ }, label);
189
+ };
190
+
191
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
192
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
193
+ title: "Evaluar",
194
+ arrow: true,
195
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.IconButton, {
196
+ "aria-label": "Evaluar",
197
+ size: "small",
198
+ onClick: function onClick(e) {
199
+ return setAnchor(e.currentTarget);
200
+ },
201
+ sx: {
202
+ width: 25,
203
+ height: 25,
204
+ p: 0
205
+ },
206
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("img", {
207
+ src: _nullIcon.default,
208
+ alt: "",
209
+ width: 25,
210
+ height: 25
211
+ })
212
+ })
213
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Menu, {
214
+ anchorEl: anchor,
215
+ open: Boolean(anchor),
216
+ onClose: close,
217
+ anchorOrigin: {
218
+ vertical: "bottom",
219
+ horizontal: "right"
220
+ },
221
+ transformOrigin: {
222
+ vertical: "top",
223
+ horizontal: "right"
224
+ },
225
+ PaperProps: {
226
+ sx: {
227
+ mt: 1,
228
+ maxWidth: "calc(100vw - 24px)"
229
+ }
230
+ },
231
+ children: [option(_acceptIcon.default, "Validado", approve), option(_rejectIcon.default, "Rechazado", reject), showApproveRejectAll && option(_acceptIcon.default, "Validar todo y enviar a evaluación", approveAll), showApproveRejectAll && option(_rejectIcon.default, "Rechazar todo y enviar a evaluación", rejectAll)]
232
+ })]
233
+ });
234
+ };
235
+
236
+ var ProductHeader = function ProductHeader(_ref4) {
237
+ var _headerData$article3, _headerData$article3$, _headerData$article3$2, _headerData$categoryR, _headerData$categoryR2, _headerData$categoryR3, _headerData$categoryR4, _headerData$article4, _headerData$article5, _headerData$article6, _headerData$article7, _headerData$article8;
238
+
239
+ var headerData = _ref4.headerData,
240
+ percent = _ref4.percent,
241
+ activeRetailer = _ref4.activeRetailer,
242
+ setActiveRetailer = _ref4.setActiveRetailer,
243
+ showValidationButtons = _ref4.showValidationButtons,
244
+ approve = _ref4.approve,
245
+ reject = _ref4.reject,
246
+ approveAll = _ref4.approveAll,
247
+ rejectAll = _ref4.rejectAll,
248
+ servicesData = _ref4.servicesData,
249
+ showApproveRejectAll = _ref4.showApproveRejectAll,
250
+ _ref4$showStatus = _ref4.showStatus,
251
+ showStatus = _ref4$showStatus === void 0 ? true : _ref4$showStatus;
252
+
253
+ // Misma fuente de cadenas que FullProductNameHeader: desde tareas llega el
254
+ // orden por cadena; si no, la relación categoría-cadena del artículo.
255
+ var _useState3 = (0, _react.useState)([]),
256
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
257
+ retailers = _useState4[0],
258
+ setRetailers = _useState4[1];
259
+
260
+ (0, _react.useEffect)(function () {
261
+ var _headerData$article, _ref5;
262
+
263
+ var fromTasks = Boolean(headerData.statusByRetailer);
264
+ var categoryRetailer = headerData.categoryRetailer || ((_headerData$article = headerData.article) === null || _headerData$article === void 0 ? void 0 : _headerData$article.categoryRetailer);
265
+ setRetailers((_ref5 = fromTasks ? headerData.categoryRetailerInOrder : categoryRetailer) !== null && _ref5 !== void 0 ? _ref5 : []);
266
+ }, [servicesData]);
267
+ var retailerIndex = (0, _react.useMemo)(function () {
268
+ var _headerData$article2, _source$findIndex;
269
+
270
+ var source = (headerData === null || headerData === void 0 ? void 0 : (_headerData$article2 = headerData.article) === null || _headerData$article2 === void 0 ? void 0 : _headerData$article2.categoryRetailer) || (headerData === null || headerData === void 0 ? void 0 : headerData.categoryRetailerInOrder) || (headerData === null || headerData === void 0 ? void 0 : headerData.categoryRetailer);
271
+ return (_source$findIndex = source === null || source === void 0 ? void 0 : source.findIndex(function (retailer) {
272
+ return (retailer === null || retailer === void 0 ? void 0 : retailer.id_retailer) === (activeRetailer === null || activeRetailer === void 0 ? void 0 : activeRetailer.id);
273
+ })) !== null && _source$findIndex !== void 0 ? _source$findIndex : -1;
274
+ }, [activeRetailer, headerData]);
275
+ var status = showStatus ? (headerData === null || headerData === void 0 ? void 0 : headerData.version_status) || (headerData === null || headerData === void 0 ? void 0 : headerData.status) || (headerData === null || headerData === void 0 ? void 0 : headerData.article_status) : null;
276
+ var category = ((headerData === null || headerData === void 0 ? void 0 : (_headerData$article3 = headerData.article) === null || _headerData$article3 === void 0 ? void 0 : (_headerData$article3$ = _headerData$article3.categoryRetailer) === null || _headerData$article3$ === void 0 ? void 0 : (_headerData$article3$2 = _headerData$article3$[retailerIndex]) === null || _headerData$article3$2 === void 0 ? void 0 : _headerData$article3$2.category_name) || (headerData === null || headerData === void 0 ? void 0 : (_headerData$categoryR = headerData.categoryRetailerInOrder) === null || _headerData$categoryR === void 0 ? void 0 : (_headerData$categoryR2 = _headerData$categoryR[retailerIndex]) === null || _headerData$categoryR2 === void 0 ? void 0 : _headerData$categoryR2.category) || (headerData === null || headerData === void 0 ? void 0 : (_headerData$categoryR3 = headerData.categoryRetailer) === null || _headerData$categoryR3 === void 0 ? void 0 : (_headerData$categoryR4 = _headerData$categoryR3[retailerIndex]) === null || _headerData$categoryR4 === void 0 ? void 0 : _headerData$categoryR4.category) || headerData.categoryName || "").replace(/\|/g, " | ");
277
+ var features = [{
278
+ feature: "UPC",
279
+ value: (headerData === null || headerData === void 0 ? void 0 : (_headerData$article4 = headerData.article) === null || _headerData$article4 === void 0 ? void 0 : _headerData$article4.upc) || (headerData === null || headerData === void 0 ? void 0 : headerData.upc)
280
+ }, {
281
+ feature: "SKU",
282
+ value: (headerData === null || headerData === void 0 ? void 0 : (_headerData$article5 = headerData.article) === null || _headerData$article5 === void 0 ? void 0 : _headerData$article5.sku) || (headerData === null || headerData === void 0 ? void 0 : headerData.sku)
283
+ }, {
284
+ feature: "Categoría",
285
+ value: category
286
+ }, {
287
+ feature: "Prov",
288
+ value: headerData === null || headerData === void 0 ? void 0 : (_headerData$article6 = headerData.article) === null || _headerData$article6 === void 0 ? void 0 : _headerData$article6.company_name
289
+ }].filter(function (item) {
290
+ return item.value;
291
+ });
292
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
293
+ component: "header",
294
+ sx: {
295
+ mb: "17px",
296
+ minWidth: 0
297
+ },
298
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Stack, {
299
+ direction: "row",
300
+ alignItems: "center",
301
+ flexWrap: "wrap",
302
+ columnGap: "10px",
303
+ rowGap: 0.5,
304
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Typography, {
305
+ component: "h2",
306
+ sx: {
307
+ fontFamily: _tokens.FONTS.Raleway,
308
+ fontWeight: 500,
309
+ fontSize: {
310
+ xs: 20,
311
+ sm: 24
312
+ },
313
+ lineHeight: {
314
+ xs: "28px",
315
+ sm: "36px"
316
+ },
317
+ letterSpacing: "-0.015em",
318
+ color: _tokens.COLORS.color_gray,
319
+ mt: "8px",
320
+ minWidth: 0,
321
+ overflowWrap: "anywhere"
322
+ },
323
+ children: (headerData === null || headerData === void 0 ? void 0 : (_headerData$article7 = headerData.article) === null || _headerData$article7 === void 0 ? void 0 : _headerData$article7.name) || (headerData === null || headerData === void 0 ? void 0 : headerData.name)
324
+ }), status && /*#__PURE__*/(0, _jsxRuntime.jsx)(_StatusChip.StatusChip, {
325
+ status: status
326
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(CompletenessBadges, {
327
+ percent: percent
328
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Typography, {
329
+ component: "span",
330
+ sx: {
331
+ fontFamily: _tokens.FONTS.AvenirNext,
332
+ fontSize: 13,
333
+ lineHeight: "18px",
334
+ color: _tokens.COLORS.s4
335
+ },
336
+ children: getTime((headerData === null || headerData === void 0 ? void 0 : (_headerData$article8 = headerData.article) === null || _headerData$article8 === void 0 ? void 0 : _headerData$article8.timestamp) || (headerData === null || headerData === void 0 ? void 0 : headerData.timestamp))
337
+ })]
338
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Stack, {
339
+ direction: "row",
340
+ alignItems: "flex-start",
341
+ justifyContent: "space-between",
342
+ gap: 1,
343
+ sx: {
344
+ mt: 0.5
345
+ },
346
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Stack, {
347
+ direction: "row",
348
+ flexWrap: "wrap",
349
+ gap: "8px",
350
+ sx: {
351
+ minWidth: 0
352
+ },
353
+ children: features.map(function (item) {
354
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(FeatureTag, (0, _objectSpread2.default)({}, item), item.feature);
355
+ })
356
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Stack, {
357
+ direction: "row",
358
+ alignItems: "center",
359
+ gap: 1,
360
+ sx: {
361
+ flexShrink: 0
362
+ },
363
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_RetailerMenu.RetailerMenu, {
364
+ retailers: retailers,
365
+ activeRetailer: activeRetailer,
366
+ setActiveRetailer: setActiveRetailer
367
+ }), showValidationButtons && /*#__PURE__*/(0, _jsxRuntime.jsx)(EvaluationMenu, {
368
+ approve: approve,
369
+ reject: reject,
370
+ approveAll: approveAll,
371
+ rejectAll: rejectAll,
372
+ showApproveRejectAll: showApproveRejectAll
373
+ })]
374
+ })]
375
+ })]
376
+ });
377
+ };
378
+
379
+ exports.ProductHeader = ProductHeader;
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.ProductMedia = void 0;
9
+
10
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
13
+
14
+ var _react = require("react");
15
+
16
+ var _material = require("@mui/material");
17
+
18
+ var _PlayCircleFilled = _interopRequireDefault(require("@mui/icons-material/PlayCircleFilled"));
19
+
20
+ var _assetTypes = require("../../../../global-files/digital-assets/assetTypes");
21
+
22
+ var _defaultProductImage = _interopRequireDefault(require("../../../../assets/images/defaultImages/defaultProductImage.png"));
23
+
24
+ var _jsxRuntime = require("react/jsx-runtime");
25
+
26
+ /*
27
+ Imagen o video de producto, con MUI. Hace lo mismo que `atoms/ProductImage`:
28
+
29
+ - El tipo se decide por `ext`; la URL no sirve porque apunta al
30
+ redimensionador de CloudFront y no conserva la extensión. El regex sobre la
31
+ URL queda de respaldo, igual que en el original.
32
+ - Una miniatura de video NO lleva controles (no caben y se tragan el clic):
33
+ se muestra el primer fotograma, un botón de play y la duración.
34
+ - Si la imagen no carga, se muestra la imagen por defecto.
35
+ */
36
+ var isVideo = function isVideo(_ref) {
37
+ var src = _ref.src,
38
+ ext = _ref.ext;
39
+ return ext ? (0, _assetTypes.resolvePreviewKind)({
40
+ ext: ext
41
+ }) === _assetTypes.ASSET_PREVIEW.VIDEO : /\.mp4($|[?#])/i.test(src || "");
42
+ };
43
+
44
+ var ProductMedia = function ProductMedia(_ref2) {
45
+ var src = _ref2.src,
46
+ ext = _ref2.ext,
47
+ _ref2$alt = _ref2.alt,
48
+ alt = _ref2$alt === void 0 ? "" : _ref2$alt,
49
+ _ref2$thumbnail = _ref2.thumbnail,
50
+ thumbnail = _ref2$thumbnail === void 0 ? false : _ref2$thumbnail,
51
+ sx = _ref2.sx;
52
+
53
+ var _useState = (0, _react.useState)(false),
54
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
55
+ failed = _useState2[0],
56
+ setFailed = _useState2[1];
57
+
58
+ var _useState3 = (0, _react.useState)(null),
59
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
60
+ duration = _useState4[0],
61
+ setDuration = _useState4[1];
62
+
63
+ var fill = {
64
+ width: "100%",
65
+ height: "100%",
66
+ objectFit: "contain",
67
+ display: "block"
68
+ };
69
+
70
+ if (isVideo({
71
+ src: src,
72
+ ext: ext
73
+ })) {
74
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
75
+ sx: (0, _objectSpread2.default)({
76
+ position: "relative",
77
+ width: "100%",
78
+ height: "100%"
79
+ }, sx),
80
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Box, {
81
+ component: "video",
82
+ src: thumbnail ? "".concat(src, "#t=0.5") : src,
83
+ controls: !thumbnail,
84
+ muted: thumbnail,
85
+ playsInline: true,
86
+ preload: "metadata",
87
+ onLoadedMetadata: function onLoadedMetadata(e) {
88
+ return setDuration(e.target.duration);
89
+ },
90
+ sx: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, fill), {}, {
91
+ bgcolor: "#000",
92
+ pointerEvents: thumbnail ? "none" : "auto"
93
+ })
94
+ }), thumbnail && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
95
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_PlayCircleFilled.default, {
96
+ "aria-hidden": true,
97
+ sx: {
98
+ position: "absolute",
99
+ top: "50%",
100
+ left: "50%",
101
+ transform: "translate(-50%, -50%)",
102
+ fontSize: 24,
103
+ color: "rgba(255,255,255,0.9)",
104
+ filter: "drop-shadow(0 0 2px rgba(0,0,0,0.6))",
105
+ pointerEvents: "none"
106
+ }
107
+ }), duration ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Box, {
108
+ component: "span",
109
+ sx: {
110
+ position: "absolute",
111
+ right: 3,
112
+ bottom: 3,
113
+ px: "4px",
114
+ borderRadius: "3px",
115
+ bgcolor: "rgba(0,0,0,0.75)",
116
+ color: "#fff",
117
+ fontSize: 9,
118
+ lineHeight: "13px",
119
+ pointerEvents: "none"
120
+ },
121
+ children: (0, _assetTypes.formatDuration)(duration)
122
+ }) : null]
123
+ })]
124
+ });
125
+ }
126
+
127
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Box, {
128
+ component: "img",
129
+ src: failed || !src ? _defaultProductImage.default : src,
130
+ alt: alt,
131
+ onError: function onError() {
132
+ return setFailed(true);
133
+ },
134
+ sx: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, fill), sx)
135
+ });
136
+ };
137
+
138
+ exports.ProductMedia = ProductMedia;
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.RetailerMenu = void 0;
9
+
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
11
+
12
+ var _react = require("react");
13
+
14
+ var _material = require("@mui/material");
15
+
16
+ var _ArrowDropDown = _interopRequireDefault(require("@mui/icons-material/ArrowDropDown"));
17
+
18
+ var _ArrowDropUp = _interopRequireDefault(require("@mui/icons-material/ArrowDropUp"));
19
+
20
+ var _data = require("../../../../global-files/data");
21
+
22
+ var _StatusChip = require("./StatusChip");
23
+
24
+ var _tokens = require("./tokens");
25
+
26
+ var _jsxRuntime = require("react/jsx-runtime");
27
+
28
+ /**
29
+ * Selector de la cadena activa. Reemplaza a `molecules/RetailerSelector` con el
30
+ * mismo comportamiento:
31
+ * - el logo de la cadena activa abre la lista;
32
+ * - la activa se marca en rosa suave y con el círculo verde;
33
+ * - una cadena cuyo estatus de servicios es "NA" no se puede elegir.
34
+ */
35
+ var RetailerMenu = function RetailerMenu(_ref) {
36
+ var _ref$retailers = _ref.retailers,
37
+ retailers = _ref$retailers === void 0 ? [] : _ref$retailers,
38
+ activeRetailer = _ref.activeRetailer,
39
+ setActiveRetailer = _ref.setActiveRetailer;
40
+
41
+ var _useState = (0, _react.useState)(null),
42
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
43
+ anchor = _useState2[0],
44
+ setAnchor = _useState2[1];
45
+
46
+ var activeId = (0, _tokens.retailerId)(activeRetailer);
47
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
48
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.ButtonBase, {
49
+ "aria-label": "Cambiar de cadena",
50
+ "aria-haspopup": "menu",
51
+ "aria-expanded": Boolean(anchor),
52
+ onClick: function onClick(e) {
53
+ return (retailers === null || retailers === void 0 ? void 0 : retailers.length) > 0 && setAnchor(e.currentTarget);
54
+ },
55
+ sx: {
56
+ borderRadius: "14px",
57
+ pr: 0.25
58
+ },
59
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Avatar, {
60
+ src: (0, _tokens.retailerImage)(activeRetailer),
61
+ alt: activeRetailer === null || activeRetailer === void 0 ? void 0 : activeRetailer.name,
62
+ sx: {
63
+ width: 26,
64
+ height: 26,
65
+ bgcolor: _tokens.COLORS.s2
66
+ }
67
+ }), anchor ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_ArrowDropUp.default, {
68
+ sx: {
69
+ color: _tokens.COLORS.s4
70
+ }
71
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_ArrowDropDown.default, {
72
+ sx: {
73
+ color: _tokens.COLORS.s4
74
+ }
75
+ })]
76
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Menu, {
77
+ anchorEl: anchor,
78
+ open: Boolean(anchor),
79
+ onClose: function onClose() {
80
+ return setAnchor(null);
81
+ },
82
+ anchorOrigin: {
83
+ vertical: "bottom",
84
+ horizontal: "right"
85
+ },
86
+ transformOrigin: {
87
+ vertical: "top",
88
+ horizontal: "right"
89
+ },
90
+ PaperProps: {
91
+ sx: {
92
+ mt: 1,
93
+ bgcolor: _tokens.COLORS.s2,
94
+ border: "1px solid ".concat(_tokens.COLORS.s3),
95
+ maxWidth: "calc(100vw - 24px)"
96
+ }
97
+ },
98
+ children: retailers.map(function (retailer, index) {
99
+ var isActive = (0, _tokens.retailerId)(retailer) != null && (0, _tokens.retailerId)(retailer) === activeId;
100
+ var status = retailer !== null && retailer !== void 0 && retailer.services ? (0, _data.getNewStatus)(retailer.services) : null;
101
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.MenuItem, {
102
+ selected: isActive,
103
+ onClick: function onClick() {
104
+ if (status === "NA") return;
105
+ setActiveRetailer(retailer);
106
+ setAnchor(null);
107
+ },
108
+ sx: {
109
+ gap: 1.25,
110
+ borderRadius: "3px",
111
+ mx: 0.75,
112
+ "&.Mui-selected, &.Mui-selected:hover": {
113
+ backgroundColor: "rgba(".concat(_tokens.COLORS.rgb_color_pink, ", 0.1)")
114
+ },
115
+ "&.Mui-selected:hover": {
116
+ backgroundColor: "rgba(".concat(_tokens.COLORS.rgb_color_pink, ", 0.18)")
117
+ }
118
+ },
119
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemAvatar, {
120
+ sx: {
121
+ minWidth: 0
122
+ },
123
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Avatar, {
124
+ src: (0, _tokens.retailerImage)(retailer),
125
+ alt: retailer === null || retailer === void 0 ? void 0 : retailer.name,
126
+ sx: {
127
+ width: 26,
128
+ height: 26,
129
+ bgcolor: _tokens.COLORS.white
130
+ }
131
+ })
132
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.ListItemText, {
133
+ primary: retailer === null || retailer === void 0 ? void 0 : retailer.name,
134
+ secondary: retailer === null || retailer === void 0 ? void 0 : retailer.team,
135
+ primaryTypographyProps: {
136
+ sx: {
137
+ fontFamily: _tokens.FONTS.AvenirNext,
138
+ fontWeight: 500,
139
+ fontSize: 14,
140
+ color: _tokens.COLORS.s5,
141
+ whiteSpace: "normal"
142
+ }
143
+ }
144
+ }), status && /*#__PURE__*/(0, _jsxRuntime.jsx)(_StatusChip.StatusChip, {
145
+ status: status
146
+ }), isActive && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Box, {
147
+ "aria-label": "Cadena activa",
148
+ sx: {
149
+ width: 20,
150
+ height: 20,
151
+ flexShrink: 0,
152
+ borderRadius: "50%",
153
+ bgcolor: _tokens.COLORS.exported
154
+ }
155
+ })]
156
+ }, "".concat(index, "-").concat(retailer === null || retailer === void 0 ? void 0 : retailer.name));
157
+ })
158
+ })]
159
+ });
160
+ };
161
+
162
+ exports.RetailerMenu = RetailerMenu;