Skip to content

Commit 1fab53f

Browse files
committed
MC-3847: Issues With Same Width Buttons In Tabs
- Re-add min-width transition animation - Re-factor algorithm for finding largest button to max out at parent container width to control overflow - Add event to Tabs component so buttons will know when to re-calculate their size on tab focus
1 parent 46c7f9a commit 1fab53f

File tree

6 files changed

+54
-51
lines changed

6 files changed

+54
-51
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@
2828
}
2929
a[data-element='link'] {
3030
max-width: 100%;
31+
min-width: 0;
3132
position: relative;
33+
transition: min-width .3s ease;
3234
word-wrap: break-word;
3335
[data-element='link_text'] {
3436
max-width: 100%;

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

Lines changed: 16 additions & 26 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: 5 additions & 0 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: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ 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";
2020
import PreviewCollection from "../preview-collection";
21+
import BeforeSetFocusedEventInterface from "../tabs/before-set-focused-event";
2122

2223
/**
2324
* @api
2425
*/
2526
export default class Preview extends PreviewCollection {
2627
public isLiveEditing: KnockoutObservable<boolean> = ko.observable(false);
27-
public currentMaxWidth: KnockoutObservable<number> = ko.observable(0);
2828
/**
2929
* Keeps track of number of button item to disable sortable if there is only 1.
3030
*/
@@ -63,6 +63,10 @@ export default class Preview extends PreviewCollection {
6363
this.resizeChildButtons();
6464
}, 500).call(this);
6565
});
66+
67+
events.on("tabs:beforeSetFocused", (eventData: BeforeSetFocusedEventInterface) => {
68+
this.resizeChildButtons();
69+
});
6670
}
6771

6872
/**
@@ -235,40 +239,27 @@ export default class Preview extends PreviewCollection {
235239
private resizeChildButtons() {
236240
if (this.wrapperElement) {
237241
const buttonItems: JQuery = $(this.wrapperElement).find(".pagebuilder-button-item > a");
238-
let buttonResizeValue: string|number = "";
242+
let buttonResizeValue: string|number = "0";
239243
if (this.parent.dataStore.get("is_same_width") === "true") {
240244
if (buttonItems.length > 0) {
241-
buttonItems.css("min-width", "");
242-
const currentLargestButton = this.findLargestButton(buttonItems);
243-
const currentLargestButtonWidth = currentLargestButton.outerWidth();
244-
if (currentLargestButtonWidth !== 0) {
245-
buttonResizeValue = currentLargestButtonWidth;
246-
this.currentMaxWidth(currentLargestButtonWidth);
247-
} else {
248-
buttonResizeValue = this.currentMaxWidth();
249-
}
245+
const currentLargestButtonWidth = this.findLargestButtonWidth(buttonItems);
246+
const parentWrapperWidth = $(this.wrapperElement).width();
247+
buttonResizeValue = Math.min(currentLargestButtonWidth, parentWrapperWidth);
250248
}
251249
}
250+
252251
buttonItems.css("min-width", buttonResizeValue);
253252
}
254253
}
255254

256255
/**
257-
* Find the largest button which will determine the button width we use for re-sizing.
256+
* Find the largest button width for calculating same size value.
258257
*
259258
* @param {JQuery} buttonItems
260-
* @returns {JQuery}
259+
* @returns {number}
261260
*/
262-
private findLargestButton(buttonItems: JQuery): JQuery {
263-
let largestButton: JQuery|null = null;
264-
buttonItems.each((index, element) => {
265-
const buttonElement = $(element);
266-
if (largestButton === null
267-
|| this.calculateButtonWidth(buttonElement) > this.calculateButtonWidth(largestButton)) {
268-
largestButton = buttonElement;
269-
}
270-
});
271-
return largestButton;
261+
private findLargestButtonWidth(buttonItems: JQuery): number {
262+
return _.max(_.map(buttonItems, (buttonItem) => this.calculateButtonWidth($(buttonItem))));
272263
}
273264

274265
/**
@@ -279,9 +270,8 @@ export default class Preview extends PreviewCollection {
279270
*/
280271
private calculateButtonWidth(buttonItem: JQuery): number {
281272
const widthProperties = ["paddingLeft", "paddingRight", "borderLeftWidth", "borderRightWidth"];
282-
const calculatedButtonWidth: number = widthProperties.reduce((accumulatedWidth, widthProperty): number => {
273+
return widthProperties.reduce((accumulatedWidth, widthProperty): number => {
283274
return accumulatedWidth + (parseInt(buttonItem.css(widthProperty), 10) || 0);
284275
}, buttonItem.find("[data-element='link_text']").width());
285-
return calculatedButtonWidth;
286276
}
287277
}
Lines changed: 12 additions & 0 deletions
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.d";
7+
import ContentTypeInterface from "../../content-type.d";
8+
9+
export default interface BeforeSetFocusedEventInterface {
10+
index: number,
11+
contentType: ContentTypeInterface & ContentTypeCollectionInterface
12+
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,10 @@ 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,
265+
contentType: this,
266+
});
263267
this.setFocusedTab(index);
264268
}
265269

0 commit comments

Comments
 (0)