magento / magento2-page-builder

Magento2 PageBuilder
Other
79 stars 59 forks source link

Fix finding child content-type elements in stage-builder #869

Open orukusaki opened 5 months ago

orukusaki commented 5 months ago

Description (*)

Fixes a bug whereby child content-type elements will not be found, where other types of elements also exist at the same level.

Manual testing scenarios (*)

  1. Create a content type, where child content elements are mixed in with other elements. For example: master.html:
    <div data-bind="attr: data.main.attributes, style: data.main.style">
    <div class="swiper">
        <ul class="swiper-wrapper" each="contentType.getChildren()">
            <li class="swiper-slide">
                <render args="{ name: content.template, data: content }"></render>
            </li>
        </ul>
        <div class="swiper-scrollbar"></div>
    </div>
    </div>

preview.html:

<div data-bind="attr: data.main.attributes, style: data.main.style"
     event="{ mouseover: onMouseOver, mouseout: onMouseOut }, mouseoverBubble: false">
    <render args="getOptions().template"></render>
    <div class="swiper">
        <ul class="swiper-wrapper element-children content-type-container"
            each="contentType.getChildren()" css="getChildrenCss()" attr="{id: contentType.id + '-children'}"
            data-bind="sortable: getSortableOptions()"
            afterRender="function (element) { if (typeof afterChildrenRender === 'function') { afterChildrenRender(element); } }">
            <li class="pagebuilder-content-type-wrapper swiper-slide">
                <if args="$parent.isContainer()">
                    <div class="pagebuilder-drop-indicator"></div>
                </if>
                <div
                    template="{ name: preview.template, data: preview, afterRender: function () { preview.dispatchAfterRenderEvent.apply(preview, arguments); } }"
                    attr="{ id: id }" css="{'pagebuilder-content-type-hidden': !preview.display()}">
                </div>
                <if args="$parent.isContainer() && $index() === $parent.contentType.getChildren()().length - 1">
                    <div class="pagebuilder-drop-indicator"></div>
                </if>
            </li>
        </ul>
        <div class="swiper-scrollbar"></div>
    </div>
</div>

It is possible to create this content type in Pagebuilder, and the correct result is rendered into the database and on the frontend. However, Pagebuilder cannot then load up the content back into the stage - the presence of the <li> element causes only the last item to be found, and <div class="swiper-scrollbar"> causes even that to be forgotten.

This small fix corrects this, and all types of content can now be loaded into the stage correctly.

Checklist

Resolved issues:

  1. [x] resolves magento/magento2-page-builder#875: Fix finding child content-type elements in stage-builder
engcom-Hotel commented 1 week ago

@magento run all tests

engcom-Hotel commented 1 week ago

@magento create issue

engcom-Hotel commented 1 week ago

Hello @orukusaki,

:x: QA not Passed

We have tried reproducing the issue by following the Manual Testing Scenarios mentioned above. But it seems for us the issue is not reproducible.

Please refer to the below custom module we have made to reproduce the issue: Magz.zip

Please let us know if we missed anything.

Thanks