Skip to content

Commit ef73f1e

Browse files
authored
chore: add avatar text template demo directly from html (#253)
1 parent 6126782 commit ef73f1e

File tree

4 files changed

+90
-10
lines changed

4 files changed

+90
-10
lines changed

packages/demo/src/examples/example16.html

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,21 @@ <h2 class="bd-title">
2828
<label class="col-sm-2 col-form-label">Avatar Template</label>
2929

3030
<div class="col-sm-10">
31-
<select class="data full-width" data-test="data">
31+
<select id="select1" class="full-width" data-test="select1">
32+
</select>
33+
</div>
34+
</div>
35+
36+
<div class="mb-3 row">
37+
<label class="col-sm-2 col-form-label">Avatar Text Template</label>
38+
39+
<div class="col-sm-10">
40+
<select id="select2" class="full-width" data-test="select2">
41+
<option value="1">Eric::Developer</option>
42+
<option value="2">Smith::Accounting</option>
43+
<option value="3">Erika::Designer</option>
44+
<option value="4">Julia::Finance</option>
45+
<option value="5">Catherine::HR</option>
3246
</select>
3347
</div>
3448
</div>

packages/demo/src/examples/example16.scss

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,19 @@
55
border-radius: 50%;
66
vertical-align: middle;
77
}
8+
.image-container {
9+
display: flex;
10+
align-items: center;
11+
gap: 15px;
12+
}
13+
.name-section {
14+
font-size: 14px;
15+
line-height: 20px;
16+
}
17+
.job-section {
18+
font-size: 13px;
19+
line-height: 16px;
20+
}
821
.ms-parent {
922
font-size: 1.1em;
1023
height: 50px;
Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import DOMPurify from 'dompurify';
12
import { type MultipleSelectInstance, multipleSelect } from 'multiple-select-vanilla';
23

34
import avatar1 from './images/avatar1.png';
@@ -8,24 +9,62 @@ import avatar5 from './images/avatar5.png';
89
import './example16.scss';
910

1011
export default class Example {
11-
ms?: MultipleSelectInstance;
12+
ms1?: MultipleSelectInstance;
13+
ms2?: MultipleSelectInstance;
1214

1315
mount() {
14-
this.ms = multipleSelect('.data', {
16+
this.ms1 = multipleSelect('[data-test=select1]', {
1517
data: [
1618
{ value: '1', text: `<img alt="avatar1" src="${avatar1}" class="avatar"> Eric` },
1719
{ value: '2', text: `<img alt="avatar2" src="${avatar2}" class="avatar"> Smith` },
1820
{ value: '3', text: `<img alt="avatar3" src="${avatar3}" class="avatar"> Erika` },
1921
{ value: '4', text: `<img alt="avatar4" src="${avatar4}" class="avatar"> Julia` },
2022
{ value: '5', text: `<img alt="avatar5" src="${avatar5}" class="avatar"> Catherine` },
2123
],
24+
infiniteScroll: true,
2225
renderOptionLabelAsHtml: true, // without this flag, html code will be showing as plain text
2326
}) as MultipleSelectInstance;
27+
28+
this.ms2 = multipleSelect('[data-test=select2]', {
29+
singleRadio: true,
30+
renderOptionLabelAsHtml: true, // without this flag, html code will be showing as plain text
31+
textTemplate: el => {
32+
const [name, job] = el.textContent!.split('::');
33+
return `<div class="image-container"><img alt="avatar${el.value}" src="${this.getAvatarByIdx(
34+
el.value,
35+
)}" class="avatar"><div class="text-container"><div class="name-section">${name}</div><div class="job-section">${job}</div></div></div>`;
36+
},
37+
sanitizer: html => DOMPurify.sanitize(html, { RETURN_TRUSTED_TYPE: true }),
38+
}) as MultipleSelectInstance;
2439
}
2540

2641
unmount() {
2742
// destroy ms instance(s) to avoid DOM leaks
28-
this.ms?.destroy();
29-
this.ms = undefined;
43+
this.ms1?.destroy();
44+
this.ms2?.destroy();
45+
this.ms1 = undefined;
46+
this.ms2 = undefined;
47+
}
48+
49+
protected getAvatarByIdx(idx: number | string) {
50+
let avatar: any;
51+
switch (+idx) {
52+
case 1:
53+
avatar = avatar1;
54+
break;
55+
case 2:
56+
avatar = avatar2;
57+
break;
58+
case 3:
59+
avatar = avatar3;
60+
break;
61+
case 4:
62+
avatar = avatar4;
63+
break;
64+
case 5:
65+
avatar = avatar5;
66+
break;
67+
}
68+
return avatar;
3069
}
3170
}

playwright/e2e/example16.spec.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,28 @@ import { test, expect } from '@playwright/test';
33
test.describe('Example 16 - Avatar Images as Text Template', () => {
44
test('show avatar images', async ({ page }) => {
55
await page.goto('#/example16');
6-
await page.locator('.ms-parent').click();
6+
7+
// 1st select
8+
await page.locator('.ms-parent[data-test=select1]').click();
79
await page.keyboard.press('ArrowDown');
810
await page.keyboard.press('ArrowDown');
911
await page.keyboard.press('Enter');
12+
const parentSpan1 = await page.locator('.ms-parent[data-test=select1] .ms-choice span');
13+
expect(parentSpan1).toHaveText('Erika');
14+
await expect(parentSpan1.locator('img').getByAltText('image3')).toBeDefined();
15+
await expect(parentSpan1.locator('img')).toHaveAttribute('src', /examples\/images\/avatar3.png/gi);
16+
await expect(page.locator('div[data-test=select1] .ms-drop')).toBeHidden();
1017

11-
const parentSpan = await page.locator('.ms-parent .ms-choice span');
12-
expect(parentSpan).toHaveText('Erika');
13-
await expect(parentSpan.locator('img').getByAltText('image3')).toBeDefined();
14-
await expect(parentSpan.locator('img')).toHaveAttribute('src', /examples\/images\/avatar3.png/gi);
18+
// 2nd select
19+
await page.locator('.ms-parent[data-test=select2]').click();
20+
await page.keyboard.press('ArrowDown');
21+
await page.keyboard.press('ArrowDown');
22+
await page.keyboard.press('Enter');
23+
const parentSpan2 = await page.locator('.ms-parent[data-test=select2] .ms-choice span');
24+
expect(await parentSpan2.locator('.name-section')).toHaveText('Erika');
25+
expect(await parentSpan2.locator('.job-section')).toHaveText('Designer');
26+
await expect(parentSpan2.locator('img').getByAltText('image3')).toBeDefined();
27+
await expect(parentSpan2.locator('img')).toHaveAttribute('src', /examples\/images\/avatar3.png/gi);
28+
await expect(page.locator('div[data-test=select2] .ms-drop')).toBeHidden();
1529
});
1630
});

0 commit comments

Comments
 (0)