Skip to content

Commit e5fff1c

Browse files
authored
fix(ui5-segmented-button): hidden items do not take space (#12210)
Until now, when an `ui-segmented-button-item` was `hidden`, it still took place and `ui5-segmented-button` was wider than sum of widths of all visible items. Also, the `aria-setsize` and `aria-posinset` values didn't respect the count of the visible items. This PR fixes these issues. **JIRA: BGSOFUIBALKAN-9029, case 4**
1 parent 53b1f26 commit e5fff1c

File tree

3 files changed

+61
-7
lines changed

3 files changed

+61
-7
lines changed

packages/main/cypress/specs/SegmentedButton.cy.tsx

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,52 @@ describe("SegmentedButton - getFocusDomRef", () => {
232232
});
233233
});
234234

235+
describe("SegmentedButtonItems appearance", () => {
236+
it("should not render items with hidden property and set correct aria-posinset and aria-setsize", () => {
237+
cy.mount(
238+
<SegmentedButton>
239+
<SegmentedButtonItem>First</SegmentedButtonItem>
240+
<SegmentedButtonItem hidden>Second</SegmentedButtonItem>
241+
<SegmentedButtonItem>Third</SegmentedButtonItem>
242+
</SegmentedButton>
243+
);
244+
245+
cy.get("[ui5-segmented-button]")
246+
.as("segmentedButton");
247+
248+
cy.get("@segmentedButton")
249+
.find("[ui5-segmented-button-item]:not([hidden])")
250+
.as("visibleItems");
251+
252+
cy.get("@segmentedButton")
253+
.find("[ui5-segmented-button-item][hidden]")
254+
.as("hiddenItems");
255+
256+
// Only visible items should be counted by SegmentedButton
257+
cy.get("@segmentedButton")
258+
.invoke("attr", "style")
259+
.should("satisfy", style => style.slice(-9) === "count: 2;");
260+
261+
// Assert aria-posinset and aria-setsize for visible items
262+
cy.get("@visibleItems")
263+
.shadow()
264+
.find("li")
265+
.each(($el, index, $list) => {
266+
cy.wrap($el).should("have.attr", "aria-posinset", `${index + 1}`);
267+
cy.wrap($el).should("have.attr", "aria-setsize", `${$list.length}`);
268+
});
269+
270+
// Assert hidden item does not have aria-posinset and aria-setsize
271+
cy.get("@hiddenItems")
272+
.shadow()
273+
.find("li")
274+
.each(($el) => {
275+
cy.wrap($el).should("not.have.attr", "aria-posinset");
276+
cy.wrap($el).should("not.have.attr", "aria-setsize");
277+
});
278+
});
279+
});
280+
235281
describe("SegmentedButton Accessibility", () => {
236282
it("segmented button should have correct aria label when accessibleName is set", () => {
237283
const LABEL = "Label";
@@ -408,4 +454,4 @@ describe("SebmentedButtonItem Accessibility", () => {
408454
.find("li")
409455
.should("have.attr", "aria-description", REF_DESCRIPTION);
410456
});
411-
});
457+
});

packages/main/src/SegmentedButton.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,15 +161,17 @@ class SegmentedButton extends UI5Element {
161161

162162
onBeforeRendering() {
163163
const items = this.getSlottedNodes<SegmentedButtonItem>("items");
164+
const visibleItems = items.filter(item => !item.hidden);
165+
let index = 1;
164166

165-
items.forEach((item, index, arr) => {
166-
item.posInSet = index + 1;
167-
item.sizeOfSet = arr.length;
167+
items.forEach(item => {
168+
item.posInSet = item.hidden ? undefined : index++;
169+
item.sizeOfSet = item.hidden ? undefined : visibleItems.length;
168170
});
169171

170172
this.normalizeSelection();
171173

172-
this.style.setProperty(getScopedVarName("--_ui5_segmented_btn_items_count"), `${items.length}`);
174+
this.style.setProperty(getScopedVarName("--_ui5_segmented_btn_items_count"), `${visibleItems.length}`);
173175
}
174176

175177
normalizeSelection() {

packages/main/src/SegmentedButtonItem.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,15 +152,21 @@ class SegmentedButtonItem extends UI5Element implements IButton, ISegmentedButto
152152
* @private
153153
*/
154154
@property({ type: Number })
155-
posInSet = 0;
155+
posInSet? = 0;
156156

157157
/**
158158
* Defines how many items are inside of the SegmentedButton.
159159
* @default 0
160160
* @private
161161
*/
162162
@property({ type: Number })
163-
sizeOfSet = 0;
163+
sizeOfSet? = 0;
164+
165+
/**
166+
* @private
167+
*/
168+
@property({ type: Boolean })
169+
hidden = false;
164170

165171
/**
166172
* Defines the text of the component.

0 commit comments

Comments
 (0)