Skip to content

Commit 14e6677

Browse files
committed
Add options (and optgroups) when select built not from html
1 parent 55e51c2 commit 14e6677

File tree

4 files changed

+84
-9
lines changed

4 files changed

+84
-9
lines changed

packages/demo/src/examples/example08.html

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,21 @@ <h2 class="bd-title">
6565
</div>
6666

6767
<div class="mb-3 row">
68-
<label class="col-sm-2">With Form</label>
68+
<label class="col-sm-2">Single Select With Form</label>
6969

7070
<div class="col-sm-10">
71-
<form id="form">
72-
<select name="select6" id="withform" class="full-width"></select>
71+
<form id="form1">
72+
<select name="select6" id="single-form" class="full-width"></select>
73+
</form>
74+
</div>
75+
</div>
76+
77+
<div class="mb-3 row">
78+
<label class="col-sm-2">Multiple Select With Form</label>
79+
80+
<div class="col-sm-10">
81+
<form id="form2">
82+
<select name="select7" id="multiple-form" class="full-width" multiple></select>
7383
</form>
7484
</div>
7585
</div>

packages/demo/src/examples/example08.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ export default class Example {
159159
],
160160
}) as MultipleSelectInstance;
161161

162-
this.ms6 = multipleSelect('#withform', {
162+
this.ms6 = multipleSelect('#single-form', {
163163
dataTest: 'select6',
164164
data: [
165165
{
@@ -176,6 +176,24 @@ export default class Example {
176176
},
177177
],
178178
}) as MultipleSelectInstance;
179+
180+
this.ms7 = multipleSelect('#multiple-form', {
181+
dataTest: 'select7',
182+
data: [
183+
{
184+
text: 'June',
185+
value: 6,
186+
},
187+
{
188+
text: 'July',
189+
value: 7,
190+
},
191+
{
192+
text: 'August',
193+
value: 8,
194+
},
195+
],
196+
}) as MultipleSelectInstance;
179197
}
180198

181199
unmount() {
@@ -186,11 +204,13 @@ export default class Example {
186204
this.ms4?.destroy();
187205
this.ms5?.destroy();
188206
this.ms6?.destroy();
207+
this.ms7?.destroy();
189208
this.ms1 = undefined;
190209
this.ms2 = undefined;
191210
this.ms3 = undefined;
192211
this.ms4 = undefined;
193212
this.ms5 = undefined;
194213
this.ms6 = undefined;
214+
this.ms7 = undefined;
195215
}
196216
}

packages/multiple-select-vanilla/src/MultipleSelectInstance.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,38 @@ export class MultipleSelectInstance {
335335
this.data = this.data.sort(this.options.preSort);
336336
}
337337

338+
if (!this.fromHtml) {
339+
this.initHtmlRows();
340+
}
341+
338342
this.dataTotal = setDataKeys(this.data || []);
339343
}
340344

345+
protected initHtmlRows() {
346+
this.elm.innerHTML = '';
347+
if (!this.data) return
348+
this.data.forEach((it: OptGroupRowData | OptionRowData) => {
349+
console.log({ it })
350+
if (it.type == 'optgroup') {
351+
const optgroup = document.createElement('optgroup');
352+
optgroup.label = it.label;
353+
(it as OptGroupRowData).children.forEach((opt: OptionRowData) => {
354+
this.buildOption(optgroup, opt);
355+
})
356+
this.elm.appendChild(optgroup);
357+
} else {
358+
this.buildOption(this.elm, (it as OptionRowData));
359+
}
360+
});
361+
}
362+
363+
protected buildOption(parent: HTMLElement, it: OptionRowData) {
364+
const option = document.createElement('option');
365+
option.value = it.value.toString();
366+
option.text = it.text;
367+
parent.appendChild(option);
368+
}
369+
341370
protected initRow(elm: HTMLOptionElement, groupDisabled?: boolean) {
342371
const row = {} as OptionRowData | OptGroupRowData;
343372
if (elm.tagName?.toLowerCase() === 'option') {
@@ -1243,6 +1272,7 @@ export class MultipleSelectInstance {
12431272
isLazyProcess = true;
12441273
this.dropElm?.querySelector('ul.ms-list')?.remove();
12451274
this.options.lazyData().then(data => {
1275+
this.fromHtml = false;
12461276
// when data is ready, remove spinner & update dropdown and selection
12471277
this.options.data = data;
12481278
this._isLazyLoaded = true;
@@ -1553,7 +1583,7 @@ export class MultipleSelectInstance {
15531583
} else {
15541584
// when multiple values could be set, we need to loop through each
15551585
Array.from(this.elm.options).forEach(option => {
1556-
option.selected = selectedValues.some(val => val === option.value);
1586+
option.selected = selectedValues.some(val => val.toString() === option.value);
15571587
});
15581588
}
15591589

playwright/e2e/example08.spec.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,32 @@ test.describe('Example 08 - Data Property', () => {
4444
await page.getByRole('button', { name: '11 of 12 selected' }).click();
4545
});
4646

47-
test('formdata should be updated after select', async({ page }) => {
47+
test('formdata should be updated after select for regular select', async({ page }) => {
4848
await page.goto('#/example08');
4949
await page.locator('div[data-test=select6].ms-parent').click();
5050
await page.getByRole('option', { name: 'July' }).click();
5151

5252
const selectedItemValue = await page.evaluate(() => {
53-
const form = document.getElementById('form');
53+
const form = document.getElementById('form1');
5454
const formData = new FormData(form);
55-
return formData.get('select6')
55+
return formData.get('select6');
5656
})
5757

58-
expect(selectedItemValue).toBe(7)
58+
expect(selectedItemValue).toBe("7");
59+
});
60+
61+
test('formdata should be updated after select for multiple select', async({ page }) => {
62+
await page.goto('#/example08');
63+
await page.locator('div[data-test=select7].ms-parent').click();
64+
await page.getByRole('option', { name: 'July' }).click();
65+
await page.getByRole('option', { name: 'August' }).click();
66+
67+
const selectedItemValue = await page.evaluate(() => {
68+
const form = document.getElementById('form2');
69+
const formData = new FormData(form);
70+
return formData.getAll('select7');
71+
})
72+
73+
expect(selectedItemValue).toEqual(["7", "8"]);
5974
});
6075
});

0 commit comments

Comments
 (0)