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.
Files changed (30) hide show
  1. package/.claude/launch.json +15 -0
  2. package/dist/ai/prompts/attribute.prompt.js +28 -0
  3. package/dist/ai/prompts/description.prompt.js +33 -0
  4. package/dist/ai/schemas/attribute.schema.js +35 -0
  5. package/dist/ai/schemas/description.schema.js +27 -0
  6. package/dist/components/atoms/InheritanceTag/InheritanceTag.stories.js +5 -5
  7. package/dist/components/atoms/InheritanceTag/index.js +6 -6
  8. package/dist/components/organisms/InputGroup/index.js +12 -1
  9. package/dist/components/organisms/LinkVariantsModal/index.js +269 -356
  10. package/dist/components/organisms/LinkVariantsModal/styles.js +14 -5
  11. package/dist/components/organisms/PropagateChangesModal/index.js +12 -13
  12. package/dist/components/pages/ProviderProductEdition/context/provider-product-edition.context.js +5 -5
  13. package/dist/components/pages/ProviderProductEdition/context/reducers/inputs.js +5 -2
  14. package/dist/components/pages/ProviderProductEdition/index.js +96 -36
  15. package/dist/components/pages/RetailerProductEdition/context/provider-product-edition.context.js +5 -5
  16. package/dist/components/pages/RetailerProductEdition/context/reducers/inputs.js +5 -2
  17. package/dist/components/pages/RetailerProductEdition/index.js +100 -38
  18. package/package.json +1 -1
  19. package/src/components/atoms/InheritanceTag/InheritanceTag.stories.js +3 -3
  20. package/src/components/atoms/InheritanceTag/index.js +6 -6
  21. package/src/components/organisms/InputGroup/index.js +12 -0
  22. package/src/components/organisms/LinkVariantsModal/index.js +260 -287
  23. package/src/components/organisms/LinkVariantsModal/styles.js +65 -32
  24. package/src/components/organisms/PropagateChangesModal/index.js +19 -17
  25. package/src/components/pages/ProviderProductEdition/context/provider-product-edition.context.jsx +4 -4
  26. package/src/components/pages/ProviderProductEdition/context/reducers/inputs.js +13 -1
  27. package/src/components/pages/ProviderProductEdition/index.js +61 -20
  28. package/src/components/pages/RetailerProductEdition/context/provider-product-edition.context.jsx +4 -4
  29. package/src/components/pages/RetailerProductEdition/context/reducers/inputs.js +13 -1
  30. 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
- // Variantes: mismo comportamiento que la ficha de la aplicación de clientes.
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: las variantes del producto, o sus hermanas si el abierto es
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 variantesDelProducto = family?.error
827
+ const hijosDelProducto = family?.error
828
828
  ? 0
829
829
  : (family?.variants ?? []).filter((v) => !v.isCurrent).length;
830
830
 
831
- const esVarianteDeOtro = family?.error
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 otra variante.
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 variante cuando no.
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 sessionStorage, así que
853
- un refresh devolvería el mismo objeto y el contador seguiría igual.
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
- const handleOnRestoreInheritance = async (attributeId) => {
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
- { articleId: state.product.id_article, attributes: [Number(attributeId)] },
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 variantes abre la decisión de propagar. Sin este
937
- // paso el cambio se queda solo en el padre y las variantes se van
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 = variantesDelProducto > 0;
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 variante de alguien: ligarlo otra vez
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
- {!esVarianteDeOtro && (
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
- {variantesDelProducto > 0 && (
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
- {variantesDelProducto} variante
1955
- {variantesDelProducto === 1 ? "" : "s"}
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
- {esVarianteDeOtro && (
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
- Variante de otro producto
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í" : "Variante"}
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 variantes.</p>
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]}