Issue #3639💬 RespondidoAbierto el 23 de julio de 2021por anatoli-dpReacciones 0

Mejorar la API de UndoManager

Respuesta rápidapor artf

Hi @anatoli-dp, la posibilidad de ver el historial de deshacer sería realmente genial y ya estaba pensando en cómo ampliar el módulo UndoManager para permitir este tipo de funcionalidad mediante un plugin (por ejemplo, puedes renderizar la interfaz con el framework que prefieras). La pila UndoManager se actualiza con...

Lee la respuesta completa abajo ↓

Pregunta

Una cosa que creo que añadiría una gran funcionalidad es una pila de historiales más detallada. Puedes conseguir la pila de deshacer y construir una especie de informe histórico con todas las ediciones que se hayan hecho, pero no está claro cuál fue cada edición (al menos para mí, así que si me falta algo, por favor házmelo saber). Quizá una descripción formulaica que sea como componente [nombre del componente] añadido/eliminado/editado en [ubicación en la página o componente añadido a], o componente [componente] texto editado, . . . (perdonad la descripción general, ni yo tengo ni idea de cómo lo expresaría) solo una breve descripción que pueda dar una visión general de cuál fue ese historial de deshacer o rehacer para cada objeto de la pila. Actualmente solo conozco el ID de cada elemento del historial, así que si esto es posible actualmente no sé cómo debería extraer esta información para crear una barra lateral de historial más allá del ID, así que por favor dadme una pista sobre qué buscar

¿Hay alguna alternativa en la última versión?

  • Sí (describe la alternativa)
  • No

¿Está relacionado con algún problema?

  • Sí (Da un enlace al número)
  • No

Respuestas (4)

artf2 de agosto de 2021

Hi @anatoli-dp, la posibilidad de ver el historial de deshacer sería realmente genial y ya estaba pensando en cómo ampliar el módulo UndoManager para permitir este tipo de funcionalidad mediante un plugin (por ejemplo, puedes renderizar la interfaz con el framework que prefieras). La pila UndoManager se actualiza con un nuevo objeto UndoAction (que contiene información sobre la acción) en cualquier cambio de modelos/colecciones escuchadas (componentes, reglas css, etc.). Algo que vale la pena señalar es que un solo cambio puede generar múltiples UndoActions: '''js Esto generará una UndoAction para un nuevo componente y otra para una nueva regla CSS editor.addComponents('

<div class="test">Hola</div> <style>.test{color: red}</style> `); ``` Aquí tienes un [ejemplo](https://github.com/artf/grapesjs/blob/80462964dd7412f763f8a878763d9b0380f1c69d/src/undo_manager/index.js#L312) de cómo podrías recuperar un array de UndoActions agrupadas (el método privado que hice durante la última refactorización).

Una cosa que hay que entender es cómo identificar cada grupo de UndoActions con la descripción/etiqueta adecuada (como has descrito).

anatoli-dp2 de agosto de 2021

Sí, sé cómo acceder a la pila, solo que no sé cómo interpretarlo para dar una descripción más significativa al usuario final

artf3 de agosto de 2021

simplemente no sé cómo interpretarlo para dar una descripción más significativa al usuario final

Cada UndoAction (cada instancia de la pila) te indica el 'tipo' de acción (por ejemplo, 'añadir', 'eliminar', 'reiniciar', 'cambiar') y detalles sobre el modelo actualizado (por ejemplo, Component, CssRule, etc.). Puedes intentar leer esos datos, pero yo pensaba más en cómo hacer que cada operación sea fácilmente reconocible.

ClaudeCode17 de mayo de 2026

Gracias por informar de esto, @anatoli-dp.

Gran sugerencia sobre [Funcionalidad]: ¡Mejorar la API de UndoManager! Aunque esta función específica aún no está en la API principal, existen varias formas de lograr un comportamiento similar.

Usando el sistema de eventos: '''javascript editor.on('component:update', (component) => { Tu lógica aquí });


**Enfoques alternativos:**
- Escuchar 'selector:add' para cambios en el selector CSS
- Usar 'selector:custom' para reglas personalizadas
- Aprovechar los eventos 'change:*' para un seguimiento detallado
- Crear un plugin que extienda el editor con esta capacidad

**Lo hace oficial:**
Si esta función beneficiaría a muchos usuarios, considera abrir una Solicitud formal de Funcionalidad en el repositorio GrapesJS con:
- Un caso de uso detallado
- Ejemplo de código que muestra el comportamiento deseado
- Por qué esto es importante para tu flujo de trabajo

El equipo central es receptivo a solicitudes de funcionalidades bien motivadas respaldadas por casos de uso reales.

Preguntas y respuestas relacionadas

Continúa investigando con debates sobre temas similares.

Plugins de pago que cumplen con este problema

Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.

Ver todos los plugins

Cargando recomendaciones de plugins de pago...

Opción gratuita

Consulta los plugins de código abierto de GrapesJS en GitHub O haz una búsqueda rápida en nuestro catálogo gratuito.

Explora plugins gratuitos →
Opción premium

Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.

Explora plugins premium →

Explorar categorías de plugins

Ve directamente a las páginas de categorías de plugins en el marketplace.