@coveo/quantic 3.14.0 → 3.14.2

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 (27) hide show
  1. package/docs/out/quantic-docs.json +9 -0
  2. package/force-app/main/default/lwc/quanticFeedbackModal/success.html +1 -1
  3. package/force-app/main/default/lwc/quanticFeedbackModalQna/templates/success.html +1 -1
  4. package/force-app/main/default/lwc/quanticGeneratedAnswer/quanticGeneratedAnswer.js +1 -1
  5. package/force-app/main/default/lwc/quanticSmartSnippet/__tests__/quanticSmartSnippet.test.js +0 -16
  6. package/force-app/main/default/lwc/quanticSmartSnippet/e2e/pageObject.ts +8 -0
  7. package/force-app/main/default/lwc/quanticSmartSnippet/e2e/quanticSmartSnippet.e2e.ts +51 -1
  8. package/force-app/main/default/lwc/quanticSort/__tests__/quanticSort.test.js +218 -37
  9. package/force-app/main/default/lwc/quanticSort/e2e/fixture.ts +61 -0
  10. package/force-app/main/default/lwc/quanticSort/e2e/pageObject.ts +89 -0
  11. package/force-app/main/default/lwc/quanticSort/e2e/quanticSort.e2e.ts +91 -0
  12. package/force-app/main/default/lwc/quanticSort/quanticSort.js +7 -4
  13. package/force-app/main/default/staticresources/coveoheadless/case-assist/headless.js +9 -7
  14. package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/facets/generator/headless-commerce-facet-generator.ssr.d.ts +2 -2
  15. package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/facets/location/headless-commerce-location-facet.d.ts +11 -0
  16. package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/facets/regular/headless-commerce-regular-facet.d.ts +8 -0
  17. package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/pagination/headless-core-commerce-pagination.d.ts +3 -0
  18. package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/pagination/headless-core-commerce-pagination.ssr.d.ts +2 -2
  19. package/force-app/main/default/staticresources/coveoheadless/definitions/features/generated-answer/generated-answer-actions.d.ts +1 -0
  20. package/force-app/main/default/staticresources/coveoheadless/definitions/features/generated-answer/generated-answer-state.d.ts +4 -0
  21. package/force-app/main/default/staticresources/coveoheadless/definitions/ssr-commerce.index.d.ts +2 -2
  22. package/force-app/main/default/staticresources/coveoheadless/definitions/tsdoc-metadata.json +1 -1
  23. package/force-app/main/default/staticresources/coveoheadless/headless.js +11 -9
  24. package/force-app/main/default/staticresources/coveoheadless/insight/headless.js +10 -8
  25. package/force-app/main/default/staticresources/coveoheadless/recommendation/headless.js +9 -7
  26. package/force-app/main/default/staticresources/dompurify/purify.min.js +2 -2
  27. package/package.json +8 -8
@@ -0,0 +1,91 @@
1
+ import {testSearch, testInsight, expect} from './fixture';
2
+ import {
3
+ useCaseEnum,
4
+ useCaseTestCases,
5
+ } from '../../../../../../playwright/utils/useCase';
6
+
7
+ const fixtures = {
8
+ search: testSearch as typeof testSearch,
9
+ insight: testInsight as typeof testInsight,
10
+ };
11
+
12
+ useCaseTestCases.forEach((useCase) => {
13
+ let test;
14
+ let sortArrOptions;
15
+ let sortLabelWithValue;
16
+ if (useCase.value === useCaseEnum.search) {
17
+ test = fixtures[useCase.value] as typeof testSearch;
18
+ } else {
19
+ test = fixtures[useCase.value] as typeof testInsight;
20
+ }
21
+
22
+ test.describe(`quantic sort ${useCase.label}`, () => {
23
+ test.beforeEach(async ({sort}) => {
24
+ await sort.clickSortDropDown();
25
+ sortArrOptions = await sort.allSortLabelOptions();
26
+ sortLabelWithValue = await sort.getSortLabelValue();
27
+ await sort.clickSortDropDown();
28
+ });
29
+
30
+ test.describe(`when changing sort option to 2nd position`, () => {
31
+ test('should trigger a new search and log analytics', async ({
32
+ sort,
33
+ search,
34
+ }) => {
35
+ const {label: expectedSortName, value: expectedSortValue} =
36
+ sortLabelWithValue[1]; // Assuming 0 is the first sort option, 1 should be the 2nd one after that.
37
+
38
+ const searchResponsePromise = search.waitForSearchResponse();
39
+ await sort.clickSortDropDown();
40
+ await sort.clickSortButton(expectedSortName);
41
+
42
+ const searchResponse = await searchResponsePromise;
43
+ const {sortCriteria} = searchResponse.request().postDataJSON();
44
+ expect(sortCriteria).toBe(expectedSortValue);
45
+ await sort.waitForSortUaAnalytics(expectedSortValue);
46
+ });
47
+ });
48
+
49
+ test.describe('when testing accessibility', () => {
50
+ test('should be accessible to keyboard', async ({sort, page}) => {
51
+ let selectedSortLabel = await sort.sortDropDown.textContent();
52
+ expect(selectedSortLabel).toEqual(sortArrOptions[0]);
53
+
54
+ // Selecting the next sort using Enter to open dropdown, the ArrowDown, then ENTER key
55
+ await sort.focusSortDropDown();
56
+ await sort.openSortDropdownUsingKeyboardEnter();
57
+ await page.keyboard.press('ArrowDown');
58
+ await page.keyboard.press('Enter');
59
+ selectedSortLabel = await sort.sortDropDown.textContent();
60
+ expect(selectedSortLabel).toEqual(sortArrOptions[1]);
61
+
62
+ // Selecting the next sort using Space to open dropdown, the ArrowDown, then ENTER key
63
+ await sort.focusSortDropDown();
64
+ await sort.openSortDropdownUsingKeyboardEnter(false);
65
+ await page.keyboard.press('ArrowDown');
66
+ await page.keyboard.press('Enter');
67
+ selectedSortLabel = await sort.sortDropDown.textContent();
68
+ expect(selectedSortLabel).toEqual(sortArrOptions[2]);
69
+ });
70
+ });
71
+
72
+ if (useCase.value === 'search') {
73
+ test.describe('when loading options from the url', () => {
74
+ test('should reflect the options of url in the component', async ({
75
+ sort,
76
+ page,
77
+ }) => {
78
+ const {label: expectedSortName, value: expectedSortValue} =
79
+ sortLabelWithValue[2]; // Assuming 0 is the first sort option
80
+
81
+ const currentUrl = await page.url();
82
+ const urlHash = `#sortCriteria=${encodeURI(expectedSortValue)}`;
83
+
84
+ await page.goto(`${currentUrl}/${urlHash}`);
85
+ await page.getByRole('button', {name: 'Try it now'}).click();
86
+ await expect(sort.sortDropDown).toContainText(expectedSortName);
87
+ });
88
+ });
89
+ }
90
+ });
91
+ });
@@ -167,11 +167,12 @@ export default class QuanticSort extends LightningElement {
167
167
  }
168
168
 
169
169
  /**
170
- * @param {CustomEvent<{value: string}>} e
170
+ * @param {CustomEvent<{value: string}>} event
171
171
  */
172
- handleChange(e) {
172
+ handleChange(event) {
173
173
  this.sort.sortBy(
174
- this.options.find((option) => option.value === e.detail.value).criterion
174
+ this.options.find((option) => option.value === event.detail.value)
175
+ .criterion
175
176
  );
176
177
  }
177
178
 
@@ -280,8 +281,10 @@ export default class QuanticSort extends LightningElement {
280
281
  * @returns {SortOption[]} The specified custom sort options.
281
282
  */
282
283
  get customSortOptions() {
284
+ /** @type {HTMLSlotElement} */
285
+ const slot = this.template.querySelector('slot[name="sortOption"]');
283
286
  /** @type {SortOption[]} */
284
- return Array.from(this.querySelectorAll('c-quantic-sort-option')).map(
287
+ return Array.from(slot?.assignedNodes()).map(
285
288
  // @ts-ignore
286
289
  ({label, value, criterion}) => ({label, value, criterion})
287
290
  );