Skip to content

Commit d89bd6d

Browse files
authored
Merge pull request #275 from magento-obsessive-owls/MC-14994
[Owls] MC-14994: Heading toolbar menu is positioned incorrectly on first drop on stage
2 parents a3e9e3a + ebc610d commit d89bd6d

File tree

5 files changed

+49
-11
lines changed

5 files changed

+49
-11
lines changed

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

Lines changed: 13 additions & 1 deletion
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/content-type/heading/preview.js

Lines changed: 10 additions & 5 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-toolbar.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66
-->
77

8-
<div class="pagebuilder-toolbar-options">
8+
<div class="pagebuilder-toolbar-options" afterRender="function (element) { afterRender.call($data, element); }">
99
<div class="pagebuilder-toolbar-options-wrapper" each="options">
1010
<ul class="pagebuilder-toolbar-options-links" css="key" each="values">
1111
<li class="pagebuilder-toolbar-options-link">

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@ import Preview from "./content-type/preview";
1111
import {PreviewCollectionInterface} from "./content-type/preview-collection.types";
1212
import {PreviewInterface} from "./content-type/preview.types";
1313
import checkStageFullScreen from "./utils/check-stage-full-screen";
14+
import deferred, {DeferredInterface} from "./utils/promise-deferred";
1415

1516
/**
1617
* @api
1718
*/
1819
export default class Toolbar {
1920
public options: KnockoutObservableArray<OptionInterface> = ko.observableArray([]);
2021
public observer: MutationObserver;
22+
public afterRenderDeferred: DeferredInterface = deferred();
2123
private preview: Preview;
24+
private element: Element;
2225

2326
/**
2427
* Toolbar Options constructor
@@ -40,6 +43,16 @@ export default class Toolbar {
4043
return "Magento_PageBuilder/content-type-toolbar";
4144
}
4245

46+
/**
47+
* On render init the toolbar
48+
*
49+
* @param {Element} element
50+
*/
51+
public afterRender(element: Element): void {
52+
this.element = element;
53+
this.afterRenderDeferred.resolve(element);
54+
}
55+
4356
/**
4457
* Upon clicking the option update the value as directed
4558
* When user toggles the option off, set the value back to default

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {OptionsInterface} from "../../content-type-menu/option.types";
1212
import Toolbar, {ContentTypeToolbarPreviewInterface} from "../../content-type-toolbar";
1313
import {OptionInterface} from "../../content-type-toolbar.types";
1414
import ContentTypeInterface from "../../content-type.types";
15+
import deferred, {DeferredInterface} from "../../utils/promise-deferred";
1516
import {ContentTypeDroppedCreateEventParamsInterface} from "../content-type-events.types";
1617
import ObservableUpdater from "../observable-updater";
1718
import BasePreview from "../preview";
@@ -22,6 +23,7 @@ import BasePreview from "../preview";
2223
export default class Preview extends BasePreview implements ContentTypeToolbarPreviewInterface {
2324
public toolbar: Toolbar;
2425
private element: Element;
26+
private afterRenderDeferred: DeferredInterface = deferred();
2527

2628
/**
2729
* @param {ContentTypeInterface} contentType
@@ -61,12 +63,13 @@ export default class Preview extends BasePreview implements ContentTypeToolbarPr
6163
}
6264

6365
/**
64-
* On render init the tabs widget
66+
* On render init the heading
6567
*
6668
* @param {Element} element
6769
*/
6870
public afterRender(element: Element): void {
6971
this.element = element;
72+
this.afterRenderDeferred.resolve(element);
7073
}
7174

7275
public bindEvents() {
@@ -75,9 +78,14 @@ export default class Preview extends BasePreview implements ContentTypeToolbarPr
7578
// When a heading is dropped for the first time show heading toolbar
7679
events.on("heading:dropAfter", (args: ContentTypeDroppedCreateEventParamsInterface) => {
7780
if (args.id === this.contentType.id) {
78-
_.delay(() => {
79-
$(this.element).focus();
80-
}, 100); // 100 ms delay to allow for heading to render
81+
Promise.all([
82+
this.afterRenderDeferred.promise,
83+
this.toolbar.afterRenderDeferred.promise,
84+
]).then(([element]) => {
85+
_.defer(() => {
86+
$(element).focus();
87+
});
88+
});
8189
}
8290
});
8391
}

0 commit comments

Comments
 (0)