Skip to content

Commit e3f9c0f

Browse files
committed
MC-3847: Issues With Same Width Buttons In Tabs
- Leverage a more generic event to remove coupling between Buttons and Tabs - Add documentation for this new event - Use a more consistent transition animation duration used by other components - Debounce button resize events so it's not called more than it needs to be - Add redraw event to storefront so Buttons know when you recalculate button size - Add test to cover the functionality works on the frontend
1 parent 870d461 commit e3f9c0f

File tree

11 files changed

+94
-41
lines changed

11 files changed

+94
-41
lines changed

app/code/Magento/PageBuilder/Test/Mftf/Test/AdminPageBuilderButtonGroupAppearanceTests.xml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2077,5 +2077,22 @@
20772077
<argument name="firstButtonIndex" value="3"/>
20782078
<argument name="secondButtonIndex" value="4"/>
20792079
</actionGroup>
2080+
<!-- Validate Storefront -->
2081+
<comment userInput="Validate Storefront: Initial" stepKey="commentValidateStorefront1"/>
2082+
<amOnPage url="$$createCMSPage.identifier$$" stepKey="goToStorefront1"/>
2083+
<waitForPageLoad stepKey="waitForPageLoad1"/>
2084+
<actionGroup ref="validateButtonItemsSameSize" stepKey="validateButtonsSameSizeStorefront1">
2085+
<argument name="buttonGroupPage" value="ButtonGroupOnStorefront"/>
2086+
<argument name="buttonItemPage" value="ButtonItemOnStorefront"/>
2087+
</actionGroup>
2088+
<click selector="{{TabOnStorefront.tabHeader('2')}}" stepKey="clickActiveTabStorefront"/>
2089+
<waitForElementVisible time="30" selector="{{TabOnStorefront.tabHeaderItemActive('2')}}" stepKey="seeNewTabActiveStorefront"/>
2090+
<actionGroup ref="validateButtonItemsSameSize" stepKey="validateButtonsSameSizeStorefront2">
2091+
<argument name="buttonGroupPage" value="ButtonGroupOnStorefront"/>
2092+
<argument name="buttonItemPage" value="ButtonItemOnStorefront"/>
2093+
<argument name="buttonGroupIndex" value="3"/>
2094+
<argument name="firstButtonIndex" value="5"/>
2095+
<argument name="secondButtonIndex" value="6"/>
2096+
</actionGroup>
20802097
</test>
20812098
</tests>

app/code/Magento/PageBuilder/docs/events.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ This document contains reference information for events dispatched in Page Build
7373
* [contentType:duplicateAfter](#contenttypeduplicateafter)
7474
* [contentType:moveBefore](#contenttypemovebefore)
7575
* [contentType:moveAfter](#contenttypemoveafter)
76+
* [contentType:redrawAfter](#contenttyperedrawafter)
7677
* [column:dragStart](#columdragstart)
7778
* [column:dragStop](#columndragstop)
7879
* [column:initializeAfter](#columninitializeafter)
@@ -268,6 +269,23 @@ All events starting with `contentType:` can also be called for specific content
268269

269270
[Back to top]
270271

272+
### `contentType:redrawAfter`
273+
274+
**Triggers**
275+
276+
* `Tabs.Preview::onTabClick`
277+
278+
**Params**
279+
280+
``` js
281+
{
282+
id: string,
283+
contentType: ContentTypeInterface & ContentTypeCollectionInterface
284+
}
285+
```
286+
287+
[Back to top]
288+
271289
### `column:dragStart`
272290

273291
**Triggers**

app/code/Magento/PageBuilder/view/adminhtml/web/css/source/content-type/button-item/_default.less

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
max-width: 100%;
3131
min-width: 0;
3232
position: relative;
33-
transition: min-width .3s ease;
33+
transition: min-width 200ms ease;
3434
word-wrap: break-word;
3535
[data-element='link_text'] {
3636
max-width: 100%;

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

Lines changed: 9 additions & 9 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/js/content-type/tabs/preview.js

Lines changed: 4 additions & 4 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/ts/js/content-type/buttons/preview.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@ import {OptionsInterface} from "../../content-type-menu/option.d";
1717
import StageUpdateAfterParamsInterface from "../../stage-update-after-params.d";
1818
import ContentTypeAfterRenderEventParamsInterface from "../content-type-after-render-event-params.d";
1919
import ContentTypeDroppedCreateEventParamsInterface from "../content-type-dropped-create-event-params";
20+
import ContentTypeRedrawAfterEventParamsInterface from "../content-type-redraw-after-event-params";
2021
import PreviewCollection from "../preview-collection";
21-
import BeforeSetFocusedEventInterface from "../tabs/before-set-focused-event";
2222

2323
/**
2424
* @api
2525
*/
2626
export default class Preview extends PreviewCollection {
2727
public isLiveEditing: KnockoutObservable<boolean> = ko.observable(false);
28+
2829
/**
2930
* Keeps track of number of button item to disable sortable if there is only 1.
3031
*/
@@ -37,6 +38,10 @@ export default class Preview extends PreviewCollection {
3738
}
3839
});
3940

41+
private debouncedResizeHandler = _.debounce(() => {
42+
this.resizeChildButtons();
43+
}, 350);
44+
4045
public bindEvents() {
4146
super.bindEvents();
4247

@@ -48,24 +53,22 @@ export default class Preview extends PreviewCollection {
4853

4954
events.on("buttons:renderAfter", (eventData: ContentTypeAfterRenderEventParamsInterface) => {
5055
if (eventData.contentType.id === this.parent.id) {
51-
this.resizeChildButtons();
56+
this.debouncedResizeHandler();
5257
}
5358
});
5459

5560
events.on("button-item:renderAfter", (eventData: ContentTypeAfterRenderEventParamsInterface) => {
5661
if (eventData.contentType.parent.id === this.parent.id) {
57-
this.resizeChildButtons();
62+
this.debouncedResizeHandler();
5863
}
5964
});
6065

6166
events.on("stage:updateAfter", (eventData: StageUpdateAfterParamsInterface) => {
62-
_.debounce(() => {
63-
this.resizeChildButtons();
64-
}, 500).call(this);
67+
this.debouncedResizeHandler();
6568
});
6669

67-
events.on("tabs:beforeSetFocused", (eventData: BeforeSetFocusedEventInterface) => {
68-
this.resizeChildButtons();
70+
events.on("contentType:redrawAfter", (eventData: ContentTypeRedrawAfterEventParamsInterface) => {
71+
this.debouncedResizeHandler();
6972
});
7073
}
7174

@@ -239,7 +242,7 @@ export default class Preview extends PreviewCollection {
239242
private resizeChildButtons() {
240243
if (this.wrapperElement) {
241244
const buttonItems: JQuery = $(this.wrapperElement).find(".pagebuilder-button-item > a");
242-
let buttonResizeValue: string|number = "0";
245+
let buttonResizeValue: number = 0;
243246
if (this.parent.dataStore.get("is_same_width") === "true") {
244247
if (buttonItems.length > 0) {
245248
const currentLargestButtonWidth = this.findLargestButtonWidth(buttonItems);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
import ContentTypeCollectionInterface from "../content-type-collection";
7+
import ContentTypeInterface from "../content-type";
8+
9+
export default interface ContentTypeRedrawAfterEventParamsInterface {
10+
id: string,
11+
contentType: ContentTypeInterface & ContentTypeCollectionInterface
12+
}

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/content-type/tabs/before-set-focused-event.d.ts

Lines changed: 0 additions & 12 deletions
This file was deleted.

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -260,11 +260,13 @@ export default class Preview extends PreviewCollection {
260260
if ($(event.target).parents(".pagebuilder-options").length > 0) {
261261
return;
262262
}
263-
events.trigger("tabs:beforeSetFocused", {
264-
index,
263+
264+
this.setFocusedTab(index);
265+
266+
events.trigger("contentType:redrawAfter", {
267+
id: this.parent.id,
265268
contentType: this,
266269
});
267-
this.setFocusedTab(index);
268270
}
269271

270272
/**

app/code/Magento/PageBuilder/view/base/web/js/content-type/tabs/appearance/default/widget.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
*/
55
define([
66
'jquery',
7+
'Magento_PageBuilder/js/events',
78
'jquery/ui'
8-
], function ($) {
9+
], function ($, events) {
910
'use strict';
1011

1112
return function (config, element) {
@@ -24,6 +25,12 @@ define([
2425

2526
$element.find('.tabs-navigation').css('marginBottom', -borderWidth);
2627
$element.find('.tabs-navigation li:not(:first-child)').css('marginLeft', -borderWidth);
28+
},
29+
activate:
30+
function () {
31+
events.trigger('contentType:redrawAfter', {
32+
element: element
33+
});
2734
}
2835
}, element);
2936
};

0 commit comments

Comments
 (0)