Skip to content

Commit f4d2547

Browse files
authored
fix(ui5-shellbar): fix menuItems cloning (#1457)
1 parent ae20272 commit f4d2547

File tree

4 files changed

+71
-13
lines changed

4 files changed

+71
-13
lines changed

packages/fiori/src/ShellBar.js

+33-4
Original file line numberDiff line numberDiff line change
@@ -380,13 +380,15 @@ class ShellBar extends UI5Element {
380380
},
381381
};
382382

383+
this.menuItemsObserver = new MutationObserver(() => {
384+
this._updateClonedMenuItems();
385+
});
386+
383387
this._header = {
384388
press: event => {
389+
this._updateClonedMenuItems();
390+
385391
if (this.menuItems.length) {
386-
this._menuPopoverItems = [];
387-
this.menuItems.forEach(item => {
388-
this._menuPopoverItems.push(item.textContent);
389-
});
390392
this.updateStaticAreaItemContentDensity();
391393
this.menuPopover.openBy(this.shadowRoot.querySelector(".ui5-shellbar-menu-button"));
392394
}
@@ -479,6 +481,8 @@ class ShellBar extends UI5Element {
479481

480482
return isHidden && isSet && !isOverflowIcon;
481483
});
484+
485+
this._observeMenuItems();
482486
}
483487

484488
onAfterRendering() {
@@ -641,6 +645,7 @@ class ShellBar extends UI5Element {
641645
}
642646

643647
onExitDOM() {
648+
this.menuItemsObserver.disconnect();
644649
ResizeHandler.deregister(this, this._handleResize);
645650
}
646651

@@ -819,6 +824,30 @@ class ShellBar extends UI5Element {
819824
}
820825
}
821826

827+
_updateClonedMenuItems() {
828+
this._menuPopoverItems = [];
829+
830+
this.menuItems.forEach(item => {
831+
// clone the menuItem and remove the slot="menuItems",
832+
// otherwise would not be slotted in the internal ui5-li
833+
const clonedItem = item.cloneNode(true);
834+
clonedItem.removeAttribute("slot");
835+
836+
this._menuPopoverItems.push(clonedItem);
837+
});
838+
}
839+
840+
_observeMenuItems() {
841+
this.menuItems.forEach(item => {
842+
this.menuItemsObserver.observe(item, {
843+
characterData: true,
844+
childList: true,
845+
subtree: true,
846+
attributes: true,
847+
});
848+
});
849+
}
850+
822851
async _getResponsivePopover() {
823852
const staticAreaItem = await this.getStaticAreaItemDomRef();
824853
this.overflowPopover = staticAreaItem.querySelector(".ui5-shellbar-overflow-popover");

packages/fiori/src/ShellBarPopover.hbs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<ui5-popover class="ui5-shellbar-menu-popover" placement-type="Bottom">
22
<ui5-list separators="None" mode="SingleSelect" @ui5-itemPress={{_menuItemPress}}>
33
{{#each _menuPopoverItems}}
4-
<ui5-li>{{ this }}</ui5-li>
4+
{{ this }}
55
{{/each}}
66
</ui5-list>
77
</ui5-popover>

packages/fiori/test/pages/ShellBar.html

+33-7
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,11 @@
122122

123123
<ui5-input slot="searchField"></ui5-input>
124124

125-
<ui5-li id="menu-item-1" slot="menuItems">Application 1</ui5-li>
126-
<ui5-li id="menu-item-2" slot="menuItems">Application 2</ui5-li>
127-
<ui5-li slot="menuItems">Application 3</ui5-li>
128-
<ui5-li slot="menuItems">Application 4</ui5-li>
129-
<ui5-li slot="menuItems">Application 5</ui5-li>
125+
<ui5-li id="menu-item-1" slot="menuItems" data-key="key1">Application 1</ui5-li>
126+
<ui5-li id="menu-item-2" slot="menuItems" data-key="key2">Application 2</ui5-li>
127+
<ui5-li slot="menuItems" data-key="key3">Application 3</ui5-li>
128+
<ui5-li slot="menuItems" data-key="key4">Application 4</ui5-li>
129+
<ui5-li slot="menuItems" data-key="key5">Application 5</ui5-li>
130130
</ui5-shellbar>
131131

132132
<section class="ui5-content-density-compact">
@@ -179,6 +179,7 @@ <h3>ShellBar in Compact</h3>
179179
</ui5-popover>
180180

181181
<ui5-input id="press-input" style="margin-top: 2rem;"></ui5-input>
182+
<ui5-input id="press-data" style="margin-top: 2rem;"></ui5-input>
182183
<ui5-input id="press-input2" style="margin-top: 2rem;"></ui5-input>
183184

184185

@@ -201,6 +202,23 @@ <h3>ShellBar in Compact</h3>
201202
</ui5-input>
202203
</ui5-shellbar>
203204

205+
<ui5-title>Menu Items</ui5-title>
206+
207+
<ui5-label>value</ui5-label><ui5-input id="result-value"></ui5-input><br>
208+
<ui5-label>key</ui5-label><ui5-input id="result-key"></ui5-input>
209+
210+
<ui5-shellbar
211+
id="menuItemsSB"
212+
primary-title="Menu Items"
213+
>
214+
<ui5-li id="mi-1" slot="menuItems" data-key="key1">App 1</ui5-li>
215+
<ui5-li id="mi-2" slot="menuItems" data-key="key2">App 2</ui5-li>
216+
<ui5-li id="mi-3"slot="menuItems" data-key="key3">App 3</ui5-li>
217+
<ui5-li id="mi-4"slot="menuItems" data-key="key4">App 4</ui5-li>
218+
</ui5-shellbar>
219+
220+
221+
204222
<script>
205223
mySearch.addEventListener("suggestionItemSelect", function (event) {
206224
 console.log(event);
@@ -233,11 +251,19 @@ <h3>ShellBar in Compact</h3>
233251
});
234252

235253
shellbar.addEventListener("ui5-menuItemClick", function(event) {
236-
window["press-input"].value = event.detail.item.textContent;
254+
var item = event.detail.item;
255+
window["press-input"].value = item.textContent;
256+
window["press-data"].value = item.getAttribute("data-key");
257+
});
258+
259+
menuItemsSB.addEventListener("ui5-menuItemClick", function(event) {
260+
var item = event.detail.item;
261+
window["result-value"].value = item.textContent;
262+
window["result-key"].value = item.getAttribute("data-key");
237263
});
238264

239265
["disc", "call"].forEach(function(id) {
240-
var currenItem = window[id][0] || window[id];
266+
var currenItem = window[id][0] || window[id];
241267
currenItem.addEventListener("ui5-itemClick", function(event) {
242268
event.preventDefault();
243269
window["press-input"].value = event.target.id;

packages/fiori/test/specs/ShellBar.spec.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -254,22 +254,25 @@ describe("Component Behavior", () => {
254254
assert.strictEqual(input.getValue(), "CoPilot", "Input value is set by click event of CoPilot");
255255
});
256256

257-
it("tests menuItemPress event", () => {
257+
it("tests menuItemClick event", () => {
258258
const primaryTitle = browser.$("#shellbar").shadow$(".ui5-shellbar-menu-button");
259259
const staticAreaItemClassName = browser.getStaticAreaItemClassName("#shellbar")
260260
const menuPopover = browser.$(`.${staticAreaItemClassName}`).shadow$(".ui5-shellbar-menu-popover");
261261
const firstMenuItem = menuPopover.$("ui5-list > ui5-li");
262262
const secondMenuItem = menuPopover.$("ui5-list > ui5-li:nth-child(2)");
263263
const input = browser.$("#press-input");
264+
const inputData = browser.$("#press-data");
264265

265266
primaryTitle.click();
266267
firstMenuItem.click();
267268

268269
assert.strictEqual(input.getValue(), "Application 1", "Input value is set by click event of the first menu item");
270+
assert.strictEqual(inputData.getValue(), "key1", "The user defined attributes are available.");
269271

270272
secondMenuItem.click();
271273

272274
assert.strictEqual(input.getValue(), "Application 2", "Input value is set by click event of the second menu item");
275+
assert.strictEqual(inputData.getValue(), "key2", "The user defined attributes are available.");
273276
});
274277

275278
it("tests if searchfield toggles when clicking on search icon", () => {

0 commit comments

Comments
 (0)