Skip to content

Commit 28b0442

Browse files
committed
MC-5403: Edit With Page Builder Button Is Slow Opening Page Builder And No Loading Indicator After 1st Load
- Add better transitions for full screen mode from “Edit with Page Builder” button
1 parent 0afe990 commit 28b0442

File tree

9 files changed

+125
-52
lines changed

9 files changed

+125
-52
lines changed

app/code/Magento/PageBuilder/view/adminhtml/web/css/source/_page-builder.less

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,35 @@
9696
}
9797
}
9898

99+
.pagebuilder-wysiwyg-wrapper.pagebuilder-transition-out .pagebuilder-stage-wrapper {
100+
.pagebuilder-stage-wrapper.stage-full-screen;
101+
102+
.pagebuilder-header {
103+
.pagebuilder-stage-wrapper.stage-full-screen.pagebuilder-header;
104+
105+
.action-close {
106+
.pagebuilder-stage-wrapper.stage-full-screen.pagebuilder-header.action-close;
107+
}
108+
}
109+
}
110+
111+
.pagebuilder-wysiwyg-wrapper.pagebuilder-transition-in {
112+
.pagebuilder-stage-wrapper {
113+
-moz-transition: .175s ease-in-out;
114+
-webkit-transition: .175s ease-in-out;
115+
opacity: 0;
116+
transform: scale(.8);
117+
transition: .175s ease-in-out;
118+
visibility: hidden;
119+
}
120+
121+
&.trigger-transition .pagebuilder-stage-wrapper {
122+
opacity: 1;
123+
transform: scale(1);
124+
visibility: visible;
125+
}
126+
}
127+
99128
.pagebuilder-add-row-wrapper {
100129
float: left;
101130
text-align: center;
@@ -154,22 +183,22 @@
154183
}
155184

156185
.pagebuilder-stage-loading {
157-
padding: 90px 0 30px;
158-
text-align: center;
159-
160-
p {
161-
font-size: 14px;
162-
margin: 3rem 0;
186+
.spinner {
187+
font-size: 4rem;
188+
left: 50%;
189+
margin-left: -2rem;
190+
margin-top: -2rem;
191+
position: absolute;
192+
top: 50%;
163193
}
164194
}
165195

166196
.pagebuilder-canvas {
167-
-moz-transition: 1s ease-in-out;
168-
-webkit-transition: 1s ease-in-out;
169-
197+
-moz-transition: opacity .75s ease-in-out, visibility .75s ease-in-out;
198+
-webkit-transition: opacity .75s ease-in-out, visibility .75s ease-in-out;
170199
opacity: 0;
171200
padding-bottom: 60px;
172-
transition: 1s ease-in-out;
201+
transition: opacity .75s ease-in-out, visibility .75s ease-in-out;
173202
visibility: hidden;
174203

175204
&.active {

app/code/Magento/PageBuilder/view/adminhtml/web/css/source/_panel.less

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,18 @@
4747
}
4848

4949
.pagebuilder-panel-wrapper {
50-
display: none;
50+
-moz-transition: opacity .75s ease-in-out, visibility .75s ease-in-out;
51+
-webkit-transition: opacity .75s ease-in-out, visibility .75s ease-in-out;
5152
float: left;
53+
opacity: 0;
5254
position: relative;
55+
transition: opacity .75s ease-in-out, visibility .75s ease-in-out;
56+
visibility: hidden;
5357
width: 150px;
5458

5559
&.visible {
56-
display: block;
60+
opacity: 1;
61+
visibility: visible;
5762

5863
&.sticky-top {
5964
position: fixed;

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

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,24 @@
55

66
define([
77
'jquery',
8+
'Magento_Ui/js/lib/view/utils/async',
9+
'underscore',
810
'Magento_Ui/js/form/element/wysiwyg',
911
'mage/translate',
1012
'Magento_PageBuilder/js/events',
1113
'Magento_Ui/js/lib/view/utils/dom-observer',
12-
'Magento_PageBuilder/js/page-builder'
13-
], function ($, Wysiwyg, $t, events, domObserver, PageBuilder) {
14+
'Magento_PageBuilder/js/page-builder',
15+
'Magento_PageBuilder/js/utils/promise-deferred'
16+
], function (jQuery, $, _, Wysiwyg, $t, events, domObserver, PageBuilder, deferred) {
1417
'use strict';
1518

1619
/**
1720
* Extend the original WYSIWYG with added PageBuilder functionality
1821
*/
1922
return Wysiwyg.extend({
2023
defaults: {
24+
transition: false,
25+
transitionOut: false,
2126
elementSelector: '> textarea',
2227
stageSelector: '.pagebuilder-stage-wrapper',
2328
pageBuilder: false,
@@ -47,7 +52,8 @@ define([
4752
*/
4853
initObservable: function () {
4954
this._super()
50-
.observe('isComponentInitialized visiblePageBuilder wysiwygConfigData loading');
55+
.observe('isComponentInitialized visiblePageBuilder wysiwygConfigData loading transition ' +
56+
'transitionOut');
5157

5258
return this;
5359
},
@@ -56,7 +62,9 @@ define([
5662
* Handle button click, init the Page Builder application
5763
*/
5864
pageBuilderEditButtonClick: function (context, event) {
59-
var modalInnerWrap = $(event.currentTarget).parents('.modal-inner-wrap');
65+
var modalInnerWrap = jQuery(event.currentTarget).parents('.modal-inner-wrap');
66+
67+
this.transition(false);
6068

6169
// Determine if the Page Builder instance is within a modal
6270
this.isWithinModal = modalInnerWrap.length === 1;
@@ -66,7 +74,7 @@ define([
6674
}
6775

6876
if (!this.isComponentInitialized()) {
69-
this.disableDomObserver($(event.currentTarget).parent()[0]);
77+
this.disableDomObserver(jQuery(event.currentTarget).parent()[0]);
7078
}
7179

7280
this.initPageBuilder();
@@ -78,15 +86,16 @@ define([
7886
*/
7987
initPageBuilder: function () {
8088
if (!this.isComponentInitialized()) {
81-
$.async({
82-
component: this,
83-
selector: this.stageSelector
84-
}, this.disableDomObserver.bind(this));
85-
8689
this.loading(true);
8790
this.pageBuilder = new PageBuilder(this.wysiwygConfigData(), this.initialValue);
8891
this.initPageBuilderListeners();
8992
this.isComponentInitialized(true);
93+
94+
// Disable the domObserver for the entire stage
95+
$.async({
96+
component: this,
97+
selector: this.stageSelector
98+
}, this.disableDomObserver.bind(this));
9099
}
91100

92101
if (!this.wysiwygConfigData()['pagebuilder_button']) {
@@ -114,26 +123,43 @@ define([
114123
* Init various listeners on the stage
115124
*/
116125
initPageBuilderListeners: function () {
117-
var id = this.pageBuilder.id;
126+
var id = this.pageBuilder.id,
127+
renderDeferred = jQuery.Deferred(),
128+
fullScreenDeferred = jQuery.Deferred(),
129+
rendered = false;
118130

119131
events.on('stage:' + id + ':readyAfter', function () {
120132
this.loading(false);
121133
}.bind(this));
122134

135+
events.on('stage:' + id + ':renderAfter', function () {
136+
renderDeferred.resolve();
137+
rendered = true;
138+
});
139+
123140
events.on('stage:' + id + ':masterFormatRenderAfter', function (args) {
124141
this.value(args.value);
125142
}.bind(this));
126143

127144
events.on('stage:' + id + ':fullScreenModeChangeAfter', function (args) {
128145
if (!args.fullScreen && this.wysiwygConfigData()['pagebuilder_button']) {
129-
this.visiblePageBuilder(false);
130-
131146
if (this.isWithinModal && this.modal) {
132147
this.modal.css({
133148
transform: '',
134149
transition: ''
135150
});
136151
}
152+
153+
// Force full screen mode whilst the animation occurs
154+
this.transitionOut(true);
155+
// Trigger animation out
156+
this.transition(false);
157+
158+
// Reset the transition out class and hide the stage
159+
_.delay(function () {
160+
this.transitionOut(false);
161+
this.visiblePageBuilder(false);
162+
}.bind(this), 185);
137163
} else if (args.fullScreen && this.wysiwygConfigData()['pagebuilder_button']) {
138164
this.visiblePageBuilder(true);
139165

@@ -143,8 +169,24 @@ define([
143169
transition: 'none'
144170
});
145171
}
172+
173+
fullScreenDeferred.resolve();
174+
175+
// If the stage has already rendered once we don't need to wait until animating the stage in
176+
if (rendered) {
177+
_.defer(function () {
178+
this.transition(true);
179+
}.bind(this));
180+
}
146181
}
147182
}.bind(this));
183+
184+
// Wait until the stage is rendered and full screen mode is activated
185+
jQuery.when(renderDeferred, fullScreenDeferred).done(function () {
186+
_.defer(function () {
187+
this.transition(true);
188+
}.bind(this));
189+
}.bind(this));
148190
}
149191
});
150192
});

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

Lines changed: 3 additions & 11 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: 7 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/template/content-type/preview.html

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@
77
<div class="pagebuilder-stage"
88
attr="id: id, 'data-role': 'pagebuilder-stage'"
99
css="'pagebuilder-show-borders': showBorders, 'pagebuilder-no-user-select': !userSelect(), 'panel-collapsed': parent.panel.isCollapsed, 'interacting': interacting, 'focus-child': focusChild">
10-
<div class="pagebuilder-stage-loading" visible="loading" >
11-
<p translate="stageLoadingMessage"></p>
10+
<div class="pagebuilder-stage-loading" visible="loading">
1211
<span class="spinner">
13-
<span repeat="8" attr="'data-repeat-index': $index"/>
14-
</span>
12+
<span repeat="8" attr="'data-repeat-index': $index"/>
13+
</span>
1514
</div>
1615
<div class="pagebuilder-canvas content-type-drop content-type-container stage-container"
1716
css="active: !loading()"

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
<span translate="pageBuilderEditButtonText" />
1515
</button>
1616
<if args="isComponentInitialized">
17-
<div visible="visiblePageBuilder" class="pagebuilder-wysiwyg-wrapper">
17+
<div visible="visiblePageBuilder"
18+
class="pagebuilder-wysiwyg-wrapper"
19+
css="{'pagebuilder-transition-in': wysiwygConfigData()['pagebuilder_button'], 'trigger-transition': transition, 'pagebuilder-transition-out': transitionOut}">
1820
<with args="pageBuilder">
1921
<render />
2022
</with>

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
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 utils from "mageUtils";
9-
import _ from "underscore";
1010
import Config from "./config";
1111
import PageBuilderInterface from "./page-builder.d";
1212
import Panel from "./panel";
@@ -53,14 +53,9 @@ export default class PageBuilder implements PageBuilderInterface {
5353
*/
5454
public onFullScreenChange(): void {
5555
if (this.isFullScreen()) {
56-
this.originalScrollTop = window.scrollY;
57-
_.defer(() => {
58-
window.scroll(0, 0);
59-
});
56+
$("body").css("overflow", "hidden");
6057
} else {
61-
_.defer(() => {
62-
window.scroll(0, this.originalScrollTop);
63-
});
58+
$("body").css("overflow", "");
6459
}
6560

6661
events.trigger(`stage:${ this.id }:fullScreenModeChangeAfter`, {

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ export default class Stage {
3939
public interacting: KnockoutObservable<boolean> = ko.observable(false);
4040
public userSelect: KnockoutObservable<boolean> = ko.observable(true);
4141
public focusChild: KnockoutObservable<boolean> = ko.observable(false);
42-
public stageLoadingMessage: string = $t("Please hold! we're just retrieving your content...");
4342
public dataStore: DataStore = new DataStore();
4443
public afterRenderDeferred: DeferredInterface = deferred();
4544
private template: string = "Magento_PageBuilder/content-type/preview";
@@ -66,6 +65,11 @@ export default class Stage {
6665
this.id = parent.id;
6766
generateAllowedParents();
6867

68+
// Fire an event after the DOM has rendered
69+
this.afterRenderDeferred.promise.then(() => {
70+
events.trigger(`stage:${ this.id }:renderAfter`, {stage: this});
71+
});
72+
6973
// Wait for the stage to be built alongside the stage being rendered
7074
Promise.all([
7175
buildStage(this, this.parent.initialValue),

0 commit comments

Comments
 (0)