Skip to content

Commit 0afe990

Browse files
committed
MC-5403: Edit With Page Builder Button Is Slow Opening Page Builder And No Loading Indicator After 1st Load
- Resolve bad performance with edit button when opening from category or product
1 parent ac1eae1 commit 0afe990

File tree

4 files changed

+41
-28
lines changed

4 files changed

+41
-28
lines changed

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

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ define([
88
'Magento_Ui/js/form/element/wysiwyg',
99
'mage/translate',
1010
'Magento_PageBuilder/js/events',
11+
'Magento_Ui/js/lib/view/utils/dom-observer',
1112
'Magento_PageBuilder/js/page-builder'
12-
], function ($, Wysiwyg, $t, events, PageBuilder) {
13+
], function ($, Wysiwyg, $t, events, domObserver, PageBuilder) {
1314
'use strict';
1415

1516
/**
@@ -18,13 +19,14 @@ define([
1819
return Wysiwyg.extend({
1920
defaults: {
2021
elementSelector: '> textarea',
21-
pageBuilder: {},
22+
stageSelector: '.pagebuilder-stage-wrapper',
23+
pageBuilder: false,
2224
visiblePageBuilder: false,
2325
isComponentInitialized: false,
2426
wysiwygConfigData: {},
2527
pageBuilderEditButtonText: $t('Edit with Page Builder'),
2628
isWithinModal: false,
27-
modal: false,
29+
modal: false
2830
},
2931

3032
/**
@@ -45,7 +47,7 @@ define([
4547
*/
4648
initObservable: function () {
4749
this._super()
48-
.observe('visiblePageBuilder wysiwygConfigData loading');
50+
.observe('isComponentInitialized visiblePageBuilder wysiwygConfigData loading');
4951

5052
return this;
5153
},
@@ -54,14 +56,19 @@ define([
5456
* Handle button click, init the Page Builder application
5557
*/
5658
pageBuilderEditButtonClick: function (context, event) {
57-
var modalInnerWrap = $(event.currentTarget).parents(".modal-inner-wrap");
59+
var modalInnerWrap = $(event.currentTarget).parents('.modal-inner-wrap');
5860

5961
// Determine if the Page Builder instance is within a modal
6062
this.isWithinModal = modalInnerWrap.length === 1;
63+
6164
if (this.isWithinModal) {
6265
this.modal = modalInnerWrap;
6366
}
6467

68+
if (!this.isComponentInitialized()) {
69+
this.disableDomObserver($(event.currentTarget).parent()[0]);
70+
}
71+
6572
this.initPageBuilder();
6673
this.toggleFullScreen();
6774
},
@@ -70,17 +77,32 @@ define([
7077
* Init Page Builder
7178
*/
7279
initPageBuilder: function () {
73-
if (!this.isComponentInitialized) {
80+
if (!this.isComponentInitialized()) {
81+
$.async({
82+
component: this,
83+
selector: this.stageSelector
84+
}, this.disableDomObserver.bind(this));
85+
7486
this.loading(true);
7587
this.pageBuilder = new PageBuilder(this.wysiwygConfigData(), this.initialValue);
7688
this.initPageBuilderListeners();
89+
this.isComponentInitialized(true);
7790
}
7891

7992
if (!this.wysiwygConfigData()['pagebuilder_button']) {
8093
this.visiblePageBuilder(true);
8194
}
8295
},
8396

97+
/**
98+
* Disable the domObserver on the PageBuilder stage to improve performance
99+
*
100+
* @param {HTMLElement} node
101+
*/
102+
disableDomObserver: function (node) {
103+
domObserver.disableNode(node);
104+
},
105+
84106
/**
85107
* Toggle Page Builder full screen mode
86108
*/
@@ -95,7 +117,6 @@ define([
95117
var id = this.pageBuilder.id;
96118

97119
events.on('stage:' + id + ':readyAfter', function () {
98-
this.isComponentInitialized = true;
99120
this.loading(false);
100121
}.bind(this));
101122

@@ -109,17 +130,17 @@ define([
109130

110131
if (this.isWithinModal && this.modal) {
111132
this.modal.css({
112-
transform: "",
113-
transition: ""
133+
transform: '',
134+
transition: ''
114135
});
115136
}
116137
} else if (args.fullScreen && this.wysiwygConfigData()['pagebuilder_button']) {
117138
this.visiblePageBuilder(true);
118139

119140
if (this.isWithinModal && this.modal) {
120141
this.modal.css({
121-
transform: "none",
122-
transition: "none"
142+
transform: 'none',
143+
transition: 'none'
123144
});
124145
}
125146
}

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

Lines changed: 2 additions & 8 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/template/form/element/wysiwyg.html

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
click="pageBuilderEditButtonClick.bind($data)">
1414
<span translate="pageBuilderEditButtonText" />
1515
</button>
16-
<if args="visiblePageBuilder">
17-
<with args="pageBuilder">
18-
<render />
19-
</with>
16+
<if args="isComponentInitialized">
17+
<div visible="visiblePageBuilder" class="pagebuilder-wysiwyg-wrapper">
18+
<with args="pageBuilder">
19+
<render />
20+
</with>
21+
</div>
2022
</if>
2123
</div>

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import ko from "knockout";
77
import $t from "mage/translate";
88
import events from "Magento_PageBuilder/js/events";
99
import "Magento_PageBuilder/js/resource/jquery/ui/jquery.ui.touch-punch";
10-
import domObserver from "Magento_Ui/js/lib/view/utils/dom-observer";
1110
import alertDialog from "Magento_Ui/js/modal/alert";
1211
import _ from "underscore";
1312
import "./binding/sortable";
@@ -86,10 +85,7 @@ export default class Stage {
8685
/**
8786
* The stage has been initiated fully and is ready
8887
*/
89-
public ready([buildResults, canvasElement]: [any[], HTMLElement]) {
90-
// Disable the dom observer from running on our canvas
91-
domObserver.disableNode(canvasElement);
92-
88+
public ready() {
9389
events.trigger(`stage:${ this.id }:readyAfter`, {stage: this});
9490
this.loading(false);
9591
this.initListeners();

0 commit comments

Comments
 (0)