contentoh-components-library 21.6.32 → 21.6.34
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.
- package/.claude/launch.json +15 -0
- package/dist/ai/prompts/attribute.prompt.js +28 -0
- package/dist/ai/prompts/description.prompt.js +33 -0
- package/dist/ai/schemas/attribute.schema.js +35 -0
- package/dist/ai/schemas/description.schema.js +27 -0
- package/dist/components/atoms/InheritanceTag/InheritanceTag.stories.js +5 -5
- package/dist/components/atoms/InheritanceTag/index.js +6 -6
- package/dist/components/organisms/InputGroup/index.js +12 -1
- package/dist/components/organisms/LinkVariantsModal/index.js +269 -356
- package/dist/components/organisms/LinkVariantsModal/styles.js +14 -5
- package/dist/components/organisms/PropagateChangesModal/index.js +12 -13
- package/dist/components/pages/ProviderProductEdition/context/provider-product-edition.context.js +5 -5
- package/dist/components/pages/ProviderProductEdition/context/reducers/inputs.js +5 -2
- package/dist/components/pages/ProviderProductEdition/index.js +96 -36
- package/dist/components/pages/RetailerProductEdition/context/provider-product-edition.context.js +5 -5
- package/dist/components/pages/RetailerProductEdition/context/reducers/inputs.js +5 -2
- package/dist/components/pages/RetailerProductEdition/index.js +100 -38
- package/package.json +1 -1
- package/src/components/atoms/InheritanceTag/InheritanceTag.stories.js +3 -3
- package/src/components/atoms/InheritanceTag/index.js +6 -6
- package/src/components/organisms/InputGroup/index.js +12 -0
- package/src/components/organisms/LinkVariantsModal/index.js +260 -287
- package/src/components/organisms/LinkVariantsModal/styles.js +65 -32
- package/src/components/organisms/PropagateChangesModal/index.js +19 -17
- package/src/components/pages/ProviderProductEdition/context/provider-product-edition.context.jsx +4 -4
- package/src/components/pages/ProviderProductEdition/context/reducers/inputs.js +13 -1
- package/src/components/pages/ProviderProductEdition/index.js +61 -20
- package/src/components/pages/RetailerProductEdition/context/provider-product-edition.context.jsx +4 -4
- package/src/components/pages/RetailerProductEdition/context/reducers/inputs.js +13 -1
- package/src/components/pages/RetailerProductEdition/index.js +74 -23
|
@@ -181,7 +181,7 @@ const RetailerProductEditionView = ({
|
|
|
181
181
|
const [statusArray, setStatusArray] = useState([]);
|
|
182
182
|
const [rejectAll, setRejectAll] = useState(false);
|
|
183
183
|
|
|
184
|
-
//
|
|
184
|
+
// Padre/hijo: mismo comportamiento que la ficha de la aplicación de clientes.
|
|
185
185
|
const [showLinkVariants, setShowLinkVariants] = useState(false);
|
|
186
186
|
const [family, setFamily] = useState(null);
|
|
187
187
|
const [showFamily, setShowFamily] = useState(false);
|
|
@@ -782,7 +782,7 @@ const RetailerProductEditionView = ({
|
|
|
782
782
|
};
|
|
783
783
|
|
|
784
784
|
/*
|
|
785
|
-
Trae la familia:
|
|
785
|
+
Trae la familia: los hijos del producto, o sus hermanos si el abierto es
|
|
786
786
|
una de ellas. Se pide al abrir la sección y no al montar la pantalla: la
|
|
787
787
|
mayoría de los productos no son familia.
|
|
788
788
|
*/
|
|
@@ -824,16 +824,16 @@ const RetailerProductEditionView = ({
|
|
|
824
824
|
}, [state.product?.id_article]);
|
|
825
825
|
|
|
826
826
|
// El conteo sale de la familia recién consultada, no del producto.
|
|
827
|
-
const
|
|
827
|
+
const hijosDelProducto = family?.error
|
|
828
828
|
? 0
|
|
829
829
|
: (family?.variants ?? []).filter((v) => !v.isCurrent).length;
|
|
830
830
|
|
|
831
|
-
const
|
|
831
|
+
const esHijoDeOtro = family?.error
|
|
832
832
|
? !!state.product?.parentArticleId
|
|
833
833
|
: !!family?.parent;
|
|
834
834
|
|
|
835
835
|
/*
|
|
836
|
-
En Creators la lista de familia es INFORMATIVA: no se salta a
|
|
836
|
+
En Creators la lista de familia es INFORMATIVA: no se salta a otro producto.
|
|
837
837
|
|
|
838
838
|
Saltar exige precargar el producto destino, y el endpoint que hace eso en la
|
|
839
839
|
aplicación de clientes —read-articles-v2— filtra por la compañía del usuario:
|
|
@@ -842,15 +842,16 @@ const RetailerProductEditionView = ({
|
|
|
842
842
|
|
|
843
843
|
Navegar sin precargar sería peor que no ofrecerlo: esta pantalla lee el
|
|
844
844
|
producto de sessionStorage, así que cambiaría la URL y seguiría mostrando el
|
|
845
|
-
producto anterior, dando a entender que se cambió de
|
|
845
|
+
producto anterior, dando a entender que se cambió de producto cuando no.
|
|
846
846
|
|
|
847
847
|
Para habilitarlo hace falta una forma de traer un producto por id sin filtro
|
|
848
848
|
de compañía, respetando el alcance del perfil interno (§5.1 del contrato).
|
|
849
849
|
*/
|
|
850
850
|
|
|
851
851
|
/*
|
|
852
|
-
Refresca tras ligar, sin recargar: el producto sale de
|
|
853
|
-
un
|
|
852
|
+
Refresca tras ligar, sin recargar la página: el producto sale de
|
|
853
|
+
sessionStorage, así que un F5 devolvería el mismo objeto y el contador
|
|
854
|
+
seguiría igual.
|
|
854
855
|
*/
|
|
855
856
|
const handleOnLinkedVariants = (result) => {
|
|
856
857
|
if (!result) return;
|
|
@@ -869,31 +870,77 @@ const RetailerProductEditionView = ({
|
|
|
869
870
|
};
|
|
870
871
|
|
|
871
872
|
dispatch({ type: "SET_PRODUCT", payload: updatedProduct });
|
|
872
|
-
setFamily(null);
|
|
873
873
|
|
|
874
874
|
try {
|
|
875
875
|
sessionStorage.setItem("productSelected", JSON.stringify(updatedProduct));
|
|
876
876
|
} catch (error) {
|
|
877
877
|
console.error("linkVariants/sessionStorage: ", error);
|
|
878
878
|
}
|
|
879
|
+
|
|
880
|
+
/*
|
|
881
|
+
Volver a preguntar, no vaciar.
|
|
882
|
+
|
|
883
|
+
Antes esto hacía `setFamily(null)` para invalidar la caché, y en esta
|
|
884
|
+
pantalla eso tenía el efecto contrario al buscado: el bloque de parentesco
|
|
885
|
+
se decide con `esHijoDeOtro`, que sale de `family`, no del producto. Con
|
|
886
|
+
`family` en null el bloque desaparecía, así que después de ligar la
|
|
887
|
+
pantalla se quedaba SIN ninguna señal de que el producto ya tenía padre
|
|
888
|
+
—justo lo que el usuario acababa de hacer—.
|
|
889
|
+
*/
|
|
890
|
+
loadFamily(true);
|
|
891
|
+
|
|
892
|
+
/*
|
|
893
|
+
Y se recargan los servicios, porque ligar cambia la herencia de cada campo
|
|
894
|
+
en el servidor: al planchar, lo que era propio pasa a heredado y los chips
|
|
895
|
+
tienen que decirlo. Sin esto la ficha sigue mostrando el estado anterior
|
|
896
|
+
hasta que alguien cierra y vuelve a abrir el producto.
|
|
897
|
+
|
|
898
|
+
Sin `enableLoading` para no parpadear el esqueleto encima de una pantalla
|
|
899
|
+
que ya está pintada.
|
|
900
|
+
*/
|
|
901
|
+
loadData(false);
|
|
879
902
|
};
|
|
880
903
|
|
|
881
904
|
/*
|
|
882
905
|
Acción "Volver a heredar" de los chips. Repinta en sitio con lo que devuelve
|
|
883
906
|
el endpoint: recargar la ficha se llevaría lo que haya sin guardar.
|
|
884
907
|
*/
|
|
885
|
-
|
|
908
|
+
/*
|
|
909
|
+
`kind` distingue de qué pestaña salió el chip. Las descripciones viven en
|
|
910
|
+
`rel_article_description` y la ficha técnica en `article_data`: el endpoint
|
|
911
|
+
recibe una lista o la otra.
|
|
912
|
+
*/
|
|
913
|
+
const handleOnRestoreInheritance = async (attributeId, kind = "attribute") => {
|
|
886
914
|
if (!attributeId || !state.product?.id_article) return;
|
|
887
915
|
|
|
916
|
+
const esDescripcion = kind === "description";
|
|
917
|
+
|
|
888
918
|
try {
|
|
889
919
|
const res = await axios.post(
|
|
890
920
|
`${process.env.REACT_APP_VARIANTS_ENDPOINT}/restore`,
|
|
891
|
-
{
|
|
921
|
+
{
|
|
922
|
+
articleId: state.product.id_article,
|
|
923
|
+
...(esDescripcion
|
|
924
|
+
? { descriptions: [Number(attributeId)] }
|
|
925
|
+
: { attributes: [Number(attributeId)] }),
|
|
926
|
+
},
|
|
892
927
|
{ headers: { Authorization: token } }
|
|
893
928
|
);
|
|
894
929
|
|
|
895
930
|
const data = readPayload(res);
|
|
896
931
|
|
|
932
|
+
if (esDescripcion) {
|
|
933
|
+
dispatch({
|
|
934
|
+
type: "UPDATE_DESCRIPTIONS_INPUTS",
|
|
935
|
+
payload: (data.descriptionValues || []).map((item) => ({
|
|
936
|
+
attributeId: item.id_description,
|
|
937
|
+
value: item.value,
|
|
938
|
+
isOverridden: 0,
|
|
939
|
+
})),
|
|
940
|
+
});
|
|
941
|
+
return;
|
|
942
|
+
}
|
|
943
|
+
|
|
897
944
|
dispatch({
|
|
898
945
|
type: "UPDATE_DATASHEETS_INPUTS",
|
|
899
946
|
payload: (data.values || []).map((item) => ({
|
|
@@ -933,10 +980,10 @@ const RetailerProductEditionView = ({
|
|
|
933
980
|
await saveDescriptions(token);
|
|
934
981
|
break;
|
|
935
982
|
case "Ficha técnica": {
|
|
936
|
-
// Guardar un padre con
|
|
937
|
-
// paso el cambio se queda solo en el padre y
|
|
983
|
+
// Guardar un padre con hijos abre la decisión de propagar. Sin este
|
|
984
|
+
// paso el cambio se queda solo en el padre y los hijos se van
|
|
938
985
|
// separando de él sin que nadie lo note.
|
|
939
|
-
const esPadre =
|
|
986
|
+
const esPadre = hijosDelProducto > 0;
|
|
940
987
|
const cambios = cambiosDeFichaTecnica();
|
|
941
988
|
|
|
942
989
|
if (esPadre && cambios.length > 0) {
|
|
@@ -1930,9 +1977,9 @@ const RetailerProductEditionView = ({
|
|
|
1930
1977
|
</div>
|
|
1931
1978
|
|
|
1932
1979
|
<div className="product-information">
|
|
1933
|
-
{/* Solo si el producto NO es ya
|
|
1980
|
+
{/* Solo si el producto NO es ya hijo de alguien: ligarlo otra vez
|
|
1934
1981
|
devolvería VARIANT_ALREADY_LINKED sin excepción. */}
|
|
1935
|
-
{!
|
|
1982
|
+
{!esHijoDeOtro && (
|
|
1936
1983
|
<div className="variants-actions">
|
|
1937
1984
|
<button
|
|
1938
1985
|
type="button"
|
|
@@ -1941,7 +1988,7 @@ const RetailerProductEditionView = ({
|
|
|
1941
1988
|
>
|
|
1942
1989
|
Ligar productos
|
|
1943
1990
|
</button>
|
|
1944
|
-
{
|
|
1991
|
+
{hijosDelProducto > 0 && (
|
|
1945
1992
|
<button
|
|
1946
1993
|
type="button"
|
|
1947
1994
|
className="variants-count"
|
|
@@ -1951,15 +1998,15 @@ const RetailerProductEditionView = ({
|
|
|
1951
1998
|
loadFamily();
|
|
1952
1999
|
}}
|
|
1953
2000
|
>
|
|
1954
|
-
{
|
|
1955
|
-
{
|
|
2001
|
+
{hijosDelProducto} hijo
|
|
2002
|
+
{hijosDelProducto === 1 ? "" : "s"}
|
|
1956
2003
|
<span aria-hidden="true">{showFamily ? " ▴" : " ▾"}</span>
|
|
1957
2004
|
</button>
|
|
1958
2005
|
)}
|
|
1959
2006
|
</div>
|
|
1960
2007
|
)}
|
|
1961
2008
|
|
|
1962
|
-
{
|
|
2009
|
+
{esHijoDeOtro && (
|
|
1963
2010
|
<div className="variants-actions">
|
|
1964
2011
|
<button
|
|
1965
2012
|
type="button"
|
|
@@ -1970,7 +2017,7 @@ const RetailerProductEditionView = ({
|
|
|
1970
2017
|
loadFamily();
|
|
1971
2018
|
}}
|
|
1972
2019
|
>
|
|
1973
|
-
|
|
2020
|
+
Hijo de otro producto
|
|
1974
2021
|
<span aria-hidden="true">{showFamily ? " ▴" : " ▾"}</span>
|
|
1975
2022
|
</button>
|
|
1976
2023
|
</div>
|
|
@@ -2000,7 +2047,7 @@ const RetailerProductEditionView = ({
|
|
|
2000
2047
|
className={`family-row${variant.isCurrent ? " current" : ""}`}
|
|
2001
2048
|
>
|
|
2002
2049
|
<span className="role">
|
|
2003
|
-
{variant.isCurrent ? "Estás aquí" : "
|
|
2050
|
+
{variant.isCurrent ? "Estás aquí" : "Hijo"}
|
|
2004
2051
|
</span>
|
|
2005
2052
|
<span className="name">{variant.name}</span>
|
|
2006
2053
|
<span className="upc">{variant.upc}</span>
|
|
@@ -2008,7 +2055,7 @@ const RetailerProductEditionView = ({
|
|
|
2008
2055
|
))}
|
|
2009
2056
|
|
|
2010
2057
|
{family && !family.error && !family.variants?.length && (
|
|
2011
|
-
<p className="loading">Este producto no tiene
|
|
2058
|
+
<p className="loading">Este producto no tiene hijos.</p>
|
|
2012
2059
|
)}
|
|
2013
2060
|
</div>
|
|
2014
2061
|
)}
|
|
@@ -2095,6 +2142,10 @@ const RetailerProductEditionView = ({
|
|
|
2095
2142
|
activeSection={state.active_tab}
|
|
2096
2143
|
inputGroup={state.descriptions_inputs[0]}
|
|
2097
2144
|
updatedDescriptions={state.updated_descriptions_inputs}
|
|
2145
|
+
/* El parentesco es del producto, no del servicio: los
|
|
2146
|
+
dos endpoints lo devuelven igual. */
|
|
2147
|
+
variant={state.services?.datasheets?.variant}
|
|
2148
|
+
onRestoreInheritance={handleOnRestoreInheritance}
|
|
2098
2149
|
articleId={state.product?.id_article}
|
|
2099
2150
|
version={state.product.version}
|
|
2100
2151
|
auditInputGroup={auditDescriptions[0]}
|