Skip to content

Commit 1fb4b74

Browse files
authored
Merge pull request #201 from magento-l3/PR-01-10-2023
PR-L3-01102023
2 parents b52a9bd + d940887 commit 1fb4b74

File tree

4 files changed

+176
-9
lines changed
  • app/code/Magento/PageBuilder/view/adminhtml/web
  • dev/tests/js/jasmine/tests/app/code/Magento/PageBuilder/adminhtml/web/js/content-type/text

4 files changed

+176
-9
lines changed

app/code/Magento/PageBuilder/view/adminhtml/web/js/content-type/text/preview.js

Lines changed: 41 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/content-type/text/default/preview.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
css="data.main.css"
1313
afterRender="afterRenderWysiwyg"
1414
contenteditable="true"
15-
event="mousedown: stopEvent, click: activateEditor, dblclick: handleDoubleClick">
15+
event="mousedown: handleMouseDown, click: activateEditor, dblclick: handleDoubleClick">
1616
</div>
1717
<div if="isWysiwygSupported()" class="placeholder-text" ifnot="data.main.html" ko-style="getPlaceholderStyle()" translate="'Edit Text'"></div>
1818

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/content-type/text/preview.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,40 @@ export default class Preview extends BasePreview {
239239
});
240240
}
241241

242+
/**
243+
* Handle "mousedown" event
244+
*
245+
* @param {Preview} preview
246+
* @param {JQueryEventObject} event
247+
* @returns {Boolean}
248+
*/
249+
public handleMouseDown(preview: Preview, event: JQueryEventObject) {
250+
const handleMouseUp = (mouseUpEvent: JQueryEventObject) => {
251+
if (this.element
252+
&& !this.wysiwyg
253+
&& document.activeElement === this.element
254+
// Check that mouseup occurred outside the element, otherwise "click" event will be triggerred in which
255+
// case we don't need to do anything as the "click" event is handled in "activateEditor"
256+
// Note: click is fired after a full click action occurs; that is, the mouse button is pressed
257+
// and released while the pointer remains inside the same element.
258+
&& this.element !== mouseUpEvent.target
259+
&& !$.contains(this.element, mouseUpEvent.target)
260+
) {
261+
this.activateEditor(this, mouseUpEvent);
262+
}
263+
$(document).off("mouseup", handleMouseUp);
264+
return true;
265+
};
266+
267+
event.stopPropagation();
268+
269+
if (this.element && !this.wysiwyg) {
270+
$(document).on("mouseup", handleMouseUp);
271+
}
272+
273+
return true;
274+
}
275+
242276
/**
243277
* @param {HTMLTextAreaElement} element
244278
*/
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/**
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
/* eslint-disable max-nested-callbacks */
7+
define([
8+
'jquery',
9+
'Magento_PageBuilder/js/content-type/text/preview'
10+
], function ($, Preview) {
11+
'use strict';
12+
13+
describe('Magento_PageBuilder/js/content-type/text/preview', function () {
14+
var model;
15+
16+
beforeEach(function () {
17+
model = new Preview({dataStore: {subscribe: jasmine.createSpy()}}, {});
18+
model.element = $('<div contenteditable="true">This text can be edited.</div>')[0];
19+
$('body').append($(model.element));
20+
});
21+
afterEach(function () {
22+
$(model.element).remove();
23+
delete model.element;
24+
});
25+
describe('handleMouseDown()', function () {
26+
it('Should call activateEditor() if mouseup occurred outside the element', function () {
27+
model.activateEditor = jasmine.createSpy();
28+
$(model.element).on('mousedown', function (event) {
29+
model.element.focus();
30+
return model.handleMouseDown(model, event);
31+
});
32+
model.element.dispatchEvent(new MouseEvent('mousedown', {
33+
view: window,
34+
bubbles: true,
35+
cancelable: true
36+
}));
37+
document.dispatchEvent(new MouseEvent('mouseup', {
38+
view: window,
39+
bubbles: true,
40+
cancelable: true
41+
}));
42+
expect(model.activateEditor).toHaveBeenCalled();
43+
});
44+
it('Should not call activateEditor() if mouseup occurred inside the element', function () {
45+
model.activateEditor = jasmine.createSpy();
46+
$(model.element).on('mousedown', function (event) {
47+
model.element.focus();
48+
return model.handleMouseDown(model, event);
49+
});
50+
model.element.dispatchEvent(new MouseEvent('mousedown', {
51+
view: window,
52+
bubbles: true,
53+
cancelable: true
54+
}));
55+
model.element.dispatchEvent(new MouseEvent('mouseup', {
56+
view: window,
57+
bubbles: true,
58+
cancelable: true
59+
}));
60+
expect(model.activateEditor).not.toHaveBeenCalled();
61+
});
62+
it('Should not call activateEditor() if the editor is already activated', function () {
63+
model.activateEditor = jasmine.createSpy();
64+
model.wysiwyg = jasmine.createSpyObj(['getAdapter']);
65+
$(model.element).on('mousedown', function (event) {
66+
model.element.focus();
67+
return model.handleMouseDown(model, event);
68+
});
69+
model.element.dispatchEvent(new MouseEvent('mousedown', {
70+
view: window,
71+
bubbles: true,
72+
cancelable: true
73+
}));
74+
document.dispatchEvent(new MouseEvent('mouseup', {
75+
view: window,
76+
bubbles: true,
77+
cancelable: true
78+
}));
79+
expect(model.activateEditor).not.toHaveBeenCalled();
80+
});
81+
it('Should not call activateEditor() if the element has no focus', function () {
82+
model.activateEditor = jasmine.createSpy();
83+
$(model.element).on('mousedown', function (event) {
84+
return model.handleMouseDown(model, event);
85+
});
86+
model.element.dispatchEvent(new MouseEvent('mousedown', {
87+
view: window,
88+
bubbles: true,
89+
cancelable: true
90+
}));
91+
document.dispatchEvent(new MouseEvent('mouseup', {
92+
view: window,
93+
bubbles: true,
94+
cancelable: true
95+
}));
96+
expect(model.activateEditor).not.toHaveBeenCalled();
97+
});
98+
});
99+
});
100+
});

0 commit comments

Comments
 (0)