Skip to content
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
4b9e525
chore(ui5-toolbar): toolbar item wrapper introduced
PetyaMarkovaBogdanova Aug 12, 2025
eb44c13
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Sep 2, 2025
0439ce7
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Sep 2, 2025
7c49aa4
chore(ui5-toolbar-item): wrappers introduced
PetyaMarkovaBogdanova Sep 9, 2025
682adfa
Merge branch 'poc-toolbar-item' of github.com:SAP/ui5-webcomponents i…
PetyaMarkovaBogdanova Sep 9, 2025
a177545
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Sep 9, 2025
6169477
chore(ui5-toolbar-item): toolbar wrappers
PetyaMarkovaBogdanova Sep 10, 2025
6d61c76
chore(ui5-toolbar): toolbar item wrapper introduced
PetyaMarkovaBogdanova Sep 10, 2025
84607fb
chore(ui5-toolbar): toolbar item wrapper introduced
PetyaMarkovaBogdanova Sep 10, 2025
8b60ec7
chore(ui5-toolbar): toolbar item wrapper introduced
PetyaMarkovaBogdanova Sep 10, 2025
433a23b
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Sep 11, 2025
72da995
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Sep 11, 2025
a82c920
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Sep 12, 2025
fed79a5
chore(ui5-toolbar-item): item wrapers introduced
PetyaMarkovaBogdanova Sep 16, 2025
2324db6
Merge branch 'poc-toolbar-item' of github.com:SAP/ui5-webcomponents i…
PetyaMarkovaBogdanova Sep 16, 2025
22648ff
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Sep 16, 2025
669a44a
chore(ui5-toolbar-item): items wrappers introduced
PetyaMarkovaBogdanova Sep 16, 2025
9a12522
chore(ui5-toolbar): toolbar item wrapper introduced
PetyaMarkovaBogdanova Sep 16, 2025
3456ef3
chore(ui5-toolbar): item wrappers introduced
PetyaMarkovaBogdanova Oct 9, 2025
67f676c
fix(ui5-shellbar): adjust sizes-parameters for shellbar
PetyaMarkovaBogdanova Oct 9, 2025
a2f410b
chore(ui5-toolbar): wrappers introduced
PetyaMarkovaBogdanova Nov 10, 2025
ee89f1c
fix(ui5-toolbar): toolbar items introduced
PetyaMarkovaBogdanova Nov 10, 2025
02ec8f9
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Nov 10, 2025
2f3648a
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Nov 10, 2025
83e8288
chore(ui5-toolbar): toolbar wrappers introduced
PetyaMarkovaBogdanova Nov 10, 2025
4a2452a
Merge branch 'poc-toolbar-item' of github.com:UI5/webcomponents into …
PetyaMarkovaBogdanova Nov 10, 2025
d53d294
chore(ui5-toolbar): wrappers introduced
PetyaMarkovaBogdanova Nov 11, 2025
9615fee
chore(ui5-toolbar): toolbarItem wrappers
PetyaMarkovaBogdanova Nov 17, 2025
b429bd6
Merge branch 'main' of github.com:UI5/webcomponents
PetyaMarkovaBogdanova Nov 17, 2025
388ab96
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Nov 17, 2025
079ae12
chore(ui5-toolbar): toolbar wrappers introduced
PetyaMarkovaBogdanova Nov 17, 2025
4ad904b
chore(ui5-toolbar): toolbar item wrapper introduced
PetyaMarkovaBogdanova Nov 18, 2025
180104d
chore(ui5-toolbar-item): wrappers introduced
PetyaMarkovaBogdanova Nov 19, 2025
d8635c5
Merge branch 'main' of github.com:UI5/webcomponents
PetyaMarkovaBogdanova Nov 19, 2025
247cfa0
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Nov 19, 2025
258aa4a
Delete packages/main/test/pages/ToolbarWrappers.html
PetyaMarkovaBogdanova Nov 19, 2025
92b262b
chore(ui5-toolbar): fix tests
PetyaMarkovaBogdanova Nov 19, 2025
492082e
chore(ui5-toolbar): fix click event handling in ToolbarItem
PetyaMarkovaBogdanova Nov 19, 2025
8e44245
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Nov 24, 2025
dced6b4
chore(ui5-toolbar): fix toolbar items
PetyaMarkovaBogdanova Nov 24, 2025
991dcc6
chore(ui5-toolbar): fix OTB width
PetyaMarkovaBogdanova Nov 24, 2025
f302f15
fix(ui5-toolbar): enhance overflow handling and add new toolbar item …
PetyaMarkovaBogdanova Nov 24, 2025
82a3e17
chore(ui5-toolbar): fix reviwe comments
PetyaMarkovaBogdanova Dec 1, 2025
bd388c0
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Dec 1, 2025
b2443a3
chore(ui5-toolbar): fix review comments
PetyaMarkovaBogdanova Dec 2, 2025
9a0b798
Merge branch 'poc-toolbar-item' of github.com:UI5/webcomponents into …
PetyaMarkovaBogdanova Dec 2, 2025
62f3d2d
Merge branch 'main' of github.com:UI5/webcomponents into poc-toolbar-…
PetyaMarkovaBogdanova Dec 2, 2025
d514738
fix(ui5-toolbar): fix tests
PetyaMarkovaBogdanova Dec 2, 2025
a5adb65
chore(ui5-toolbar): review comments
PetyaMarkovaBogdanova Dec 9, 2025
8b3d82a
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Dec 10, 2025
22f6370
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Dec 16, 2025
7ca80af
fix(ui5-toolbar): migrate ToolbarItem to UI5 Web Component
PetyaMarkovaBogdanova Jan 6, 2026
9715c19
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Jan 6, 2026
fff9c29
fix(ui5-toolbar-item): item wrapper introduced
PetyaMarkovaBogdanova Jan 6, 2026
3a9b49d
Merge branch 'poc-toolbar-item' of github.com:UI5/webcomponents into …
PetyaMarkovaBogdanova Jan 6, 2026
a083b75
fix(ui5-toolbar-item): general wrapper introduced
PetyaMarkovaBogdanova Jan 7, 2026
a2bc90b
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Jan 8, 2026
8775ffc
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Jan 8, 2026
30df429
Merge branch 'poc-toolbar-item' of github.com:UI5/webcomponents into …
PetyaMarkovaBogdanova Jan 8, 2026
fc27605
fix(ui5-toolbar-item): remove code from components that is not needed
PetyaMarkovaBogdanova Jan 8, 2026
679d062
fix(ui5-toolbar-item): code-review comments addressed
PetyaMarkovaBogdanova Jan 19, 2026
0bc2aa0
fix(ui5-toolbar-item): code-review comments addressed
PetyaMarkovaBogdanova Jan 19, 2026
b12a993
fix(ui5-toolbar-item): correct code issue
PetyaMarkovaBogdanova Jan 19, 2026
4509ab9
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Jan 19, 2026
ba4b188
fix(ui5-toolbar-item): checkForWrapper fixed
PetyaMarkovaBogdanova Jan 19, 2026
f45a9f7
Merge branch 'poc-toolbar-item' of github.com:UI5/webcomponents into …
PetyaMarkovaBogdanova Jan 19, 2026
b290e9c
fix(ui5-toolbar-item): code reviews feedback implementation
PetyaMarkovaBogdanova Jan 30, 2026
e3d3642
fix(ui5-toolbar): typo in sample fixed
PetyaMarkovaBogdanova Feb 3, 2026
08885fa
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Feb 3, 2026
ff66797
chore(ui5-toolbar): experimental flag added
PetyaMarkovaBogdanova Feb 9, 2026
7ee5579
Merge branch 'main' into poc-toolbar-item
PetyaMarkovaBogdanova Feb 9, 2026
4d62c86
chore(ui5-toolbar): failing tests fixed
PetyaMarkovaBogdanova Feb 9, 2026
5d17701
Merge branch 'poc-toolbar-item' of github.com:UI5/webcomponents into …
PetyaMarkovaBogdanova Feb 9, 2026
8b69cba
chore(ui5-toolbar): failing tests fixed
PetyaMarkovaBogdanova Feb 9, 2026
7127372
feat(ui5-toolbar): failing tests fixed
PetyaMarkovaBogdanova Feb 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 124 additions & 1 deletion packages/main/cypress/specs/Toolbar.cy.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import ToolbarSelect from "../../src/ToolbarSelect.js";
import ToolbarSelectOption from "../../src/ToolbarSelectOption.js";
import ToolbarSeparator from "../../src/ToolbarSeparator.js";
import ToolbarSpacer from "../../src/ToolbarSpacer.js";
import type ToolbarItem from "../../src/ToolbarItem.js";
import ToolbarItem from "../../src/ToolbarItem.js";
import add from "@ui5/webcomponents-icons/dist/add.js";
import decline from "@ui5/webcomponents-icons/dist/decline.js";
import employee from "@ui5/webcomponents-icons/dist/employee.js";
Expand Down Expand Up @@ -572,3 +572,126 @@ describe("Toolbar Button", () => {
cy.get("#value-input").should("have.value", "1");
});
});

describe("Toolbar Item", () => {
it("Should render ui5-toolbar-item with correct properties and not suppress events", () => {
// Mount the Toolbar with a ui5-toolbar-item wrapping a web component
cy.mount(
<Toolbar>
<ToolbarItem prevent-overflow-closing overflow-priority="AlwaysOverflow">
<Button id="innerButton" icon="employee">User Menu</Button>
</ToolbarItem>
</Toolbar>
);

// Verify the ui5-toolbar-item has the correct properties
cy.get("ui5-toolbar-item").should((item) => {
expect(item).to.have.attr("prevent-overflow-closing");
expect(item).to.have.attr("overflow-priority", "AlwaysOverflow");
});

// Verify the inner component (ui5-button) is rendered
cy.get("ui5-toolbar-item")
.find("ui5-button").should((button) => {
expect(button).to.exist;
expect(button).to.contain.text("User Menu");
});

// Attach a click event to the inner button
cy.get("ui5-button#innerButton")
.then(button => {
button.get(0).addEventListener("click", cy.stub().as("buttonClicked"));
});

// Trigger a click event on the inner button
cy.get("ui5-button#innerButton").click();

// Verify the click event was triggered
cy.get("@buttonClicked").should("have.been.calledOnce");
});

it("Should respect prevent-overflow-closing property", () => {
// Mount the Toolbar with constrained width to force overflow
cy.mount(
<div style={{ width: "200px" }}>
<Toolbar>
<ToolbarItem overflow-priority="AlwaysOverflow" prevent-overflow-closing>
<Button id="preventCloseButton" icon="employee">Prevent Close</Button>
</ToolbarItem>
<ToolbarItem overflow-priority="AlwaysOverflow">
<Button id="normalButton" icon="add">Normal Button</Button>
</ToolbarItem>
</Toolbar>
</div>
);

// Wait for overflow processing
cy.wait(500);

// Click the overflow button to open the popover
cy.get("ui5-toolbar")
.shadow()
.find(".ui5-tb-overflow-btn")
.click();

// Verify the popover is open
cy.get("ui5-toolbar")
.shadow()
.find(".ui5-overflow-popover")
.should("have.prop", "open", true);

// Click on the item with prevent-overflow-closing
cy.get("ui5-toolbar-item[prevent-overflow-closing]")
.find("ui5-button")
.click();

// Verify the popover remains open
cy.get("ui5-toolbar")
.shadow()
.find(".ui5-overflow-popover")
.should("have.prop", "open", true);

// Optional: Test that normal items still close the popover
cy.get("ui5-toolbar-item:not([prevent-overflow-closing])")
.find("ui5-button")
.click();

// Verify the popover closes
cy.get("ui5-toolbar")
.shadow()
.find(".ui5-overflow-popover")
.should("have.prop", "open", false);
});

it("Should respect overflow-priority property", () => {
// Mount the Toolbar with multiple ui5-toolbar-items
cy.mount(
<Toolbar>
<ToolbarItem overflow-priority="AlwaysOverflow">
<Button id="highPriorityButton" icon="employee">High Priority</Button>
</ToolbarItem>
<ToolbarItem overflow-priority="NeverOverflow">
<Button id="lowPriorityButton" icon="employee">Low Priority</Button>
</ToolbarItem>
</Toolbar>
);

// Verify the overflow-priority property is respected
cy.get("ui5-toolbar-item[overflow-priority='AlwaysOverflow']")
.should("exist")
.should("have.attr", "overflow-priority", "AlwaysOverflow");

cy.get("ui5-toolbar-item[overflow-priority='NeverOverflow']")
.should("exist")
.should("have.attr", "overflow-priority", "NeverOverflow");

// Simulate overflow behavior and ensure high-priority item remains visible
cy.viewport(300, 1080); // Simulate a smaller viewport
cy.get("ui5-toolbar-item[overflow-priority='NeverOverflow']")
.should("be.visible");

// Ensure low-priority item is hidden or moved to overflow
cy.get("ui5-toolbar-item[overflow-priority='AlwaysOverflow']")
.should("not.be.visible");
});
})
44 changes: 43 additions & 1 deletion packages/main/src/ToolbarItem.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
import property from "@ui5/webcomponents-base/dist/decorators/property.js";
import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
import jsxRenderer from "@ui5/webcomponents-base/dist/renderer/JsxRenderer.js";
import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
import ToolbarItemTemplate from "./ToolbarItemTemplate.js";

import type ToolbarItemOverflowBehavior from "./types/ToolbarItemOverflowBehavior.js";

Expand All @@ -16,13 +20,23 @@ type ToolbarItemEventDetail = {
bubbles: true,
})

@event("click", {
bubbles: true,
})

@customElement({
tag: "ui5-toolbar-item",
languageAware: true,
renderer: jsxRenderer,
template: ToolbarItemTemplate,
})

/**
* @class
*
* Represents an abstract class for items, used in the `ui5-toolbar`.
* @constructor
* @extends UI5Element
* @abstract
* @public
* @since 1.17.0
*/
Expand Down Expand Up @@ -60,6 +74,17 @@ class ToolbarItem extends UI5Element {
@property({ type: Boolean })
isOverflowed: boolean = false;

/**
* Defines if the toolbar item is overflowed.
* @default false
* @since 2.11.0
*/

@slot({
"default": true, type: HTMLElement, invalidateOnChildChange: true,
})
item!: HTMLElement | undefined;

/**
* Defines if the width of the item should be ignored in calculating the whole width of the toolbar
* @protected
Expand Down Expand Up @@ -107,10 +132,27 @@ class ToolbarItem extends UI5Element {
},
};
}

constructor() {
super();
}

/**
* Handles the click event on the toolbar item.
* If `preventOverflowClosing` is false, it will fire a "close-overflow" event.
*/
onClick(e: Event): void {
e.stopImmediatePropagation();
if (!this.preventOverflowClosing) {
this.fireDecoratorEvent("close-overflow");
}
}
}

export type {
IEventOptions,
ToolbarItemEventDetail,
};
ToolbarItem.define();

export default ToolbarItem;
9 changes: 9 additions & 0 deletions packages/main/src/ToolbarItemTemplate.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import type ToolbarItem from "./ToolbarItem.js";

export default function ToolbarItemTemplate(this: ToolbarItem) {
return (
<div onClick={this.onClick}>
<slot></slot>
</div>
);
}
4 changes: 3 additions & 1 deletion packages/main/test/pages/Toolbar.html
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@
</ui5-toolbar-select>
<ui5-toolbar-separator></ui5-toolbar-separator>
<ui5-toolbar-separator></ui5-toolbar-separator>
<ui5-toolbar-button icon="employee" text="Call me later"></ui5-toolbar-button>
<ui5-toolbar-item overflow-priority="AlwaysOverflow">
<ui5-button icon="employee">Call me later</ui5-button>
</ui5-toolbar-item>
</ui5-toolbar>
</section>
<br /><br />
Expand Down
68 changes: 68 additions & 0 deletions packages/main/test/pages/ToolbarWrappers.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<!DOCTYPE html>
<html>

<head>
<meta charset="utf-8">

<title>Toolbar</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta charset="utf-8">

<script src="%VITE_BUNDLE_PATH%" type="module"></script>
<link rel="stylesheet" type="text/css" href="./styles/Toolbar.css">
</head>

<body>
<div id="toolbars-container">
<ui5-title level="H3">Standard Toolbar with ToolbarSelect and ToolbarButton</ui5-title>
<br />
<section>
<ui5-toolbar id="otb_standard">
<ui5-toolbar-button icon="add" stable-dom-ref="otb_button_1" text="Left 1 (long)"></ui5-toolbar-button>
<ui5-toolbar-button icon="decline" text="Left 2"></ui5-toolbar-button>
<ui5-toolbar-button icon="employee" text="Left 3"></ui5-toolbar-button>
<ui5-toolbar-button icon="decline" text="Left 4"></ui5-toolbar-button>
<ui5-toolbar-button icon="add" text="Mid 1"></ui5-toolbar-button>
<ui5-toolbar-button icon="decline" text="Mid 2"></ui5-toolbar-button>
<ui5-toolbar-button icon="add" text="Right 1"></ui5-toolbar-button>
<ui5-toolbar-button overflow-priority="NeverOverflow" icon="employee" text="Right 4"></ui5-toolbar-button>
<ui5-toolbar-select id="toolbar-select">
<ui5-toolbar-select-option>1</ui5-toolbar-select-option>
<ui5-toolbar-select-option selected>2</ui5-toolbar-select-option>
<ui5-toolbar-select-option>3</ui5-toolbar-select-option>
</ui5-toolbar-select>
<ui5-toolbar-separator></ui5-toolbar-separator>
<ui5-toolbar-separator></ui5-toolbar-separator>
<ui5-toolbar-button overflow-priority="AlwaysOverflow" icon="employee" prevent-overflow-closing text="Call me later" ></ui5-toolbar-button>
</ui5-toolbar>
</section>
<ui5-title level="H3">Toolbar with ui5-select and ui5-button wrapped in ui5-toolbar-item</ui5-title>
<br />
<section>
<ui5-toolbar id="otb_standard">
<ui5-toolbar-item><ui5-button icon="add" stable-dom-ref="otb_button_1">Left 1 (long)</ui5-button></ui5-toolbar-item>
<ui5-toolbar-item><ui5-button icon="decline">Left 2</ui5-button></ui5-toolbar-item>
<ui5-toolbar-item><ui5-button icon="employee">Left 3</ui5-button></ui5-toolbar-item>
<ui5-toolbar-item><ui5-button icon="decline">Left 4</ui5-button></ui5-toolbar-item>
<ui5-toolbar-item><ui5-button icon="add">Mid 1</ui5-button></ui5-toolbar-item>
<ui5-toolbar-item><ui5-button icon="decline">Mid 2</ui5-button></ui5-toolbar-item>
<ui5-toolbar-item><ui5-button icon="add">Right 1</ui5-button></ui5-toolbar-item>
<ui5-toolbar-item overflow-priority="NeverOverflow"><ui5-button icon="employee">Right 4</ui5-button></ui5-toolbar-item>
<ui5-toolbar-item>
<ui5-select id="toolbar-select">
<ui5-option>1</ui5-option>
<ui5-option selected>2</ui5-option>
<ui5-option>3</ui5-option>
</ui5-select>
</ui5-toolbar-item>
<ui5-toolbar-separator></ui5-toolbar-separator>
<ui5-toolbar-separator></ui5-toolbar-separator>
<ui5-toolbar-item overflow-priority="AlwaysOverflow" prevent-overflow-closing >
<ui5-button icon="employee">Call me later</ui5-button>
</ui5-toolbar-item>
</ui5-toolbar>
</section>
</div>
</body>

</html>
Loading