Skip to content

Commit 07317bb

Browse files
committed
fix: add selectedIndex and value setter
1 parent e91acbc commit 07317bb

3 files changed

Lines changed: 36 additions & 4 deletions

File tree

src/option.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class OptionElement extends globalThis.HTMLElement {
5353
}
5454

5555
if (name === 'disabled') {
56-
this.#internals.ariaDisabled = newVal != null ? 'true' : 'false';
56+
this.#internals.ariaDisabled = this.disabled ? 'true' : 'false';
5757
this.#ownerElement()?.reset();
5858
}
5959
}

src/selectmenu.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,16 +155,22 @@ class SelectMenuElement extends globalThis.HTMLElement {
155155
return this.options.findIndex(option => option.selected);
156156
}
157157

158-
set selectedIndex(val) {
159-
158+
set selectedIndex(index) {
159+
const option = this.options.find(option => option.index === index);
160+
if (option) {
161+
this.#selectOption(option);
162+
}
160163
}
161164

162165
get value() {
163166
return this.options.find(option => option.selected)?.value ?? '';
164167
}
165168

166169
set value(val) {
167-
170+
const option = this.options.find(option => option.value === val);
171+
if (option) {
172+
this.#selectOption(option);
173+
}
168174
}
169175

170176
get required() {

test/test.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,32 @@ test('selectmenu selects the option w/ selected attribute', async function (t) {
2525
t.equal(selectmenu.selectedIndex, 1);
2626
});
2727

28+
test('selectmenu.selectedIndex selects the option w/ index', async function (t) {
29+
const selectmenu = await fixture(`
30+
<x-selectmenu>
31+
<x-option>Option 1</x-option>
32+
<x-option>Option 2</x-option>
33+
</x-selectmenu>`);
34+
35+
selectmenu.selectedIndex = 1;
36+
37+
t.equal(selectmenu.value, 'Option 2');
38+
t.equal(selectmenu.selectedIndex, 1);
39+
});
40+
41+
test('selectmenu.value selects the option w/ value', async function (t) {
42+
const selectmenu = await fixture(`
43+
<x-selectmenu>
44+
<x-option>Option 1</x-option>
45+
<x-option>Option 2</x-option>
46+
</x-selectmenu>`);
47+
48+
selectmenu.value = 'Option 2';
49+
50+
t.equal(selectmenu.value, 'Option 2');
51+
t.equal(selectmenu.selectedIndex, 1);
52+
});
53+
2854
function delay(ms) {
2955
return new Promise((resolve) => setTimeout(resolve, ms));
3056
}

0 commit comments

Comments
 (0)