Skip to content

Commit 4b074b0

Browse files
committed
MC-18601: Page Builder Render
1 parent 5a4935f commit 4b074b0

File tree

5 files changed

+91
-1
lines changed

5 files changed

+91
-1
lines changed

app/code/Magento/PageBuilder/view/adminhtml/requirejs-config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ var config = {
3232
},
3333
'mage/validation': {
3434
'Magento_PageBuilder/js/system/config/validator-rules-mixin': true
35+
},
36+
'Magento_Ui/js/form/form': {
37+
'Magento_PageBuilder/js/form/form-mixin': true
3538
}
3639
}
3740
}

app/code/Magento/PageBuilder/view/adminhtml/web/js/form/element/wysiwyg.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ define([
7979
if (!this.isComponentInitialized()) {
8080
this.loading(true);
8181
this.pageBuilder = new PageBuilder(this.wysiwygConfigData(), this.initialValue);
82+
events.trigger('pagebuilder:register', {ns: this.ns, instance: this.pageBuilder});
8283
this.initPageBuilderListeners();
8384
this.isComponentInitialized(true);
8485

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/**
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
define(['jquery', 'underscore', 'Magento_PageBuilder/js/events', 'consoleLogger'], function ($, _, events, consoleLogger) {
7+
'use strict';
8+
9+
var mixin = {
10+
defaults: {
11+
pageBuilderInstances: [],
12+
},
13+
14+
/**
15+
* Record instances of Page Builder initialized in the forms namespace
16+
*/
17+
initialize: function () {
18+
var self = this;
19+
this._super();
20+
21+
events.on('pagebuilder:register', function (data) {
22+
if (data.ns === self.ns) {
23+
self.pageBuilderInstances.push(data.instance);
24+
}
25+
});
26+
27+
return this;
28+
},
29+
30+
/**
31+
* Intercept save call to ensure any Page Builder rendering is completed before submitting form
32+
*
33+
* @param {String} redirect
34+
* @param {Object} data
35+
*/
36+
save: function (redirect, data) {
37+
var self = this,
38+
superFunction = this._super,
39+
submit = function () {
40+
superFunction.apply(self, [redirect, data]);
41+
};
42+
43+
if (this.pageBuilderInstances.length > 0) {
44+
let locks = this.pageBuilderInstances.map(function (instance) {
45+
if (instance.stage.renderingLock && !_.isUndefined(instance.stage.renderingLock.promise)) {
46+
return instance.stage.renderingLock.promise;
47+
}
48+
}).filter(function (promise) {
49+
return promise !== undefined;
50+
});
51+
52+
if (locks.length === 0) {
53+
submit();
54+
} else {
55+
var timeout = setTimeout(function () {
56+
consoleLogger.error("Page Builder was rendering for 5 seconds without releasing locks.");
57+
}, 5000);
58+
59+
$('body').trigger('processStart');
60+
Promise.all(locks).then(function () {
61+
$('body').trigger('processStop');
62+
clearTimeout(timeout);
63+
submit();
64+
});
65+
}
66+
} else {
67+
submit();
68+
}
69+
}
70+
};
71+
72+
return function (target) {
73+
return target.extend(mixin);
74+
};
75+
});

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

Lines changed: 6 additions & 0 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/stage.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export default class Stage {
3131
public dataStore: DataStore = new DataStore();
3232
public afterRenderDeferred: DeferredInterface = deferred();
3333
public rootContainer: ContentTypeCollectionInterface;
34+
public renderingLock: DeferredInterface;
3435
private template: string = "Magento_PageBuilder/content-type/preview";
3536
private render: Render;
3637
private collection: Collection = new Collection();
@@ -41,10 +42,14 @@ export default class Stage {
4142
* @type {(() => void) & _.Cancelable}
4243
*/
4344
private applyBindingsDebounce = _.debounce(() => {
45+
this.renderingLock = deferred();
4446
this.render.applyBindings(this.rootContainer)
4547
.then((renderedOutput: string) => events.trigger(`stage:${ this.id }:masterFormatRenderAfter`, {
4648
value: renderedOutput,
47-
})).catch((error: Error) => {
49+
})).then(() => {
50+
this.renderingLock.resolve();
51+
this.renderingLock = null;
52+
}).catch((error: Error) => {
4853
console.error(error);
4954
});
5055
}, 500);

0 commit comments

Comments
 (0)