Skip to content

Commit 25dbaec

Browse files
committed
MC-3474: Apply Resizing Functionality to Preview
- Add a min-width transition to LESS - Remove empty button template file - Add afterRender event to buttons template in child button rendering loop - Add events to buttons preview controller that will trigger re-sizing of buttons - Add Interface for previewData:updateAfter event
1 parent 152f1ae commit 25dbaec

File tree

6 files changed

+139
-1
lines changed

6 files changed

+139
-1
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,9 @@
2525
margin: 0;
2626
}
2727
}
28+
29+
a[data-element="link"] {
30+
transition: min-width .5s ease;
31+
}
2832
}
2933
}

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

Lines changed: 59 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/template/content-type/buttons/default/preview.html

Whitespace-only changes.

app/code/Magento/PageBuilder/view/adminhtml/web/template/content-type/buttons/inline/preview.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88
<div class="pagebuilder-content-type pagebuilder-entity pagebuilder-entity-preview pagebuilder-no-blur pagebuilder-live-edit pagebuilder-buttons" event="{ mouseover: onMouseOver, mouseout: onMouseOut }, mouseoverBubble: false">
99
<render args="getOptions().template" />
1010
<div class="element-children buttons-container" each="parent.getChildren()" attr="Object.assign({}, data.main.attributes(), { id: parent.id + '-children' })" ko-style="data.main.style" css="data.main.css" data-bind="sortableChildren: { handle: '.move-structural', items: '.pagebuilder-content-type-wrapper', connectWith: '.buttons-container', appendTo: 'body' }">
11-
<div class="pagebuilder-content-type-wrapper" template="{ name: preview.previewTemplate, data: preview }" attr="{ id: id }"></div>
11+
<div class="pagebuilder-content-type-wrapper" template="{ name: preview.previewTemplate, data: preview, afterRender: function () { preview.dispatchAfterRenderEvent.apply(preview, arguments); } }" attr="{ id: id }"></div>
1212
</div>
1313
</div>

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

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import Option from "../../content-type-menu/option";
1414
import OptionInterface from "../../content-type-menu/option.d";
1515
import ContentTypeDroppedCreateEventParamsInterface from "../content-type-dropped-create-event-params";
1616
import PreviewCollection from "../preview-collection";
17+
import PreviewDataUpdateAfterParamsInterface from "../preview-data-update-after-params";
18+
import ContentTypeAfterRenderEventParamsInterface from "../content-type-after-render-event-params";
19+
import ContentTypeRemovedEventParamsInterface from "../content-type-removed-event-params";
1720

1821
/**
1922
* @api
@@ -29,6 +32,28 @@ export default class Preview extends PreviewCollection {
2932
this.addButton();
3033
}
3134
});
35+
36+
events.on("previewData:updateAfter", (eventData: PreviewDataUpdateAfterParamsInterface) => {
37+
const contentTypePreview = eventData.preview;
38+
if ((contentTypePreview.config.name === "button-item"
39+
&& contentTypePreview.parent.parent.id === this.parent.id)
40+
|| (contentTypePreview.config.name === "buttons"
41+
&& contentTypePreview.parent.id === this.parent.id)) {
42+
this.resizeChildButtons();
43+
}
44+
});
45+
46+
events.on("button-item:renderAfter", (eventData: ContentTypeAfterRenderEventParamsInterface) => {
47+
if (eventData.contentType.parent.id === this.parent.id) {
48+
this.resizeChildButtons();
49+
}
50+
});
51+
52+
events.on("button-item:removeAfter", (eventData: ContentTypeRemovedEventParamsInterface) => {
53+
if (eventData.parent.id === this.parent.id) {
54+
this.resizeChildButtons();
55+
}
56+
});
3257
}
3358

3459
/**
@@ -84,4 +109,41 @@ export default class Preview extends PreviewCollection {
84109
console.error(error);
85110
});
86111
}
112+
113+
/**
114+
* Resize width of all child buttons. Dependently make them the same width if configured.
115+
*/
116+
private resizeChildButtons() {
117+
if (this.wrapperElement) {
118+
const buttonItems: JQuery = $(this.wrapperElement).find(".pagebuilder-button-item > a");
119+
let buttonResizeValue: string|number = "";
120+
if (this.parent.dataStore.get("same_width") === "1") {
121+
if (buttonItems.length > 0) {
122+
const currentLargestButton = this.findLargestButton(buttonItems);
123+
buttonResizeValue = currentLargestButton.css("min-width", "").outerWidth();
124+
}
125+
}
126+
127+
buttonItems.css("min-width", buttonResizeValue);
128+
}
129+
}
130+
131+
/**
132+
* Find the largest button text value which will determine the button width we use for re-sizing.
133+
*
134+
* @param {JQuery} buttonItems
135+
* @returns {JQuery}
136+
*/
137+
private findLargestButton(buttonItems: JQuery): JQuery {
138+
let largestButton: JQuery|null = null;
139+
buttonItems.each((index, element) => {
140+
const buttonElement = $(element);
141+
if (largestButton === null
142+
|| buttonElement.find("span").width() > largestButton.find("span").width()) {
143+
largestButton = buttonElement;
144+
}
145+
});
146+
147+
return largestButton;
148+
}
87149
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/**
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
import Preview from "./preview";
7+
8+
/**
9+
* @api
10+
*/
11+
export default interface PreviewDataUpdateAfterParamsInterface {
12+
preview: Preview;
13+
}

0 commit comments

Comments
 (0)