# Prohibiting document parts from merging

**URL:** <https://discuss.prosemirror.net/t/prohibiting-document-parts-from-merging/281>\
**Category:** Uncategorized\
**Created:** [April 10, 2016, 3:36pm UTC](https://discuss.prosemirror.net/t/prohibiting-document-parts-from-merging/281 "2016-04-10T15:36:25Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![johanneswilm](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/johanneswilm/32/19_2.png) [@johanneswilm](https://discuss.prosemirror.net/u/johanneswilm)\
**Post date:** [April 10, 2016, 3:36pm UTC](https://discuss.prosemirror.net/t/prohibiting-document-parts-from-merging/281/1 "2016-04-10T15:36:25Z")

</div>

Our documents have exactly 6 parts that should always be there and not be deletable.

In version 0.5.1, I solved this by using a filter transform:

```
 onFilterTransform(transform) {
    let prohibited = false
    const docParts = ['title', 'metadatasubtitle', 'metadataauthors', 'metadataabstract',
        'metadatakeywords', 'documentcontents']
    let index = 0
    transform.doc.forEach(function(childNode){
        if (index > 5) {
            prohibited = true
        } else if (docParts[index] !== childNode.type.name) {
            prohibited = true
        }
        index++
    })
    if (index < 5) {
        prohibited = true
    }
    return prohibited
}

```

This worked well.

For version 0.6.0, I tried to adjust it slightly, making use of the childCount property of nodes:

```
onFilterTransform(transform) {
    let prohibited = false
    const docParts = ['title', 'metadatasubtitle', 'metadataauthors', 'metadataabstract',
        'metadatakeywords', 'documentcontents']
    if (transform.doc.childCount === 6) { // There should always be exactly 6 parts to the document
        let index = 0
        transform.doc.forEach(function(childNode){
            if (docParts[index] !== childNode.type.name) {
                prohibited = true
            }
            index++
        })
    } else {
        prohibited = true
    }
    return prohibited
} 

```

However, this doesn’t work anymore. If I try to select text from the title and into the document contents and hit “backspace”, it now throws a JS error of “Content can not be wrapped in ancestor title” (title can indeed only take text content), but visually the elements are merged on screen.

What’s the suggested workaround for this?

---

<div class="post-metadata">

**Author:** ![marijn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/marijn/32/15_2.png) [@marijn](https://discuss.prosemirror.net/u/marijn)\
**Post date:** [April 11, 2016, 8:01am UTC](https://discuss.prosemirror.net/t/prohibiting-document-parts-from-merging/281/2 "2016-04-11T08:01:47Z")

</div>

There is no good way to do this yet. Subscribe to [#220](https://github.com/ProseMirror/prosemirror/issues/220) which should have some progress soon.

---

<div class="post-metadata">

**Author:** ![johanneswilm](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/johanneswilm/32/19_2.png) [@johanneswilm](https://discuss.prosemirror.net/u/johanneswilm)\
**Post date:** [April 11, 2016, 3:01pm UTC](https://discuss.prosemirror.net/t/prohibiting-document-parts-from-merging/281/3 "2016-04-11T15:01:18Z")

</div>

Ok, will wait for this then. We’ll just stick with version 0.5.1 for now.

---

<div class="post-metadata">

**Author:** ![johanneswilm](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/johanneswilm/32/19_2.png) [@johanneswilm](https://discuss.prosemirror.net/u/johanneswilm)\
**Post date:** [April 11, 2016, 9:00pm UTC](https://discuss.prosemirror.net/t/prohibiting-document-parts-from-merging/281/4 "2016-04-11T21:00:41Z")

</div>

@marijn: But should PM really throw an error and show an invalid document if the user tries two elements whose contents aren’t compatible? That seems like a bug to me.

---

<div class="post-metadata">

**Author:** ![marijn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/marijn/32/15_2.png) [@marijn](https://discuss.prosemirror.net/u/marijn)\
**Post date:** [April 12, 2016, 7:57am UTC](https://discuss.prosemirror.net/t/prohibiting-document-parts-from-merging/281/5 "2016-04-12T07:57:49Z")

</div>

Can you show me a document snippet (preferably using the built-in schema) + cursor position + command that causes the error?

---

<div class="post-metadata">

**Author:** ![johanneswilm](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/johanneswilm/32/19_2.png) [@johanneswilm](https://discuss.prosemirror.net/u/johanneswilm)\
**Post date:** [April 12, 2016, 11:46am UTC](https://discuss.prosemirror.net/t/prohibiting-document-parts-from-merging/281/7 "2016-04-12T11:46:04Z")

</div>

@marijn: The default schema doesn’t seem to have just this. I’ll try with a basic sketch of the situation, elt me know if you need more details.

```
class Title extends Textblock {
    get contains() {
        return NodeKind.text
    }
}

```

Document structure:

```
<title>Some [title</title>
<paragraph>And this] is the first paragraph.<citation/></paragraph>

```

Where [= start of selection and] = end of selection.

User hits backspace, which causes title and paragraph to merge. A JS error is thrown, probably because the title cannot contain the inline citation node.

---

<div class="post-metadata">

**Author:** ![marijn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/marijn/32/15_2.png) [@marijn](https://discuss.prosemirror.net/u/marijn)\
**Post date:** [April 12, 2016, 12:07pm UTC](https://discuss.prosemirror.net/t/prohibiting-document-parts-from-merging/281/8 "2016-04-12T12:07:07Z")

</div>

Opened [#299](https://github.com/ProseMirror/prosemirror/issues/299) for this

---

<div class="post-metadata">

**Author:** ![marijn](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/marijn/32/15_2.png) [@marijn](https://discuss.prosemirror.net/u/marijn)\
**Post date:** [April 12, 2016, 7:59pm UTC](https://discuss.prosemirror.net/t/prohibiting-document-parts-from-merging/281/9 "2016-04-12T19:59:59Z")

</div>

And I’ve pushed a patch that fixes the issue.

---

<div class="post-metadata">

**Author:** ![johanneswilm](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/johanneswilm/32/19_2.png) [@johanneswilm](https://discuss.prosemirror.net/u/johanneswilm)\
**Post date:** [April 12, 2016, 9:53pm UTC](https://discuss.prosemirror.net/t/prohibiting-document-parts-from-merging/281/10 "2016-04-12T21:53:10Z")

</div>

> [@marijn](#):
>
> And I’ve pushed a patch that fixes the issue.

@marijn Thanks! That patch also reenables the transform filter solution for our use case. This was the last issue I found with with the pre-0.6.0 version. It seems we can now do everything we could with version 0.5.1.
