Issue #5049πŸ’¬ AnsweredOpened April 13, 2023by ronaldohoch2 reactions

Problem when dragging component composed by image and link

Quick answerby gustavohleal❀ 1

Hi! I've tested your solution. It does change the image correctly with the image locked inside the main component and you can move it around. The src attribute is changed in the model, but when you move the component he goes back to the placeholder image. If you change the image and then open the View Code modal you w...

Read full answer below ↓

Question

GrapesJS version

  • I confirm to use the latest version of GrapesJS

What browser are you using?

Brave last version

Reproducible demo link

https://jsfiddle.net/rp7oc96v/1/

Describe the bug

Hi Arthur! I'm creating a new component, an image inside a link, like the mj-image component, but i'm stuck in one configuration or it's a bug...

How to reproduce the bug?

  1. drop the block "Link na Imagem"
  2. when you try to drag the new component from image, grapesjs select the image and not the component root tag (<a>)
  3. If i need to drag the whole componet, i need to use the icon from toolbar.

What is the expected behavior?

  1. That children component don't mode without the parent element.

What is the current behavior?

  1. If the children img element dont' have the attribute data-gjs-selectable="false" we will move only the image instead of moving the whole component.

Other problems i found In my component, i have configured this:

model:{defaults:{...
resizable: {
       ratioDefault: 1
}
...

So, when i drop my new component, the resizer shows up, but, if i click again, with the resizer visible, it hides...

If i put data-gjs-locked="true" or data-gjs-editabble="false" to block everything from image, i can't change it's src with assets manager. If I put the style pointer-events:none, the event dblclick from component don't fires, the grapesjs keeps clicking on the image πŸ˜”

Also, tried the things we found in these issues: https://github.com/GrapesJS/grapesjs/issues/3014 https://github.com/GrapesJS/grapesjs/issues/2103

Code of Conduct

  • I agree to follow this project's Code of Conduct

Answers (4)

gustavohlealβ€’ April 14, 2023

Hi! I've tested your solution. It does change the image correctly with the image locked inside the main component and you can move it around. The src attribute is changed in the model, but when you move the component he goes back to the placeholder image. If you change the image and then open the View Code modal you will see that the src attribute didn't change like in the model. I believe that this is happening because grapes is not setting an id for the image in the exported code.

Check the prints: Without setting an image when component is dropped: image

Changing the image: image

Then the view code:

image

Adding a column and moving the component into:

image

Here is the updated jsFiddle: https://jsfiddle.net/5er1kmg4/7/

But if you check the image model right after selecting the new image it has the new src value. This is happening with the standard asset manager. Me and @ronaldohoch were able to solve our problem because we use a custom asset manager. But i thought that this could be some bug and was worth to inform you. I hope that this can help.

artfβ€’ April 18, 2023

@gustavohleal my bad, you have to update the src property directly instead of the attribute image.set({ src: asset.getSrc() });

artfβ€’ April 14, 2023

Use the data-gjs-locked="true" property to ignore the image and update properly your custom component

// Remove runCommand("open-assets");  as it doesn't make sense to run it on the model side
// you can activate the component via blocks (https://grapesjs.com/docs/api/block.html#properties)
// by using `activate` property
init(){
  editor.runCommand("open-assets");
}
// Handle assets update in the view
view: {
  events: {
    dblclick: 'onActive',
  },

  onActive() {
    const { model } = this;
    editor.Assets.open({
      select(asset, complete) {
        const image = model.findType('image')[0];
        if (image) {
          image.addAttributes({ src: asset.getSrc() });
          complete && editor.Assets.close();
        }
      }
    });
  }
}
ClaudeCodeβ€’ May 17, 2026

Thanks for reporting this, @ronaldohoch.

Great question about Problem when dragging component composed by image and link. The recommended approach with StyleManager is to use the event-driven API.

Start here:

  1. Check the GrapesJS documentation for your specific module
  2. Look for the on() event listener method
  3. Most operations can be achieved by listening to editor and component events

Common patterns:

// Listen for changes
editor.on('change', () => console.log('something changed'));

// Component lifecycle
editor.on('component:mount', (c) => console.log('component ready', c));
editor.on('component:update', (c) => console.log('component updated', c));

If you're still stuck:

  • Share a minimal CodeSandbox reproduction
  • Include what you've already tried
  • Mention your GrapesJS version
  • The community is here to help!

Related Questions and Answers

Continue research with similar issue discussions.

Paid Plugins That Match This Issue

Curated by issue keywords and label relevance to help you ship faster.

View all plugins

Loading paid plugin recommendations...

Free option

Check the open-source GrapesJS plugins on GitHub or run a quick search in our free catalog.

Browse free plugins β†’
Premium option

Premium plugins ship with support, regular updates, and production-ready features β€” save days of integration work.

Browse premium plugins β†’

Related tutorials

In-depth guides on the same topic.

All tutorials β†’

Browse Plugin Categories

Jump directly to plugin category pages on the marketplace.