Skip to content

Commit fb2e161

Browse files
committed
Merge branch 'ACP2E-1974' of https://github.com/magento-l3/magento2-page-builder into PR-07032023
2 parents 3de0c3d + 9d8b2f1 commit fb2e161

File tree

4 files changed

+212
-26
lines changed

4 files changed

+212
-26
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ define([
8888
this.wysiwygConfigData(),
8989
this.initialValue
9090
);
91+
if (!this.source.get('pageBuilderInstances')) {
92+
this.source.set('pageBuilderInstances', []);
93+
}
94+
// Register PageBuilder instance in the data provider in case the event "pagebuilder:register"
95+
// is triggered before the subscribers are registered
96+
this.source.get('pageBuilderInstances').push(this.pageBuilder);
9197
events.trigger('pagebuilder:register', {
9298
ns: this.ns,
9399
instance: this.pageBuilder

app/code/Magento/PageBuilder/view/adminhtml/web/js/form/form-mixin.js

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@ define([
1212
'use strict';
1313

1414
var mixin = {
15-
defaults: {
16-
pageBuilderInstances: []
17-
},
18-
1915
/**
2016
* Record instances of Page Builder initialized in the forms namespace
2117
*/
@@ -24,9 +20,18 @@ define([
2420

2521
this._super();
2622

23+
if (!this.source.get('pageBuilderInstances')) {
24+
this.source.set('pageBuilderInstances', []);
25+
}
26+
2727
events.on('pagebuilder:register', function (data) {
28+
var instance;
29+
2830
if (data.ns === self.ns) {
29-
self.pageBuilderInstances.push(data.instance);
31+
instance = _.findWhere(self.source.get('pageBuilderInstances'), {id: data.instance.id});
32+
if (!instance) {
33+
self.source.get('pageBuilderInstances').push(data.instance);
34+
}
3035
}
3136
});
3237

@@ -44,7 +49,7 @@ define([
4449
timeout,
4550
locks;
4651

47-
if (_.isEmpty(this.pageBuilderInstances)) {
52+
if (_.isEmpty(this.source.get('pageBuilderInstances'))) {
4853
submit();
4954
} else {
5055
timeout = setTimeout(function () {
@@ -56,7 +61,7 @@ define([
5661
// Wait for all rendering locks within Page Builder stages to resolve
5762
$.when.apply(
5863
null,
59-
this.pageBuilderInstances.map(function (instance) {
64+
this.source.get('pageBuilderInstances').map(function (instance) {
6065
locks = instance.stage.renderingLocks;
6166

6267
return locks[locks.length - 1];

dev/tests/js/jasmine/tests/app/code/Magento/PageBuilder/adminhtml/web/js/form/element/wysiwyg.test.js

Lines changed: 72 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,77 @@
66

77
/* eslint-disable max-nested-callbacks */
88
define([
9-
'jquery',
10-
'Magento_PageBuilder/js/form/element/wysiwyg'
11-
], function ($, UiWysiwyg) {
9+
'squire'
10+
], function (Squire) {
1211
'use strict';
1312

14-
var wysiwyg;
13+
var $,
14+
wysiwyg,
15+
events = {
16+
trigger: jasmine.createSpy(),
17+
on: jasmine.createSpy()
18+
},
19+
injector = new Squire();
1520

16-
function createWysiwygMock() {
17-
var mock,
18-
MockWysiwyg = function () {};
21+
function PageBuilderFactoryMock() {
22+
this.id = 'pagebuilder_instance_id';
23+
}
24+
25+
PageBuilderFactoryMock.prototype.isFullScreen = jasmine.createSpy().and.returnValue(false);
26+
27+
function getWysiwygFactoryMock(Wysiwyg) {
28+
var _proto,
29+
WysiwygMock = function () {};
1930

20-
MockWysiwyg.prototype = Object.create(UiWysiwyg.prototype);
21-
MockWysiwyg.prototype.constructor = MockWysiwyg;
22-
mock = new MockWysiwyg();
23-
$.extend(mock, UiWysiwyg.defaults);
24-
return mock;
31+
_proto = Object.create(Wysiwyg.prototype);
32+
_proto.constructor = WysiwygMock;
33+
WysiwygMock.prototype = _proto;
34+
35+
return WysiwygMock;
2536
}
2637

27-
beforeEach(function () {
28-
wysiwyg = createWysiwygMock();
29-
wysiwyg.pageBuilder = {id: 'pb-wysiwyg-test'};
30-
$(document.body).append(
31-
$('<div><div contenteditable="true"><a href="/login"></a><span tabindex="0"></span></div></div>')
32-
.attr('id', wysiwyg.pageBuilder.id)
33-
);
38+
beforeEach(function (done) {
39+
injector.mock({
40+
'Magento_PageBuilder/js/page-builder': PageBuilderFactoryMock,
41+
'Magento_PageBuilder/js/events': events
42+
});
43+
injector.require(['jquery', 'Magento_PageBuilder/js/form/element/wysiwyg'], function (jq, PageBuilderWysiwyg) {
44+
var WysiwygFactoryMock = getWysiwygFactoryMock(PageBuilderWysiwyg);
45+
46+
$ = jq;
47+
$.async = jasmine.createSpy();
48+
wysiwyg = new WysiwygFactoryMock();
49+
$.extend(wysiwyg, PageBuilderWysiwyg.defaults);
50+
$.extend(wysiwyg, {
51+
source: {
52+
set: function (name, value) {
53+
this[name] = value;
54+
},
55+
get: function (name) {
56+
return this[name];
57+
}
58+
},
59+
pageBuilder: new PageBuilderFactoryMock(),
60+
isComponentInitialized: jasmine.createSpy().and.returnValue(false),
61+
loading: jasmine.createSpy().and.returnValue(false),
62+
visiblePageBuilder: jasmine.createSpy().and.returnValue(false),
63+
wysiwygConfigData: jasmine.createSpy().and.returnValue({isFullScreen: false}),
64+
ns: 'testnamespace'
65+
});
66+
$(document.body).append(
67+
$('<div><div contenteditable="true"><a href="/login"></a><span tabindex="0"></span></div></div>')
68+
.attr('id', wysiwyg.pageBuilder.id)
69+
);
70+
done();
71+
});
3472
});
3573

3674
afterEach(function () {
3775
$('#' + wysiwyg.pageBuilder.id).remove();
76+
try {
77+
injector.clean();
78+
injector.remove();
79+
} catch (e) {}
3880
});
3981

4082
describe('Magento_PageBuilder/js/form/element/wysiwyg', function () {
@@ -62,5 +104,16 @@ define([
62104
expect($div.find('[contenteditable]').attr('contenteditable')).toBe('true');
63105
});
64106
});
107+
describe('initPageBuilder', function () {
108+
it('Should register PageBuilder instance', function () {
109+
wysiwyg.initPageBuilder();
110+
expect(wysiwyg.source.get('pageBuilderInstances')).toContain(wysiwyg.pageBuilder);
111+
expect(events.trigger)
112+
.toHaveBeenCalledWith(
113+
'pagebuilder:register',
114+
{ns: wysiwyg.ns, instance: wysiwyg.pageBuilder}
115+
);
116+
});
117+
});
65118
});
66119
});
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/**
2+
*
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
/* eslint-disable max-nested-callbacks */
8+
define([
9+
'jquery',
10+
'Magento_PageBuilder/js/events',
11+
'squire'
12+
], function ($, events, Squire) {
13+
'use strict';
14+
15+
var form,
16+
PageBuilderFactoryMock,
17+
injector = new Squire();
18+
19+
function getPageBuilderFactoryMock() {
20+
var _proto,
21+
PageBuilderMock = function () {
22+
this.id = 'pagebuilder_instance_id';
23+
};
24+
25+
_proto = PageBuilderMock.prototype;
26+
_proto.isFullScreen = jasmine.createSpy().and.returnValue(false);
27+
28+
return PageBuilderMock;
29+
}
30+
31+
beforeEach(function (done) {
32+
PageBuilderFactoryMock = getPageBuilderFactoryMock();
33+
injector.mock({
34+
'jquery': $,
35+
'Magento_PageBuilder/js/events': events
36+
});
37+
injector.require(['Magento_PageBuilder/js/form/form-mixin'], function (mixin) {
38+
form = mixin({
39+
_super: jasmine.createSpy(),
40+
source: {
41+
set: function (name, value) {
42+
this[name] = value;
43+
},
44+
get: function (name) {
45+
return this[name];
46+
}
47+
},
48+
extend: function (child) {
49+
return $.extend(this, child);
50+
},
51+
ns: 'test_form_namespace'
52+
});
53+
done();
54+
});
55+
});
56+
57+
afterEach(function () {
58+
try {
59+
injector.clean();
60+
injector.remove();
61+
} catch (e) {
62+
}
63+
});
64+
65+
describe('Magento_PageBuilder/js/form/form-mixin', function () {
66+
describe('initialize', function () {
67+
beforeEach(function () {
68+
form.initialize();
69+
expect(form._super).toHaveBeenCalled();
70+
});
71+
it('Should not register pagebuilder instances from different namespace', function () {
72+
var pageBuilderInstance = new PageBuilderFactoryMock();
73+
74+
events.trigger('pagebuilder:register', {instance: pageBuilderInstance, ns: 'different_namespace'});
75+
expect(form.source.get('pageBuilderInstances')).toEqual([]);
76+
});
77+
it('Should not register already registered pagebuilder instance', function () {
78+
var pageBuilderInstance = new PageBuilderFactoryMock();
79+
80+
form.source.set('pageBuilderInstances', [pageBuilderInstance]);
81+
events.trigger('pagebuilder:register', {instance: pageBuilderInstance, ns: 'test_form_namespace'});
82+
expect(form.source.get('pageBuilderInstances')).toEqual([pageBuilderInstance]);
83+
});
84+
it('Should register pagebuilder instances within the form namespace', function () {
85+
var pageBuilderInstance = new PageBuilderFactoryMock();
86+
87+
expect(form.source.get('pageBuilderInstances')).toEqual([]);
88+
events.trigger('pagebuilder:register', {instance: pageBuilderInstance, ns: 'test_form_namespace'});
89+
expect(form.source.get('pageBuilderInstances')).toEqual([pageBuilderInstance]);
90+
});
91+
});
92+
describe('save', function () {
93+
it('Should save immediately if no pagebuilder instances are registered', function () {
94+
form.save();
95+
expect(form._super).toHaveBeenCalled();
96+
});
97+
it('Should wait until pagebuilder instances locks are released before save', function () {
98+
var pageBuilderInstance = new PageBuilderFactoryMock(),
99+
lock = $.Deferred();
100+
101+
pageBuilderInstance.stage = {renderingLocks: [lock]};
102+
form.source.set('pageBuilderInstances', [pageBuilderInstance]);
103+
form.save();
104+
105+
expect(form._super).not.toHaveBeenCalled();
106+
});
107+
it('Should save when all pagebuilder instances locks are released', function (done) {
108+
var pageBuilderInstance = new PageBuilderFactoryMock(),
109+
lock = $.Deferred();
110+
111+
pageBuilderInstance.stage = {renderingLocks: [lock]};
112+
form.source.set('pageBuilderInstances', [pageBuilderInstance]);
113+
form.save();
114+
lock.resolve();
115+
setTimeout(function () {
116+
expect(form._super).toHaveBeenCalled();
117+
done();
118+
}, 100);
119+
});
120+
});
121+
});
122+
});

0 commit comments

Comments
 (0)