Skip to content

✨ feat: Add percentage to charts#172

Merged
caverav merged 9 commits intodevelopmentfrom
feature/percentage-charts
Nov 7, 2024
Merged

✨ feat: Add percentage to charts#172
caverav merged 9 commits intodevelopmentfrom
feature/percentage-charts

Conversation

@caverav
Copy link
Copy Markdown
Owner

@caverav caverav commented Nov 7, 2024

Descripción

Se ha añadido la dependencia chartjs-plugin-datalabels y se ha integrado en varios componentes de gráficos (CIATriadChart, CVSSChart, RemediationPriorityChart, SeverityPieChart, TimePerAuditChart). Se ha configurado el plugin para que formatee las etiquetas de datos según los requisitos específicos de cada gráfico.

Motivación y Contexto

Este cambio es necesario para mejorar la visualización de los datos en los gráficos, proporcionando etiquetas de datos personalizadas que muestran porcentajes y otros formatos específicos. Esto soluciona el problema de la falta de claridad en la representación de los datos en los gráficos.

¿Cómo ha sido probado?

Verificar que se muestren los porcentajes

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 plugin de datos a varios gráficos, permitiendo la visualización de etiquetas de datos en el gráfico de pastel de severidad y mejorando la representación visual en otros gráficos.
    • Se introdujeron líneas de anotación en el gráfico CVSS para representar visualmente la puntuación promedio.
  • Mejoras

    • Se mejoró la configuración de los gráficos para incluir etiquetas de datos que muestran porcentajes, aumentando el valor informativo de los gráficos.
    • Se ha configurado la opción de etiquetas de datos en varios gráficos, aunque algunas etiquetas no se mostrarán debido a la configuración del formateador.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Nov 7, 2024

Warning

Rate limit exceeded

@caverav has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 3 minutes and 30 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 b8ccac9 and 2064aad.

📝 Walkthrough
📝 Walkthrough
📝 Walkthrough
📝 Walkthrough
📝 Walkthrough

Walkthrough

Se ha actualizado el archivo package.json del proyecto frontend para incluir una nueva dependencia, "chartjs-plugin-datalabels": "^2.2.0". Además, se han realizado modificaciones en varios componentes de gráficos para integrar esta nueva funcionalidad. En los componentes CIATriadChart, CVSSChart, RemediationPriorityChart, SeverityPieChart, TimePerAuditChart, AverageCVSS, CIATriad, CVSSScore, RemediationComplexity y RemediationPriority, se ha añadido la configuración del plugin datalabels, permitiendo la visualización de etiquetas de datos en los gráficos, aunque algunas configuraciones devuelven cadenas vacías para desactivar la visualización de etiquetas.

Changes

Archivo Resumen de cambios
frontend/package.json Se añadió la dependencia "chartjs-plugin-datalabels": "^2.2.0" en la sección de dependencias.
frontend/src/components/charts/CIATriadChart.tsx Se añadió la configuración del plugin datalabels en las opciones del gráfico, con una función formatter que devuelve una cadena vacía.
frontend/src/components/charts/CVSSChart.tsx Se añadió la configuración del plugin datalabels y se modificó el plugin de anotaciones para incluir una nueva línea de anotación (line1).
frontend/src/components/charts/RemediationPriorityChart.tsx Se añadió la configuración del plugin datalabels en las opciones del gráfico, con una función formatter que devuelve una cadena vacía.
frontend/src/components/charts/SeverityPieChart.tsx Se actualizó ChartJS.register para incluir ChartDataLabels y se añadió la configuración del plugin datalabels para mostrar porcentajes.
frontend/src/components/charts/TimePerAuditChart.tsx Se añadieron importaciones para BubbleDataPoint y Point, se actualizó ChartJS.register para incluir ChartDataLabels, y se mejoró la configuración del plugin datalabels para calcular y formatear porcentajes.
frontend/src/components/dashboard/AverageCVSS.tsx Se añadió la configuración del plugin datalabels y se introdujo una línea de anotación para representar el averageCVSS.
frontend/src/components/dashboard/CIATriad.tsx Se añadió la configuración del plugin datalabels en las opciones del gráfico, con una función formatter que devuelve una cadena vacía.
frontend/src/components/dashboard/CVSSScore.tsx Se añadió la configuración del plugin datalabels para mostrar porcentajes en el gráfico de pastel.
frontend/src/components/dashboard/RemediationComplexity.tsx Se añadió la configuración del plugin datalabels en las opciones del gráfico, con una función formatter que devuelve una cadena vacía.
frontend/src/components/dashboard/RemediationPriority.tsx Se añadió la configuración del plugin datalabels en las opciones del gráfico, con una función formatter que devuelve una cadena vacía.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Frontend
    participant ChartLibrary

    User->>Frontend: Solicita gráfico
    Frontend->>ChartLibrary: Configura gráfico con datalabels
    ChartLibrary-->>Frontend: Devuelve gráfico configurado
    Frontend-->>User: Muestra gráfico
Loading

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: 5

🧹 Outside diff range and nitpick comments (4)
frontend/src/components/charts/RemediationPriorityChart.tsx (2)

Line range hint 1-15: ¡El plugin de datalabels no está registrado!

Es necesario registrar el plugin de datalabels con ChartJS para que funcione correctamente. Debes importarlo y registrarlo junto con los demás plugins.

Aplica este cambio:

import {
  BarElement,
  CategoryScale,
  Chart as ChartJS,
  Legend,
  LinearScale,
  Title,
  Tooltip,
} from 'chart.js';
+ import ChartDataLabels from 'chartjs-plugin-datalabels';
import { t } from 'i18next';
import React from 'react';
import { Bar } from 'react-chartjs-2';

ChartJS.register(
  CategoryScale,
  LinearScale,
  BarElement,
  Title,
  Tooltip,
  Legend,
+ ChartDataLabels
);

Line range hint 19-23: Mejora la tipificación de los datos

La interfaz PriorityData podría beneficiarse de una mejor definición de tipos para garantizar la integridad de los datos.

Considera esta mejora:

 type PriorityData = {
-  name: string;
-  count: number;
-  color: string;
+  name: string;
+  count: number;
+  color: `#${string}` | string;  // Permite colores hexadecimales o nombres de colores CSS
 };
frontend/src/components/charts/CVSSChart.tsx (2)

Line range hint 1-116: ¡El tipado puede mejorarse significativamente!

El componente necesita mejoras en sus definiciones de tipos:

  1. Las opciones del gráfico deberían estar tipadas:
import { ChartOptions } from 'chart.js';

const options: ChartOptions<'bar'> = {
  // ... configuración actual
};
  1. Los datos del gráfico también deberían tener un tipo explícito:
import { ChartData } from 'chart.js';

const chartData: ChartData<'bar'> = {
  // ... datos actuales
};

Estos cambios proporcionarán:

  • Mejor autocompletado en el IDE
  • Detección temprana de errores
  • Documentación más clara

Line range hint 1-116: ¡Considera extraer la lógica de colores a una función utilitaria!

La lógica para determinar los colores basados en la puntuación CVSS debería estar en una función separada para mejorar la mantenibilidad y reusabilidad.

const getCVSSColor = (score: number): string => {
  if (score >= 9.0) return '#dc3545';
  if (score >= 7.0) return '#fd7e14';
  if (score >= 4.0) return '#ffc107';
  if (score >= 0.1) return '#28a745';
  return '#6c757d';
};

Esto haría el código más limpio y permitiría reutilizar la lógica de colores en otros componentes si fuera necesario.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 17b5309 and 7892ccb.

📒 Files selected for processing (6)
  • frontend/package.json (1 hunks)
  • frontend/src/components/charts/CIATriadChart.tsx (1 hunks)
  • frontend/src/components/charts/CVSSChart.tsx (1 hunks)
  • frontend/src/components/charts/RemediationPriorityChart.tsx (1 hunks)
  • frontend/src/components/charts/SeverityPieChart.tsx (2 hunks)
  • frontend/src/components/charts/TimePerAuditChart.tsx (3 hunks)
🔇 Additional comments (4)
frontend/src/components/charts/SeverityPieChart.tsx (1)

1-8: ¡La importación y registro del plugin están correctos!

La integración del plugin ChartDataLabels se ha realizado adecuadamente.

frontend/src/components/charts/CIATriadChart.tsx (1)

100-102: Verificar la implementación en otros componentes de gráficos

Es necesario verificar si este patrón de deshabilitar las etiquetas de datos se repite en otros componentes de gráficos, ya que podría indicar un problema más amplio en la implementación.

✅ Verification successful

El patrón de deshabilitar etiquetas es consistente y justificado

La implementación actual es coherente en todo el código base:

  • CIATriadChart.tsx, CVSSChart.tsx y RemediationPriorityChart.tsx deshabilitan las etiquetas de datos retornando una cadena vacía
  • SeverityPieChart.tsx y TimePerAuditChart.tsx tienen implementaciones personalizadas del formateador para mostrar datos específicos

Este patrón no representa un problema arquitectónico, sino una decisión de diseño deliberada donde las etiquetas se muestran selectivamente según el tipo de gráfico.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Buscar patrones similares en otros componentes de gráficos
echo "Buscando implementaciones similares en otros componentes:"
rg -A 3 "datalabels.*formatter.*=>" frontend/src/components/charts/

Length of output: 194


Script:

#!/bin/bash
# Buscar todos los archivos de gráficos
echo "Archivos de gráficos encontrados:"
fd ".*Chart\.tsx$" frontend/src/components/charts/

# Buscar patrones de configuración de datalabels
echo -e "\nBuscando configuraciones de datalabels:"
rg -U "datalabels:.*\{[\s\S]+?\}" frontend/src/components/charts/

# Buscar cualquier uso de formatter en los archivos
echo -e "\nBuscando otros usos de formatter:"
rg "formatter" frontend/src/components/charts/

Length of output: 3449

frontend/src/components/charts/TimePerAuditChart.tsx (1)

3-3: ¡Las importaciones y el registro del plugin son correctos!

La integración del plugin ChartDataLabels y los tipos necesarios está bien implementada.

Also applies to: 8-8, 12-12, 24-24

frontend/package.json (1)

35-35: ¡Verificar la compatibilidad con chart.js!

La nueva dependencia chartjs-plugin-datalabels@^2.2.0 se ha añadido correctamente, pero es crucial verificar su compatibilidad con la versión actual de chart.js (^4.4.4).

✅ Verification successful

¡La compatibilidad está confirmada y todo está en orden!

La versión de chart.js (^4.4.4) es totalmente compatible con chartjs-plugin-datalabels ^2.2.0. El plugin está siendo utilizado correctamente en:

  • frontend/src/components/charts/TimePerAuditChart.tsx
  • frontend/src/components/charts/SeverityPieChart.tsx

La implementación es correcta y las importaciones están bien estructuradas. No hay ningún problema de compatibilidad o integración que reportar.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Descripción: Verificar la compatibilidad de versiones y buscar vulnerabilidades conocidas

# Verificar la compatibilidad de versiones en el README del plugin
curl -s https://raw.githubusercontent.com/chartjs/chartjs-plugin-datalabels/master/README.md | grep -A 5 "Compatibility"

# Buscar vulnerabilidades conocidas
npm audit chartjs-plugin-datalabels@2.2.0 || true

Length of output: 520


Script:

#!/bin/bash
# Buscar en el package.json la versión de chart.js
cat frontend/package.json | jq -r '.dependencies["chart.js"]'

# Buscar archivos que usen el plugin de datalabels
rg -l "chartjs-plugin-datalabels" --type js --type ts

# Buscar importaciones específicas del plugin
ast-grep --pattern 'import $_ from "chartjs-plugin-datalabels"'

# Buscar registros del plugin
rg "plugin.*datalabel" -A 2 -B 2

Length of output: 1445

Comment thread frontend/src/components/charts/RemediationPriorityChart.tsx
Comment thread frontend/src/components/charts/SeverityPieChart.tsx
Comment thread frontend/src/components/charts/CVSSChart.tsx
Comment thread frontend/src/components/charts/CIATriadChart.tsx
Comment thread frontend/src/components/charts/TimePerAuditChart.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: 5

🧹 Outside diff range and nitpick comments (7)
frontend/src/components/dashboard/RemediationPriority.tsx (3)

Line range hint 1-8: ¡El registro del plugin datalabels está ausente!

Es necesario importar y registrar el plugin de datalabels para que funcione correctamente:

import {
  BarElement,
  CategoryScale,
  Chart as ChartJS,
  Legend,
  LinearScale,
  Title,
  Tooltip,
+ ChartDataLabels,
} from 'chart.js';
+import 'chartjs-plugin-datalabels';

Line range hint 12-22: ¡Falta registrar el plugin en ChartJS!

Después de importar el plugin, es necesario registrarlo:

ChartJS.register(
  CategoryScale,
  LinearScale,
  BarElement,
  Title,
  Tooltip,
  Legend,
+ ChartDataLabels
);

Line range hint 65-75: ¡Mejora la visualización de los datos!

Para mejorar la presentación visual del gráfico, sugiero ajustar los colores para que sean más accesibles y consistentes con el tema oscuro:

    datasets: [
      {
        data: priorityData,
-       backgroundColor: ['#2ECC40', '#FFDC00', '#FF851B', '#FF4136'],
+       backgroundColor: ['#4CAF50', '#FFC107', '#FF9800', '#F44336'],
+       borderRadius: 6,
+       borderSkipped: false,
      },
    ],
frontend/src/components/dashboard/RemediationComplexity.tsx (1)

Line range hint 1-8: Falta registrar el plugin de datalabels

Es necesario importar y registrar el plugin para que funcione correctamente.

Agrega estas modificaciones:

 import {
   BarElement,
   CategoryScale,
   Chart as ChartJS,
   Legend,
   LinearScale,
   Title,
   Tooltip,
+  Chart,
 } from 'chart.js';
+import ChartDataLabels from 'chartjs-plugin-datalabels';

+Chart.register(ChartDataLabels);
frontend/src/components/dashboard/CIATriad.tsx (1)

Line range hint 52-67: ¡La generación de colores necesita una mejor implementación!

El código actual tiene varios problemas:

  1. Duplicación de la lógica de generación de colores
  2. Posible generación de colores muy similares
  3. Falta de reutilización del código

Te propongo extraer la lógica a una función de utilidad:

// Agregar al archivo utils.ts
export const generateChartColor = (index: number) => {
  const predefinedColors = [
    { r: 255, g: 99, b: 132 },
    { r: 54, g: 162, b: 235 },
    { r: 255, g: 206, b: 86 },
    { r: 75, g: 192, b: 192 },
    // Añadir más colores según necesidad
  ];
  
  const color = predefinedColors[index % predefinedColors.length];
  return {
    backgroundColor: `rgba(${color.r}, ${color.g}, ${color.b}, 0.2)`,
    borderColor: 'rgba(255, 255, 255, 0.2)'
  };
};

Y luego simplificar el código del componente:

- backgroundColor: `rgba(${Math.floor(Math.random() * 155 + 100)}, ${Math.floor(Math.random() * 155 + 100)}, ${Math.floor(Math.random() * 155 + 100)}, 0.2)`,
- borderColor: 'rgba(255, 255, 255, 0.2)',
+ ...generateChartColor(index),

Esta solución:

  • Elimina la duplicación de código
  • Garantiza colores visualmente distintos
  • Mejora la mantenibilidad
frontend/src/components/dashboard/AverageCVSS.tsx (2)

Line range hint 41-163: ¡El código necesita varias mejoras críticas!

  1. La lógica de colores usando operadores ternarios anidados es difícil de mantener y propensa a errores.
  2. El manejo de errores solo registra en consola, lo cual no es suficiente para una aplicación en producción.
  3. Los cálculos dentro de useEffect podrían optimizarse.

Sugiero las siguientes mejoras:

  1. Extraer la lógica de colores a una función utilitaria:
const getCVSSColor = (score: number): string => {
  if (score >= 9) return '#FF4136';
  if (score >= 7) return '#FF851B';
  if (score >= 4) return '#FFDC00';
  return '#2ECC40';
};
  1. Mejorar el manejo de errores:
.catch((error) => {
  console.error('Error al cargar datos del audit:', error);
  setData({
    labels: ['Error al cargar datos'],
    datasets: [{
      data: [0],
      backgroundColor: '#FF4136'
    }]
  });
  // Aquí deberías agregar notificación al usuario
});
  1. Optimizar los cálculos:
const calculateAverageCVSS = (findings: Finding[]): number => {
  const sum = findings.reduce((acc, finding) => 
    acc + cvssStringToScore(finding.cvssv3 ?? ''), 0);
  return Math.round((sum / findings.length) * 10) / 10;
};

Line range hint 1-40: ¡Las importaciones necesitan organización y tipado más estricto!

La estructura actual de las importaciones podría mejorarse, y faltan algunos tipos importantes.

Sugiero:

  1. Agregar tipos para los datos:
interface Finding {
  title: string;
  cvssv3: string | null;
}

interface ChartData {
  labels: string[];
  datasets: {
    data: number[];
    backgroundColor: string;
  }[];
}
  1. Organizar las importaciones por grupos (externos, internos, tipos).
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 7892ccb and b8ccac9.

📒 Files selected for processing (5)
  • frontend/src/components/dashboard/AverageCVSS.tsx (1 hunks)
  • frontend/src/components/dashboard/CIATriad.tsx (1 hunks)
  • frontend/src/components/dashboard/CVSSScore.tsx (1 hunks)
  • frontend/src/components/dashboard/RemediationComplexity.tsx (1 hunks)
  • frontend/src/components/dashboard/RemediationPriority.tsx (1 hunks)

Comment thread frontend/src/components/dashboard/RemediationPriority.tsx
Comment thread frontend/src/components/dashboard/RemediationComplexity.tsx
Comment thread frontend/src/components/dashboard/CIATriad.tsx
Comment thread frontend/src/components/dashboard/CVSSScore.tsx
Comment thread frontend/src/components/dashboard/AverageCVSS.tsx
@caverav caverav merged commit e4ec485 into development Nov 7, 2024
@caverav caverav deleted the feature/percentage-charts branch November 7, 2024 01:53
@coderabbitai coderabbitai Bot mentioned this pull request Nov 7, 2024
7 tasks
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.

1 participant