Skip to content

Commit a79c344

Browse files
committed
ACP2E-1542: Pagebuilder floating editor adds "tabindex" attribute when editing hyperlink and saving the template
1 parent d52a3e8 commit a79c344

File tree

3 files changed

+96
-5
lines changed

3 files changed

+96
-5
lines changed

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,26 @@ define([
131131
editableValue = this.pageBuilder.isFullScreen();
132132

133133
editable.attr('contenteditable', editableValue);
134-
$(pageBuilderSelector + focusableSelector).attr('tabindex', tabIndexValue);
134+
if (this.pageBuilder.isFullScreen()) {
135+
$(pageBuilderSelector + focusableSelector)
136+
.each(function () {
137+
if ($(this).data('original-tabindex')) {
138+
$(this).attr('tabindex', $(this).data('original-tabindex'));
139+
} else if ($(this).data('original-tabindex') === '') {
140+
$(this).removeAttr('tabindex');
141+
}
142+
$(this).removeData('original-tabindex');
143+
});
144+
} else {
145+
$(pageBuilderSelector + focusableSelector).each(function () {
146+
if ($(this).attr('tabindex')) {
147+
$(this).data('original-tabindex', $(this).attr('tabindex'));
148+
} else {
149+
$(this).data('original-tabindex', '');
150+
}
151+
$(this).attr('tabindex', '-1');
152+
});
153+
}
135154
$(mediaSelector).attr('tabindex', tabIndexValue);
136155
},
137156

dev/tests/js/jasmine/tests/app/code/Magento/PageBuilder/adminhtml/web/js/form/element/image-uploader.test.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66

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

1413
var uploader,
@@ -73,7 +72,7 @@ define([
7372

7473
beforeEach(function (done) {
7574
injector.mock(mocks);
76-
injector.require(['Magento_PageBuilder/js/form/element/image-uploader'], function (ImageUploader) {
75+
injector.require(['Magento_PageBuilder/js/form/element/image-uploader', 'jquery'], function (ImageUploader, $) {
7776
/**
7877
* A stub constructor to bypass the original
7978
* @constructor
@@ -114,7 +113,7 @@ define([
114113
expect(uploader.$uploadArea.removeClass).toHaveBeenCalledWith('foo bar');
115114
});
116115

117-
$.each(scenarios, function (i, scenario) {
116+
scenarios.forEach(function (scenario, i) {
118117
it('Should add modifier classes if configuration is met in scenario ' + i, function () {
119118
uploader.elementWidthModifierClasses = scenario.config;
120119
spyOn(uploader.$uploadArea, 'is').and.returnValue(true);
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
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+
'squire'
10+
], function (Squire) {
11+
'use strict';
12+
13+
var injector = new Squire(),
14+
mocks = {
15+
'Magento_PageBuilder/js/events': jasmine.createSpyObj('events',['on', 'trigger']),
16+
'Magento_PageBuilder/js/page-builder': function () {}
17+
},
18+
wysiwyg,
19+
$;
20+
21+
beforeEach(function (done) {
22+
injector.mock(mocks);
23+
injector.require(['Magento_PageBuilder/js/form/element/wysiwyg', 'jquery'], function (UiWysiwyg, jq) {
24+
var MockWysiwyg = function () {};
25+
26+
MockWysiwyg.prototype = Object.create(UiWysiwyg.prototype);
27+
MockWysiwyg.prototype.constructor = MockWysiwyg;
28+
wysiwyg = new MockWysiwyg();
29+
$ = jq;
30+
$.extend(wysiwyg, UiWysiwyg.defaults, {pageBuilder: {id: 'pb-wysiwyg-test'}});
31+
$(document.body).append(
32+
$('<div><div contenteditable="true"><a href="/login"></a><span tabindex="0"></span></div></div>')
33+
.attr('id', wysiwyg.pageBuilder.id)
34+
);
35+
done();
36+
});
37+
});
38+
39+
afterEach(function () {
40+
try {
41+
injector.clean();
42+
injector.remove();
43+
} catch (e) {}
44+
$('#' + wysiwyg.pageBuilder.id).remove();
45+
});
46+
47+
describe('Magento_PageBuilder/js/form/element/wysiwyg', function () {
48+
describe('toggleFocusableElements', function () {
49+
it('Should restore tabindex and contenteditable in fullscreen mode', function () {
50+
var $div = $('#' + wysiwyg.pageBuilder.id);
51+
52+
wysiwyg.pageBuilder.isFullScreen = jasmine.createSpy().and.returnValue(false);
53+
wysiwyg.toggleFocusableElements();
54+
expect($div.find('a').attr('tabindex')).toBe('-1');
55+
expect($div.find('a').data('original-tabindex')).toBe('');
56+
expect($div.find('span').attr('tabindex')).toBe('-1');
57+
expect($div.find('span').data('original-tabindex')).toBe('0');
58+
expect($div.find('[contenteditable]').attr('contenteditable')).toBe('false');
59+
60+
// check full screen mode
61+
wysiwyg.pageBuilder.isFullScreen = jasmine.createSpy().and.returnValue(true);
62+
wysiwyg.toggleFocusableElements();
63+
// check that taindex is removed from "a"
64+
expect($div.find('a').attr('tabindex')).toBe(undefined);
65+
expect($div.find('a').data('original-tabindex')).toBe(undefined);
66+
// check that taindex is restored for "span"
67+
expect($div.find('span').attr('tabindex')).toBe('0');
68+
expect($div.find('span').data('original-tabindex')).toBe(undefined);
69+
expect($div.find('[contenteditable]').attr('contenteditable')).toBe('true');
70+
});
71+
});
72+
});
73+
});

0 commit comments

Comments
 (0)