diff --git a/package.json b/package.json index 69bf1588..d1c9a583 100644 --- a/package.json +++ b/package.json @@ -74,4 +74,4 @@ "typescript": "catalog:" }, "packageManager": "pnpm@10.10.0" -} \ No newline at end of file +} diff --git a/packages/demo/src/examples/example08.html b/packages/demo/src/examples/example08.html index b81ed0ad..5155bb93 100644 --- a/packages/demo/src/examples/example08.html +++ b/packages/demo/src/examples/example08.html @@ -63,4 +63,24 @@

+ +
+ + +
+
+ +
+
+
+ +
+ + +
+
+ +
+
+
diff --git a/packages/demo/src/examples/example08.ts b/packages/demo/src/examples/example08.ts index 4b58f94c..8c2c976d 100644 --- a/packages/demo/src/examples/example08.ts +++ b/packages/demo/src/examples/example08.ts @@ -6,6 +6,8 @@ export default class Example { ms3?: MultipleSelectInstance; ms4?: MultipleSelectInstance; ms5?: MultipleSelectInstance; + ms6?: MultipleSelectInstance; + ms7?: MultipleSelectInstance; mount() { this.ms1 = multipleSelect('#basic', { @@ -157,6 +159,42 @@ export default class Example { }, ], }) as MultipleSelectInstance; + + this.ms6 = multipleSelect('#single-form', { + dataTest: 'select6', + data: [ + { + text: 'June', + value: 6, + }, + { + text: 'July', + value: 7, + }, + { + text: 'August', + value: 8, + }, + ], + }) as MultipleSelectInstance; + + this.ms7 = multipleSelect('#multiple-form', { + dataTest: 'select7', + data: [ + { + text: 'June', + value: 6, + }, + { + text: 'July', + value: 7, + }, + { + text: 'August', + value: 8, + }, + ], + }) as MultipleSelectInstance; } unmount() { @@ -166,10 +204,14 @@ export default class Example { this.ms3?.destroy(); this.ms4?.destroy(); this.ms5?.destroy(); + this.ms6?.destroy(); + this.ms7?.destroy(); this.ms1 = undefined; this.ms2 = undefined; this.ms3 = undefined; this.ms4 = undefined; this.ms5 = undefined; + this.ms6 = undefined; + this.ms7 = undefined; } } diff --git a/packages/multiple-select-vanilla/src/MultipleSelectInstance.ts b/packages/multiple-select-vanilla/src/MultipleSelectInstance.ts index 43006d53..17c9edb4 100644 --- a/packages/multiple-select-vanilla/src/MultipleSelectInstance.ts +++ b/packages/multiple-select-vanilla/src/MultipleSelectInstance.ts @@ -335,9 +335,37 @@ export class MultipleSelectInstance { this.data = this.data.sort(this.options.preSort); } + if (!this.fromHtml) { + this.initHtmlRows(); + } + this.dataTotal = setDataKeys(this.data || []); } + protected initHtmlRows() { + this.elm.innerHTML = ''; + if (!this.data) return; + this.data.forEach((it: OptGroupRowData | OptionRowData) => { + if (it.type === 'optgroup') { + const optgroup = document.createElement('optgroup'); + optgroup.label = (it as OptGroupRowData).label; + (it as OptGroupRowData).children.forEach((opt: OptionRowData) => { + this.buildOption(optgroup, opt); + }); + this.elm.appendChild(optgroup); + } else { + this.buildOption(this.elm, it as OptionRowData); + } + }); + } + + protected buildOption(parent: HTMLElement, it: OptionRowData) { + const option = document.createElement('option'); + option.value = it.value.toString(); + option.text = it.text; + parent.appendChild(option); + } + protected initRow(elm: HTMLOptionElement, groupDisabled?: boolean) { const row = {} as OptionRowData | OptGroupRowData; if (elm.tagName?.toLowerCase() === 'option') { @@ -1243,6 +1271,7 @@ export class MultipleSelectInstance { isLazyProcess = true; this.dropElm?.querySelector('ul.ms-list')?.remove(); this.options.lazyData().then(data => { + this.fromHtml = false; // when data is ready, remove spinner & update dropdown and selection this.options.data = data; this._isLazyLoaded = true; @@ -1553,7 +1582,7 @@ export class MultipleSelectInstance { } else { // when multiple values could be set, we need to loop through each Array.from(this.elm.options).forEach(option => { - option.selected = selectedValues.some(val => val === option.value); + option.selected = selectedValues.some(val => val.toString() === option.value); }); } diff --git a/playwright/e2e/example08.spec.ts b/playwright/e2e/example08.spec.ts index 7eca0e5f..d37e624c 100644 --- a/playwright/e2e/example08.spec.ts +++ b/playwright/e2e/example08.spec.ts @@ -43,4 +43,33 @@ test.describe('Example 08 - Data Property', () => { await page.getByRole('option', { name: 'Group 1' }).click(); await page.getByRole('button', { name: '11 of 12 selected' }).click(); }); + + test('formdata should be updated after select for regular select', async({ page }) => { + await page.goto('#/example08'); + await page.locator('div[data-test=select6].ms-parent').click(); + await page.getByRole('option', { name: 'July' }).click(); + + const selectedItemValue = await page.evaluate(() => { + const form = document.getElementById('form1'); + const formData = new FormData(form); + return formData.get('select6'); + }) + + expect(selectedItemValue).toBe("7"); + }); + + test('formdata should be updated after select for multiple select', async({ page }) => { + await page.goto('#/example08'); + await page.locator('div[data-test=select7].ms-parent').click(); + await page.getByRole('option', { name: 'July' }).click(); + await page.getByRole('option', { name: 'August' }).click(); + + const selectedItemValue = await page.evaluate(() => { + const form = document.getElementById('form2'); + const formData = new FormData(form); + return formData.getAll('select7'); + }) + + expect(selectedItemValue).toEqual(["7", "8"]); + }); });