8
8
'Magento_Ui/js/form/element/wysiwyg' ,
9
9
'mage/translate' ,
10
10
'Magento_PageBuilder/js/events' ,
11
+ 'Magento_Ui/js/lib/view/utils/dom-observer' ,
11
12
'Magento_PageBuilder/js/page-builder'
12
- ] , function ( $ , Wysiwyg , $t , events , PageBuilder ) {
13
+ ] , function ( $ , Wysiwyg , $t , events , domObserver , PageBuilder ) {
13
14
'use strict' ;
14
15
15
16
/**
@@ -18,13 +19,14 @@ define([
18
19
return Wysiwyg . extend ( {
19
20
defaults : {
20
21
elementSelector : '> textarea' ,
21
- pageBuilder : { } ,
22
+ stageSelector : '.pagebuilder-stage-wrapper' ,
23
+ pageBuilder : false ,
22
24
visiblePageBuilder : false ,
23
25
isComponentInitialized : false ,
24
26
wysiwygConfigData : { } ,
25
27
pageBuilderEditButtonText : $t ( 'Edit with Page Builder' ) ,
26
28
isWithinModal : false ,
27
- modal : false ,
29
+ modal : false
28
30
} ,
29
31
30
32
/**
@@ -45,7 +47,7 @@ define([
45
47
*/
46
48
initObservable : function ( ) {
47
49
this . _super ( )
48
- . observe ( 'visiblePageBuilder wysiwygConfigData loading' ) ;
50
+ . observe ( 'isComponentInitialized visiblePageBuilder wysiwygConfigData loading' ) ;
49
51
50
52
return this ;
51
53
} ,
@@ -54,14 +56,19 @@ define([
54
56
* Handle button click, init the Page Builder application
55
57
*/
56
58
pageBuilderEditButtonClick : function ( context , event ) {
57
- var modalInnerWrap = $ ( event . currentTarget ) . parents ( " .modal-inner-wrap" ) ;
59
+ var modalInnerWrap = $ ( event . currentTarget ) . parents ( ' .modal-inner-wrap' ) ;
58
60
59
61
// Determine if the Page Builder instance is within a modal
60
62
this . isWithinModal = modalInnerWrap . length === 1 ;
63
+
61
64
if ( this . isWithinModal ) {
62
65
this . modal = modalInnerWrap ;
63
66
}
64
67
68
+ if ( ! this . isComponentInitialized ( ) ) {
69
+ this . disableDomObserver ( $ ( event . currentTarget ) . parent ( ) [ 0 ] ) ;
70
+ }
71
+
65
72
this . initPageBuilder ( ) ;
66
73
this . toggleFullScreen ( ) ;
67
74
} ,
@@ -70,17 +77,32 @@ define([
70
77
* Init Page Builder
71
78
*/
72
79
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
+
74
86
this . loading ( true ) ;
75
87
this . pageBuilder = new PageBuilder ( this . wysiwygConfigData ( ) , this . initialValue ) ;
76
88
this . initPageBuilderListeners ( ) ;
89
+ this . isComponentInitialized ( true ) ;
77
90
}
78
91
79
92
if ( ! this . wysiwygConfigData ( ) [ 'pagebuilder_button' ] ) {
80
93
this . visiblePageBuilder ( true ) ;
81
94
}
82
95
} ,
83
96
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
+
84
106
/**
85
107
* Toggle Page Builder full screen mode
86
108
*/
@@ -95,7 +117,6 @@ define([
95
117
var id = this . pageBuilder . id ;
96
118
97
119
events . on ( 'stage:' + id + ':readyAfter' , function ( ) {
98
- this . isComponentInitialized = true ;
99
120
this . loading ( false ) ;
100
121
} . bind ( this ) ) ;
101
122
@@ -109,17 +130,17 @@ define([
109
130
110
131
if ( this . isWithinModal && this . modal ) {
111
132
this . modal . css ( {
112
- transform : "" ,
113
- transition : ""
133
+ transform : '' ,
134
+ transition : ''
114
135
} ) ;
115
136
}
116
137
} else if ( args . fullScreen && this . wysiwygConfigData ( ) [ 'pagebuilder_button' ] ) {
117
138
this . visiblePageBuilder ( true ) ;
118
139
119
140
if ( this . isWithinModal && this . modal ) {
120
141
this . modal . css ( {
121
- transform : " none" ,
122
- transition : " none"
142
+ transform : ' none' ,
143
+ transition : ' none'
123
144
} ) ;
124
145
}
125
146
}
0 commit comments