GrapesJS / grapesjs

Free and Open source Web Builder Framework. Next generation tool for building templates without coding
https://grapesjs.com
BSD 3-Clause "New" or "Revised" License
22.36k stars 4.05k forks source link

BUG: Undomanager.remove() not working #5641

Closed yashvi2026 closed 8 months ago

yashvi2026 commented 8 months ago

GrapesJS version

What browser are you using?

Chrome v91

Reproducible demo link

https://codepen.io/Harshsne/pen/WNgZzPE

Describe the bug

How to reproduce the bug?

  1. Append an image to the canvas and close the image modal.(so that component will be removed from tracking as i have removed the component from the undomanager stack) editor.on('asset:close', () => { console.log("close") const selected = editor.getSelected(); if (selected && selected.is('image')) { editor.UndoManager.remove(selected); } })
  2. Press crtl+ z

What is the expected behavior? ...Removed component from the undomanager should not be tracked and when i press crtl+z its changes should not be displayed.

What is the current behavior? Removed component from undomanager is still tracked by undomanager.

undomanager new

My actual need is: when i close the image modal without adding any image to it ,I have removed the image block as in my code ,so when i press undo without any src the appended image block is displayed i dont want that to happen so i would like to remove that component from the undomanager stack . editor.on('asset:close', () => { const selected = editor.getSelected(); if (selected && selected.is('image')) { if (selected.get('attributes').src == "empty") { editor.getSelected().remove(); editor.select(); editor.UndoManager.remove(selected); } } }) Any other alternative way i can achieve this? @artf

Code of Conduct

artf commented 8 months ago

The problem here is not Undomanager.remove but what is tracked. When you're resizing the image, you're not editing the Component itself but its CssRule object so that's why it's not working as expected. I'd probably suggest to simply skip the undo manager with operations you don't want to track

editor.UndoManager.skip(() => {
  // ....
});