This commit is contained in:
Eric Liu 2025-08-17 13:46:40 -07:00 committed by GitHub
commit 77d72b43d2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 142 additions and 135 deletions

View file

@ -47,6 +47,7 @@
<div
bind:this={ref}
{role}
{id}
aria-expanded={ariaExpanded}
aria-owns={(ariaExpanded && menuId) || undefined}
aria-controls={(ariaExpanded && menuId) || undefined}

View file

@ -347,6 +347,22 @@
class="bx--list-box__invalid-icon bx--list-box__invalid-icon--warning"
/>
{/if}
<div class:bx--list-box__field--wrapper={true}>
{#if checked.length > 0}
<ListBoxSelection
selectionCount={checked.length}
on:clear
on:clear={() => {
selectedIds = [];
sortedItems = sortedItems.map((item) => ({
...item,
checked: false,
}));
}}
translateWithId={translateWithIdSelection}
{disabled}
/>
{/if}
<ListBoxField
role="button"
tabindex="0"
@ -404,21 +420,6 @@
{disabled}
{translateWithId}
>
{#if checked.length > 0}
<ListBoxSelection
selectionCount={checked.length}
on:clear
on:clear={() => {
selectedIds = [];
sortedItems = sortedItems.map((item) => ({
...item,
checked: false,
}));
}}
translateWithId={translateWithIdSelection}
{disabled}
/>
{/if}
{#if filterable}
<input
bind:this={inputRef}
@ -498,6 +499,7 @@
<ListBoxMenuIcon {open} {translateWithId} />
{/if}
</ListBoxField>
</div>
<div style:display={open ? "block" : "none"}>
<ListBoxMenu aria-label={ariaLabel} {id} aria-multiselectable="true">
{#each filterable ? filteredItems : sortedItems as item, i (item.id)}

View file

@ -465,20 +465,24 @@ describe("MultiSelect", () => {
selectedIds: ["0", "1"],
},
});
await user.click(screen.getAllByRole("button")[0]);
await openMenu();
const options = screen.getAllByRole("option");
expect(options[0]).toHaveAttribute("aria-selected", "true");
expect(options[1]).toHaveAttribute("aria-selected", "true");
expect(options[2]).toHaveAttribute("aria-selected", "false");
const clearButton = screen.getByRole("button", { name: /clear/i });
await closeMenu();
const clearButton = screen.getByRole("button", {
name: /clear all selected items/i,
});
await user.click(clearButton);
await user.click(screen.getByRole("button"));
expect(options[0]).toHaveAttribute("aria-selected", "false");
expect(options[1]).toHaveAttribute("aria-selected", "false");
expect(options[2]).toHaveAttribute("aria-selected", "false");
await openMenu();
const updatedOptions = screen.getAllByRole("option");
expect(updatedOptions[0]).toHaveAttribute("aria-selected", "false");
expect(updatedOptions[1]).toHaveAttribute("aria-selected", "false");
expect(updatedOptions[2]).toHaveAttribute("aria-selected", "false");
});
it("skips disabled items during keyboard navigation", async () => {