contentoh-components-library 21.6.35 → 21.6.37

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.
@@ -16,6 +16,10 @@ var _jsxRuntime = require("react/jsx-runtime");
16
16
  *
17
17
  * El estado "propio" es el que carga información —ese campo se separó del padre—
18
18
  * así que es el que lleva acento y el que ofrece la acción de volver a heredar.
19
+ *
20
+ * OJO: "propio" ya NO significa "a salvo de la propagación". Desde el cambio del
21
+ * 2026-09-01 la propagación sobrescribe también estos valores; el aviso de que va
22
+ * a pasar vive en el diálogo de propagación, no aquí. El tooltip lo dice así.
19
23
  * "Heredado" es el caso normal y se mantiene discreto: si gritara en cada campo,
20
24
  * la ficha entera se volvería ruido.
21
25
  *
@@ -51,9 +55,9 @@ var InheritanceTag = function InheritanceTag(_ref) {
51
55
  className: "inheritance-tag ".concat(state, " ").concat(className),
52
56
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
53
57
  className: "tag-label",
54
- title: isOverridden ? "Valor propio de este producto hijo. La propagación del padre no lo modifica." : "Valor heredado".concat(parentUpc ? " del producto ".concat(parentUpc) : " del producto padre", "."),
58
+ title: isOverridden ? "Valor capturado en este producto hijo, distinto al del padre. Si el padre propaga este atributo, se reemplaza." : "Valor heredado".concat(parentUpc ? " del producto ".concat(parentUpc) : " del producto padre", "."),
55
59
  children: isOverridden ? "Propio" : "Heredado"
56
- }), isOverridden && onRestore && /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
60
+ }), Boolean(isOverridden) && onRestore && /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
57
61
  type: "button",
58
62
  className: "tag-action",
59
63
  onClick: onRestore,
@@ -420,7 +420,7 @@ var TagAndInput = function TagAndInput(_ref) {
420
420
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_styles.Container, {
421
421
  inputType: inputType,
422
422
  className: "input-container",
423
- children: [(label === null || label === void 0 ? void 0 : label.length) && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
423
+ children: [Boolean(label === null || label === void 0 ? void 0 : label.length) && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
424
424
  className: "title-container",
425
425
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
426
426
  className: "titles",
@@ -54,7 +54,7 @@ var TagAndInputv2 = function TagAndInputv2(_ref) {
54
54
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_styles.Container, {
55
55
  inputType: inputType,
56
56
  className: "input-container",
57
- children: [(label === null || label === void 0 ? void 0 : label.length) && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
57
+ children: [Boolean(label === null || label === void 0 ? void 0 : label.length) && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
58
58
  className: "title-container",
59
59
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ScreenHeaderv.ScreenHeaderv2, {
60
60
  text: label,
@@ -9,6 +9,8 @@ exports.PropagateChangesModal = void 0;
9
9
 
10
10
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
11
11
 
12
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
13
+
12
14
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
13
15
 
14
16
  var _react = require("react");
@@ -27,7 +29,10 @@ var _jsxRuntime = require("react/jsx-runtime");
27
29
 
28
30
  props (* requerido):
29
31
  - *changedAttributes: [{ id, name, value }] lo que se acaba de editar
30
- - *variants: [{ articleId, name, upc }] los hijos activos del padre
32
+ - *variants: [{ articleId, name, upc, overriddenAttributes }] los hijos
33
+ activos del padre. `overriddenAttributes` son los atributos que ese hijo
34
+ capturó a mano; la propagación los sobrescribe, y este diálogo es el
35
+ único lugar donde el usuario puede enterarse antes de que pase.
31
36
  - *onCancel: cerrar sin guardar nada
32
37
  - *onConfirm: (propagation | null) => void
33
38
  null → guardar solo el padre
@@ -67,6 +72,31 @@ var PropagateChangesModal = function PropagateChangesModal(_ref) {
67
72
  var destinatarios = scope === "all" ? variants.length : chosenChildren.length;
68
73
  var puedePropagar = chosenAttributes.length > 0 && destinatarios > 0;
69
74
  var enSegundoPlano = destinatarios > UMBRAL_SEGUNDO_PLANO;
75
+ /*
76
+ A quién se le va a pisar un valor capturado a mano.
77
+ La propagación sobrescribe: eso se decidió a propósito, porque el usuario ya
78
+ eligió atributo por atributo y hijo por hijo. Pero sobrescribir en silencio
79
+ es otra cosa, y desde que se quitaron las etiquetas de «Heredado» y «Propio»
80
+ este diálogo es el único momento en que alguien puede saberlo.
81
+ Se recalcula con lo que está marcado ahora, no al abrir: si el usuario
82
+ desmarca el atributo conflictivo, el aviso desaparece — que es justo la
83
+ salida que el aviso debería estar ofreciendo.
84
+ */
85
+
86
+ var destinos = scope === "all" ? variants : variants.filter(function (item) {
87
+ return chosenChildren.includes(item.articleId);
88
+ });
89
+ var conValorPropio = destinos.map(function (hijo) {
90
+ var _hijo$overriddenAttri;
91
+
92
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, hijo), {}, {
93
+ pisados: ((_hijo$overriddenAttri = hijo.overriddenAttributes) !== null && _hijo$overriddenAttri !== void 0 ? _hijo$overriddenAttri : []).filter(function (id) {
94
+ return chosenAttributes.includes(Number(id));
95
+ })
96
+ });
97
+ }).filter(function (hijo) {
98
+ return hijo.pisados.length > 0;
99
+ });
70
100
 
71
101
  var toggleAttribute = function toggleAttribute(id) {
72
102
  setChosenAttributes(function (current) {
@@ -173,8 +203,11 @@ var PropagateChangesModal = function PropagateChangesModal(_ref) {
173
203
  })
174
204
  }, variant.articleId);
175
205
  })
176
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_styles.Note, {
177
- children: "Un hijo que haya editado alguno de estos atributos por su cuenta conserva su valor. Para devolverlo al del padre est\xE1 la acci\xF3n \xABVolver a heredar\xBB en la ficha de ese hijo."
206
+ }), conValorPropio.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_styles.Note, {
207
+ className: "accent",
208
+ children: [conValorPropio.length === 1 ? "Un hijo tiene un valor propio en lo que elegiste y se va a reemplazar: " : "".concat(conValorPropio.length, " hijos tienen valores propios en lo que elegiste y se van a reemplazar: "), conValorPropio.map(function (hijo) {
209
+ return "".concat(hijo.name || "Producto ".concat(hijo.articleId), " (").concat(hijo.pisados.length, ")");
210
+ }).join(", "), ". Si no quieres pisarlos, desmarca ese atributo o ese hijo."]
178
211
  }), enSegundoPlano && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_styles.Note, {
179
212
  className: "accent",
180
213
  children: ["Son m\xE1s de ", UMBRAL_SEGUNDO_PLANO, " hijos, as\xED que la propagaci\xF3n corre en segundo plano: el guardado termina antes de que todas est\xE9n actualizadas."]
@@ -0,0 +1,178 @@
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.UnlinkVariantModal = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
13
+
14
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/asyncToGenerator"));
15
+
16
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
17
+
18
+ var _react = require("react");
19
+
20
+ var _axios = _interopRequireDefault(require("axios"));
21
+
22
+ var _api = require("../LinkVariantsModal/api");
23
+
24
+ var _styles = require("./styles");
25
+
26
+ var _jsxRuntime = require("react/jsx-runtime");
27
+
28
+ /*
29
+ Confirmación para romper un vínculo padre/hijo.
30
+
31
+ El servidor ya sabía hacerlo desde el principio —POST /variants/unlink—, pero
32
+ no había forma de pedirlo desde ninguna pantalla: la única manera de deshacer
33
+ una liga era DESACTIVAR al padre, que suelta a todos los hijos de golpe y no
34
+ se puede revertir. Esto es la versión de a uno.
35
+
36
+ La acción se pide siempre con el id del HIJO, que es quien tiene el vínculo en
37
+ `article.parent_article_id`. Por eso las dos direcciones —un hijo que se suelta
38
+ y un padre que suelta a un hijo— son la misma llamada; lo único que cambia es
39
+ el texto, porque no es lo mismo lo que el usuario cree estar haciendo.
40
+
41
+ props (* requerido):
42
+ - *childArticleId: el hijo que pierde el vínculo
43
+ - childName / childUpc: para nombrarlo en el diálogo
44
+ - parentName / parentUpc: de quién se desprende
45
+ - mode: "self" (esta ficha deja de ser hija) | "child" (esta ficha suelta a un hijo)
46
+ - *token, endpoint
47
+ - *onClose, onUnlinked
48
+ */
49
+ var UnlinkVariantModal = function UnlinkVariantModal(_ref) {
50
+ var childArticleId = _ref.childArticleId,
51
+ childName = _ref.childName,
52
+ childUpc = _ref.childUpc,
53
+ parentName = _ref.parentName,
54
+ parentUpc = _ref.parentUpc,
55
+ _ref$mode = _ref.mode,
56
+ mode = _ref$mode === void 0 ? "self" : _ref$mode,
57
+ token = _ref.token,
58
+ _ref$endpoint = _ref.endpoint,
59
+ endpoint = _ref$endpoint === void 0 ? process.env.REACT_APP_VARIANTS_ENDPOINT : _ref$endpoint,
60
+ onClose = _ref.onClose,
61
+ onUnlinked = _ref.onUnlinked;
62
+
63
+ var _useState = (0, _react.useState)(false),
64
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
65
+ loading = _useState2[0],
66
+ setLoading = _useState2[1];
67
+
68
+ var _useState3 = (0, _react.useState)(null),
69
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
70
+ error = _useState4[0],
71
+ setError = _useState4[1];
72
+
73
+ var nombreHijo = childName || "Producto ".concat(childArticleId);
74
+ var nombrePadre = parentName || "el producto padre";
75
+
76
+ var submit = /*#__PURE__*/function () {
77
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
78
+ var res, data;
79
+ return _regenerator.default.wrap(function _callee$(_context) {
80
+ while (1) {
81
+ switch (_context.prev = _context.next) {
82
+ case 0:
83
+ setLoading(true);
84
+ setError(null);
85
+ _context.prev = 2;
86
+ _context.next = 5;
87
+ return _axios.default.post("".concat(endpoint, "/unlink"), {
88
+ articleIds: [childArticleId]
89
+ }, {
90
+ headers: {
91
+ Authorization: token
92
+ }
93
+ });
94
+
95
+ case 5:
96
+ res = _context.sent;
97
+ data = (0, _api.readPayload)(res);
98
+ onUnlinked === null || onUnlinked === void 0 ? void 0 : onUnlinked((0, _objectSpread2.default)((0, _objectSpread2.default)({}, data), {}, {
99
+ mode: mode,
100
+ childArticleId: childArticleId
101
+ }));
102
+ onClose === null || onClose === void 0 ? void 0 : onClose();
103
+ _context.next = 15;
104
+ break;
105
+
106
+ case 11:
107
+ _context.prev = 11;
108
+ _context.t0 = _context["catch"](2);
109
+ // El transporte siempre responde 200; el error de negocio viaja dentro.
110
+ setError(_context.t0 instanceof _api.ApiError || (_context.t0 === null || _context.t0 === void 0 ? void 0 : _context.t0.name) === "ApiError" ? _context.t0.message : "No se pudo desvincular. Intenta de nuevo.");
111
+ setLoading(false);
112
+
113
+ case 15:
114
+ case "end":
115
+ return _context.stop();
116
+ }
117
+ }
118
+ }, _callee, null, [[2, 11]]);
119
+ }));
120
+
121
+ return function submit() {
122
+ return _ref2.apply(this, arguments);
123
+ };
124
+ }();
125
+
126
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_styles.Overlay, {
127
+ onClick: loading ? undefined : onClose,
128
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_styles.Panel, {
129
+ onClick: function onClick(event) {
130
+ return event.stopPropagation();
131
+ },
132
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_styles.Header, {
133
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h2", {
134
+ children: mode === "self" ? "Dejar de ser hijo de otro producto" : "Desvincular este hijo"
135
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
136
+ children: mode === "self" ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
137
+ children: ["\xAB", nombreHijo, "\xBB dejar\xE1 de colgar de \xAB", nombrePadre, "\xBB", parentUpc ? " (UPC ".concat(parentUpc, ")") : "", "."]
138
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
139
+ children: ["\xAB", nombreHijo, "\xBB", childUpc ? " (UPC ".concat(childUpc, ")") : "", " dejar\xE1 de colgar de este producto."]
140
+ })
141
+ })]
142
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_styles.Body, {
143
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("ul", {
144
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("li", {
145
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("strong", {
146
+ children: "No se borra nada."
147
+ }), " Todo lo que hered\xF3 \u2014atributos, descripciones, im\xE1genes y cadenas\u2014 se queda como informaci\xF3n propia del producto."]
148
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("li", {
149
+ children: "Desaparecen las marcas de \xABHeredado\xBB y \xABPropio\xBB: sin padre dejan de querer decir algo."
150
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("li", {
151
+ children: ["Deja de recibir la propagaci\xF3n", mode === "self" ? " de su padre" : " de este producto", ": lo que se edite de un lado ya no baja al otro."]
152
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("li", {
153
+ className: "aviso",
154
+ children: "Volver a ligarlos es a mano, y hay que elegir otra vez qu\xE9 hereda. Desvincular no se deshace solo."
155
+ })]
156
+ })
157
+ }), error && /*#__PURE__*/(0, _jsxRuntime.jsx)(_styles.Message, {
158
+ children: error
159
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_styles.Footer, {
160
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
161
+ type: "button",
162
+ className: "secondary",
163
+ onClick: onClose,
164
+ disabled: loading,
165
+ children: "Cancelar"
166
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
167
+ type: "button",
168
+ className: "primary",
169
+ onClick: submit,
170
+ disabled: loading,
171
+ children: loading ? "Desvinculando…" : "Desvincular"
172
+ })]
173
+ })]
174
+ })
175
+ });
176
+ };
177
+
178
+ exports.UnlinkVariantModal = UnlinkVariantModal;
@@ -0,0 +1,42 @@
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.Panel = exports.Overlay = exports.Message = exports.Header = exports.Footer = exports.Body = 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, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6;
17
+
18
+ var PINK = "#E13AA8";
19
+
20
+ var Overlay = _styledComponents.default.div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(40, 31, 51, 0.4);\n"])));
21
+
22
+ exports.Overlay = Overlay;
23
+
24
+ var Panel = _styledComponents.default.div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n width: min(460px, 92vw);\n border-radius: 10px;\n background-color: ", ";\n font-family: ", ";\n overflow: hidden;\n"])), _variables.GlobalColors.white, _variables.FontFamily.Raleway);
25
+
26
+ exports.Panel = Panel;
27
+
28
+ var Header = _styledComponents.default.div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n padding: 18px 22px 10px;\n\n h2 {\n margin: 0;\n font-family: ", ";\n font-size: 16px;\n color: ", ";\n }\n\n p {\n margin: 6px 0 0;\n font-size: 13px;\n line-height: 1.4;\n color: ", ";\n }\n"])), _variables.FontFamily.Raleway_600, _variables.GlobalColors.deep_gray, _variables.GlobalColors.gray);
29
+
30
+ exports.Header = Header;
31
+
32
+ var Body = _styledComponents.default.div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2.default)(["\n padding: 4px 22px 8px;\n\n ul {\n margin: 0;\n padding-left: 18px;\n }\n\n li {\n margin-bottom: 6px;\n font-size: 13px;\n line-height: 1.4;\n color: ", ";\n }\n\n /* Lo \xFAnico que no se puede deshacer solo va marcado: el resto son\n consecuencias, esta es una advertencia. */\n li.aviso {\n color: ", ";\n }\n"])), _variables.GlobalColors.deep_gray, PINK);
33
+
34
+ exports.Body = Body;
35
+
36
+ var Message = _styledComponents.default.p(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2.default)(["\n margin: 8px 22px 0;\n padding: 10px 12px;\n border-radius: 6px;\n background-color: rgba(225, 58, 168, 0.1);\n font-size: 13px;\n line-height: 1.4;\n color: ", ";\n"])), PINK);
37
+
38
+ exports.Message = Message;
39
+
40
+ var Footer = _styledComponents.default.div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n padding: 16px 22px 20px;\n\n button {\n height: 38px;\n padding: 0 16px;\n border-radius: 6px;\n cursor: pointer;\n font-family: ", ";\n font-size: 13px;\n }\n\n button:disabled {\n opacity: 0.5;\n cursor: default;\n }\n\n .secondary {\n border: 1px solid ", ";\n background: none;\n color: ", ";\n }\n\n .primary {\n border: 1px solid ", ";\n background-color: ", ";\n color: ", ";\n }\n"])), _variables.FontFamily.Raleway_600, _variables.GlobalColors.s2, _variables.GlobalColors.deep_gray, PINK, PINK, _variables.GlobalColors.white);
41
+
42
+ exports.Footer = Footer;