Skip to content

Commit 0831386

Browse files
committed
MC-18601: Page Builder Render
1 parent 02e8fd3 commit 0831386

File tree

7 files changed

+43
-32
lines changed

7 files changed

+43
-32
lines changed

app/code/Magento/PageBuilder/view/adminhtml/web/js/content-type-menu/edit.js

Lines changed: 4 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/js/content-type/observable-updater.js

Lines changed: 3 additions & 3 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/js/form/form-mixin.js

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,20 @@
33
* See COPYING.txt for license details.
44
*/
55

6-
define(['jquery', 'underscore', 'Magento_PageBuilder/js/events', 'consoleLogger'], function ($, _, events, consoleLogger) {
6+
define(['jquery', 'Magento_PageBuilder/js/events', 'consoleLogger'], function ($, events, consoleLogger) {
77
'use strict';
88

99
var mixin = {
1010
defaults: {
11-
pageBuilderInstances: [],
11+
pageBuilderInstances: []
1212
},
1313

1414
/**
1515
* Record instances of Page Builder initialized in the forms namespace
1616
*/
1717
initialize: function () {
1818
var self = this;
19+
1920
this._super();
2021

2122
events.on('pagebuilder:register', function (data) {
@@ -35,33 +36,31 @@ define(['jquery', 'underscore', 'Magento_PageBuilder/js/events', 'consoleLogger'
3536
*/
3637
save: function (redirect, data) {
3738
var self = this,
38-
submit = this._super.bind(self, redirect, data);
39+
submit = this._super.bind(self, redirect, data),
40+
locks,
41+
timeout;
3942

40-
if (this.pageBuilderInstances.length > 0) {
41-
let locks = this.pageBuilderInstances.map(function (instance) {
42-
if (instance.stage.renderingLock && !_.isUndefined(instance.stage.renderingLock.promise)) {
43-
return instance.stage.renderingLock.promise;
44-
}
45-
}).filter(function (promise) {
46-
return promise !== undefined;
43+
if (this.pageBuilderInstances.length === 0) {
44+
submit();
45+
} else {
46+
locks = this.pageBuilderInstances.map(function (instance) {
47+
return instance.stage.renderingLock;
4748
});
4849

4950
if (locks.length === 0) {
5051
submit();
5152
} else {
52-
var timeout = setTimeout(function () {
53-
consoleLogger.error("Page Builder was rendering for 5 seconds without releasing locks.");
53+
timeout = setTimeout(function () {
54+
consoleLogger.error('Page Builder was rendering for 5 seconds without releasing locks.');
5455
}, 5000);
5556

5657
$('body').trigger('processStart');
57-
Promise.all(locks).then(function () {
58+
$.when.apply(null, locks).then(function () {
5859
$('body').trigger('processStop');
5960
clearTimeout(timeout);
6061
submit();
6162
});
6263
}
63-
} else {
64-
submit();
6564
}
6665
}
6766
};

app/code/Magento/PageBuilder/view/adminhtml/web/js/stage.js

Lines changed: 8 additions & 4 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-menu/edit.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@ export default class Edit {
4141
}
4242

4343
/**
44-
* Serialize and unserialize the data to ensure it can be serialized in the future
44+
* Flip flop to JSON and back again to ensure all data received from the form is serializable. Magento by default
45+
* adds functions into some basic types which cannot be serialized when calling PostMessage.
4546
*
46-
* @param data
47+
* @param {DataObject} data
48+
* @returns {DataObject}
4749
*/
4850
private filterData(data: DataObject): DataObject {
4951
return JSON.parse(JSON.stringify(data));

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/content-type/observable-updater.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ export default class ObservableUpdater {
104104

105105
if (elementConfig.style !== undefined) {
106106
let previousStyles = {};
107-
if (typeof this.previousData[elementName].style !== "undefined") {
107+
if (this.previousData[elementName].style !== undefined) {
108108
previousStyles = this.previousData[elementName].style;
109109
}
110110
generatedData[elementName].style = this.generateStyles(previousStyles, elementConfig, convertedData);
@@ -125,7 +125,7 @@ export default class ObservableUpdater {
125125

126126
if (elementConfig.css !== undefined && elementConfig.css.var in convertedData) {
127127
let previousCss = {};
128-
if (typeof this.previousData[elementName].css !== "undefined") {
128+
if (this.previousData[elementName].css !== undefined) {
129129
previousCss = this.previousData[elementName].css;
130130
}
131131
generatedData[elementName].css = this.generateCss(previousCss, elementConfig, convertedData);
@@ -288,7 +288,7 @@ export default class ObservableUpdater {
288288
}
289289
if (typeof value === "object") {
290290
_.extend(result, value);
291-
} else if (typeof value !== "undefined") {
291+
} else if (value !== undefined) {
292292
result[fromSnakeToCamelCase(propertyConfig.name)] = value;
293293
}
294294
}

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/stage.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* See COPYING.txt for license details.
44
*/
55

6+
import $ from "jquery";
67
import ko from "knockout";
78
import events from "Magento_PageBuilder/js/events";
89
import "Magento_PageBuilder/js/resource/jquery/ui/jquery.ui.touch-punch";
@@ -31,7 +32,11 @@ export default class Stage {
3132
public dataStore: DataStore = new DataStore();
3233
public afterRenderDeferred: DeferredInterface = deferred();
3334
public rootContainer: ContentTypeCollectionInterface;
34-
public renderingLock: DeferredInterface;
35+
/**
36+
* We always complete a single render when the stage is first loaded, so we can set the lock when the stage is
37+
* created. The lock is used to halt the parent forms submission when Page Builder is rendering.
38+
*/
39+
public renderingLock: JQueryDeferred<boolean> = $.Deferred();
3540
private template: string = "Magento_PageBuilder/content-type/preview";
3641
private render: Render;
3742
private collection: Collection = new Collection();
@@ -42,13 +47,12 @@ export default class Stage {
4247
* @type {(() => void) & _.Cancelable}
4348
*/
4449
private applyBindingsDebounce = _.debounce(() => {
45-
this.renderingLock = deferred();
50+
this.renderingLock = $.Deferred();
4651
this.render.applyBindings(this.rootContainer)
4752
.then((renderedOutput: string) => events.trigger(`stage:${ this.id }:masterFormatRenderAfter`, {
4853
value: renderedOutput,
4954
})).then(() => {
5055
this.renderingLock.resolve();
51-
this.renderingLock = null;
5256
}).catch((error: Error) => {
5357
console.error(error);
5458
});

0 commit comments

Comments
 (0)