Skip to content

Conversation

@caverav
Copy link
Owner

@caverav caverav commented Feb 4, 2025

Descripción

Backend:

  • Se mejora la función splitHTMLParagraphs en report-generator.js para gestionar correctamente imágenes vacías y asegurar que las propiedades alt tengan un valor predeterminado en caso de ausencia.

Frontend:

  • Editor de Texto: Se actualiza el componente RichText para reemplazar ReactQuill por el editor basado en TipTap, utilizando el paquete reactjs-tiptap-editor y sus extensiones. Se agregan múltiples extensiones (como Bold, Italic, Heading, Image, Table, etc.) para ofrecer mayor funcionalidad y compatibilidad.
  • Se actualiza el hook de autenticación useAuth.tsx para utilizar la URL de inicialización (initUrl) definida en las variables de entorno.

Motivación y Contexto

Un usuario notificó no poder subir imágenes en la sección de pruebas.

¿Cómo ha sido probado?

Se realizaron pruebas manuales en entornos de desarrollo, verificando que el editor:

  • Permita la inserción y formateo de texto (negrita, cursiva, subrayado, etc.).
  • Soporte la inserción y manejo de imágenes mediante arrastrar y soltar o pegar desde el portapapeles.
  • Funcione correctamente con las extensiones adicionales (como tablas, código, listas, etc.).
  • Permita la carga y visualización de contenido HTML enriquecido.

Tipos de cambios

  • Bugfix (cambio que no interrumpe el funcionamiento y que soluciona un problema)
  • New feature (cambio que añade funcionalidad sin interrumpir el funcionamiento existente)
  • Breaking change (cambio 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 Características

    • Se ha implementado un renovado editor de texto enriquecido, que ofrece una experiencia de edición más rápida y moderna.
    • Se han añadido nuevas dependencias que mejoran la funcionalidad del proyecto frontend.
  • Estilos

    • Se han actualizado los estilos del editor y de diversos componentes, proporcionando un diseño más limpio y coherente.
  • Mantenimiento y Optimización

    • Se han mejorado los procesos de generación de informes, optimizando el manejo de imágenes y fortaleciendo la configuración de autenticación para una mayor robustez.

Updated frontend package.json with new dependencies:
- added "@ant-design/icons": "^5.6.0"
- added "@tiptap/extension-heading": "^2.11.4"
- added "@tiptap/extension-highlight": "^2.11.4"
- added "diff": "^7.0.0"
- added "katex": "^0.16.21"
- added "reactjs-tiptap-editor": "^0.1.14"
…x, Color, and Font options, and improved image handling through drag-and-drop functionality.
…customization, code block formatting, and text selection enhancements.
- Introduced CustomImage component for handling images.
- Updated imagesUrl to use import.meta.env.VITE_API_URL dynamically instead of hardcoding it.
…uploads including base64 conversion and API posting.
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 4, 2025

Warning

Rate limit exceeded

@caverav has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 11 minutes and 51 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 ea43193 and e4a3292.

📒 Files selected for processing (1)
  • frontend/package.json (3 hunks)
📝 Walkthrough

Walkthrough

Se han realizado modificaciones tanto en el backend como en el frontend. En el backend, se ajusta la expresión regular y se mejora el manejo de datos en la función de generación de reportes. En el frontend, se actualiza el archivo de dependencias, se elimina el editor ReactQuill reemplazándolo por RcTiptapEditor en el componente RichText, se ajustan los estilos asociados y se incorpora una URL dinámica en el hook de autenticación. Además, se eliminan archivos CSS relacionados con Quill.

Changes

Archivo(s) Resumen de cambios
backend/src/lib/report-generator.js Se modifica la función splitHTMLParagraphs para retornar un array vacío si data es falsy, se actualiza la expresión regular para los atributos alt en <img>, y se refactoriza la lógica de procesamiento de imágenes.
frontend/package.json Se añaden nuevas dependencias (por ejemplo, Tiptap, KaTeX, etc.) y se fija la versión de eslint-plugin-prefer-arrow-functions a 3.4.1.
frontend/src/components/text/RichText.tsx Se sustituye ReactQuill por RcTiptapEditor, se eliminan y actualizan tipos de props, y se implementa un manejo de cambios con debounce.
frontend/src/components/text/css/RichText.css Se incorporan nuevos estilos para el editor rico, la toolbar, el contenido, tablas, diff highlighting y otros elementos visuales.
frontend/src/hooks/useAuth.tsx Se introduce la constante initUrl para construir dinámicamente la URL utilizada en el registro de usuarios.
frontend/src/components/text/css/quill-styles.css
frontend/src/components/text/css/quill.snow.css
Se eliminan los estilos y archivos completos relacionados con el editor Quill, removiendo reglas y configuraciones específicas para dicho editor.

Sequence Diagram(s)

sequenceDiagram
    participant U as Usuario
    participant E as RcTiptapEditor
    participant D as Función Debounce
    participant C as Callback onChange

    U->>E: Introduce contenido
    E->>D: Emite evento de cambio
    D->>C: Llama al callback tras intervalo de debounce
    C-->>U: Actualiza el contenido almacenado
Loading

Suggested labels

bug, enhancement

Suggested reviewers

  • Icksir
  • jllanosg

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 generate docstrings to generate docstrings for this PR. (Beta)
  • @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
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: 7

🧹 Nitpick comments (4)
frontend/src/components/text/RichText.tsx (1)

4-5: Remover código comentado o reactivarlo.
Estos imports comentados parecen residuales de una implementación anterior con Label y Placeholder. Si no se volverán a usar, convendría eliminarlos para mantener el código limpio.

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

11-27: createImage con POST JSON.
La función envía datos en formato JSON, lo cual es adecuado. Recomendable manejar errores de validación (4xx) desde el servidor para feedback más detallado.

frontend/src/hooks/useAuth.tsx (1)

109-109: Llamada a la ruta dinámica de registro.
fetch(initUrl, ...) permite una fácil reconfiguración de la URL sin cambios en el código. Igualmente, revisa si el servidor requiere cabeceras o tokens adicionales para la creación del usuario.

frontend/src/components/text/css/RichText.css (1)

67-70: Las imágenes no son completamente accesibles.

No se han definido estilos para estados de hover o focus, lo que afecta la accesibilidad.

Agregar estilos para mejorar la accesibilidad:

 img {
   max-width: 100%;
   border-radius: 3px;
+  cursor: pointer;
+  transition: transform 0.2s ease;
+ }
+
+ img:hover {
+  transform: scale(1.02);
+ }
+
+ img:focus {
+  outline: 2px solid var(--q-color-primary);
+  outline-offset: 2px;
 }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5ef1e77 and 268562f.

📒 Files selected for processing (8)
  • backend/src/lib/report-generator.js (2 hunks)
  • frontend/package.json (5 hunks)
  • frontend/src/components/text/ImageHandler.tsx (1 hunks)
  • frontend/src/components/text/RichText.tsx (1 hunks)
  • frontend/src/components/text/css/RichText.css (1 hunks)
  • frontend/src/hooks/useAuth.tsx (2 hunks)
  • frontend/src/services/image.ts (1 hunks)
  • frontend/src/services/utils.ts (1 hunks)
🧰 Additional context used
🪛 Biome (1.9.4)
frontend/src/components/text/ImageHandler.tsx

[error] 26-26: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 75-75: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

frontend/src/services/utils.ts

[error] 120-161: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 131-131: A character class cannot match a character and a combining character.

A character and a combining character forms a new character. Replace the character class with an alternation.

(lint/suspicious/noMisleadingCharacterClass)


[error] 139-139: A character class cannot match a character and a combining character.

A character and a combining character forms a new character. Replace the character class with an alternation.

(lint/suspicious/noMisleadingCharacterClass)


[error] 166-167: A character class cannot match a character and a combining character.

A character and a combining character forms a new character. Replace the character class with an alternation.

(lint/suspicious/noMisleadingCharacterClass)

🔇 Additional comments (18)
frontend/src/components/text/RichText.tsx (7)

1-2: Validación de imports relacionados con tipografías y fórmulas.
Estos imports lucen adecuados para brindar soporte a KaTeX y al estilo del editor TipTap. Asegúrate de que realmente se utilicen funciones de LaTeX en este componente, pues de lo contrario podrías evitar dependencias innecesarias.


6-42: Verificar uso de extensiones.
Se importan múltiples extensiones de reactjs-tiptap-editor. Confirma que todas sean necesarias en este componente para evitar aumentar innecesariamente el tamaño del bundle.


44-45: Ruta de subida de imágenes configurada correctamente.
La URL de imágenes se construye a partir de import.meta.env.VITE_API_URL. Asegúrate de que el entorno contenga la variable y que se use en todas las rutas relacionadas con imágenes para mantener la consistencia.


46-124: Revisar límite de 50,000 caracteres.
Dentro de extensions, se configura un límite de 50,000 caracteres. Confirma si es apropiado para el caso de uso en producción, ya que podría ser demasiado laxo o quedarte corto según el contexto. Del mismo modo, considera manejar validaciones más robustas si se espera un uso intensivo.


126-133: Buena práctica con debounce.
La implementación de debounce con 300 ms resulta adecuada para evitar llamadas excesivas. Solo verifica en pruebas que no cause retrasos molestos para el usuario al escribir.


135-140: Definición clara de los tipos de props.
El tipo RichTextProps es conciso y describe bien las propiedades requeridas. Esto facilita el mantenimiento y la legibilidad del componente.


142-173: Componente RichText con TipTap.
La transición a RcTiptapEditor se ve completa y bien organizada. Se utiliza la prop onChangeContent correctamente y se administra el estado interno. Asegúrate de probar escenarios donde value sea nulo o indefinido para garantizar manejo seguro.

frontend/src/services/image.ts (4)

1-2: Revisa la base de la URL.
API_BASE_URL concatena '/api/' tras la variable de entorno. Asegúrate de que sea coherente con la configuración del servidor y no existan duplicaciones de rutas en otras partes del proyecto.


3-9: Función getImage correctamente estructurada.
La función maneja la respuesta y arroja error si la respuesta no es exitosa. Esto es bueno para evitar continuar con datos inválidos.


29-37: deleteImage elimina recurso con DELETE.
La lógica es clara y coherente. Si el backend requiere autenticación especial, confirma que las credenciales estén correctamente configuradas.


39-43: Exportación por defecto de las funciones.
Agrupar funciones en un objeto evita contaminación del espacio global de nombres. Esto facilita su importación y mantiene la coherencia modular.

frontend/src/hooks/useAuth.tsx (1)

7-7: Reemplazo dinámico de la URL de inicialización.
Asignar initUrl usando la variable de entorno VITE_API_URL hace que el proceso de registro sea más flexible. Verifica que VITE_API_URL contenga una ruta adecuada en todos los entornos.

frontend/package.json (6)

15-15: Verificación de la dependencia '@ant-design/icons'
La inclusión de este paquete es correcta y respalda la integración de TipTap en la aplicación. Asegúrate de consultar su documentación para confirmar la compatibilidad con el resto del stack.


30-41: Evaluación de dependencias TipTap
Se han agregado múltiples dependencias de TipTap que permiten utilizar extensiones avanzadas (menús flotantes, encabezados, resaltado, imágenes, etc.) en el editor. Es importante revisar periódicamente la compatibilidad de estas versiones y mantenerlas actualizadas según las necesidades del proyecto.


53-53: Confirmación de la inclusión de 'diff'
La adición del paquete "diff" es acertada si se requiere funcionalidades para comparar textos o estados. Verifica que la versión especificada se alinee correctamente con las utilidades que se pretendan implementar.


58-59: Validación de 'katex' y 'lodash'
La incorporación de "katex" es útil para el renderizado de expresiones matemáticas, mientras que "lodash" sirve para optimizar operaciones utilitarias. Ambas dependencias se añaden de forma coherente; revisa que sus versiones interactúen sin conflictos con el resto del código.


68-68: Revisión de 'reactjs-tiptap-editor'
Este paquete respalda la migración de ReactQuill a TipTap y mejora el manejo de imágenes y ediciones ricas en el componente correspondiente. Es fundamental probar su integración para garantizar una experiencia de usuario fluida y sin contratiempos.


88-88: Fijación de versión en 'eslint-plugin-prefer-arrow-functions'
El ajuste de la versión de "^3.4.1" a "3.4.1" asegura consistencia y evita actualizaciones inesperadas que puedan alterar el comportamiento del linter. Este cambio es adecuado siempre que se verifique que no afecta negativamente otras configuraciones del proyecto.

@caverav caverav changed the title 🐛 fix(rich-text-parsing): Fix missing alt attribute and use TipTap over Quill 🐛 fix(rich-text): Fix missing alt attribute and use TipTap over Quill Feb 5, 2025
Copy link
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

🧹 Nitpick comments (1)
frontend/src/components/text/RichText.tsx (1)

1-174: La migración a TipTap es positiva pero requiere mejoras críticas.

Aunque el cambio a TipTap es una buena decisión, hay varios aspectos que necesitan atención inmediata:

  1. Organización del código
  2. Seguridad en el manejo de archivos
  3. Manejo de errores
  4. Estados de carga

Sugiero dividir este componente en varios archivos:

  • RichText.tsx: Solo el componente
  • config/editor.ts: Configuración del editor
  • config/api.ts: URLs de la API
  • utils/file.ts: Validación de archivos
  • utils/debounce.ts: Función de debounce

Esto mejorará significativamente la mantenibilidad y testabilidad del código.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 268562f and e39f7e9.

📒 Files selected for processing (3)
  • frontend/src/components/text/RichText.tsx (1 hunks)
  • frontend/src/components/text/css/quill-styles.css (0 hunks)
  • frontend/src/components/text/css/quill.snow.css (0 hunks)
💤 Files with no reviewable changes (2)
  • frontend/src/components/text/css/quill-styles.css
  • frontend/src/components/text/css/quill.snow.css
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Analyze (javascript-typescript)

…arity and maintainability by extracting image attribute processing into separate functions
coderabbitai[bot]
coderabbitai bot previously approved these changes Feb 5, 2025
@sonarqubecloud
Copy link

sonarqubecloud bot commented Feb 5, 2025

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.

2 participants