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
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.GalleryHeader = void 0;
6
+ exports.GalleryHeader = exports.GALLERY_COLUMNS = void 0;
7
7
 
8
8
  var _styles = require("./styles");
9
9
 
@@ -11,13 +11,97 @@ var _CheckBox = require("../../atoms/CheckBox");
11
11
 
12
12
  var _jsxRuntime = require("react/jsx-runtime");
13
13
 
14
+ /*
15
+ Las columnas de la bandeja dependen de qué se está listando: un PDF no tiene
16
+ "tipo de toma" ni alto por ancho, y una foto no tiene "tipo de activo".
17
+ Estaban escritas a mano en el marcado, así que la única forma de cambiarlas
18
+ era duplicar el componente.
19
+
20
+ El preset `image` reproduce exactamente las columnas y clases de antes, para
21
+ que la bandeja de imágenes se vea idéntica sin que nadie tenga que pasar nada.
22
+ */
23
+ var GALLERY_COLUMNS = {
24
+ image: {
25
+ template: "0.1fr 1fr 1fr 1fr 1fr 1fr",
26
+ columns: [{
27
+ key: "preview",
28
+ label: "Imagen",
29
+ className: "image-header"
30
+ }, {
31
+ key: "name",
32
+ label: "Nombre",
33
+ className: "image-name"
34
+ }, {
35
+ key: "size",
36
+ label: "Tamaño",
37
+ className: "image-size"
38
+ }, {
39
+ key: "format",
40
+ label: "Formato",
41
+ className: "image-format"
42
+ }, {
43
+ key: "legend",
44
+ label: "¿Tiene leyenda?",
45
+ className: "image-description"
46
+ }, {
47
+ key: "shotType",
48
+ label: "Tipo de toma",
49
+ className: "shoot-type"
50
+ }]
51
+ },
52
+ asset: {
53
+ template: "0.1fr 1fr 1fr 1fr 1fr",
54
+ columns: [{
55
+ key: "preview",
56
+ label: "Activo",
57
+ className: "asset-header"
58
+ }, {
59
+ key: "name",
60
+ label: "Nombre",
61
+ className: "asset-name"
62
+ }, {
63
+ key: "weight",
64
+ label: "Peso",
65
+ className: "asset-weight"
66
+ }, {
67
+ key: "format",
68
+ label: "Formato",
69
+ className: "asset-format"
70
+ }, {
71
+ key: "assetType",
72
+ label: "Tipo de activo",
73
+ className: "asset-type"
74
+ }]
75
+ }
76
+ };
77
+ /**
78
+ * Encabezado de la bandeja, con su casilla de "seleccionar todo".
79
+ *
80
+ * `checkAllId` e `itemSelector` se pueden cambiar porque imágenes y activos
81
+ * conviven en la misma pestaña: si las dos listas compartieran el id de la
82
+ * casilla global, marcar todas las imágenes marcaría también los activos.
83
+ */
84
+
85
+ exports.GALLERY_COLUMNS = GALLERY_COLUMNS;
86
+
14
87
  var GalleryHeader = function GalleryHeader(_ref) {
88
+ var _GALLERY_COLUMNS$vari;
89
+
15
90
  var setCheckAll = _ref.setCheckAll,
16
91
  setSelectedImages = _ref.setSelectedImages,
17
- shotThd = _ref.shotThd;
92
+ shotThd = _ref.shotThd,
93
+ _ref$variant = _ref.variant,
94
+ variant = _ref$variant === void 0 ? "image" : _ref$variant,
95
+ columns = _ref.columns,
96
+ _ref$checkAllId = _ref.checkAllId,
97
+ checkAllId = _ref$checkAllId === void 0 ? "check-all-images" : _ref$checkAllId,
98
+ _ref$itemSelector = _ref.itemSelector,
99
+ itemSelector = _ref$itemSelector === void 0 ? "[id^='gallery-element-']" : _ref$itemSelector;
100
+ var preset = (_GALLERY_COLUMNS$vari = GALLERY_COLUMNS[variant]) !== null && _GALLERY_COLUMNS$vari !== void 0 ? _GALLERY_COLUMNS$vari : GALLERY_COLUMNS.image;
101
+ var visibleColumns = columns !== null && columns !== void 0 ? columns : preset.columns;
18
102
 
19
103
  var checkAll = function checkAll(e) {
20
- var checkboxList = document.querySelectorAll("[id^='gallery-element-']");
104
+ var checkboxList = document.querySelectorAll(itemSelector);
21
105
  checkboxList.forEach(function (chk) {
22
106
  return chk.checked = e.target.checked;
23
107
  });
@@ -26,35 +110,23 @@ var GalleryHeader = function GalleryHeader(_ref) {
26
110
  };
27
111
 
28
112
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_styles.Container, {
113
+ template: preset.template,
29
114
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
30
115
  className: "checkbox",
31
116
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_CheckBox.CheckBox, {
32
- id: "check-all-images",
117
+ id: checkAllId,
33
118
  onChange: function onChange(e) {
34
119
  return checkAll(e);
35
120
  }
36
121
  })
37
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
122
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
38
123
  className: "information",
39
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
40
- className: "image-header",
41
- children: "Imagen"
42
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
43
- className: "image-name",
44
- children: "Nombre"
45
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
46
- className: "image-size",
47
- children: "Tama\xF1o"
48
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
49
- className: "image-format",
50
- children: "Formato"
51
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
52
- className: "image-description",
53
- children: "\xBFTiene leyenda?"
54
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
55
- className: "shoot-type",
56
- children: "Tipo de toma"
57
- })]
124
+ children: visibleColumns.map(function (column) {
125
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
126
+ className: column.className,
127
+ children: column.label
128
+ }, column.key);
129
+ })
58
130
  })]
59
131
  });
60
132
  };
@@ -15,6 +15,9 @@ var _variables = require("../../../global-files/variables");
15
15
 
16
16
  var _templateObject;
17
17
 
18
- var Container = _styledComponents.default.div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n width: 100%;\n padding: 10px;\n padding-left: 0;\n align-items: center;\n\n .checkbox{\n width: 5.25%;\n }\n\n .information{\n width: 90%;\n display: grid;\n grid-template-columns: 0.1fr 1fr 1fr 1fr 1fr 1fr;\n }\n .image-header{\n\n }\n\n .image-name{\n padding-left: 1.75rem;\n }\n\n .image-size{\n padding-left: 2.75rem;\n\n }\n\n .image-format{\n padding-left: 4.5rem;\n\n }\n\n .image-description{\n margin-left: -1rem;\n }\n\n .shoot-type{\n }\n\n p {\n font-family: ", ";\n font-style: normal;\n font-weight: 600;\n font-size: 14px;\n line-height: 21px;\n letter-spacing: -0.015em;\n color: ", ";\n flex: 1;\n text-align: center;\n\n /*&.value-header {\n max-width: 60px;\n }\n\n &.image-header {\n max-width: 60px;\n }\n\n &.image-name {\n min-width: 20%;\n }\n\n &.image-format {\n max-width: 60px;\n }\n\n &.image-size {\n max-width: 90px;\n }\n\n &.image-identifier {\n max-width: 80px;\n }\n\n &.image-description {\n max-width: 120px;\n }*/\n }\n"])), _variables.FontFamily.AvenirNext, _variables.GlobalColors.s5);
18
+ var Container = _styledComponents.default.div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n width: 100%;\n padding: 10px;\n padding-left: 0;\n align-items: center;\n\n .checkbox{\n width: 5.25%;\n }\n\n .information{\n width: 90%;\n display: grid;\n /* Lo define el preset de columnas; el valor por defecto es el de im\xE1genes. */\n grid-template-columns: ", ";\n }\n .image-header{\n\n }\n\n .image-name{\n padding-left: 1.75rem;\n }\n\n .image-size{\n padding-left: 2.75rem;\n\n }\n\n .image-format{\n padding-left: 4.5rem;\n\n }\n\n .image-description{\n margin-left: -1rem;\n }\n\n .shoot-type{\n }\n\n p {\n font-family: ", ";\n font-style: normal;\n font-weight: 600;\n font-size: 14px;\n line-height: 21px;\n letter-spacing: -0.015em;\n color: ", ";\n flex: 1;\n text-align: center;\n\n /*&.value-header {\n max-width: 60px;\n }\n\n &.image-header {\n max-width: 60px;\n }\n\n &.image-name {\n min-width: 20%;\n }\n\n &.image-format {\n max-width: 60px;\n }\n\n &.image-size {\n max-width: 90px;\n }\n\n &.image-identifier {\n max-width: 80px;\n }\n\n &.image-description {\n max-width: 120px;\n }*/\n }\n"])), function (_ref) {
19
+ var template = _ref.template;
20
+ return template || "0.1fr 1fr 1fr 1fr 1fr 1fr";
21
+ }, _variables.FontFamily.AvenirNext, _variables.GlobalColors.s5);
19
22
 
20
23
  exports.Container = Container;
@@ -0,0 +1,56 @@
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.default = exports.SinActivos = exports.Interactivo = void 0;
9
+
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
11
+
12
+ var _react = require("react");
13
+
14
+ var _index = require("./index");
15
+
16
+ var _jsxRuntime = require("react/jsx-runtime");
17
+
18
+ var _default = {
19
+ title: "Components/molecules/GalleryTrayTabs",
20
+ component: _index.GalleryTrayTabs
21
+ };
22
+ exports.default = _default;
23
+
24
+ var Interactivo = function Interactivo() {
25
+ var _useState = (0, _react.useState)(_index.TRAYS.IMAGES),
26
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
27
+ tray = _useState2[0],
28
+ setTray = _useState2[1];
29
+
30
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.GalleryTrayTabs, {
31
+ activeTray: tray,
32
+ setActiveTray: setTray,
33
+ imagesCount: 8,
34
+ assetsCount: 3
35
+ });
36
+ };
37
+ /** Estado real hasta que exista el backend: la bandeja de activos en cero. */
38
+
39
+
40
+ exports.Interactivo = Interactivo;
41
+
42
+ var SinActivos = function SinActivos() {
43
+ var _useState3 = (0, _react.useState)(_index.TRAYS.IMAGES),
44
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
45
+ tray = _useState4[0],
46
+ setTray = _useState4[1];
47
+
48
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.GalleryTrayTabs, {
49
+ activeTray: tray,
50
+ setActiveTray: setTray,
51
+ imagesCount: 8,
52
+ assetsCount: 0
53
+ });
54
+ };
55
+
56
+ exports.SinActivos = SinActivos;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TRAYS = exports.GalleryTrayTabs = void 0;
7
+
8
+ var _styles = require("./styles");
9
+
10
+ var _jsxRuntime = require("react/jsx-runtime");
11
+
12
+ var TRAYS = {
13
+ IMAGES: "images",
14
+ ASSETS: "assets"
15
+ };
16
+ /**
17
+ * Selector entre las dos bandejas de la pestaña Imágenes.
18
+ *
19
+ * Los activos viven aquí y no en una pestaña propia porque es lo que pide la
20
+ * tarea —"dentro de las bandejas de imágenes"— y porque así comparten
21
+ * selección, descarga y permisos con las fotos en vez de duplicarlos.
22
+ */
23
+
24
+ exports.TRAYS = TRAYS;
25
+
26
+ var GalleryTrayTabs = function GalleryTrayTabs(_ref) {
27
+ var _ref$activeTray = _ref.activeTray,
28
+ activeTray = _ref$activeTray === void 0 ? TRAYS.IMAGES : _ref$activeTray,
29
+ setActiveTray = _ref.setActiveTray,
30
+ _ref$imagesCount = _ref.imagesCount,
31
+ imagesCount = _ref$imagesCount === void 0 ? 0 : _ref$imagesCount,
32
+ _ref$assetsCount = _ref.assetsCount,
33
+ assetsCount = _ref$assetsCount === void 0 ? 0 : _ref$assetsCount;
34
+ var trays = [{
35
+ id: TRAYS.IMAGES,
36
+ label: "Imágenes",
37
+ count: imagesCount
38
+ }, {
39
+ id: TRAYS.ASSETS,
40
+ label: "Activos digitales",
41
+ count: assetsCount
42
+ }];
43
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_styles.Container, {
44
+ children: trays.map(function (tray) {
45
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("button", {
46
+ type: "button",
47
+ className: tray.id === activeTray ? "tray-tab active" : "tray-tab",
48
+ onClick: function onClick() {
49
+ return setActiveTray === null || setActiveTray === void 0 ? void 0 : setActiveTray(tray.id);
50
+ },
51
+ children: [tray.label, /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
52
+ className: "tray-count",
53
+ children: tray.count
54
+ })]
55
+ }, tray.id);
56
+ })
57
+ });
58
+ };
59
+
60
+ exports.GalleryTrayTabs = GalleryTrayTabs;
@@ -0,0 +1,20 @@
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.Container = void 0;
9
+
10
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/taggedTemplateLiteral"));
11
+
12
+ var _styledComponents = _interopRequireDefault(require("styled-components"));
13
+
14
+ var _variables = require("../../../global-files/variables");
15
+
16
+ var _templateObject;
17
+
18
+ var Container = _styledComponents.default.div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 0 0;\n\n .tray-tab {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: none;\n border-bottom: 2px solid transparent;\n background: none;\n cursor: pointer;\n font-family: ", ";\n font-size: 14px;\n line-height: 21px;\n letter-spacing: -0.015em;\n color: ", ";\n\n &:hover {\n color: ", ";\n }\n\n &.active {\n color: ", ";\n font-weight: 600;\n border-bottom-color: ", ";\n }\n }\n\n .tray-count {\n min-width: 20px;\n padding: 0 6px;\n border-radius: 10px;\n background: ", ";\n color: ", ";\n font-family: ", ";\n font-size: 11px;\n line-height: 18px;\n text-align: center;\n }\n\n .active .tray-count {\n background: ", ";\n color: ", ";\n }\n"])), _variables.FontFamily.AvenirNext, _variables.GlobalColors.s4, _variables.GlobalColors.s5, _variables.GlobalColors.s5, _variables.GlobalColors.color_purple, _variables.GlobalColors.s2, _variables.GlobalColors.s5, _variables.FontFamily.Lato, _variables.GlobalColors.color_purple, _variables.GlobalColors.white);
19
+
20
+ exports.Container = Container;
@@ -24,6 +24,7 @@ var ImageSelector = function ImageSelector(_ref) {
24
24
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.ProductImage, {
25
25
  img: image.src,
26
26
  altText: image.altText,
27
+ ext: image.ext,
27
28
  imageType: modalSelector ? "catalogue-modal-image" : "carousel-image",
28
29
  onClick: function onClick() {
29
30
  return setActiveImage(index);
@@ -9,6 +9,10 @@ exports.default = exports.RetailerSelectorDefault = void 0;
9
9
 
10
10
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
11
11
 
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
13
+
14
+ var _react = require("react");
15
+
12
16
  var _index = require("./index");
13
17
 
14
18
  var _jsxRuntime = require("react/jsx-runtime");
@@ -16,11 +20,28 @@ var _jsxRuntime = require("react/jsx-runtime");
16
20
  var _default = {
17
21
  title: "Components/molecules/RetailerSelector",
18
22
  component: _index.RetailerSelector
19
- };
23
+ }; // El panel se abre hacia la izquierda del avatar: sin margen quedaría fuera de
24
+ // la vista. La cadena activa vive en estado para que elegir otra se vea.
25
+
20
26
  exports.default = _default;
21
27
 
22
28
  var Template = function Template(args) {
23
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.RetailerSelector, (0, _objectSpread2.default)({}, args));
29
+ var _useState = (0, _react.useState)(args.retailers[1]),
30
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
31
+ activeRetailer = _useState2[0],
32
+ setActiveRetailer = _useState2[1];
33
+
34
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
35
+ style: {
36
+ display: "flex",
37
+ justifyContent: "flex-end",
38
+ width: 420
39
+ },
40
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.RetailerSelector, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, args), {}, {
41
+ activeRetailer: activeRetailer,
42
+ setActiveRetailer: setActiveRetailer
43
+ }))
44
+ });
24
45
  };
25
46
 
26
47
  var RetailerSelectorDefault = Template.bind({});
@@ -111,6 +111,8 @@ var RetailerSelector = function RetailerSelector(_ref) {
111
111
  }), retailersPanel && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
112
112
  className: "retailers-panel",
113
113
  children: retailers.map(function (retailer, index) {
114
+ var _retailer$id, _retailer$id2, _activeRetailer$id;
115
+
114
116
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_AsignationOption.AsignationOption, {
115
117
  profileImage: retailer === null || retailer === void 0 ? void 0 : retailer.image,
116
118
  imageType: "medium-image",
@@ -124,8 +126,11 @@ var RetailerSelector = function RetailerSelector(_ref) {
124
126
  setActiveRetailer(retailer);
125
127
  document.removeEventListener("click", closeRetailersPanel, false);
126
128
  setRetailersPanel(false);
127
- },
128
- active: retailer.id === activeRetailer.id,
129
+ } // El id llega como `id` o como `id_retailer` según el origen
130
+ // (en RetailerProductEdition, `categoryRetailerInOrder` usa
131
+ // `id_retailer`); comparar solo `id` nunca marcaba la activa.
132
+ ,
133
+ active: ((_retailer$id = retailer === null || retailer === void 0 ? void 0 : retailer.id) !== null && _retailer$id !== void 0 ? _retailer$id : retailer === null || retailer === void 0 ? void 0 : retailer.id_retailer) != null && ((_retailer$id2 = retailer === null || retailer === void 0 ? void 0 : retailer.id) !== null && _retailer$id2 !== void 0 ? _retailer$id2 : retailer === null || retailer === void 0 ? void 0 : retailer.id_retailer) === ((_activeRetailer$id = activeRetailer === null || activeRetailer === void 0 ? void 0 : activeRetailer.id) !== null && _activeRetailer$id !== void 0 ? _activeRetailer$id : activeRetailer === null || activeRetailer === void 0 ? void 0 : activeRetailer.id_retailer),
129
134
  showStatus: showStatus
130
135
  }, "".concat(index, "-").concat(retailer === null || retailer === void 0 ? void 0 : retailer.name));
131
136
  })
@@ -86,6 +86,8 @@ var RetailerSelectorv2 = function RetailerSelectorv2(_ref) {
86
86
  }), retailersPanel && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
87
87
  className: "retailers-panel",
88
88
  children: retailers.map(function (retailer, index) {
89
+ var _retailer$id, _retailer$id2, _activeRetailer$id;
90
+
89
91
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_AsignationOption.AsignationOption, {
90
92
  profileImage: retailer === null || retailer === void 0 ? void 0 : retailer.image,
91
93
  imageType: "medium-image",
@@ -97,8 +99,10 @@ var RetailerSelectorv2 = function RetailerSelectorv2(_ref) {
97
99
  setActiveRetailer(retailer);
98
100
  document.removeEventListener("click", closeRetailersPanel, false);
99
101
  setRetailersPanel(false);
100
- },
101
- active: retailer.id === activeRetailer.id,
102
+ } // El id llega como `id` o como `id_retailer` según el origen;
103
+ // comparar solo `id` nunca marcaba la cadena activa.
104
+ ,
105
+ active: ((_retailer$id = retailer === null || retailer === void 0 ? void 0 : retailer.id) !== null && _retailer$id !== void 0 ? _retailer$id : retailer === null || retailer === void 0 ? void 0 : retailer.id_retailer) != null && ((_retailer$id2 = retailer === null || retailer === void 0 ? void 0 : retailer.id) !== null && _retailer$id2 !== void 0 ? _retailer$id2 : retailer === null || retailer === void 0 ? void 0 : retailer.id_retailer) === ((_activeRetailer$id = activeRetailer === null || activeRetailer === void 0 ? void 0 : activeRetailer.id) !== null && _activeRetailer$id !== void 0 ? _activeRetailer$id : activeRetailer === null || activeRetailer === void 0 ? void 0 : activeRetailer.id_retailer),
102
106
  showStatus: showStatus
103
107
  }, "".concat(index, "-").concat(retailer === null || retailer === void 0 ? void 0 : retailer.name));
104
108
  })
@@ -0,0 +1,235 @@
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.default = exports.Vacia = exports.SoloLectura = exports.PayloadDeGuardado = exports.ErroresDeSubida = exports.Cuadricula = exports.ConActivos = void 0;
9
+
10
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
11
+
12
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectWithoutProperties"));
13
+
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
15
+
16
+ var _react = require("react");
17
+
18
+ var _index = require("./index");
19
+
20
+ var _useDigitalAssets = require("../../../global-files/digital-assets/useDigitalAssets");
21
+
22
+ var _assets = require("../../../global-files/digital-assets/assets.reducer");
23
+
24
+ var _assets2 = require("../../../global-files/digital-assets/assets.adapter");
25
+
26
+ var _assets3 = require("../../../global-files/digital-assets/assets.actions");
27
+
28
+ var _assets4 = require("../../../global-files/digital-assets/assets.mock");
29
+
30
+ var _jsxRuntime = require("react/jsx-runtime");
31
+
32
+ var _excluded = ["file"];
33
+ var _default = {
34
+ title: "Components/organisms/DigitalAssetsTray",
35
+ component: _index.DigitalAssetsTray
36
+ };
37
+ /*
38
+ Las historias usan EL MISMO reducer que la ficha, no un estado de juguete.
39
+ Así lo que se ve aquí es el comportamiento real: qué queda marcado para
40
+ guardar, qué se anota para borrar y qué payload saldría hacia el backend.
41
+ */
42
+
43
+ exports.default = _default;
44
+
45
+ var Demo = function Demo(_ref) {
46
+ var _ref$initialAssets = _ref.initialAssets,
47
+ initialAssets = _ref$initialAssets === void 0 ? [] : _ref$initialAssets,
48
+ _ref$localAssets = _ref.localAssets,
49
+ localAssets = _ref$localAssets === void 0 ? [] : _ref$localAssets,
50
+ _ref$gridLayout = _ref.gridLayout,
51
+ gridLayout = _ref$gridLayout === void 0 ? false : _ref$gridLayout,
52
+ _ref$readOnly = _ref.readOnly,
53
+ readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
54
+ _ref$showPayload = _ref.showPayload,
55
+ showPayload = _ref$showPayload === void 0 ? false : _ref$showPayload;
56
+
57
+ var _useReducer = (0, _react.useReducer)(_assets.assetsReducer, _assets.assetsInitialState),
58
+ _useReducer2 = (0, _slicedToArray2.default)(_useReducer, 2),
59
+ state = _useReducer2[0],
60
+ dispatch = _useReducer2[1];
61
+
62
+ var _useState = (0, _react.useState)([]),
63
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
64
+ notices = _useState2[0],
65
+ setNotices = _useState2[1];
66
+
67
+ var tray = (0, _useDigitalAssets.useDigitalAssets)({
68
+ assets: state.assets_values,
69
+ dispatch: dispatch,
70
+ notices: notices,
71
+ setNotices: setNotices
72
+ }); // Carga inicial simulando la respuesta del backend, una sola vez.
73
+
74
+ var _useState3 = (0, _react.useState)(false),
75
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
76
+ loaded = _useState4[0],
77
+ setLoaded = _useState4[1];
78
+
79
+ if (!loaded && (initialAssets.length || localAssets.length)) {
80
+ if (initialAssets.length) tray.replaceAll(initialAssets); // Archivos locales ya en un estado de subida (subiendo, con error...), para
81
+ // ver cómo se pintan sin tener que provocar el fallo contra el backend.
82
+
83
+ if (localAssets.length) {
84
+ dispatch({
85
+ type: _assets3.ASSET_ACTIONS.ADD_ASSETS,
86
+ payload: localAssets.map(function (_ref2) {
87
+ var file = _ref2.file,
88
+ estado = (0, _objectWithoutProperties2.default)(_ref2, _excluded);
89
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, (0, _assets2.fromFile)(file)), estado);
90
+ })
91
+ });
92
+ }
93
+
94
+ setLoaded(true);
95
+ }
96
+
97
+ var payload = (0, _assets2.buildSavePayload)((0, _assets.selectAssetsToSave)(state));
98
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
99
+ style: {
100
+ width: 960
101
+ },
102
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_index.DigitalAssetsTray, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, tray), {}, {
103
+ unsaved: (0, _assets.countUnsavedAssets)(state),
104
+ gridLayout: gridLayout,
105
+ readOnly: readOnly,
106
+ selectedAssets: state.selected_assets,
107
+ setSelectedAssets: function setSelectedAssets(assets) {
108
+ return dispatch({
109
+ type: "SET_SELECTED_ASSETS",
110
+ payload: assets
111
+ });
112
+ },
113
+ setCheckAll: function setCheckAll(checked) {
114
+ return dispatch({
115
+ type: "TOGGLE_CHECK_ALL_ASSETS",
116
+ payload: checked
117
+ });
118
+ }
119
+ })), /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
120
+ style: {
121
+ fontFamily: "Lato",
122
+ fontSize: 12
123
+ },
124
+ children: ["Seleccionados: ", state.selected_assets.length, " \xB7 Sin subir: ", tray.pending.length, " \xB7 Marcados para actualizar: ", state.updated_assets.length, " \xB7 Para borrar:", " ", state.deleted_assets.length, " \xB7 \xBFHay cambios sin guardar?", " ", (0, _assets.hasUnsavedAssets)(state) ? "sí" : "no"]
125
+ }), showPayload && /*#__PURE__*/(0, _jsxRuntime.jsx)("pre", {
126
+ style: {
127
+ fontSize: 11,
128
+ background: "#f7f7fc",
129
+ padding: 12,
130
+ borderRadius: 6,
131
+ maxHeight: 280,
132
+ overflow: "auto"
133
+ },
134
+ children: JSON.stringify(payload, null, 2)
135
+ })]
136
+ });
137
+ };
138
+ /**
139
+ * Estado real de hoy: sin backend, la bandeja arranca vacía. Arrastrar un mp4,
140
+ * un gif, un PDF, un xlsx o un psd lo valida y lo agrega; cualquier otra cosa se
141
+ * rechaza con su motivo. Nada se sube.
142
+ */
143
+
144
+
145
+ var Vacia = function Vacia() {
146
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(Demo, {});
147
+ };
148
+
149
+ exports.Vacia = Vacia;
150
+
151
+ var ConActivos = function ConActivos() {
152
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(Demo, {
153
+ initialAssets: _assets4.backendAssetsMock
154
+ });
155
+ };
156
+
157
+ exports.ConActivos = ConActivos;
158
+
159
+ var Cuadricula = function Cuadricula() {
160
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(Demo, {
161
+ initialAssets: _assets4.backendAssetsMock,
162
+ gridLayout: true
163
+ });
164
+ };
165
+
166
+ exports.Cuadricula = Cuadricula;
167
+
168
+ var SoloLectura = function SoloLectura() {
169
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(Demo, {
170
+ initialAssets: _assets4.backendAssetsMock,
171
+ readOnly: true
172
+ });
173
+ };
174
+ /**
175
+ * Lo que se le enviaría al backend, actualizándose en vivo. Cambia el tipo de un
176
+ * activo y aparece en `updateAssets`; bórralo y su id pasa a `deleteAssets`;
177
+ * suelta un archivo nuevo y aparece en `newAssets` sin `key`, porque todavía no
178
+ * se ha subido a S3.
179
+ */
180
+
181
+
182
+ exports.SoloLectura = SoloLectura;
183
+
184
+ var PayloadDeGuardado = function PayloadDeGuardado() {
185
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(Demo, {
186
+ initialAssets: _assets4.backendAssetsMock,
187
+ showPayload: true
188
+ });
189
+ };
190
+
191
+ exports.PayloadDeGuardado = PayloadDeGuardado;
192
+
193
+ var archivo = function archivo(name, type) {
194
+ return new File(["x"], name, {
195
+ type: type
196
+ });
197
+ };
198
+ /**
199
+ * Cómo se ve una subida que falla: el motivo aparece debajo del archivo y el
200
+ * resto sigue su curso. Los textos son los que producen de verdad
201
+ * `uploadAssets.js` (S3 y firma) y `presign-asset-upload` (rechazo del servidor).
202
+ */
203
+
204
+
205
+ var ErroresDeSubida = function ErroresDeSubida() {
206
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(Demo, {
207
+ localAssets: [{
208
+ file: archivo("video-campana.mp4", "video/mp4"),
209
+ status: _assets2.ASSET_STATUS.UPLOADING,
210
+ progress: 45
211
+ }, {
212
+ file: archivo("manual-instalacion.pdf", "application/pdf"),
213
+ status: _assets2.ASSET_STATUS.ERROR,
214
+ error: "No se pudo subir el archivo. Avisa a soporte (permiso de almacenamiento)."
215
+ }, {
216
+ file: archivo("render-final.psd", ""),
217
+ status: _assets2.ASSET_STATUS.ERROR,
218
+ error: "El archivo supera el tamaño permitido."
219
+ }, {
220
+ file: archivo("tabla-tallas.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"),
221
+ status: _assets2.ASSET_STATUS.ERROR,
222
+ error: "No se pudo conectar para subir el archivo. Revisa tu conexión e inténtalo de nuevo."
223
+ }, {
224
+ file: archivo("foto-lifestyle.jpg", "image/jpeg"),
225
+ status: _assets2.ASSET_STATUS.ERROR,
226
+ error: "El archivo pesa más del máximo permitido para imagen"
227
+ }, {
228
+ file: archivo("catalogo.zip", "application/zip"),
229
+ status: _assets2.ASSET_STATUS.ERROR,
230
+ error: "No se pudo preparar la subida. Revisa tu conexión e inténtalo de nuevo."
231
+ }]
232
+ });
233
+ };
234
+
235
+ exports.ErroresDeSubida = ErroresDeSubida;