Skip to content

Commit 2d9d981

Browse files
committed
PB-390: Nested Page Builder content can fail to save when action is performed quickly
- Ensure template manager obeys rendering locks - Remove content from PageBuilder instance
1 parent 385a091 commit 2d9d981

File tree

7 files changed

+20
-21
lines changed

7 files changed

+20
-21
lines changed

app/code/Magento/PageBuilder/view/adminhtml/web/js/page-builder.js

Lines changed: 0 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/js/stage.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/template-manager.js

Lines changed: 5 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/page-builder.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ export default class PageBuilder implements PageBuilderInterface {
3434
public isFullScreen: KnockoutObservable<boolean> = ko.observable(false);
3535
public loading: KnockoutObservable<boolean> = ko.observable(true);
3636
public wrapperStyles: KnockoutObservable<{[key: string]: string}> = ko.observable({});
37-
public content: string;
3837
public isAllowedTemplateSave: boolean;
3938
public isAllowedTemplateApply: boolean;
4039
private previousWrapperStyles: {[key: string]: string} = {};
@@ -77,9 +76,6 @@ export default class PageBuilder implements PageBuilderInterface {
7776
*/
7877
public initListeners() {
7978
events.on(`stage:${ this.id }:toggleFullscreen`, this.toggleFullScreen.bind(this));
80-
events.on(`stage:${ this.id }:masterFormatRenderAfter`, (content: {value: string}) => {
81-
this.content = content.value;
82-
});
8379
this.isFullScreen.subscribe(() => this.onFullScreenChange());
8480
}
8581

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/page-builder.types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,4 @@ export default interface PageBuilderInterface {
1818
isFullScreen: KnockoutObservable<boolean>;
1919
loading: KnockoutObservable<boolean>;
2020
wrapperStyles: KnockoutObservable<{[key: string]: string}>;
21-
content: string;
2221
}

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export default class Stage {
3636
* We always complete a single render when the stage is first loaded, so we can set the lock when the stage is
3737
* created. The lock is used to halt the parent forms submission when Page Builder is rendering.
3838
*/
39-
public renderingLocks: Array<JQueryDeferred<void>> = [];
39+
public renderingLocks: Array<JQueryDeferred<string>> = [];
4040
private template: string = "Magento_PageBuilder/content-type/preview";
4141
private render: Render;
4242
private collection: Collection = new Collection();
@@ -48,11 +48,12 @@ export default class Stage {
4848
*/
4949
private applyBindingsDebounce = _.debounce(() => {
5050
this.render.applyBindings(this.rootContainer)
51-
.then((renderedOutput: string) => events.trigger(`stage:${ this.id }:masterFormatRenderAfter`, {
52-
value: renderedOutput,
53-
})).then(() => {
51+
.then((renderedOutput: string) => {
52+
events.trigger(`stage:${ this.id }:masterFormatRenderAfter`, {
53+
value: renderedOutput,
54+
});
5455
this.renderingLocks.forEach((lock) => {
55-
lock.resolve();
56+
lock.resolve(renderedOutput);
5657
});
5758
}).catch((error: Error) => {
5859
if (error) {

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/template-manager.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,16 @@ export function saveAsTemplate(stage: Stage) {
5959
*/
6060
confirm(name: string, createdFor: string) {
6161
return new Promise((resolve, reject) => {
62-
capture.then((imageSrc: string) => {
62+
// Retrieve the rendering lock from the stage
63+
const renderingLock = stage.renderingLocks[stage.renderingLocks.length - 1];
64+
65+
// Wait for the screenshot and the rendering lock to complete before making the request
66+
$.when(capture, renderingLock).then((imageSrc: string, content: string) => {
6367
$.ajax({
6468
url: Config.getConfig("template_save_url"),
6569
data: {
6670
name,
67-
template: stage.pageBuilder.content,
71+
template: content,
6872
previewImage: imageSrc,
6973
createdFor,
7074
},

0 commit comments

Comments
 (0)