@scania/tegel 1.3.1 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/cjs/loader.cjs.js +1 -1
  2. package/dist/cjs/tds-chip.cjs.entry.js +11 -1
  3. package/dist/cjs/tds-dropdown.cjs.entry.js +9 -2
  4. package/dist/cjs/tds-popover-core.cjs.entry.js +5 -0
  5. package/dist/cjs/tegel.cjs.js +1 -1
  6. package/dist/collection/collection-manifest.json +3 -3
  7. package/dist/collection/components/button/test/basic/button.e2e.js +35 -0
  8. package/dist/collection/components/button/test/danger/button.e2e.js +18 -0
  9. package/dist/collection/components/button/test/disabled/button.e2e.js +24 -0
  10. package/dist/collection/components/button/test/ghost/button.e2e.js +18 -0
  11. package/dist/collection/components/button/test/icon/button.e2e.js +38 -0
  12. package/dist/collection/components/button/test/secondary/button.e2e.js +18 -0
  13. package/dist/collection/components/chip/chip.js +12 -2
  14. package/dist/collection/components/dropdown/dropdown.css +3 -0
  15. package/dist/collection/components/dropdown/dropdown.js +28 -3
  16. package/dist/collection/components/dropdown/dropdown.stories.js +17 -1
  17. package/dist/collection/components/dropdown/test/basic/dropdown.e2e.js +41 -0
  18. package/dist/collection/components/dropdown/test/default/dropdown.e2e.js +76 -0
  19. package/dist/collection/components/dropdown/test/error/dropdown.e2e.js +36 -0
  20. package/dist/collection/components/dropdown/test/filter/dropdown.e2e.js +56 -0
  21. package/dist/collection/components/dropdown/test/filter/normalize-text-false/dropdown.e2e.js +43 -0
  22. package/dist/collection/components/dropdown/test/multiselect/dropdown.e2e.js +81 -0
  23. package/dist/collection/components/message/message.stories.js +0 -1
  24. package/dist/collection/components/message/test/error/message.e2e.js +33 -0
  25. package/dist/collection/components/message/test/information/message.e2e.js +33 -0
  26. package/dist/collection/components/message/test/success/message.e2e.js +33 -0
  27. package/dist/collection/components/message/test/warning/message.e2e.js +33 -0
  28. package/dist/collection/components/popover-core/popover-core.js +5 -0
  29. package/dist/collection/components/table/table/test/batch/table.e2e.js +24 -0
  30. package/dist/collection/components/table/table/test/default/table.e2e.js +46 -0
  31. package/dist/collection/components/table/table/test/expandable-row/table.e2e.js +64 -0
  32. package/dist/collection/components/table/table/test/filtering/table.e2e.js +41 -0
  33. package/dist/collection/components/table/table/test/multiselect/table.e2e.js +47 -0
  34. package/dist/collection/components/table/table/test/pagination/table.e2e.js +53 -0
  35. package/dist/collection/components/table/table/test/sorting/table.e2e.js +36 -0
  36. package/dist/collection/components/table/table-component-filtering.stories.js +2 -0
  37. package/dist/collection/components/table/table-component-pagination.stories.js +2 -0
  38. package/dist/collection/components/textarea/test/basic/textarea.e2e.js +26 -0
  39. package/dist/collection/components/textarea/test/default/textarea.e2e.js +34 -0
  40. package/dist/collection/components/textarea/test/read-only/textarea.e2e.js +26 -0
  41. package/dist/components/popover-core.js +5 -0
  42. package/dist/components/tds-chip.js +12 -2
  43. package/dist/components/tds-dropdown.js +10 -2
  44. package/dist/esm/loader.js +1 -1
  45. package/dist/esm/tds-chip.entry.js +11 -1
  46. package/dist/esm/tds-dropdown.entry.js +9 -2
  47. package/dist/esm/tds-popover-core.entry.js +5 -0
  48. package/dist/esm/tegel.js +1 -1
  49. package/dist/tegel/p-33dfc79a.entry.js +1 -0
  50. package/dist/tegel/{p-9e1430c5.entry.js → p-49c03547.entry.js} +1 -1
  51. package/dist/tegel/p-c1f3d3a9.entry.js +1 -0
  52. package/dist/tegel/tegel.css +2 -2
  53. package/dist/tegel/tegel.esm.js +1 -1
  54. package/dist/types/components/block/block.d.ts +11 -0
  55. package/dist/types/components/dropdown/dropdown-option/dropdown-option.d.ts +1 -0
  56. package/dist/types/components/dropdown/dropdown.d.ts +7 -3
  57. package/dist/types/components/dropdown/dropdown.stories.d.ts +13 -0
  58. package/dist/types/components/header/header-launcher/header-launcher.d.ts +15 -0
  59. package/dist/types/components/popover-canvas/popover-canvas.d.ts +27 -0
  60. package/dist/types/components/popover-core/popover-core.d.ts +47 -0
  61. package/dist/types/components/popover-menu/popover-menu.d.ts +28 -0
  62. package/dist/types/components/side-menu/side-menu-item/side-menu-item.d.ts +24 -0
  63. package/dist/types/components/side-menu/side-menu.d.ts +45 -0
  64. package/dist/types/components/table/table-body/table-body.d.ts +24 -0
  65. package/dist/types/components/table/table-body-cell/table-body-cell.d.ts +27 -0
  66. package/dist/types/components/table/table-body-row/table-body-row.d.ts +28 -0
  67. package/dist/types/components/table/table-body-row-expandable/table-body-row-expandable.d.ts +29 -0
  68. package/dist/types/components/table/table-header/table-header.d.ts +39 -0
  69. package/dist/types/components/table/table-header-cell/table-header-cell.d.ts +56 -0
  70. package/dist/types/components/table/table-toolbar/table-toolbar.d.ts +29 -0
  71. package/dist/types/components/tooltip/tooltip.d.ts +34 -0
  72. package/dist/types/components.d.ts +9 -1
  73. package/package.json +3 -2
  74. package/dist/tegel/p-e5fd7377.entry.js +0 -1
  75. package/dist/tegel/p-ff006811.entry.js +0 -1
@@ -86,7 +86,9 @@ export class TdsDropdown {
86
86
  }
87
87
  else {
88
88
  this.filterResult = children.filter((element) => {
89
- if (!element.textContent.toLowerCase().includes(query.toLowerCase())) {
89
+ if (!this.normalizeString(element.textContent)
90
+ .toLowerCase()
91
+ .includes(this.normalizeString(query).toLowerCase())) {
90
92
  element.setAttribute('hidden', '');
91
93
  }
92
94
  else {
@@ -121,6 +123,7 @@ export class TdsDropdown {
121
123
  this.error = false;
122
124
  this.multiselect = false;
123
125
  this.filter = false;
126
+ this.normalizeText = true;
124
127
  this.noResultText = 'No result';
125
128
  this.defaultValue = undefined;
126
129
  this.open = false;
@@ -270,6 +273,10 @@ export class TdsDropdown {
270
273
  this.setDefaultOption();
271
274
  }
272
275
  }
276
+ /** Method to check if we should normalize text */
277
+ normalizeString(text) {
278
+ return this.normalizeText ? text.normalize('NFD').replace(/\p{Diacritic}/gu, '') : text;
279
+ }
273
280
  /** Method that resets the dropdown without emitting an event. */
274
281
  internalReset() {
275
282
  this.getChildren().forEach((element) => {
@@ -570,6 +577,24 @@ export class TdsDropdown {
570
577
  "reflect": false,
571
578
  "defaultValue": "false"
572
579
  },
580
+ "normalizeText": {
581
+ "type": "boolean",
582
+ "mutable": false,
583
+ "complexType": {
584
+ "original": "boolean",
585
+ "resolved": "boolean",
586
+ "references": {}
587
+ },
588
+ "required": false,
589
+ "optional": false,
590
+ "docs": {
591
+ "tags": [],
592
+ "text": "Normalizes input text for fuzzier search"
593
+ },
594
+ "attribute": "normalize-text",
595
+ "reflect": false,
596
+ "defaultValue": "true"
597
+ },
573
598
  "noResultText": {
574
599
  "type": "string",
575
600
  "mutable": false,
@@ -714,7 +739,7 @@ export class TdsDropdown {
714
739
  },
715
740
  "setValue": {
716
741
  "complexType": {
717
- "signature": "(value: string | string[], label?: string) => Promise<{ value: any; label: any; }[]>",
742
+ "signature": "(value: string | string[], label?: string) => Promise<{ value: string; label: string; }[]>",
718
743
  "parameters": [{
719
744
  "tags": [],
720
745
  "text": ""
@@ -732,7 +757,7 @@ export class TdsDropdown {
732
757
  "id": "global::HTMLTdsDropdownOptionElement"
733
758
  }
734
759
  },
735
- "return": "Promise<{ value: any; label: any; }[]>"
760
+ "return": "Promise<{ value: string; label: string; }[]>"
736
761
  },
737
762
  "docs": {
738
763
  "text": "Method for setting the value of the Dropdown.\n\nSingle selection example:\n\n<code>\ndropdown.setValue('option-1', 'Option 1');\n</code>\n\nMultiselect example:\n\n<code>\ndropdown.setValue(['option-1', 'option-2']);\n</code>",
@@ -52,6 +52,16 @@ export default {
52
52
  defaultValue: { summary: 'false' },
53
53
  },
54
54
  },
55
+ normalizeText: {
56
+ name: 'Normalize text',
57
+ description: 'Should search be normalized',
58
+ control: {
59
+ type: 'boolean',
60
+ },
61
+ table: {
62
+ defaultValue: { summary: 'true' },
63
+ },
64
+ },
55
65
  multiselect: {
56
66
  name: 'Multiselect',
57
67
  description: 'Adds multiselect functionality to the Dropdown.',
@@ -146,6 +156,7 @@ export default {
146
156
  modeVariant: 'Inherit from parent',
147
157
  error: false,
148
158
  filter: false,
159
+ normalizeText: true,
149
160
  multiselect: false,
150
161
  size: 'Large',
151
162
  labelText: 'Label text',
@@ -167,9 +178,10 @@ const defaultOptionLookUp = {
167
178
  'Option 2': 'option-2',
168
179
  'Option 3': 'option-3',
169
180
  'Option 4': 'option-4',
181
+ 'îles Åland': 'iles-aland',
170
182
  };
171
183
  const getMultiselectDefaultValue = (multiDefaultOption) => multiDefaultOption.map((item) => defaultOptionLookUp[item]);
172
- const Template = ({ placeholder, labelText, labelPosition, helperText, size, error, filter, multiselect, openDirection, modeVariant, disabled, defaultOption, multiDefaultOption, }) => formatHtmlPreview(`
184
+ const Template = ({ placeholder, labelText, labelPosition, helperText, size, error, filter, normalizeText, multiselect, openDirection, modeVariant, disabled, defaultOption, multiDefaultOption, }) => formatHtmlPreview(`
173
185
  <style>
174
186
  /* demo-wrapper is for demonstration purposes only*/
175
187
  .demo-wrapper {
@@ -200,6 +212,7 @@ const Template = ({ placeholder, labelText, labelPosition, helperText, size, err
200
212
  size="${sizeLookUp[size]}"
201
213
  ${error ? 'error' : ''}
202
214
  ${filter ? 'filter' : ''}
215
+ ${normalizeText ? '' : `normalize-text="false"`}
203
216
  ${multiselect ? 'multiselect' : ''}
204
217
  ${disabled ? 'disabled' : ''}
205
218
  open-direction="${openDirection.toLowerCase()}"
@@ -216,6 +229,9 @@ const Template = ({ placeholder, labelText, labelPosition, helperText, size, err
216
229
  <tds-dropdown-option value="option-4">
217
230
  Option 4
218
231
  </tds-dropdown-option>
232
+ <tds-dropdown-option value="iles-aland">
233
+ îles Åland
234
+ </tds-dropdown-option>
219
235
  </tds-dropdown>
220
236
  </div>
221
237
 
@@ -0,0 +1,41 @@
1
+ import { test } from "stencil-playwright";
2
+ import { expect } from "@playwright/test";
3
+ const componentTestPath = 'src/components/dropdown/test/basic/index.html';
4
+ test.describe('tds-dropdown-basic', () => {
5
+ test('renders basic dropdown correctly', async ({ page }) => {
6
+ await page.goto(componentTestPath);
7
+ const dropdown = page.getByTestId('tds-dropdown-testid');
8
+ await expect(dropdown).toHaveCount(1);
9
+ /* check diff in screenshot */
10
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
11
+ });
12
+ test('should find label and not exist', async ({ page }) => {
13
+ await page.goto(componentTestPath);
14
+ const labelText = page.getByText(/Label text/);
15
+ await expect(labelText).toHaveCount(0);
16
+ });
17
+ test('find helper text and check not exist', async ({ page }) => {
18
+ await page.goto(componentTestPath);
19
+ const helperText = page.getByText(/Helper text/);
20
+ await expect(helperText).toHaveCount(0);
21
+ });
22
+ test('have the button to be visible', async ({ page }) => {
23
+ await page.goto(componentTestPath);
24
+ const dropdownButton = page.getByRole('button').first();
25
+ await expect(dropdownButton).toBeVisible();
26
+ });
27
+ test('clicking the dropdown button opens the dropdown-list', async ({ page }) => {
28
+ await page.goto(componentTestPath);
29
+ const dropdownButton = page.getByRole('button').first();
30
+ const dropdownListElementOne = page
31
+ .locator('tds-dropdown-option')
32
+ .filter({ hasText: 'Option 1' });
33
+ await expect(dropdownListElementOne).toBeHidden();
34
+ await dropdownButton.click();
35
+ /* before clicking dropdownlist should not be visible, the button should be */
36
+ await expect(dropdownButton).toBeVisible();
37
+ await expect(dropdownListElementOne).toBeVisible();
38
+ /* checks diff on screenshot */
39
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
40
+ });
41
+ });
@@ -0,0 +1,76 @@
1
+ import { test } from "stencil-playwright";
2
+ import { expect } from "@playwright/test";
3
+ const componentTestPath = 'src/components/dropdown/test/default/index.html';
4
+ test.describe('tds-dropdown-default', () => {
5
+ test('renders default dropdown correctly', async ({ page }) => {
6
+ await page.goto(componentTestPath);
7
+ const dropdown = page.getByTestId('tds-dropdown-testid');
8
+ await expect(dropdown).toHaveCount(1);
9
+ /* check diff in screenshot */
10
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
11
+ });
12
+ test('should find label and be visible', async ({ page }) => {
13
+ await page.goto(componentTestPath);
14
+ const labelText = page.getByText(/Label text/);
15
+ await expect(labelText).toBeVisible();
16
+ });
17
+ test('find helper text and check if visible', async ({ page }) => {
18
+ await page.goto(componentTestPath);
19
+ const helperText = page.getByText(/Helper text/);
20
+ await expect(helperText).toBeVisible();
21
+ });
22
+ test('have the placeholder="Placeholder" text', async ({ page }) => {
23
+ await page.goto(componentTestPath);
24
+ const dropdownButton = page.getByRole('button', { name: 'Placeholder' });
25
+ await expect(dropdownButton).toBeVisible();
26
+ });
27
+ test('clicking the dropdown button opens the dropdown-list', async ({ page }) => {
28
+ await page.goto(componentTestPath);
29
+ const dropdownButton = page.getByRole('button', { name: 'Placeholder' });
30
+ const dropdownListElementOne = page
31
+ .locator('tds-dropdown-option')
32
+ .filter({ hasText: 'Option 1' });
33
+ await expect(dropdownListElementOne).toBeHidden();
34
+ await dropdownButton.click();
35
+ /* before clicking dropdownlist should not be visible, the button should be */
36
+ await expect(dropdownButton).toBeVisible();
37
+ await expect(dropdownListElementOne).toBeVisible();
38
+ /* checks diff on screenshot */
39
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
40
+ });
41
+ test('clicking the dropdown opens the dropdown-list, then click Option 1', async ({ page }) => {
42
+ await page.goto(componentTestPath);
43
+ /* click the dropdown button */
44
+ const dropdownButton = page.getByRole('button', { name: 'Placeholder' });
45
+ await dropdownButton.click();
46
+ /* Click the Option 1 button */
47
+ const dropdownListElementOneButton = page
48
+ .locator('tds-dropdown-option')
49
+ .filter({ hasText: /Option 1/ })
50
+ .getByRole('button');
51
+ await dropdownListElementOneButton.click();
52
+ await expect(dropdownListElementOneButton).toBeHidden();
53
+ const dropdownButtonWithOption1 = page.getByRole('button', { name: 'Option 1' });
54
+ await expect(dropdownButtonWithOption1.first()).toBeVisible();
55
+ /* also check screenshot diff to make sure it says Option 1 */
56
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
57
+ });
58
+ test('clicking the dropdown opens the dropdown-list, then click an option 2 that is disabled should not close it', async ({ page, }) => {
59
+ await page.goto(componentTestPath);
60
+ const dropdownListElementTwoButton = page
61
+ .locator('tds-dropdown-option')
62
+ .filter({ hasText: /Option 2/ });
63
+ const dropdownButtonElement = page.getByRole('button', { name: 'Placeholder' });
64
+ /* before clicking dropdownlist should not be visible, the button should be */
65
+ await expect(dropdownButtonElement).toBeVisible();
66
+ await expect(dropdownListElementTwoButton).toBeHidden();
67
+ /* after clicking dropdownlist should be visible, the button should also be */
68
+ await dropdownButtonElement.click();
69
+ await expect(dropdownButtonElement).toBeVisible();
70
+ await expect(dropdownListElementTwoButton).toBeVisible();
71
+ /* after clicking option 2 that is disabled list should be visible and also button should be */
72
+ await dropdownListElementTwoButton.click();
73
+ await expect(dropdownButtonElement).toBeVisible();
74
+ await expect(dropdownListElementTwoButton).toBeVisible();
75
+ });
76
+ });
@@ -0,0 +1,36 @@
1
+ import { test } from "stencil-playwright";
2
+ import { expect } from "@playwright/test";
3
+ const componentTestPath = 'src/components/dropdown/test/error/index.html';
4
+ test.describe('tds-dropdown-error', () => {
5
+ test('renders error dropdown correctly', async ({ page }) => {
6
+ await page.goto(componentTestPath);
7
+ const dropdown = page.getByTestId('tds-dropdown-testid');
8
+ await expect(dropdown).toHaveCount(1);
9
+ /* Check diff on screenshot */
10
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
11
+ });
12
+ test('find helper text and check if visible and have icon', async ({ page }) => {
13
+ await page.goto(componentTestPath);
14
+ const helperText = page.getByText(/Helper text/);
15
+ await expect(helperText).toBeVisible();
16
+ const helperTextIcon = helperText.getByRole('img');
17
+ await expect(helperTextIcon).toHaveCount(1);
18
+ });
19
+ test('clicking the dropdown opens the dropdown-list', async ({ page }) => {
20
+ await page.goto(componentTestPath);
21
+ const dropdownListElementOneButton = page
22
+ .locator('tds-dropdown-option')
23
+ .filter({ hasText: /Option 1/ })
24
+ .getByRole('button');
25
+ const dropdownButton = page.getByRole('button', { name: 'Placeholder' });
26
+ /* before clicking dropdownlist should not be visible, the button should be */
27
+ await expect(dropdownButton).toBeVisible();
28
+ await expect(dropdownListElementOneButton).toBeHidden();
29
+ await dropdownButton.click();
30
+ /* after clicking dropdownlist should be visible, the button should also be */
31
+ await expect(dropdownButton).toBeVisible();
32
+ await expect(dropdownListElementOneButton).toBeVisible();
33
+ /* check diff on screenshot */
34
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
35
+ });
36
+ });
@@ -0,0 +1,56 @@
1
+ import { test } from "stencil-playwright";
2
+ import { expect } from "@playwright/test";
3
+ const componentTestPath = 'src/components/dropdown/test/filter/index.html';
4
+ test.describe('tds-dropdown-filter', () => {
5
+ test('renders filter dropdown correctly', async ({ page }) => {
6
+ await page.goto(componentTestPath);
7
+ const dropdown = page.getByTestId('tds-dropdown-testid');
8
+ await expect(dropdown).toHaveCount(1);
9
+ /* Check diff on screenshot */
10
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
11
+ });
12
+ test('clicking the dropdown opens the dropdown-list, then start typing "iles" to only show that option in the dropdown list', async ({ page, }) => {
13
+ await page.goto(componentTestPath);
14
+ const inputElement = page.getByRole('textbox');
15
+ const dropdownListElementOneButton = page
16
+ .locator('tds-dropdown-option')
17
+ .filter({ hasText: /Option 1/ });
18
+ const dropdownListElementTwoButton = page
19
+ .locator('tds-dropdown-option')
20
+ .filter({ hasText: /Option 2/ });
21
+ const dropdownListElementThreeButton = page
22
+ .locator('tds-dropdown-option')
23
+ .filter({ hasText: /Option 3/ });
24
+ const dropdownListElementFourButton = page
25
+ .locator('tds-dropdown-option')
26
+ .filter({ hasText: /Option 4/ });
27
+ const dropdownListElementFiveButton = page
28
+ .locator('tds-dropdown-option')
29
+ .filter({ hasText: /îles Åland/ });
30
+ /* before clicking dropdownlist should not be visible, the button should be */
31
+ await expect(inputElement).toBeVisible();
32
+ await expect(dropdownListElementOneButton).toBeHidden();
33
+ await expect(dropdownListElementTwoButton).toBeHidden();
34
+ await expect(dropdownListElementThreeButton).toBeHidden();
35
+ await expect(dropdownListElementFourButton).toBeHidden();
36
+ await expect(dropdownListElementFiveButton).toBeHidden();
37
+ /* Clicking the input element should show the dropdown list and all its content */
38
+ await inputElement.click();
39
+ await expect(inputElement).toBeVisible();
40
+ await expect(dropdownListElementOneButton).toBeVisible();
41
+ await expect(dropdownListElementTwoButton).toBeVisible();
42
+ await expect(dropdownListElementThreeButton).toBeVisible();
43
+ await expect(dropdownListElementFourButton).toBeVisible();
44
+ await expect(dropdownListElementFiveButton).toBeVisible();
45
+ /* Add text and only Option 1 should be visible */
46
+ await inputElement.fill('iles');
47
+ await expect(inputElement).toBeVisible();
48
+ await expect(dropdownListElementOneButton).toBeHidden();
49
+ await expect(dropdownListElementTwoButton).toBeHidden();
50
+ await expect(dropdownListElementThreeButton).toBeHidden();
51
+ await expect(dropdownListElementFourButton).toBeHidden();
52
+ await expect(dropdownListElementFiveButton).toBeVisible();
53
+ /* Check diff on screenshot after adding text */
54
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
55
+ });
56
+ });
@@ -0,0 +1,43 @@
1
+ import { test } from "stencil-playwright";
2
+ import { expect } from "@playwright/test";
3
+ const componentTestPath = 'src/components/dropdown/test/filter/normalize-text-false/index.html';
4
+ test.describe('tds-dropdown-filter', () => {
5
+ test('renders filter dropdown correctly', async ({ page }) => {
6
+ await page.goto(componentTestPath);
7
+ const dropdown = page.getByTestId('tds-dropdown-testid');
8
+ await expect(dropdown).toHaveCount(1);
9
+ /* Check diff on screenshot */
10
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
11
+ });
12
+ test('typing "iles" should not show anything in dropdown with normalize text set to false', async ({ page, }) => {
13
+ await page.goto(componentTestPath);
14
+ const inputElement = page.getByRole('textbox');
15
+ const dropdownListElementOneButton = page
16
+ .locator('tds-dropdown-option')
17
+ .filter({ hasText: /Option 1/ });
18
+ const dropdownListElementTwoButton = page
19
+ .locator('tds-dropdown-option')
20
+ .filter({ hasText: /Option 2/ });
21
+ const dropdownListElementThreeButton = page
22
+ .locator('tds-dropdown-option')
23
+ .filter({ hasText: /Option 3/ });
24
+ const dropdownListElementFourButton = page
25
+ .locator('tds-dropdown-option')
26
+ .filter({ hasText: /Option 4/ });
27
+ const dropdownListElementFiveButton = page
28
+ .locator('tds-dropdown-option')
29
+ .filter({ hasText: /îles Åland/ });
30
+ /* Add text and only Option 1 should be visible */
31
+ await inputElement.fill('iles');
32
+ await expect(inputElement).toBeVisible();
33
+ await expect(dropdownListElementOneButton).toBeHidden();
34
+ await expect(dropdownListElementTwoButton).toBeHidden();
35
+ await expect(dropdownListElementThreeButton).toBeHidden();
36
+ await expect(dropdownListElementFourButton).toBeHidden();
37
+ await expect(dropdownListElementFiveButton).toBeHidden();
38
+ const noResult = page.getByText('No result');
39
+ await expect(noResult).toBeVisible();
40
+ /* Check diff on screenshot after adding text */
41
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
42
+ });
43
+ });
@@ -0,0 +1,81 @@
1
+ import { test } from "stencil-playwright";
2
+ import { expect } from "@playwright/test";
3
+ const componentTestPath = 'src/components/dropdown/test/multiselect/index.html';
4
+ test.describe('tds-dropdown-multiselect', () => {
5
+ test('renders multiselect dropdown correctly', async ({ page }) => {
6
+ await page.goto(componentTestPath);
7
+ const dropdown = page.getByTestId('tds-dropdown-testid');
8
+ await expect(dropdown).toHaveCount(1);
9
+ /* Check diff on screenshot */
10
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
11
+ });
12
+ test('clicking the dropdown opens the dropdown-list, then click Option 1, should not close it', async ({ page, }) => {
13
+ await page.goto(componentTestPath);
14
+ /* click the dropdown button */
15
+ const dropdownButton = page.getByRole('button', { name: 'Placeholder' });
16
+ await dropdownButton.click();
17
+ /* Click the Option 1 button */
18
+ const dropdownListElementOneButton = page
19
+ .locator('tds-dropdown-option')
20
+ .filter({ hasText: /Option 1/ });
21
+ await dropdownListElementOneButton.click();
22
+ await expect(dropdownListElementOneButton).toBeVisible();
23
+ const dropdownButtonWithOption1 = page.getByRole('button', { name: 'Option 1' });
24
+ await expect(dropdownButtonWithOption1.first()).toBeVisible();
25
+ /* also check screenshot diff to make sure it says Option 1 */
26
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
27
+ });
28
+ test('clicking the dropdown opens the dropdown-list, then click on all the options', async ({ page, }) => {
29
+ await page.goto(componentTestPath);
30
+ /* click the button */
31
+ const dropdownButton = page.getByRole('button', { name: 'Placeholder' });
32
+ await dropdownButton.click();
33
+ /* get all checkboxes */
34
+ const dropdownListElementOneButton = page
35
+ .getByText(/Option 1/)
36
+ .filter({ has: page.getByRole('checkbox') });
37
+ const dropdownListElementTwoButton = page
38
+ .getByText(/Option 2/)
39
+ .filter({ has: page.getByRole('checkbox') });
40
+ const dropdownListElementThreeButton = page
41
+ .getByText(/Option 3/)
42
+ .filter({ has: page.getByRole('checkbox') });
43
+ const dropdownListElementFourButton = page
44
+ .getByText(/Option 4/)
45
+ .filter({ has: page.getByRole('checkbox') });
46
+ await expect(dropdownListElementOneButton).toHaveCount(1);
47
+ await expect(dropdownListElementTwoButton).toHaveCount(1);
48
+ await expect(dropdownListElementThreeButton).toHaveCount(1);
49
+ await expect(dropdownListElementFourButton).toHaveCount(1);
50
+ /* check each one and see that it updates correctly */
51
+ await dropdownListElementOneButton.click();
52
+ await expect(dropdownListElementOneButton).toHaveAttribute('aria-selected');
53
+ await expect(dropdownListElementTwoButton).not.toHaveAttribute('aria-selected');
54
+ await expect(dropdownListElementThreeButton).not.toHaveAttribute('aria-selected');
55
+ await expect(dropdownListElementFourButton).not.toHaveAttribute('aria-selected');
56
+ const inputText = page.getByRole('button', { name: /Option 1/ });
57
+ await expect(inputText).toHaveCount(1);
58
+ await dropdownListElementTwoButton.click();
59
+ await expect(dropdownListElementOneButton).toHaveAttribute('aria-selected');
60
+ await expect(dropdownListElementTwoButton).not.toHaveAttribute('aria-selected');
61
+ await expect(dropdownListElementThreeButton).not.toHaveAttribute('aria-selected');
62
+ await expect(dropdownListElementFourButton).not.toHaveAttribute('aria-selected');
63
+ await expect(inputText).toHaveCount(1);
64
+ await dropdownListElementThreeButton.click();
65
+ await expect(dropdownListElementOneButton).toHaveAttribute('aria-selected');
66
+ await expect(dropdownListElementTwoButton).not.toHaveAttribute('aria-selected');
67
+ await expect(dropdownListElementThreeButton).toHaveAttribute('aria-selected');
68
+ await expect(dropdownListElementFourButton).not.toHaveAttribute('aria-selected');
69
+ const inputText2 = page.getByRole('button', { name: /Option 1,Option 3/ });
70
+ await expect(inputText2).toHaveCount(1);
71
+ await dropdownListElementFourButton.click();
72
+ await expect(dropdownListElementOneButton).toHaveAttribute('aria-selected');
73
+ await expect(dropdownListElementTwoButton).not.toHaveAttribute('aria-selected');
74
+ await expect(dropdownListElementThreeButton).toHaveAttribute('aria-selected');
75
+ await expect(dropdownListElementFourButton).toHaveAttribute('aria-selected');
76
+ const inputText3 = page.getByRole('button', { name: /Option 1,Option 3,Option 4/ });
77
+ await expect(inputText3).toHaveCount(1);
78
+ /* also check screenshot diff to make sure */
79
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
80
+ });
81
+ });
@@ -98,7 +98,6 @@ const Template = ({ modeVariant, messageVariant, header, extendedMessage, minima
98
98
  header="${header}"
99
99
  ${noIcon ? 'no-icon' : ''}
100
100
  ${minimal ? 'minimal' : ''}
101
- mode-variant="${modeVariant.toLowerCase()}"
102
101
  ${modeVariant !== 'Inherit from parent'
103
102
  ? `mode-variant="${modeVariant.toLowerCase()}"`
104
103
  : ''}
@@ -0,0 +1,33 @@
1
+ import { test } from "stencil-playwright";
2
+ import { expect } from "@playwright/test";
3
+ const componentTestPath = 'src/components/message/test/error/index.html';
4
+ test.describe('tds-message', () => {
5
+ test('is rendered correctly', async ({ page }) => {
6
+ await page.goto(componentTestPath);
7
+ /* Check if a component exists in the DOM */
8
+ const messageComponent = page.locator('tds-message');
9
+ expect(messageComponent).toBeTruthy();
10
+ /* Take screenshot */
11
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
12
+ });
13
+ test('is in error variant', async ({ page }) => {
14
+ await page.goto(componentTestPath);
15
+ const messageComponentDiv = page.locator('tds-message > div');
16
+ await expect(messageComponentDiv).toHaveClass(/error/);
17
+ });
18
+ test('has header text', async ({ page }) => {
19
+ await page.goto(componentTestPath);
20
+ const messageComponentHeader = page.locator('tds-message .header');
21
+ await expect(messageComponentHeader).not.toBeEmpty();
22
+ });
23
+ test('has subheader text', async ({ page }) => {
24
+ await page.goto(componentTestPath);
25
+ const messageComponent = page.locator('tds-message');
26
+ await expect(messageComponent).toHaveText(/Longer Message text can be placed here. Longer Message text can be placed here./);
27
+ });
28
+ test('has error icon', async ({ page }) => {
29
+ await page.goto(componentTestPath);
30
+ const messageIconComponent = page.locator('tds-message tds-icon');
31
+ await expect(messageIconComponent).toHaveAttribute('name', 'error');
32
+ });
33
+ });
@@ -0,0 +1,33 @@
1
+ import { test } from "stencil-playwright";
2
+ import { expect } from "@playwright/test";
3
+ const componentTestPath = 'src/components/message/test/information/index.html';
4
+ test.describe('tds-message', () => {
5
+ test('is rendered correctly', async ({ page }) => {
6
+ await page.goto(componentTestPath);
7
+ /* Check if a component exists in the DOM */
8
+ const messageComponent = page.locator('tds-message');
9
+ expect(messageComponent).toBeTruthy();
10
+ /* Take screenshot */
11
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
12
+ });
13
+ test('is in information variant', async ({ page }) => {
14
+ await page.goto(componentTestPath);
15
+ const messageComponentDiv = page.locator('tds-message > div');
16
+ await expect(messageComponentDiv).toHaveClass(/information/);
17
+ });
18
+ test('has header text', async ({ page }) => {
19
+ await page.goto(componentTestPath);
20
+ const messageComponentHeader = page.locator('tds-message .header');
21
+ await expect(messageComponentHeader).not.toBeEmpty();
22
+ });
23
+ test('has subheader text', async ({ page }) => {
24
+ await page.goto(componentTestPath);
25
+ const messageComponent = page.locator('tds-message');
26
+ await expect(messageComponent).toHaveText(/Longer Message text can be placed here. Longer Message text can be placed here./);
27
+ });
28
+ test('has error icon', async ({ page }) => {
29
+ await page.goto(componentTestPath);
30
+ const messageIconComponent = page.locator('tds-message tds-icon');
31
+ await expect(messageIconComponent).toHaveAttribute('name', 'info');
32
+ });
33
+ });
@@ -0,0 +1,33 @@
1
+ import { test } from "stencil-playwright";
2
+ import { expect } from "@playwright/test";
3
+ const componentTestPath = 'src/components/message/test/success/index.html';
4
+ test.describe('tds-message', () => {
5
+ test('is rendered correctly', async ({ page }) => {
6
+ await page.goto(componentTestPath);
7
+ /* Check if a component exists in the DOM */
8
+ const messageComponent = page.locator('tds-message');
9
+ expect(messageComponent).toBeTruthy();
10
+ /* Take screenshot */
11
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
12
+ });
13
+ test('is in success variant', async ({ page }) => {
14
+ await page.goto(componentTestPath);
15
+ const messageComponentDiv = page.locator('tds-message > div');
16
+ await expect(messageComponentDiv).toHaveClass(/success/);
17
+ });
18
+ test('has header text', async ({ page }) => {
19
+ await page.goto(componentTestPath);
20
+ const messageComponentHeader = page.locator('tds-message .header');
21
+ await expect(messageComponentHeader).not.toBeEmpty();
22
+ });
23
+ test('has subheader text', async ({ page }) => {
24
+ await page.goto(componentTestPath);
25
+ const messageComponent = page.locator('tds-message');
26
+ await expect(messageComponent).toHaveText(/Longer Message text can be placed here. Longer Message text can be placed here./);
27
+ });
28
+ test('has error icon', async ({ page }) => {
29
+ await page.goto(componentTestPath);
30
+ const messageIconComponent = page.locator('tds-message tds-icon');
31
+ await expect(messageIconComponent).toHaveAttribute('name', 'tick');
32
+ });
33
+ });
@@ -0,0 +1,33 @@
1
+ import { test } from "stencil-playwright";
2
+ import { expect } from "@playwright/test";
3
+ const componentTestPath = 'src/components/message/test/warning/index.html';
4
+ test.describe('tds-message', () => {
5
+ test('is rendered correctly', async ({ page }) => {
6
+ await page.goto(componentTestPath);
7
+ /* Check if a component exists in the DOM */
8
+ const messageComponent = page.locator('tds-message');
9
+ expect(messageComponent).toBeTruthy();
10
+ /* Take screenshot */
11
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
12
+ });
13
+ test('is in warning variant', async ({ page }) => {
14
+ await page.goto(componentTestPath);
15
+ const messageComponentDiv = page.locator('tds-message > div');
16
+ await expect(messageComponentDiv).toHaveClass(/warning/);
17
+ });
18
+ test('has header text', async ({ page }) => {
19
+ await page.goto(componentTestPath);
20
+ const messageComponentHeader = page.locator('tds-message .header');
21
+ await expect(messageComponentHeader).not.toBeEmpty();
22
+ });
23
+ test('has subheader text', async ({ page }) => {
24
+ await page.goto(componentTestPath);
25
+ const messageComponent = page.locator('tds-message');
26
+ await expect(messageComponent).toHaveText(/Longer Message text can be placed here. Longer Message text can be placed here./);
27
+ });
28
+ test('has error icon', async ({ page }) => {
29
+ await page.goto(componentTestPath);
30
+ const messageIconComponent = page.locator('tds-message tds-icon');
31
+ await expect(messageIconComponent).toHaveAttribute('name', 'warning');
32
+ });
33
+ });
@@ -51,6 +51,11 @@ export class TdsPopoverCore {
51
51
  }
52
52
  }
53
53
  }
54
+ /* To enable initial loading of a component if user controls show prop*/
55
+ componentWillLoad() {
56
+ this.setIsShown(this.show);
57
+ }
58
+ /* To observe any change of show prop after an initial load */
54
59
  onShowChange(newValue) {
55
60
  this.setIsShown(newValue);
56
61
  }
@@ -0,0 +1,24 @@
1
+ import { test } from "stencil-playwright";
2
+ import { expect } from "@playwright/test";
3
+ const componentTestPath = 'src/components/table/table/test/batch/index.html';
4
+ test.describe('tds-table-batch', () => {
5
+ test('renders batch table correctly', async ({ page }) => {
6
+ await page.goto(componentTestPath);
7
+ const tableComponent = page.getByRole('table');
8
+ await expect(tableComponent).toHaveCount(1);
9
+ /* Check diff on screenshot */
10
+ await expect(page).toHaveScreenshot({ maxDiffPixels: 0 });
11
+ });
12
+ test('table has a settings button', async ({ page }) => {
13
+ await page.goto(componentTestPath);
14
+ const tdsTableToolbarSettings = page.getByRole('img');
15
+ await expect(tdsTableToolbarSettings).toHaveCount(1);
16
+ await expect(tdsTableToolbarSettings).toBeVisible();
17
+ });
18
+ test('table has a [Download] button', async ({ page }) => {
19
+ await page.goto(componentTestPath);
20
+ const tdsTableToolbarDownloadButton = page.getByRole('button', { name: /Download/ });
21
+ await expect(tdsTableToolbarDownloadButton).toHaveCount(1);
22
+ await expect(tdsTableToolbarDownloadButton).toBeVisible();
23
+ });
24
+ });