diff --git a/CHANGELOG.md b/CHANGELOG.md index c63e6d961..deaf5cea4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ### Fixed - **Table**: The empty component threw an error when it was deleted from the document. +- **SingleSelect**, **MultiSelect**: Fix selected state when opened by default. ### Added diff --git a/dev/vscode-multi-select/open-prop.html b/dev/vscode-multi-select/open-prop.html new file mode 100644 index 000000000..cb039db82 --- /dev/null +++ b/dev/vscode-multi-select/open-prop.html @@ -0,0 +1,33 @@ + + + + + + + VSCode Elements + + + + + + + +

Open by default

+
+ + + Lorem + Ipsum + Dolor + + +
+ + + diff --git a/dev/vscode-single-select/open-prop.html b/dev/vscode-single-select/open-prop.html index 1678ea5ca..0219c64a6 100644 --- a/dev/vscode-single-select/open-prop.html +++ b/dev/vscode-single-select/open-prop.html @@ -23,7 +23,8 @@

Open by default

Lorem - Ipsum + Ipsum + Dolor diff --git a/src/includes/vscode-select/vscode-select-base.ts b/src/includes/vscode-select/vscode-select-base.ts index 23ad6fbc8..b96c0fd6e 100644 --- a/src/includes/vscode-select/vscode-select-base.ts +++ b/src/includes/vscode-select/vscode-select-base.ts @@ -231,7 +231,7 @@ export class VscodeSelectBase extends VscElement { const values: string[] = []; this._valueOptionIndexMap = {}; - optionElements.forEach((el) => { + optionElements.forEach((el, i) => { const {innerText, description, disabled} = el; const value = typeof el.value === 'string' ? el.value : innerText.trim(); const selected = el.selected ?? false; @@ -246,6 +246,10 @@ export class VscodeSelectBase extends VscElement { nextIndex = options.push(op); + if (selected && !this._multiple) { + this._activeIndex = i; + } + if (selected) { selectedIndexes.push(options.length - 1); values.push(value); diff --git a/src/vscode-multi-select/vscode-multi-select.test.ts b/src/vscode-multi-select/vscode-multi-select.test.ts index 20ca2731f..2a1ff0a22 100644 --- a/src/vscode-multi-select/vscode-multi-select.test.ts +++ b/src/vscode-multi-select/vscode-multi-select.test.ts @@ -272,6 +272,36 @@ describe('vscode-multi-select', () => { expect(el.value).to.eql(['dolor']); }); + it('open by default', async () => { + const sl = await fixture( + html` + Lorem + Ipsum + Dolor + ` + ); + + expect(sl.shadowRoot?.querySelector('ul.options')).to.be.ok; + }); + + it('shows selected option when opened by default', async () => { + const sl = await fixture( + html` + Lorem + Ipsum + Dolor + ` + ); + + const op = sl.shadowRoot?.querySelector('ul.options li:nth-child(2)'); + + expect(op).lightDom.to.eq(` + + Ipsum + `); + expect(op?.classList.contains('selected')).to.be.true; + }); + it('changes the description of an option in an existing select', async () => { const el = await fixture(html` diff --git a/src/vscode-single-select/vscode-single-select.test.ts b/src/vscode-single-select/vscode-single-select.test.ts index 460662a64..5ae497b5d 100644 --- a/src/vscode-single-select/vscode-single-select.test.ts +++ b/src/vscode-single-select/vscode-single-select.test.ts @@ -925,6 +925,21 @@ describe('vscode-single-select', () => { expect(sl.shadowRoot?.querySelector('ul.options')).to.be.ok; }); + it('shows selected option when opened by default', async () => { + const sl = await fixture( + html` + Lorem + Ipsum + Dolor + ` + ); + + const op = sl.shadowRoot?.querySelector('ul.options li:nth-child(2)'); + + expect(op).lightDom.to.eq('Ipsum'); + expect(op?.classList.contains('selected')).to.be.true; + }); + it('changes the description of an option in an existing select', async () => { const el = await fixture(html` diff --git a/src/vscode-single-select/vscode-single-select.ts b/src/vscode-single-select/vscode-single-select.ts index 3e4d883fd..402092af3 100644 --- a/src/vscode-single-select/vscode-single-select.ts +++ b/src/vscode-single-select/vscode-single-select.ts @@ -340,8 +340,9 @@ export class VscodeSingleSelect const options = list.map((op, index) => { const classes = classMap({ option: true, - active: index === this._activeIndex && !op.disabled, disabled: op.disabled, + selected: op.selected, + active: index === this._activeIndex && !op.disabled, }); return html`