Issue #3258Opened February 2, 2021by stljeff10 reactions

QUESTION: Prevent/Disable Custom Blocks from being dropped inside other Custom Blocks

Question

Hello,

I have a custom component, let's call it a Section Block. I want to prevent the user from dropping Section Blocks inside other Section Blocks. Is that possible?

Ref: https://grapesjs.com/docs/modules/Components.html#define-custom-component-type

I am aware of the draggable/droppable options that I can define on new component types. My understanding of these options is that they are inclusive.

...
draggable: 'form, form *', // Can be dropped only inside `form` elements
...

Is there a way to make draggable exclusive, where I say, "this block can be dropped anywhere EXCEPT [[component type]]"?

Answers (3)

artfFebruary 3, 20210 reactions

You can use :not() selector, eg. :not(.except-this-class)

stljeff1February 5, 20210 reactions

Thanks @artf . This solution works, mostly. Now I am encountering a new problem where some placeholder text is disappearing.

On some elements inside my blocks, I'll have an HTML element with a text node, then some other nested html element. An example would be a link tag containing an icon.

<a href="#">Click Me <i class="fa fa-chevron-right"></i></a>

When I add the draggable option to the model of my component, HTML elements inside the block similar to the A tag above will lose their text node. If I wrap these text nodes in something like a span tag, the text will stay. Examples of elements that don''t change:

<h1>I'm a Lonely textnode</h1>
<a href="#><span>this textnode is safe</span><i class="fa fa-chevron-right"></i></a>

Do you know of anything that will cause text nodes to disappear if they appear inside a container with other elements?

Here is how I am creating my custom component:


        editor.DomComponents.addType('MySectionBlock', {
            model: editor.DomComponents.getType('default').model.extend({
                draggable: ':not(.my-section-block)'
            }),
            view: editor.DomComponents.getType('default').view.extend({
                init() {
                    this.listenTo(this.model, 'active', this.act());
                },
                act() {
                        // do stuff to manipulate the view

                },
            })
        });

My apologies if this new issue is vague. I am still troubleshooting, and very confused how this draggable config option can affect my component's view. Do you think I am somehow deleting these text nodes after I initiate my component's view?

Thanks again.

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...

Browse Plugin Categories

Jump directly to plugin category pages on the marketplace.