Skip to content

Commit d4030bd

Browse files
#637: Form field/field group viewport scope
- convert media style in viewport specific classes
1 parent 9f07a3f commit d4030bd

File tree

3 files changed

+114
-7
lines changed

3 files changed

+114
-7
lines changed

app/code/Magento/PageBuilder/Test/Mftf/Test/ViewportSwitcherMobile/ViewportSwitcherMobileTabsThroughBlockContentTypeTest.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@
211211
<dontSeeElement selector="{{DividerOnStage.base('1')}}" stepKey="dontSeeDividerCMSBlockStage"/>
212212
<actionGroup ref="ValidateContentTypesStyleEqualsExpectedStyleActionGroup" stepKey="seeTabsMinHeightCMSBlockStage">
213213
<argument name="selector" value="{{TabsOnStage.tabsContentPath}}"/>
214-
<argument name="expectedProperty" value="{{PageBuilderTabsDefinedMinHeight.value}}"/>
214+
<argument name="expectedProperty" value="{{PageBuilderTabsDefaultMinHeight.value}}"/>
215215
<argument name="cssProperty" value="minHeight"/>
216216
</actionGroup>
217217
<actionGroup ref="ValidateContentTypesStyleEqualsExpectedStyleActionGroup" stepKey="seeTabsNavAlignedCenterCMSBlockStage">
@@ -335,7 +335,7 @@
335335
<dontSeeElement selector="{{DividerOnStorefront.base('1')}}" stepKey="dontSeeDividerCMSPageStage"/>
336336
<actionGroup ref="ValidateContentTypesStyleEqualsExpectedStyleActionGroup" stepKey="seeTabsMinHeightCMSPageStage">
337337
<argument name="selector" value="{{TabsOnFrontend.tabsContentPath}}"/>
338-
<argument name="expectedProperty" value="{{PageBuilderTabsDefinedMinHeight.value}}"/>
338+
<argument name="expectedProperty" value="{{PageBuilderTabsDefaultMinHeight.value}}"/>
339339
<argument name="cssProperty" value="minHeight"/>
340340
</actionGroup>
341341
<actionGroup ref="ValidateContentTypesStyleEqualsExpectedStyleActionGroup" stepKey="seeTabsNavAlignedCenterCMSPageStage">
@@ -372,7 +372,7 @@
372372
<dontSeeElement selector="{{DividerOnStorefront.base('1')}}" stepKey="dontSeeDividerCMSPageStorefront"/>
373373
<actionGroup ref="ValidateContentTypesStyleEqualsExpectedStyleActionGroup" stepKey="seeTabsMinHeightCMSPageStorefront">
374374
<argument name="selector" value="{{TabsOnFrontend.tabsContentPath}}"/>
375-
<argument name="expectedProperty" value="{{PageBuilderTabsDefinedMinHeight.value}}"/>
375+
<argument name="expectedProperty" value="{{PageBuilderTabsDefaultMinHeight.value}}"/>
376376
<argument name="cssProperty" value="minHeight"/>
377377
</actionGroup>
378378
<actionGroup ref="ValidateContentTypesStyleEqualsExpectedStyleActionGroup" stepKey="seeTabsNavAlignedCenterCMSPageStorefront">
@@ -391,7 +391,7 @@
391391
</actionGroup>
392392
<actionGroup ref="validateContentTypeHeightEqualToMinHeightPlusPaddingAndBorder" stepKey="validateTab2MinHeightCMSPageStorefront">
393393
<argument name="content" value="{{TabOnStorefront.tabContentCSS}}"/>
394-
<argument name="minHeight" value="{{PageBuilderTabsDefinedMinHeight.value}}"/>
394+
<argument name="minHeight" value="{{PageBuilderTabsDefaultMinHeight.value}}"/>
395395
<argument name="index" value="2"/>
396396
</actionGroup>
397397
<actionGroup ref="switchTabs" stepKey="switchTabsCMSPageStorefront">

app/code/Magento/PageBuilder/view/adminhtml/web/js/content-type/block/preview.js

Lines changed: 54 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/content-type/block/preview.ts

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ import ko from "knockout";
88
import $t from "mage/translate";
99
import widgetInitializer from "Magento_PageBuilder/js/widget-initializer";
1010
import mageUtils from "mageUtils";
11+
import _ from "underscore";
1112
import Config from "../../config";
1213
import ContentTypeInterface from "../../content-type";
1314
import ContentTypeConfigInterface from "../../content-type-config.types";
1415
import HideShowOption from "../../content-type-menu/hide-show-option";
1516
import {OptionsInterface} from "../../content-type-menu/option.types";
17+
import { pbStyleAttribute } from "../../content-type/style-registry";
1618
import {DataObject} from "../../data-store";
1719
import {get} from "../../utils/object";
1820
import ObservableUpdater from "../observable-updater";
@@ -169,7 +171,7 @@ export default class Preview extends BasePreview {
169171
let content: string = "";
170172
if (response.data.content) {
171173
this.showBlockPreview(true);
172-
content = this.processBackgroundImages(response.data.content);
174+
content = this.processContent(response.data.content);
173175
this.data.main.html(content);
174176
this.initializeWidgets(this.element);
175177
} else if (response.data.error) {
@@ -198,6 +200,19 @@ export default class Preview extends BasePreview {
198200
this.displayingBlockPreview(isShow);
199201
}
200202

203+
/**
204+
* Adapt content to view it on stage.
205+
*
206+
* @param content
207+
*/
208+
private processContent(content: string): string {
209+
let processedContent = this.processBackgroundImages(content);
210+
211+
processedContent = this.processBreakpointStyles(processedContent);
212+
213+
return processedContent;
214+
}
215+
201216
/**
202217
* Generate styles for background images.
203218
*
@@ -240,4 +255,44 @@ export default class Preview extends BasePreview {
240255

241256
return content;
242257
}
258+
259+
/**
260+
* Replace media queries with viewport classes.
261+
*
262+
* @param {string} content
263+
* @return string
264+
*/
265+
private processBreakpointStyles(content: string): string {
266+
const document = new DOMParser().parseFromString(content, "text/html");
267+
const styleBlocks = document.querySelectorAll("style");
268+
const mediaStyleBlock = document.createElement("style");
269+
const viewports = Config.getConfig("viewports");
270+
271+
styleBlocks.forEach((styleBlock: HTMLStyleElement) => {
272+
const cssRules = (styleBlock.sheet as CSSStyleSheet).cssRules;
273+
274+
Array.from(cssRules).forEach((rule: CSSMediaRule) => {
275+
const mediaScope = rule instanceof CSSMediaRule && _.findKey(viewports, (viewport: any) => {
276+
return rule.conditionText === viewport.media;
277+
});
278+
279+
if (mediaScope) {
280+
Array.from(rule.cssRules).forEach((mediaRule: CSSStyleRule, index: number) => {
281+
if (mediaRule.selectorText.indexOf(pbStyleAttribute) !== -1) {
282+
const selector = mediaRule.selectorText.replace(" ", ` .${ mediaScope}-viewport `);
283+
284+
mediaStyleBlock.append(`${ selector } {${ mediaRule.style.cssText }}`);
285+
}
286+
});
287+
}
288+
});
289+
});
290+
291+
if (mediaStyleBlock.innerText.length) {
292+
document.body.append(mediaStyleBlock);
293+
content = document.head.innerHTML + document.body.innerHTML;
294+
}
295+
296+
return content;
297+
}
243298
}

0 commit comments

Comments
 (0)