Skip to content

Commit 344e747

Browse files
Merge branch 'develop' into MC-35220
2 parents 80b3e31 + 7ef5f37 commit 344e747

File tree

671 files changed

+1401
-167
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

671 files changed

+1401
-167
lines changed

app/code/Magento/PageBuilder/Component/Form/Element/Wysiwyg.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use Magento\Catalog\Api\CategoryAttributeRepositoryInterface;
1414
use Magento\Framework\Exception\NoSuchEntityException;
1515
use Magento\PageBuilder\Model\State as PageBuilderState;
16-
use \Magento\PageBuilder\Model\Stage\Config as Config;
16+
use Magento\PageBuilder\Model\Stage\Config as Config;
1717

1818
/**
1919
* Updates wysiwyg element with Page Builder specific config
@@ -56,6 +56,7 @@ public function __construct(
5656
}
5757
} catch (NoSuchEntityException $e) {
5858
// This model is used by non product attributes
59+
$config['wysiwyg'] = true;
5960
}
6061
}
6162
$isEnablePageBuilder = isset($wysiwygConfigData['is_pagebuilder_enabled'])
@@ -66,7 +67,7 @@ public function __construct(
6667
$data['config']['component'] = 'Magento_PageBuilder/js/form/element/wysiwyg';
6768

6869
// Override the templates to include our KnockoutJS code
69-
$data['config']['template'] = 'Magento_PageBuilder/form/element/wysiwyg';
70+
$data['config']['template'] = 'ui/form/field';
7071
$data['config']['elementTmpl'] = 'Magento_PageBuilder/form/element/wysiwyg';
7172
$wysiwygConfigData = $stageConfig->getConfig();
7273
$data['config']['wysiwygConfigData'] = isset($config['wysiwygConfigData']) ?
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types = 1);
8+
9+
namespace Magento\PageBuilder\Plugin\Catalog\Ui\DataProvider\Product\Form\Modifier;
10+
11+
use Magento\Catalog\Api\Data\ProductAttributeInterface;
12+
use Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Eav as EavModifier;
13+
use Magento\Framework\Stdlib\ArrayManager;
14+
15+
/**
16+
* Data Provider for EAV Attributes on Product Page
17+
*/
18+
class EavPlugin
19+
{
20+
public const META_ATTRIBUTE_CONFIG_PATH = 'arguments/data/config';
21+
22+
/**
23+
* @var ArrayManager
24+
*/
25+
private $arrayManager;
26+
27+
/**
28+
* @param ArrayManager $arrayManager
29+
*/
30+
public function __construct(ArrayManager $arrayManager)
31+
{
32+
$this->arrayManager = $arrayManager;
33+
}
34+
35+
/**
36+
* Setup Attribute Meta
37+
*
38+
* @param EavModifier $subject
39+
* @param array $result
40+
* @param ProductAttributeInterface $attribute
41+
* @param string $groupCode
42+
* @param int $sortOrder
43+
* @return array
44+
*
45+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
46+
*/
47+
public function afterSetupAttributeMeta(
48+
EavModifier $subject,
49+
$result,
50+
ProductAttributeInterface $attribute,
51+
$groupCode,
52+
$sortOrder
53+
) {
54+
$meta = $result;
55+
56+
if ($attribute->getData('is_pagebuilder_enabled')) {
57+
$meta = $this->arrayManager->merge(
58+
static::META_ATTRIBUTE_CONFIG_PATH,
59+
$result,
60+
[
61+
'additionalClasses' => 'admin__field-wide admin__field-page-builder'
62+
]
63+
);
64+
}
65+
66+
return $meta;
67+
}
68+
69+
/**
70+
* Setup Attribute Container Meta
71+
*
72+
* @param EavModifier $subject
73+
* @param array $result
74+
* @param ProductAttributeInterface $attribute
75+
* @return array
76+
*
77+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
78+
*/
79+
public function afterSetupAttributeContainerMeta(
80+
EavModifier $subject,
81+
$result,
82+
ProductAttributeInterface $attribute
83+
) {
84+
$containerMeta = $result;
85+
86+
if ($attribute->getData('is_pagebuilder_enabled')) {
87+
$containerMeta = $this->arrayManager->merge(
88+
static::META_ATTRIBUTE_CONFIG_PATH,
89+
$result,
90+
[
91+
'additionalFieldsetClasses' => [
92+
'admin__field-wide' => true,
93+
'admin__fieldset-page-builder' => true
94+
],
95+
'template' => 'Magento_PageBuilder/form/components/group/group'
96+
]
97+
);
98+
}
99+
100+
return $containerMeta;
101+
}
102+
}

app/code/Magento/PageBuilder/Test/Mftf/ActionGroup/AdminActionGroup/SwitchToPageBuilderStageActionGroup.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,17 @@
1111
<arguments>
1212
<argument name="sectionSelector" defaultValue="{{CmsNewPagePageContentSection.header}}" type="string"/>
1313
<argument name="sectionDependentSelector" defaultValue="{{CmsNewPagePageContentSection.header}}._show" type="string"/>
14+
<argument name="snapshotSelector" defaultValue="{{PageBuilderStage.snapshot}}" type="string"/>
15+
<argument name="editButtonSelector" defaultValue="{{PageBuilderStage.editButtonSelector}}" type="string"/>
1416
<argument name="rowIndex" defaultValue="1" type="string"/>
1517
</arguments>
1618
<waitForElementVisible time="30" selector="{{sectionSelector}}" stepKey="waitForSection"/>
1719
<conditionalClick selector="{{sectionSelector}}" dependentSelector="{{sectionDependentSelector}}" visible="false" stepKey="expandSection"/>
1820
<waitForPageLoad time="30" stepKey="waitForStageToLoad"/>
21+
<waitForElementVisible time="30" selector="{{snapshotSelector}}" stepKey="waitForSnapshot"/>
22+
<waitForElementVisible time="30" selector="{{editButtonSelector}}" stepKey="waitForEditButton"/>
23+
<click selector="{{editButtonSelector}}" stepKey="clickEditButton"/>
24+
<waitForPageLoad stepKey="waitForFullScreenAnimation"/>
1925
<!-- Wait for the first row to be added into the stage for it to be "ready" -->
2026
<waitForElementNotVisible selector="{{PageBuilderStage.stageLoading}}" stepKey="waitForStageLoadingGraphicNotVisible"/>
2127
<waitForElementVisible time="30" selector="{{RowOnStage.base(rowIndex)}}" stepKey="waitForPageBuilderRow"/>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
10+
<actionGroup name="switchToPageBuilderStage">
11+
<arguments>
12+
<argument name="sectionSelector" defaultValue="{{CmsNewPagePageContentSection.header}}" type="string"/>
13+
<argument name="sectionDependentSelector" defaultValue="{{CmsNewPagePageContentSection.header}}._show" type="string"/>
14+
<argument name="rowIndex" defaultValue="1" type="string"/>
15+
</arguments>
16+
<waitForElementVisible time="30" selector="{{sectionSelector}}" stepKey="waitForSection"/>
17+
<conditionalClick selector="{{sectionSelector}}" dependentSelector="{{sectionDependentSelector}}" visible="false" stepKey="expandSection"/>
18+
<waitForPageLoad time="30" stepKey="waitForStageToLoad"/>
19+
<!-- Wait for the first row to be added into the stage for it to be "ready" -->
20+
<waitForElementNotVisible selector="{{PageBuilderStage.stageLoading}}" stepKey="waitForStageLoadingGraphicNotVisible"/>
21+
<waitForElementVisible time="30" selector="{{RowOnStage.base(rowIndex)}}" stepKey="waitForPageBuilderRow"/>
22+
</actionGroup>
23+
</actionGroups>

app/code/Magento/PageBuilder/Test/Mftf/ActionGroup/BackgroundConfigurationActionGroup/ValidateParallaxVideoBackgroundWithAllAttributesActionGroup.xml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@
1111
<annotations>
1212
<description>Validates all video background attributes when all attributes are configured and parallax is enabled. Extends: validateVideoBackgroundWithAllAttributes</description>
1313
</annotations>
14+
<arguments>
15+
<argument name="expectedPosition" defaultValue="position: fixed;" type="string"/>
16+
</arguments>
1417
<assertStringContainsString stepKey="assertVideoPosition">
15-
<expectedResult type="string">position: fixed;</expectedResult>
18+
<expectedResult type="string">{{expectedPosition}}</expectedResult>
1619
<actualResult type="variable">$videoStyle</actualResult>
1720
</assertStringContainsString>
1821
<assertStringContainsString stepKey="assertImagePosition">
19-
<expectedResult type="string">position: fixed;</expectedResult>
22+
<expectedResult type="string">{{expectedPosition}}</expectedResult>
2023
<actualResult type="variable">$fallbackImageStyle</actualResult>
2124
</assertStringContainsString>
2225
</actionGroup>
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
10+
<actionGroup name="ScrollToActionGroup">
11+
<annotations>
12+
<description>Scroll to element inside Page Builder stage using CSS selector</description>
13+
</annotations>
14+
<arguments>
15+
<argument name="cssSelector" type="string"/>
16+
<argument name="index" defaultValue="1" type="string" />
17+
<argument name="verticalOffset" defaultValue="0" type="string"/>
18+
</arguments>
19+
<executeJS function="return document.querySelectorAll('{{cssSelector}}')[{{index}}-1].offsetTop" stepKey="elementPosition"/>
20+
<executeJS function="document.querySelector('{{PageBuilderStage.stageWrapperFullScreen}}').scrollTop = parseInt({$elementPosition} - {{verticalOffset}}, 10)" stepKey="scrollToElement"/>
21+
</actionGroup>
22+
</actionGroups>

app/code/Magento/PageBuilder/Test/Mftf/Section/PageBuilderSliderSection/SliderOnStageSection.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<section name="SliderOnStage">
1111
<element name="all" type="button" selector="div[data-content-type=slider]"/>
1212
<element name="base" type="button" selector="(//div[@data-content-type='slider'])[{{sliderIndex}}]" parameterized="true"/>
13+
<element name="baseCSS" type="button" selector="div.pagebuilder-content-type.pagebuilder-slider"/>
1314
<element name="containerCSS" type="text" selector="[data-content-type=slider] &gt; .slider-container"/>
1415
<element name="hidden" type="button" selector="(//div[@data-content-type='slider'])[{{sliderIndex}}]/ancestor::*[contains(@class, 'pagebuilder-content-type-wrapper') and contains(@class, 'pagebuilder-content-type-hidden')]" parameterized="true"/>
1516
<element name="notHidden" type="button" selector="(//div[@data-content-type='slider'])[{{sliderIndex}}]/parent::*[contains(@class, 'pagebuilder-content-type-wrapper') and not(contains(@class, 'pagebuilder-content-type-hidden'))][1]" parameterized="true"/>

app/code/Magento/PageBuilder/Test/Mftf/Section/PageBuilderStageSection/PageBuilderPanelSection.xml

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,27 @@
88
<sections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
99
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Page/etc/SectionObject.xsd">
1010
<section name="PageBuilderPanel">
11-
<element name="leftPanel" type="input" selector="#pagebuilder-panel"/>
12-
<element name="searchField" type="input" selector="//*[@id=&quot;pagebuilder-panel&quot;]/div[1]/a"/>
13-
<element name="clearSearch" type="button" selector="//*[@id=&quot;pagebuilder-panel&quot;]/div[1]/a"/>
14-
<element name="firstSection" type="button" selector="//*[@id=&quot;pagebuilder-panel-menu-sections&quot;]/li[1]" timeout="30"/>
15-
<element name="allPanelMenuSections" type="button" selector="#pagebuilder-panel-menu-sections .menu-section-title"/>
16-
<element name="allMenuSectionContentTypes" type="button" selector="#pagebuilder-panel-menu-sections #menu-section-{{arg1}} .pagebuilder-draggable-content-type" parameterized="true"/>
17-
<element name="panelMenuSection" type="button" selector="//div[@id='pagebuilder-panel']//h4[.='{{arg1}}']" parameterized="true"/>
18-
<element name="panelMenuSectionActive" type="button" selector="//div[@id='pagebuilder-panel']//li[@class='active']//h4[.='{{arg1}}']" parameterized="true"/>
19-
<element name="layoutMenuSection" type="button" selector="//*[@id=&quot;menu-section-layout&quot;]" timeout="10"/>
20-
<element name="layoutMenuSectionContentType" type="button" selector="//*[@id=&quot;menu-section-layout&quot;]/div/div/ul/li/a/span[2]"/>
21-
<element name="elementsMenuSection" type="button" selector="//*[@id=&quot;menu-section-elements&quot;]"/>
22-
<element name="elementsMenuSectionContentType" type="button" selector="//*[@id=&quot;menu-section-elements&quot;]/div/div/ul/li/a/span[2]"/>
23-
<element name="mediaMenuSection" type="button" selector="//*[@id=&quot;menu-section-media&quot;]"/>
24-
<element name="mediaMenuSectionContentType" type="button" selector="//*[@id=&quot;menu-section-media&quot;]/div/div/ul/li/a/span[2]"/>
25-
<element name="addContentMenuSection" type="button" selector="//*[@id=&quot;menu-section-add_content&quot;]"/>
26-
<element name="addContentMenuSectionContentType" type="button" selector="//*[@id=&quot;menu-section-add_content&quot;]/div/div/ul/li/a/span[2]"/>
27-
<element name="searchPanel" type="input" selector="//*[@id=&quot;search-content-types-input&quot;]" timeout="30"/>
28-
<element name="searchResults" type="text" selector="//*[@id=&quot;search-results&quot;]" timeout="30"/>
29-
<element name="nothingFound" type="text" selector="//*[@id=&quot;pagebuilder-panel&quot;]/div[2]/div" timeout="30"/>
30-
<element name="draggableContentTypeInPanel" type="button" selector="//*[text()=&quot;{{arg1}}&quot;]/ancestor::*[contains(@class, &quot;ui-draggable&quot;)]" parameterized="true"/>
31-
<element name="contentTypeInMenuSection" type="button" selector="//ul[@class='pagebuilder-panel-menu-sections']//li[{{arg1}}]//h4[.='{{arg2}}']/../..//ul//li[{{arg3}}]//span[text()='{{arg4}}']" parameterized="true"/>
32-
<element name="contentTypeWithIcon" type="button" selector="//ul[@class='pagebuilder-panel-menu-sections']//span[@class='content-type-icon']//i[@class='icon-pagebuilder-{{arg2}}']/../following-sibling::span[text()='{{arg1}}']" parameterized="true"/>
11+
<element name="leftPanel" type="input" selector=".stage-is-active #pagebuilder-panel"/>
12+
<element name="searchField" type="input" selector="//div[contains(@class,'stage-is-active')]//*[@id=&quot;pagebuilder-panel&quot;]/div[1]/a"/>
13+
<element name="clearSearch" type="button" selector="//div[contains(@class,'stage-is-active')]//*[@id=&quot;pagebuilder-panel&quot;]/div[1]/a"/>
14+
<element name="firstSection" type="button" selector="//div[contains(@class,'stage-is-active')]//*[@id=&quot;pagebuilder-panel-menu-sections&quot;]/li[1]" timeout="30"/>
15+
<element name="allPanelMenuSections" type="button" selector=".stage-is-active #pagebuilder-panel-menu-sections .menu-section-title"/>
16+
<element name="allMenuSectionContentTypes" type="button" selector=".stage-is-active #pagebuilder-panel-menu-sections #menu-section-{{arg1}} .pagebuilder-draggable-content-type" parameterized="true"/>
17+
<element name="panelMenuSection" type="button" selector="//div[contains(@class,'stage-is-active')]//div[@id='pagebuilder-panel']//h4[.='{{arg1}}']" parameterized="true"/>
18+
<element name="panelMenuSectionActive" type="button" selector="//div[contains(@class,'stage-is-active')]//div[@id='pagebuilder-panel']//li[@class='active']//h4[.='{{arg1}}']" parameterized="true"/>
19+
<element name="layoutMenuSection" type="button" selector="//div[contains(@class,'stage-is-active')]//*[@id=&quot;menu-section-layout&quot;]" timeout="10"/>
20+
<element name="layoutMenuSectionContentType" type="button" selector="//div[contains(@class,'stage-is-active')]//*[@id=&quot;menu-section-layout&quot;]/div/div/ul/li/a/span[2]"/>
21+
<element name="elementsMenuSection" type="button" selector="//div[contains(@class,'stage-is-active')]//*[@id=&quot;menu-section-elements&quot;]"/>
22+
<element name="elementsMenuSectionContentType" type="button" selector="//div[contains(@class,'stage-is-active')]//*[@id=&quot;menu-section-elements&quot;]/div/div/ul/li/a/span[2]"/>
23+
<element name="mediaMenuSection" type="button" selector="//div[contains(@class,'stage-is-active')]//*[@id=&quot;menu-section-media&quot;]"/>
24+
<element name="mediaMenuSectionContentType" type="button" selector="//div[contains(@class,'stage-is-active')]//*[@id=&quot;menu-section-media&quot;]/div/div/ul/li/a/span[2]"/>
25+
<element name="addContentMenuSection" type="button" selector="//div[contains(@class,'stage-is-active')]//*[@id=&quot;menu-section-add_content&quot;]"/>
26+
<element name="addContentMenuSectionContentType" type="button" selector="//div[contains(@class,'stage-is-active')]//*[@id=&quot;menu-section-add_content&quot;]/div/div/ul/li/a/span[2]"/>
27+
<element name="searchPanel" type="input" selector="//div[contains(@class,'stage-is-active')]//*[@id=&quot;search-content-types-input&quot;]" timeout="30"/>
28+
<element name="searchResults" type="text" selector="//div[contains(@class,'stage-is-active')]//*[@id=&quot;search-results&quot;]" timeout="30"/>
29+
<element name="nothingFound" type="text" selector="//div[contains(@class,'stage-is-active')]//*[@id=&quot;pagebuilder-panel&quot;]/div[2]/div" timeout="30"/>
30+
<element name="draggableContentTypeInPanel" type="button" selector="//div[contains(@class,'stage-is-active')]//*[text()=&quot;{{arg1}}&quot;]/ancestor::*[contains(@class, &quot;ui-draggable&quot;)]" parameterized="true"/>
31+
<element name="contentTypeInMenuSection" type="button" selector="//div[contains(@class,'stage-is-active')]//ul[@class='pagebuilder-panel-menu-sections']//li[{{arg1}}]//h4[.='{{arg2}}']/../..//ul//li[{{arg3}}]//span[text()='{{arg4}}']" parameterized="true"/>
32+
<element name="contentTypeWithIcon" type="button" selector="//div[contains(@class,'stage-is-active')]//ul[@class='pagebuilder-panel-menu-sections']//span[@class='content-type-icon']//i[@class='icon-pagebuilder-{{arg2}}']/../following-sibling::span[text()='{{arg1}}']" parameterized="true"/>
3333
</section>
3434
</sections>

app/code/Magento/PageBuilder/Test/Mftf/Section/PageBuilderStageSection/PageBuilderStageSection.xml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@
1515
<element name="openFullScreen" type="button" selector="//i[@class='icon-pagebuilder-fullscreen']"/>
1616
<element name="exitFullScreen" type="button" selector=".pagebuilder-header .icon-pagebuilder-fullscreen-exit"/>
1717
<element name="stageLoading" type="button" selector="div.pagebuilder-stage-loading"/>
18-
<element name="stageWrapper" type="button" selector="//div[@class='pagebuilder-stage-wrapper']"/>
19-
<element name="enabled" type="button" selector="//div[not(contains(@class, '_disabled'))]/div[contains(@class, 'pagebuilder-wysiwyg-wrapper')]/div[@class='pagebuilder-stage-wrapper']"/>
20-
<element name="disabled" type="button" selector="//div[contains(@class, '_disabled')]/div[contains(@class, 'pagebuilder-wysiwyg-wrapper')]/div[@class='pagebuilder-stage-wrapper']"/>
21-
<element name="stageWrapperFullScreen" type="button" selector="div.pagebuilder-stage-wrapper.stage-full-screen"/>
18+
<element name="stageWrapper" type="button" selector="//div[contains(@class, 'pagebuilder-stage-wrapper')]"/>
19+
<element name="snapshot" type="button" selector="div.stage-content-snapshot"/>
20+
<element name="editButtonSelector" type="button" selector="//button/span[contains(text(), 'Edit with Page Builder')]"/>
21+
<element name="enabled" type="button" selector="//div[not(contains(@class, '_disabled'))]/div[contains(@class, 'pagebuilder-wysiwyg-wrapper')]/div[contains(@class, 'pagebuilder-stage-wrapper')]"/>
22+
<element name="disabled" type="button" selector="//div[contains(@class, '_disabled')]/div[contains(@class, 'pagebuilder-wysiwyg-wrapper')]/div[contains(@class, 'pagebuilder-stage-wrapper')]"/>
23+
<element name="stagePreview" type="button" selector="//div[contains(@class, 'pagebuilder-stage-wrapper') and not(contains(@class, 'stage-full-screen'))]"/>
24+
<element name="stageWrapperFullScreen" type="button" selector="div.pagebuilder-stage-wrapper.stage-is-active.stage-full-screen"/>
2225
<element name="stageOverlay" type="button" selector="div.pagebuilder-wysiwyg-overlay"/>
2326
<element name="stageOverlayOnHover" type="button" selector="div.pagebuilder-wysiwyg-overlay._hover"/>
2427
<element name="stageWidthJS" type="button" selector="document.querySelector('div[class~=\'root-container-container\']').clientWidth"/>

0 commit comments

Comments
 (0)