Skip to content

Adds Vulnerability Types and Categories to Custom Data#177

Merged
caverav merged 60 commits intodevelopmentfrom
feature/vulnerability-custom-data
Nov 15, 2024
Merged

Adds Vulnerability Types and Categories to Custom Data#177
caverav merged 60 commits intodevelopmentfrom
feature/vulnerability-custom-data

Conversation

@massi-ponce
Copy link
Copy Markdown
Collaborator

@massi-ponce massi-ponce commented Nov 14, 2024

Descripción

Se agregan la vistas "Vulnerability Types" y "Vulnerability Categories" a "Custom Data", junto a toda su funcionalidad.

Motivación y Contexto

Se realiza para completar las secciones faltantes en "Custom Data".

¿Cómo probar?

Vulnerability Types

  • Crear vulnerability types (ojalá en distintos idiomas).
  • Eliminar una o unas vulnerability types.
  • Editar una o unas vulnerability types.
  • Ver como se filtran las vulnerability types por idioma (dropdown).
  • Ver como se actualiza la EditCard tras una creación o edición de vulnerability types.
  • Ver como la EditCard vuelve al estado inicial al "cancelar" la edición.

Vulnerability Categories

  • Crear vulnerability categories.
  • Eliminar una o unas vulnerability categories.
  • Editar una o unas vulnerability categories.
  • Ver como se actualiza la EditCard tras una creación o edición de vulnerability categories.
  • Ver como la EditCard vuelve al estado inicial al "cancelar" la edición.

Tipos de cambios

  • Bugfix (cambio que no interrumpe el funcionamiento y que soluciona un problema)
  • New feature (cambio que no interrumpe el funcionamiento y que añade funcionalidad)
  • Breaking change (corrección o funcionalidad que podría causar que la funcionalidad existente cambie)

Lista de verificación:

  • Mi código sigue el estilo de código de este proyecto.
  • Mi cambio requiere una modificación en la documentación.
  • He actualizado la documentación en consecuencia.
  • Requiere nuevos tests.

Summary by CodeRabbit

  • Nuevas Funciones

    • Se ha añadido un nuevo componente Switch para una interfaz de usuario personalizable.
    • Se han introducido componentes para gestionar categorías y tipos de vulnerabilidades.
      • Los usuarios pueden añadir, editar y listar tipos y categorías de vulnerabilidades con una interfaz interactiva y responsiva.
  • Mejoras en la Localización

    • Se han agregado mensajes de éxito y error para la gestión de tipos y categorías de vulnerabilidades.
  • Actualizaciones de Dependencias

    • Se ha actualizado la versión de la dependencia @radix-ui/react-switch.

massi-ponce and others added 30 commits November 3, 2024 15:59
This commit adds the `VulnerabilityCategories` component along with its associated functionality for managing categories and sorting options. The component allows users to create, update, and delete vulnerability categories. It includes features such as adding new categories, updating category lists, and saving changes. Additionally, a `CategoryList` component is introduced to display and manage the list of vulnerability categories, including drag-and-drop functionality for reordering items.

The `VulnerabilityCategories` component integrates with translation functionality, error handling, and toast notifications for user feedback. Users can input category names, specify sorting options, and interact with the category list interface. This enhancement provides a comprehensive solution for managing vulnerability categories within the application.
… component in frontend/src/components/ui/switch.tsx
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Nov 14, 2024

📝 Walkthrough
📝 Walkthrough

Walkthrough

Se han realizado cambios en el proyecto frontend, que incluyen la actualización de la versión de la dependencia @radix-ui/react-switch, la introducción de un nuevo componente Switch, y la adición de nuevos mensajes de localización relacionados con tipos y categorías de vulnerabilidad. Además, se han creado componentes para gestionar listas de tipos y categorías de vulnerabilidades, junto con la implementación de funciones y tipos en el servicio de datos para manejar estas entidades.

Changes

Archivo Resumen de cambios
frontend/package.json Actualización de la versión de @radix-ui/react-switch de ^1.1.0 a ^1.1.1.
frontend/src/components/ui/switch.tsx Se añadió un nuevo componente Switch que utiliza @radix-ui/react-switch con características de accesibilidad y estilos personalizados.
frontend/src/i18n/en-US/index.ts Se añadieron nuevos mensajes de éxito y error relacionados con la creación y actualización de tipos y categorías de vulnerabilidad.
frontend/src/routes/data/CustomData.tsx Se importaron nuevos componentes VulnerabilityCategories y VulnerabilityTypes, y se actualizaron las opciones de cardOptions.
frontend/src/routes/data/CustomData/VulnerabilityCategories.tsx Se creó un nuevo componente VulnerabilityCategories para gestionar categorías de vulnerabilidad con validación y manejo de errores.
frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx Se introdujo el componente VulnerabilityCategoryList para gestionar una lista de categorías de vulnerabilidad con interactividad.
frontend/src/routes/data/CustomData/VulnerabilityTypeList.tsx Se creó un nuevo componente VulnerabilityTypeList para gestionar una lista de tipos de vulnerabilidad con funcionalidad de edición.
frontend/src/routes/data/CustomData/VulnerabilityTypes.tsx Se introdujo un componente VulnerabilityTypes para manejar tipos de vulnerabilidad, incluyendo la adición y edición de entradas.
frontend/src/services/data.ts Se añadieron nuevos tipos y funciones para manejar tipos y categorías de vulnerabilidad, mejorando la capacidad del servicio de datos.

Possibly related PRs

Suggested labels

enhancement

Suggested reviewers

  • Icksir
  • jllanosg
  • caverav
  • Sealra

Warning

Rate limit exceeded

@massi-ponce has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 4 minutes and 2 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 9df1002 and 2238299.

Warning

There were issues while running some tools. Please review the errors and either fix the tool’s configuration or disable the tool if it’s a critical failure.

🔧 eslint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

frontend/src/routes/data/CustomData/VulnerabilityCategories.tsx

Oops! Something went wrong! :(

ESLint: 8.57.1

ESLint couldn't find the plugin "@typescript-eslint/eslint-plugin".

(The package "@typescript-eslint/eslint-plugin" was not found when loaded as a Node module from the directory "/frontend".)

It's likely that the plugin isn't installed correctly. Try reinstalling by running the following:

npm install @typescript-eslint/eslint-plugin@latest --save-dev

The plugin "@typescript-eslint/eslint-plugin" was referenced from the config file in "frontend/.eslintrc.cjs".

If you still can't figure out the problem, please stop by https://eslint.org/chat/help to chat with the team.


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 9df1002 and 2238299.

📒 Files selected for processing (1)
  • frontend/src/routes/data/CustomData/VulnerabilityCategories.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • frontend/src/routes/data/CustomData/VulnerabilityCategories.tsx

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

‼️ IMPORTANT
Auto-reply has been disabled for this repository in the CodeRabbit settings. The CodeRabbit bot will not respond to your replies unless it is explicitly tagged.

  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 16

🧹 Outside diff range and nitpick comments (18)
frontend/src/components/ui/switch.tsx (3)

1-4: ¡Optimiza las importaciones de tipos!

Deberías separar las importaciones de tipos para mejorar el rendimiento en tiempo de ejecución. Es una práctica recomendada en TypeScript.

Aplica este cambio:

-import * as React from 'react';
+import { forwardRef, type ElementRef, type ComponentPropsWithoutRef } from 'react';

6-9: ¡La documentación es obligatoria!

El componente carece de documentación JSDoc. En un componente de UI reutilizable, es crucial documentar su propósito y props.

Agrega esta documentación:

+/**
+ * Un componente Switch accesible basado en Radix UI.
+ * Proporciona una interfaz toggle con estados checked/unchecked.
+ *
+ * @component
+ * @example
+ * <Switch
+ *   checked={isEnabled}
+ *   onCheckedChange={setIsEnabled}
+ * />
+ */
const Switch = React.forwardRef<

25-27: ¡Exporta el tipo del componente!

Deberías exportar el tipo del componente para facilitar su uso en otros archivos.

Agrega esta exportación de tipo:

+export type SwitchProps = React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>;
 export { Switch };
frontend/src/routes/data/CustomData.tsx (1)

Line range hint 82-88: ¡La lógica de renderizado es inconsistente!

El componente CustomFields tiene un tratamiento especial en el renderizado que rompe con el patrón establecido para los demás componentes. Esto dificulta el mantenimiento y reduce la consistencia del código.

Sugerencia: Eliminar el renderizado condicional y tratar CustomFields como los demás componentes:

      <div className="mt-4">
-       {cardContent.id === 6 ? (
-         <CustomFields />
-       ) : (
          <Card title={cardContent.cardTitle}>{cardContent.cardChildren}</Card>
-       )}
      </div>
frontend/src/i18n/en-US/index.ts (1)

759-759: ¡La nueva entrada debería estar agrupada con las demás traducciones relacionadas!

La entrada vulnerabilityType debería estar agrupada con las demás traducciones relacionadas con vulnerabilidades para mantener una mejor organización del código.

Considera mover esta entrada cerca de las otras traducciones relacionadas con vulnerabilidades, alrededor de la línea 170.

frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx (4)

167-173: Mejorar la eficiencia al comparar objetos

Usar JSON.stringify para comparar objetos es ineficiente y puede causar problemas si las propiedades no están en el mismo orden. Esto puede afectar el rendimiento de la aplicación.

Reemplaza la comparación por una función de comparación profunda:

+ import isEqual from 'lodash/isEqual';

 useEffect(() => {
   const updatedData = rows.map(({ id, ...rest }) => rest);
-  if (JSON.stringify(updatedData) !== JSON.stringify(data)) {
+  if (!isEqual(updatedData, data)) {
     onUpdateList(updatedData);
   }
 }, [rows, data, onUpdateList]);

Esto garantiza una comparación más confiable y eficiente.


89-92: Mejorar la accesibilidad del icono de arrastre

El icono de arrastre carece de una etiqueta aria, lo que puede dificultar su uso para personas que utilizan lectores de pantalla.

Agrega un atributo aria-label para describir la función del botón:

 <div className="cursor-grab col-span-1 flex items-center justify-center">
-  <Bars2Icon className="h-6 w-6 text-gray-500" />
+  <Bars2Icon className="h-6 w-6 text-gray-500" aria-label="Reordenar categoría" />
 </div>

95-95: Eliminar comentario innecesario

El comentario eslint-disable-next-line sonarjs/no-duplicate-string puede ser redundante si ya no es necesario desactivar esa regla.

Si es posible, elimina el comentario para mantener el código limpio.


81-165: Dividir 'renderRow' en componentes más pequeños

El método renderRow es extenso y abarca múltiples responsabilidades, lo que dificulta su mantenimiento y legibilidad.

Considera separar partes del renderizado en componentes individuales:

  • Crear un componente para los campos de entrada.
  • Crear un componente para los selectores de ordenamiento.
  • Crear un componente para los botones de acción.

Esto mejorará la organización y facilitará futuras modificaciones.

frontend/src/routes/data/CustomData/VulnerabilityCategories.tsx (3)

88-90: Manejo de errores insuficiente al crear una categoría

Al atrapar un error al crear una categoría, solo muestras un mensaje genérico. Sería mejor proporcionar detalles adicionales o permitir que el usuario intente nuevamente.

Considera mostrar más información o recomendaciones al usuario.


95-105: Falta manejar el estado de carga al actualizar categorías

Durante la actualización de categorías en onClickSave, no estás manejando un estado de carga. Esto puede llevar a problemas de interacción si el usuario intenta realizar otras acciones mientras la actualización está en curso.

Añade un estado de carga para mejorar la usabilidad.


120-163: Mejora de accesibilidad y semántica en el formulario

Para mejorar la accesibilidad, considera usar etiquetas <label> asociadas con los campos de entrada y agrupar los elementos dentro de un <form>.

Esto ayudará a usuarios con lectores de pantalla y mejorará la estructura del HTML.

frontend/src/routes/data/CustomData/VulnerabilityTypes.tsx (4)

69-73: Notifica al usuario en caso de error al cargar los idiomas

Actualmente, si ocurre un error al cargar los idiomas, solo se registra en la consola, pero el usuario no es notificado. Deberías mostrar un mensaje de error para informar al usuario.

Puedes agregar un mensaje de error así:

        } catch (err) {
          console.error(err);
+         toast.error(t('err.failedLoadingLanguages'));
        }

Asegúrate de tener una clave de traducción para 'err.failedLoadingLanguages'.


94-97: Notifica al usuario en caso de error al cargar los tipos de vulnerabilidad

Si ocurre un error al obtener los tipos de vulnerabilidad, el usuario no es informado. Deberías mostrar un mensaje de error para mejorar la experiencia del usuario.

Agrega un mensaje de error como este:

        } catch (err) {
          console.error(err);
+         toast.error(t('err.failedLoadingVulnerabilityTypes'));
        }

Recuerda agregar la traducción correspondiente para 'err.failedLoadingVulnerabilityTypes'.


148-152: Evita la duplicación de código al filtrar los tipos de vulnerabilidad

El filtrado de vulnerabilityTypes por locale se repite en varias partes del código. Deberías extraer esta lógica en una función reutilizable para mejorar la mantenibilidad.

Crea una función para filtrar:

const filterVulnerabilityTypesByLanguage = (languageValue: string) => {
  return vulnerabilityTypes.filter(type => type.locale === languageValue);
};

Luego, úsala así:

      const onChangeLanguage = (value: ListItem) => {
-        setFilteredVulnerabilityTypes(
-          vulnerabilityTypes.filter(type => type.locale === value.value),
-        );
+        setFilteredVulnerabilityTypes(filterVulnerabilityTypesByLanguage(value.value));
        setCurrentLanguage(value);
      };

Aplica lo mismo en otras partes donde filtras por idioma.


165-187: Mejora el manejo de errores al actualizar los tipos de vulnerabilidad

Actualmente, si ocurre un error durante la actualización, solo se muestra un mensaje genérico. Deberías manejar casos específicos, como conflictos o problemas de validación, para proporcionar información más detallada al usuario.

Considera verificar el código de estado de la respuesta de error:

        } catch (error) {
          console.error(error);
-         toast.error(t('err.failedUpdatingVulnerabilityTypes'));
+         if (error.response && error.response.status === 400) {
+           toast.error(t('err.validationError'));
+         } else {
+           toast.error(t('err.failedUpdatingVulnerabilityTypes'));
+         }
          setIsEditing(false);
          return;
        }

Asegúrate de agregar las claves de traducción necesarias.

frontend/src/services/data.ts (2)

791-793: Inconsistencia en el nombre de la función createVulnerabilityCategories

La función createVulnerabilityCategories sugiere que crea múltiples categorías, pero actualmente solo acepta un único objeto VulnerabilityCategory. Para mayor claridad y coherencia, sería recomendable renombrar la función a createVulnerabilityCategory.

Aplica este diff para renombrar la función:

-export const createVulnerabilityCategories = async (
+export const createVulnerabilityCategory = async (
  vulnerabilityCategory: VulnerabilityCategory,

Asegúrate de actualizar todas las llamadas a esta función en el código.


772-837: Unificar el manejo de errores para reducir código duplicado

Noté que el manejo de errores en las funciones relacionadas con vulnerabilidades es repetitivo. Sería beneficioso extraer este comportamiento en una función auxiliar para mejorar la mantenibilidad y reducir la duplicación de código.

Por ejemplo, podrías crear una función handleResponseError:

function handleResponseError(response: Response): never {
  throw new Error(response.statusText || networkErrorMsg);
}

Y utilizarla en tus funciones:

     if (!response.ok) {
-      throw new Error(networkErrorMsg);
+      handleResponseError(response);
     }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 2d98e6f and 9765638.

📒 Files selected for processing (10)
  • frontend/package.json (1 hunks)
  • frontend/src/components/ui/switch.tsx (1 hunks)
  • frontend/src/i18n/en-US/index.ts (3 hunks)
  • frontend/src/routes/data/CustomData.tsx (2 hunks)
  • frontend/src/routes/data/CustomData/VulnerabilityCategories.tsx (1 hunks)
  • frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx (1 hunks)
  • frontend/src/routes/data/CustomData/VulnerabilityTypeList.tsx (1 hunks)
  • frontend/src/routes/data/CustomData/VulnerabilityTypes.tsx (1 hunks)
  • frontend/src/routes/data/CustomData/custom-components/PrimarySwitch.tsx (1 hunks)
  • frontend/src/services/data.ts (2 hunks)
✅ Files skipped from review due to trivial changes (1)
  • frontend/package.json
🔇 Additional comments (6)
frontend/src/routes/data/CustomData/custom-components/PrimarySwitch.tsx (2)

1-1: ¡Buena elección de librería!

La utilización de @headlessui/react es una decisión acertada ya que proporciona componentes accesibles y bien mantenidos.


31-31: Exportación correcta

La exportación por defecto es apropiada para un componente único en el archivo.

frontend/src/routes/data/CustomData.tsx (2)

9-10: ¡Las importaciones están correctamente estructuradas!

La adición de los nuevos componentes sigue el patrón de importación establecido y mantiene una organización coherente con el resto del código.


Line range hint 16-40: ¡Atención! La secuencia de IDs no es consecutiva

La secuencia de IDs salta del 2 al 4, lo que podría causar confusión en el mantenimiento futuro del código. Es necesario mantener una secuencia numérica coherente.

Sugerencia de corrección:

    {
-     id: 4,
+     id: 3,
      title: t('vulnerabilityTypes'),
      cardTitle: t('createVulnerabilityTypes'),
      cardChildren: <VulnerabilityTypes />,
    },
    {
-     id: 5,
+     id: 4,
      title: t('vulnerabilityCategories'),
      cardTitle: t('createVulnerabilityCategories'),
      cardChildren: <VulnerabilityCategories />,
    },

Verificar las nuevas claves de traducción

Es necesario verificar que las nuevas claves de traducción existan en todos los archivos de idiomas.

frontend/src/routes/data/CustomData/VulnerabilityCategories.tsx (1)

47-50: Valores iniciales de los estados podrían no ser los deseados

Estás inicializando sortOption y sortOrder con el primer elemento de sus respectivas listas. Verifica que estos valores coincidan con las preferencias predeterminadas o requerimientos del negocio.

Asegura que los valores iniciales sean los correctos para el caso de uso previsto.

frontend/src/services/data.ts (1)

795-795: ⚠️ Potential issue

Corregir el tipo de dato devuelto en createVulnerabilityCategory

El tipo de dato devuelto en la promesa es incorrecto; debería ser VulnerabilityCategory en lugar de VulnerabilityType.

Aplica este diff para corregir el tipo de dato:

   datas: VulnerabilityType;
+  datas: VulnerabilityCategory;

Likely invalid or redundant comment.

Comment thread frontend/src/routes/data/CustomData/custom-components/PrimarySwitch.tsx Outdated
Comment thread frontend/src/routes/data/CustomData/custom-components/PrimarySwitch.tsx Outdated
Comment thread frontend/src/components/ui/switch.tsx
Comment thread frontend/src/components/ui/switch.tsx
Comment thread frontend/src/routes/data/CustomData/VulnerabilityTypeList.tsx
Comment thread frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx
Comment thread frontend/src/routes/data/CustomData/VulnerabilityCategories.tsx Outdated
Comment thread frontend/src/routes/data/CustomData/VulnerabilityCategories.tsx
Comment thread frontend/src/routes/data/CustomData/VulnerabilityTypes.tsx
Comment thread frontend/src/services/data.ts
Comment thread frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx Outdated
@massi-ponce massi-ponce changed the base branch from main to development November 14, 2024 16:17
Comment thread frontend/src/routes/data/CustomData/VulnerabilityCategories.tsx
Copy link
Copy Markdown
Owner

@caverav caverav left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Se utilizan componentes propios en vez de utilizar los de shadcn, acordamos que preferiríamos estos (solo indiqué uno pero hay varios)

Comment thread frontend/src/routes/data/CustomData/VulnerabilityCategories.tsx Outdated
@jllanosg
Copy link
Copy Markdown
Collaborator

Creo que este PR si requiere nuevos tests (descripción del PR)

- use shadcn switch component instead of primary switch
- center cross button
- change label position to be up
- expand card size
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Outside diff range and nitpick comments (2)
frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx (2)

30-45: Falta seguridad de tipos en las traducciones

Las claves de traducción se utilizan directamente como strings, lo que podría causar errores en tiempo de ejecución si las traducciones no existen.

Considera usar un tipo para las claves de traducción:

type TranslationKey = 
  | 'cvssScore'
  | 'cvssTemporalScore'
  | 'cvssEnvironmentalScore'
  | 'priority'
  | 'remediationComplexity'
  | 'descending'
  | 'ascending';

const t = (key: TranslationKey): string => {
  // implementación existente
};

79-79: El comentario debe estar en inglés

El comentario en español debe ser traducido al inglés para mantener la consistencia del código.

-//disabled true -> no se está editando
+//disabled true -> not in edit mode
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 9765638 and abc3d44.

📒 Files selected for processing (2)
  • frontend/src/routes/data/CustomData/VulnerabilityCategories.tsx (1 hunks)
  • frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • frontend/src/routes/data/CustomData/VulnerabilityCategories.tsx

Comment thread frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx
Comment thread frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx
Comment thread frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx
Comment thread frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between abc3d44 and ee249a1.

📒 Files selected for processing (1)
  • frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx (1 hunks)
🔇 Additional comments (5)
frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx (5)

57-62: ⚠️ Potential issue

La comparación de datos es ineficiente y poco fiable

La comparación de referencias (!==) no detecta cambios en el contenido de los arrays, lo que puede causar que el componente no se actualice correctamente.

Implementa una comparación profunda:

+import { isEqual } from 'lodash';

 useEffect(() => {
-  if (prevDataRef.current !== data) {
+  if (!isEqual(prevDataRef.current, data)) {
     setRows(data.map((row, index) => ({ ...row, id: index.toString() })));
     prevDataRef.current = data;
   }
 }, [data]);

Likely invalid or redundant comment.


52-54: ⚠️ Potential issue

El uso del índice como clave es una mala práctica

Usar el índice como identificador en React puede causar problemas de renderizado y comportamiento inesperado, especialmente al reordenar o eliminar elementos.

Implementa un identificador único:

 const [rows, setRows] = useState(
-  data.map((row, index) => ({ ...row, id: index.toString() })),
+  data.map((row) => ({ ...row, id: crypto.randomUUID() })),
 );

Likely invalid or redundant comment.


176-182: ⚠️ Potential issue

La comparación de datos es extremadamente ineficiente

Usar JSON.stringify para comparar objetos es una práctica muy ineficiente que puede causar problemas de rendimiento significativos.

Implementa una comparación más eficiente:

-  useEffect(() => {
-    const updatedData = rows.map(({ id, ...rest }) => rest);
-    if (JSON.stringify(updatedData) !== JSON.stringify(data)) {
-      onUpdateList(updatedData);
-    }
-  }, [rows, data, onUpdateList]);
+  useEffect(() => {
+    const updatedData = rows.map(({ id, ...rest }) => rest);
+    const hasChanges = updatedData.some((item, index) => (
+      !data[index] ||
+      item.name !== data[index].name ||
+      item.sortValue !== data[index].sortValue ||
+      item.sortOrder !== data[index].sortOrder ||
+      item.sortAuto !== data[index].sortAuto
+    ));
+    if (hasChanges) {
+      onUpdateList(updatedData);
+    }
+  }, [rows, data, onUpdateList]);

Likely invalid or redundant comment.


64-72: ⚠️ Potential issue

Falta validación de entrada en el manejador

No se está validando ningún valor antes de actualizar el estado, lo que podría permitir datos inválidos en la aplicación.

Implementa las validaciones necesarias:

 const handleInputChange = (
   id: string,
   field: keyof VulnerabilityCategoryItem,
   value: string | boolean,
 ) => {
+  if (field === 'name' && typeof value === 'string') {
+    if (value.length === 0 || value.length > 100) {
+      console.error('Nombre inválido');
+      return;
+    }
+  }
+  if (field === 'sortValue' && typeof value === 'string') {
+    if (!sortOptions.some(opt => opt.value === value)) {
+      console.error('Valor de ordenamiento inválido');
+      return;
+    }
+  }
   setRows(prevRows =>
     prevRows.map(row => (row.id === id ? { ...row, [field]: value } : row)),
   );
 };

Likely invalid or redundant comment.


11-16: ⚠️ Potential issue

Los tipos son demasiado permisivos y necesitan ser más estrictos

La definición actual permite valores que no deberían ser válidos. Es necesario reforzar los tipos para prevenir errores en tiempo de ejecución.

Implementa estos cambios:

+type SortValueType = 'cvssScore' | 'cvssTemporalScore' | 'cvssEnvironmentalScore' | 'priority' | 'remediationComplexity';
+type SortOrderType = 'asc' | 'desc';

 type VulnerabilityCategoryItem = {
-  name: string;
+  name: string & { minLength: 1, maxLength: 100 };
-  sortValue: string;
+  sortValue: SortValueType;
-  sortOrder: string;
+  sortOrder: SortOrderType;
   sortAuto: boolean;
 };

Likely invalid or redundant comment.

Comment thread frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx
Comment thread frontend/src/routes/data/CustomData/VulnerabilityCategoriesList.tsx
massi-ponce and others added 2 commits November 14, 2024 14:54
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@caverav caverav merged commit 9090fcd into development Nov 15, 2024
@caverav caverav deleted the feature/vulnerability-custom-data branch November 15, 2024 02:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants