@coveo/quantic 3.11.0 → 3.12.0
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.
- package/README.md +1 -1
- package/docs/out/quantic-docs.json +27 -0
- package/force-app/main/default/lwc/quanticBreadcrumbManager/__tests__/quanticBreadcrumbManager.test.js +610 -0
- package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/fixture.ts +76 -0
- package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/pageObject.ts +282 -0
- package/force-app/main/default/lwc/quanticBreadcrumbManager/e2e/quanticBreadcrumbManager.e2e.ts +167 -0
- package/force-app/main/default/lwc/quanticBreadcrumbManager/quanticBreadcrumbManager.html +10 -10
- package/force-app/main/default/lwc/quanticBreadcrumbManager/quanticBreadcrumbManager.js +8 -8
- package/force-app/main/default/lwc/quanticFeedbackModalQna/templates/quanticFeedbackModalQna.html +1 -0
- package/force-app/main/default/lwc/quanticGeneratedAnswer/__tests__/quanticGeneratedAnswer.test.js +538 -21
- package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/data.ts +56 -0
- package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/fixture.ts +87 -0
- package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/pageObject.ts +279 -0
- package/force-app/main/default/lwc/quanticGeneratedAnswer/e2e/quanticGeneratedAnswer.e2e.ts +178 -0
- package/force-app/main/default/lwc/quanticGeneratedAnswer/templates/generatedAnswer.html +24 -10
- package/force-app/main/default/lwc/quanticGeneratedAnswer/templates/retryPrompt.html +2 -2
- package/force-app/main/default/lwc/quanticGeneratedAnswerToggle/quanticGeneratedAnswerToggle.html +1 -1
- package/force-app/main/default/lwc/quanticPager/e2e/fixture.ts +4 -4
- package/force-app/main/default/lwc/quanticPager/e2e/{pagerObject.ts → pageObject.ts} +1 -1
- package/force-app/main/default/lwc/quanticTab/__tests__/quanticTab.test.js +287 -0
- package/force-app/main/default/lwc/quanticTab/e2e/fixture.ts +62 -0
- package/force-app/main/default/lwc/quanticTab/e2e/pageObject.ts +67 -0
- package/force-app/main/default/lwc/quanticTab/e2e/quanticTab.e2e.ts +77 -0
- package/force-app/main/default/lwc/quanticTab/quanticTab.html +1 -1
- package/force-app/main/default/lwc/quanticTabBar/__tests__/quanticTabBar.test.js +331 -0
- package/force-app/main/default/lwc/quanticTabBar/e2e/fixture.ts +61 -0
- package/force-app/main/default/lwc/quanticTabBar/e2e/pageObject.ts +80 -0
- package/force-app/main/default/lwc/quanticTabBar/e2e/quanticTabBar.e2e.ts +173 -0
- package/force-app/main/default/lwc/quanticTabBar/quanticTabBar.html +30 -8
- package/force-app/main/default/lwc/quanticTabBar/quanticTabBar.js +5 -4
- package/force-app/main/default/lwc/quanticUserActionsToggle/e2e/pageObject.ts +1 -1
- package/force-app/main/default/lwc/quanticUserActionsToggle/quanticUserActionsToggle.js +4 -0
- package/force-app/main/default/lwc/quanticUtils/__tests__/markdownUtils.test.js +1 -1
- package/force-app/main/default/staticresources/coveobueno/browser/bueno.js +4 -4
- package/force-app/main/default/staticresources/coveoheadless/case-assist/headless.js +8 -10
- package/force-app/main/default/staticresources/coveoheadless/definitions/api/analytics/instant-result-analytics.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/api/analytics/search-analytics.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/api/commerce/common/request.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/api/knowledge/stream-answer-api.d.ts +4 -2
- package/force-app/main/default/staticresources/coveoheadless/definitions/api/search/search-api-params.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/api/service/case-assist/case-assist-params.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/api/service/insight/insight-params.d.ts +2 -2
- package/force-app/main/default/staticresources/coveoheadless/definitions/app/commerce-engine/commerce-engine.ssr.d.ts +2 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/app/commerce-ssr-engine/factories/build-factory.d.ts +2 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/app/commerce-ssr-engine/factories/utils/recommendation-filter.d.ts +11 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/app/commerce-ssr-engine/types/common.d.ts +12 -2
- package/force-app/main/default/staticresources/coveoheadless/definitions/app/commerce-ssr-engine/types/kind.d.ts +9 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/app/undoable.d.ts +0 -3
- package/force-app/main/default/staticresources/coveoheadless/definitions/commerce.index.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/breadcrumb-manager/headless-core-breadcrumb-manager.ssr.d.ts +1 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/facets/generator/headless-commerce-facet-generator.ssr.d.ts +3 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/parameter-manager/headless-core-parameter-manager.d.ts +7 -6
- package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/parameter-manager/headless-core-parameter-manager.ssr.d.ts +3 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/sub-controller/headless-sub-controller.d.ts +1 -2
- package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/sub-controller/headless-sub-controller.ssr.d.ts +2 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/core/url-manager/headless-core-url-manager.d.ts +11 -2
- package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/product-list/headless-product-list.ssr.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/product-view/headless-product-view.ssr.d.ts +1 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/commerce/recommendations/headless-recommendations.d.ts +1 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/controllers/core/context/example-deleteme-headless-case-context.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/actions-history/ipx-actions-history-actions.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/analytics/analytics-utils.d.ts +3 -3
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/parameters/parameters-actions.d.ts +22 -6
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/parameters/parameters-schema.d.ts +4 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/parameters/parameters-selectors.d.ts +0 -11
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/parameters/parameters-serializer.d.ts +8 -2
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/parameters/parameters-serializer.ssr.d.ts +44 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/parameters/parameters-slice.d.ts +4 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/parameters/parameters-state.d.ts +4 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/recommendations/recommendations-actions.d.ts +1 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/recommendations/recommendations-state.d.ts +1 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/commerce/search/search-selectors.d.ts +0 -12
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/debug/debug-selectors.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/generated-answer/generated-answer-analytics-actions.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/history/history-actions.d.ts +3 -3
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/pipeline/select-pipeline.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/query/query-selectors.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/question-answering/question-answering-document-id.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/question-answering/question-answering-selectors.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/legacy/search-actions.d.ts +42 -42
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/legacy/search-request.d.ts +44 -44
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/search-actions.d.ts +42 -43
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/search-mappings.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/search-request.d.ts +44 -44
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/search/search-selectors.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/search-hub/search-hub-selectors.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/features/search-parameters/search-parameter-serializer.d.ts +5 -2
- package/force-app/main/default/staticresources/coveoheadless/definitions/selectors/commerce-selectors.index.d.ts +2 -2
- package/force-app/main/default/staticresources/coveoheadless/definitions/ssr-commerce.index.d.ts +4 -3
- package/force-app/main/default/staticresources/coveoheadless/definitions/state/commerce-app-state.d.ts +2 -2
- package/force-app/main/default/staticresources/coveoheadless/definitions/state/state-sections.d.ts +4 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/test/mock-search-request.d.ts +44 -44
- package/force-app/main/default/staticresources/coveoheadless/definitions/tsdoc-metadata.json +1 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/utils/compare-utils.d.ts +2 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/utils/errors.d.ts +3 -0
- package/force-app/main/default/staticresources/coveoheadless/definitions/utils/utils.d.ts +0 -1
- package/force-app/main/default/staticresources/coveoheadless/definitions/utils/validate-payload.d.ts +1 -1
- package/force-app/main/default/staticresources/coveoheadless/headless.js +10 -12
- package/force-app/main/default/staticresources/coveoheadless/insight/headless.js +9 -11
- package/force-app/main/default/staticresources/coveoheadless/recommendation/headless.js +8 -10
- package/force-app/main/default/staticresources/dompurify/purify.min.js +2 -1339
- package/force-app/main/default/staticresources/marked/marked.min.js +3 -3
- package/package.json +12 -16
package/README.md
CHANGED
|
@@ -6163,6 +6163,33 @@
|
|
|
6163
6163
|
"required": true,
|
|
6164
6164
|
"defaultValue": "",
|
|
6165
6165
|
"type": "string"
|
|
6166
|
+
},
|
|
6167
|
+
{
|
|
6168
|
+
"name": "userId",
|
|
6169
|
+
"attribute": "user-id",
|
|
6170
|
+
"access": "@api",
|
|
6171
|
+
"description": "<p>The ID of the user whose actions are being displayed. For example in email format "someone@company.com".</p>",
|
|
6172
|
+
"required": true,
|
|
6173
|
+
"defaultValue": "",
|
|
6174
|
+
"type": "string"
|
|
6175
|
+
},
|
|
6176
|
+
{
|
|
6177
|
+
"name": "ticketCreationDateTime",
|
|
6178
|
+
"attribute": "ticket-creation-date-time",
|
|
6179
|
+
"access": "@api",
|
|
6180
|
+
"description": "<p>The date and time when the ticket was created. For example "2024-01-01T00:00:00Z"</p>",
|
|
6181
|
+
"required": true,
|
|
6182
|
+
"defaultValue": "",
|
|
6183
|
+
"type": "string"
|
|
6184
|
+
},
|
|
6185
|
+
{
|
|
6186
|
+
"name": "excludedCustomActions",
|
|
6187
|
+
"attribute": "excluded-custom-actions",
|
|
6188
|
+
"access": "@api",
|
|
6189
|
+
"description": "<p>The names of custom events to exclude.</p>",
|
|
6190
|
+
"required": false,
|
|
6191
|
+
"defaultValue": "[]",
|
|
6192
|
+
"type": "Array.<string>"
|
|
6166
6193
|
}
|
|
6167
6194
|
]
|
|
6168
6195
|
}
|
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
/* eslint-disable no-import-assign */
|
|
2
|
+
// @ts-ignore
|
|
3
|
+
import QuanticBreadcrumbManager from 'c/quanticBreadcrumbManager';
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
import {createElement} from 'lwc';
|
|
6
|
+
import * as mockHeadlessLoader from 'c/quanticHeadlessLoader';
|
|
7
|
+
|
|
8
|
+
const initialBreadcrumbManagerState = {
|
|
9
|
+
hasBreadcrumbs: false,
|
|
10
|
+
numericFacetBreadcrumbs: [],
|
|
11
|
+
categoryFacetBreadcrumbs: [],
|
|
12
|
+
dateFacetBreadcrumbs: [],
|
|
13
|
+
facetBreadcrumbs: [],
|
|
14
|
+
};
|
|
15
|
+
let breadcrumbManagerState = initialBreadcrumbManagerState;
|
|
16
|
+
|
|
17
|
+
const initialStoreState = {};
|
|
18
|
+
let storeState = initialStoreState;
|
|
19
|
+
|
|
20
|
+
const functionsMocks = {
|
|
21
|
+
buildBreadcrumbManager: jest.fn(() => ({
|
|
22
|
+
state: breadcrumbManagerState,
|
|
23
|
+
subscribe: functionsMocks.subscribe,
|
|
24
|
+
})),
|
|
25
|
+
subscribe: jest.fn((cb) => {
|
|
26
|
+
cb();
|
|
27
|
+
return functionsMocks.unsubscribe;
|
|
28
|
+
}),
|
|
29
|
+
unsubscribe: jest.fn(() => {}),
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const selectors = {
|
|
33
|
+
initializationError: 'c-quantic-component-error',
|
|
34
|
+
breadcrumbShowMoreButton: '[data-testid="breadcrumb-manager__more-button"]',
|
|
35
|
+
breadcrumbClearAllFiltersButton:
|
|
36
|
+
'[data-testid="breadcrumb-manager__clear-button"]',
|
|
37
|
+
facetBreadcrumb: '[data-testid="facet-breadcrumb"]',
|
|
38
|
+
facetBreadcrumbValue: '[data-testid="facet-breadcrumb-value"]',
|
|
39
|
+
categoryFacetBreadcrumb: '[data-testid="category-facet-breadcrumb"]',
|
|
40
|
+
categoryFacetBreadcrumbValue:
|
|
41
|
+
'[data-testid="category-facet-breadcrumb-value"]',
|
|
42
|
+
numericFacetBreadcrumb: '[data-testid="numeric-facet-breadcrumb"]',
|
|
43
|
+
numericFacetBreadcrumbValue: '[data-testid="numeric-facet-breadcrumb-value"]',
|
|
44
|
+
dateFacetBreadcrumb: '[data-testid="date-facet-breadcrumb"]',
|
|
45
|
+
dateFacetBreadcrumbValue: '[data-testid="date-facet-breadcrumb-value"]',
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const exampleEngine = {
|
|
49
|
+
id: 'dummy engine',
|
|
50
|
+
};
|
|
51
|
+
const defaultCollapseThreshold = 5;
|
|
52
|
+
let isInitialized = false;
|
|
53
|
+
|
|
54
|
+
function createTestComponent(options = {}) {
|
|
55
|
+
const element = createElement('c-quantic-breadcrumb-manager', {
|
|
56
|
+
is: QuanticBreadcrumbManager,
|
|
57
|
+
});
|
|
58
|
+
for (const [key, value] of Object.entries(options)) {
|
|
59
|
+
element[key] = value;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
document.body.appendChild(element);
|
|
63
|
+
return element;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function prepareHeadlessState() {
|
|
67
|
+
// @ts-ignore
|
|
68
|
+
mockHeadlessLoader.getHeadlessBundle = () => {
|
|
69
|
+
return {
|
|
70
|
+
buildBreadcrumbManager: functionsMocks.buildBreadcrumbManager,
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function mockStoreState() {
|
|
76
|
+
// @ts-ignore
|
|
77
|
+
mockHeadlessLoader.getFromStore = () => {
|
|
78
|
+
return storeState;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Helper function to wait until the microtask queue is empty.
|
|
83
|
+
function flushPromises() {
|
|
84
|
+
// eslint-disable-next-line @lwc/lwc/no-async-operation
|
|
85
|
+
return new Promise((resolve) => setTimeout(resolve, 0));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function mockSuccessfulHeadlessInitialization() {
|
|
89
|
+
// @ts-ignore
|
|
90
|
+
mockHeadlessLoader.initializeWithHeadless = (element, _, initialize) => {
|
|
91
|
+
if (element instanceof QuanticBreadcrumbManager && !isInitialized) {
|
|
92
|
+
isInitialized = true;
|
|
93
|
+
initialize(exampleEngine);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function mockErroneousHeadlessInitialization() {
|
|
99
|
+
// @ts-ignore
|
|
100
|
+
mockHeadlessLoader.initializeWithHeadless = (element) => {
|
|
101
|
+
if (element instanceof QuanticBreadcrumbManager) {
|
|
102
|
+
element.setInitializationError();
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function cleanup() {
|
|
108
|
+
// The jsdom instance is shared across test cases in a single file so reset the DOM
|
|
109
|
+
while (document.body.firstChild) {
|
|
110
|
+
document.body.removeChild(document.body.firstChild);
|
|
111
|
+
}
|
|
112
|
+
jest.clearAllMocks();
|
|
113
|
+
isInitialized = false;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
describe('c-quantic-breadcrumb-manager', () => {
|
|
117
|
+
afterEach(() => {
|
|
118
|
+
breadcrumbManagerState = initialBreadcrumbManagerState;
|
|
119
|
+
storeState = initialStoreState;
|
|
120
|
+
cleanup();
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe('when an initialization error occurs', () => {
|
|
124
|
+
beforeEach(() => {
|
|
125
|
+
mockErroneousHeadlessInitialization();
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('should display the initialization error component', async () => {
|
|
129
|
+
const element = createTestComponent();
|
|
130
|
+
await flushPromises();
|
|
131
|
+
|
|
132
|
+
const errorComponent = element.shadowRoot.querySelector(
|
|
133
|
+
selectors.initializationError
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
expect(errorComponent).not.toBeNull();
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
describe('controller initialization', () => {
|
|
141
|
+
beforeEach(() => {
|
|
142
|
+
mockSuccessfulHeadlessInitialization();
|
|
143
|
+
prepareHeadlessState();
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('should build the breadcrumb manager and subscribe to state', async () => {
|
|
147
|
+
createTestComponent();
|
|
148
|
+
await flushPromises();
|
|
149
|
+
|
|
150
|
+
expect(functionsMocks.buildBreadcrumbManager).toHaveBeenCalledTimes(1);
|
|
151
|
+
expect(functionsMocks.buildBreadcrumbManager).toHaveBeenCalledWith(
|
|
152
|
+
exampleEngine
|
|
153
|
+
);
|
|
154
|
+
expect(functionsMocks.subscribe).toHaveBeenCalledTimes(1);
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
beforeEach(() => {
|
|
159
|
+
mockSuccessfulHeadlessInitialization();
|
|
160
|
+
prepareHeadlessState();
|
|
161
|
+
mockStoreState();
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
afterEach(() => {
|
|
165
|
+
breadcrumbManagerState = initialBreadcrumbManagerState;
|
|
166
|
+
storeState = initialStoreState;
|
|
167
|
+
cleanup();
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
describe('facet breadcrumbs rendering', () => {
|
|
171
|
+
const exampleFacetBreadcrumbs = [
|
|
172
|
+
{
|
|
173
|
+
field: 'fieldOne',
|
|
174
|
+
facetId: 'facetIdOne',
|
|
175
|
+
values: [{value: {value: 'one'}}, {value: {value: 'two'}}],
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
field: 'fieldTwo',
|
|
179
|
+
facetId: 'facetIdTwo',
|
|
180
|
+
values: [{value: {value: 'three'}}, {value: {value: 'four'}}],
|
|
181
|
+
},
|
|
182
|
+
];
|
|
183
|
+
|
|
184
|
+
beforeEach(() => {
|
|
185
|
+
breadcrumbManagerState = {
|
|
186
|
+
...breadcrumbManagerState,
|
|
187
|
+
facetBreadcrumbs: exampleFacetBreadcrumbs,
|
|
188
|
+
hasBreadcrumbs: true,
|
|
189
|
+
};
|
|
190
|
+
storeState = exampleFacetBreadcrumbs.reduce((acc, breadcrumb) => {
|
|
191
|
+
acc[breadcrumb.facetId] = {
|
|
192
|
+
facetId: breadcrumb.facetId,
|
|
193
|
+
format: (value) => value,
|
|
194
|
+
};
|
|
195
|
+
return acc;
|
|
196
|
+
}, {});
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it('should properly display the breadcrumb values', async () => {
|
|
200
|
+
const element = createTestComponent();
|
|
201
|
+
await flushPromises();
|
|
202
|
+
|
|
203
|
+
const facetBreadcrumbs = element.shadowRoot.querySelectorAll(
|
|
204
|
+
selectors.facetBreadcrumb
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
expect(facetBreadcrumbs.length).toBe(exampleFacetBreadcrumbs.length);
|
|
208
|
+
facetBreadcrumbs.forEach((facetBreadcrumb, index) => {
|
|
209
|
+
const exampleFacetBreadcrumb = exampleFacetBreadcrumbs[index];
|
|
210
|
+
const facetBreadcrumbValues = Array.from(
|
|
211
|
+
facetBreadcrumb.querySelectorAll(selectors.facetBreadcrumbValue)
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
expect(facetBreadcrumbValues.length).toBe(
|
|
215
|
+
exampleFacetBreadcrumb.values.length
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
const labels = facetBreadcrumbValues.map(
|
|
219
|
+
(facetBreadcrumbValue) => facetBreadcrumbValue.label
|
|
220
|
+
);
|
|
221
|
+
const values = exampleFacetBreadcrumb.values.map((item) => item.value);
|
|
222
|
+
expect(labels).toEqual(values);
|
|
223
|
+
|
|
224
|
+
const breadcrumbClearAllFiltersButton =
|
|
225
|
+
element.shadowRoot.querySelector(
|
|
226
|
+
selectors.breadcrumbClearAllFiltersButton
|
|
227
|
+
);
|
|
228
|
+
expect(breadcrumbClearAllFiltersButton).not.toBeNull();
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
describe('when the number of selected values for one facet exceeds the collapse threshold', () => {
|
|
233
|
+
const testManyFacetBreadcrumbs = [
|
|
234
|
+
{
|
|
235
|
+
field: 'fieldOne',
|
|
236
|
+
facetId: 'facetIdOne',
|
|
237
|
+
values: [
|
|
238
|
+
{value: {value: 'one'}},
|
|
239
|
+
{value: {value: 'two'}},
|
|
240
|
+
{value: {value: 'three'}},
|
|
241
|
+
{value: {value: 'four'}},
|
|
242
|
+
{value: {value: 'five'}},
|
|
243
|
+
{value: {value: 'six'}},
|
|
244
|
+
],
|
|
245
|
+
},
|
|
246
|
+
];
|
|
247
|
+
|
|
248
|
+
beforeEach(() => {
|
|
249
|
+
breadcrumbManagerState = {
|
|
250
|
+
...breadcrumbManagerState,
|
|
251
|
+
facetBreadcrumbs: testManyFacetBreadcrumbs,
|
|
252
|
+
hasBreadcrumbs: true,
|
|
253
|
+
};
|
|
254
|
+
storeState = testManyFacetBreadcrumbs.reduce((acc, breadcrumb) => {
|
|
255
|
+
acc[breadcrumb.facetId] = {
|
|
256
|
+
facetId: breadcrumb.facetId,
|
|
257
|
+
format: (value) => value,
|
|
258
|
+
};
|
|
259
|
+
return acc;
|
|
260
|
+
}, {});
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it('should collapse the values and display a show more button', async () => {
|
|
264
|
+
const element = createTestComponent();
|
|
265
|
+
await flushPromises();
|
|
266
|
+
|
|
267
|
+
const facetBreadcrumbs = element.shadowRoot.querySelectorAll(
|
|
268
|
+
selectors.facetBreadcrumb
|
|
269
|
+
);
|
|
270
|
+
expect(facetBreadcrumbs.length).toBe(testManyFacetBreadcrumbs.length);
|
|
271
|
+
|
|
272
|
+
const firstFacetBreadcrumb = facetBreadcrumbs[0];
|
|
273
|
+
const facetBreadcrumbValues = Array.from(
|
|
274
|
+
firstFacetBreadcrumb.querySelectorAll(selectors.facetBreadcrumbValue)
|
|
275
|
+
);
|
|
276
|
+
expect(facetBreadcrumbValues.length).toBe(defaultCollapseThreshold);
|
|
277
|
+
facetBreadcrumbValues.forEach((facetBreadcrumbValue, index) => {
|
|
278
|
+
const facetValueLabel = facetBreadcrumbValue.label.value;
|
|
279
|
+
expect(facetValueLabel).toBe(
|
|
280
|
+
testManyFacetBreadcrumbs[0].values[index].value.value
|
|
281
|
+
);
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
const breadcrumbShowMoreButton = element.shadowRoot.querySelector(
|
|
285
|
+
selectors.breadcrumbShowMoreButton
|
|
286
|
+
);
|
|
287
|
+
expect(breadcrumbShowMoreButton).not.toBeNull();
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
it('should expand the values when the show more button is clicked', async () => {
|
|
291
|
+
const element = createTestComponent();
|
|
292
|
+
await flushPromises();
|
|
293
|
+
|
|
294
|
+
const facetBreadcrumbs = element.shadowRoot.querySelectorAll(
|
|
295
|
+
selectors.facetBreadcrumb
|
|
296
|
+
);
|
|
297
|
+
const firstFacetBreadcrumb = facetBreadcrumbs[0];
|
|
298
|
+
|
|
299
|
+
const facetBreadcrumbValues = Array.from(
|
|
300
|
+
firstFacetBreadcrumb.querySelectorAll(selectors.facetBreadcrumbValue)
|
|
301
|
+
);
|
|
302
|
+
expect(facetBreadcrumbValues.length).toBe(defaultCollapseThreshold);
|
|
303
|
+
|
|
304
|
+
const breadcrumbShowMoreButton = element.shadowRoot.querySelector(
|
|
305
|
+
selectors.breadcrumbShowMoreButton
|
|
306
|
+
);
|
|
307
|
+
expect(breadcrumbShowMoreButton).not.toBeNull();
|
|
308
|
+
|
|
309
|
+
breadcrumbShowMoreButton.click();
|
|
310
|
+
await flushPromises();
|
|
311
|
+
|
|
312
|
+
const facetBreadcrumbValuesAfterClick = Array.from(
|
|
313
|
+
firstFacetBreadcrumb.querySelectorAll(selectors.facetBreadcrumbValue)
|
|
314
|
+
);
|
|
315
|
+
expect(facetBreadcrumbValuesAfterClick.length).toBe(
|
|
316
|
+
testManyFacetBreadcrumbs[0].values.length
|
|
317
|
+
);
|
|
318
|
+
const breadcrumbShowMoreButtonAfterClick =
|
|
319
|
+
element.shadowRoot.querySelector(selectors.breadcrumbShowMoreButton);
|
|
320
|
+
expect(breadcrumbShowMoreButtonAfterClick).toBeNull();
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
describe('with a custom collapse threshold', () => {
|
|
325
|
+
const customCollapseThreshold = 3;
|
|
326
|
+
const testManyFacetBreadcrumbs = [
|
|
327
|
+
{
|
|
328
|
+
field: 'fieldOne',
|
|
329
|
+
facetId: 'facetIdOne',
|
|
330
|
+
values: [
|
|
331
|
+
{value: {value: 'one'}},
|
|
332
|
+
{value: {value: 'two'}},
|
|
333
|
+
{value: {value: 'three'}},
|
|
334
|
+
{value: {value: 'four'}},
|
|
335
|
+
{value: {value: 'five'}},
|
|
336
|
+
{value: {value: 'six'}},
|
|
337
|
+
],
|
|
338
|
+
},
|
|
339
|
+
];
|
|
340
|
+
|
|
341
|
+
beforeEach(() => {
|
|
342
|
+
breadcrumbManagerState = {
|
|
343
|
+
...breadcrumbManagerState,
|
|
344
|
+
facetBreadcrumbs: testManyFacetBreadcrumbs,
|
|
345
|
+
hasBreadcrumbs: true,
|
|
346
|
+
};
|
|
347
|
+
storeState = testManyFacetBreadcrumbs.reduce((acc, breadcrumb) => {
|
|
348
|
+
acc[breadcrumb.facetId] = {
|
|
349
|
+
facetId: breadcrumb.facetId,
|
|
350
|
+
format: (value) => value,
|
|
351
|
+
};
|
|
352
|
+
return acc;
|
|
353
|
+
}, {});
|
|
354
|
+
});
|
|
355
|
+
it('should collapse the values over the custom collapse threshold and display a show more button', async () => {
|
|
356
|
+
const element = createTestComponent({
|
|
357
|
+
collapseThreshold: customCollapseThreshold,
|
|
358
|
+
});
|
|
359
|
+
await flushPromises();
|
|
360
|
+
|
|
361
|
+
const facetBreadcrumbs = element.shadowRoot.querySelectorAll(
|
|
362
|
+
selectors.facetBreadcrumb
|
|
363
|
+
);
|
|
364
|
+
expect(facetBreadcrumbs.length).toBe(testManyFacetBreadcrumbs.length);
|
|
365
|
+
|
|
366
|
+
const firstFacetBreadcrumb = facetBreadcrumbs[0];
|
|
367
|
+
const facetBreadcrumbValues = Array.from(
|
|
368
|
+
firstFacetBreadcrumb.querySelectorAll(selectors.facetBreadcrumbValue)
|
|
369
|
+
);
|
|
370
|
+
expect(facetBreadcrumbValues.length).toBe(customCollapseThreshold);
|
|
371
|
+
facetBreadcrumbValues.forEach((facetBreadcrumbValue, index) => {
|
|
372
|
+
const facetValueLabel = facetBreadcrumbValue.label.value;
|
|
373
|
+
expect(facetValueLabel).toBe(
|
|
374
|
+
testManyFacetBreadcrumbs[0].values[index].value.value
|
|
375
|
+
);
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
const breadcrumbShowMoreButton = element.shadowRoot.querySelector(
|
|
379
|
+
selectors.breadcrumbShowMoreButton
|
|
380
|
+
);
|
|
381
|
+
expect(breadcrumbShowMoreButton).not.toBeNull();
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
describe('category facet breadcrumbs', () => {
|
|
387
|
+
const testCategoryFacetBreadcrumbs = [
|
|
388
|
+
{
|
|
389
|
+
field: 'fieldOne',
|
|
390
|
+
facetId: 'facetIdOne',
|
|
391
|
+
path: [{value: 'one'}, {value: 'two'}],
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
field: 'fieldTwo',
|
|
395
|
+
facetId: 'facetIdTwo',
|
|
396
|
+
path: [{value: 'three'}, {value: 'four'}],
|
|
397
|
+
},
|
|
398
|
+
];
|
|
399
|
+
|
|
400
|
+
beforeEach(() => {
|
|
401
|
+
breadcrumbManagerState = {
|
|
402
|
+
...breadcrumbManagerState,
|
|
403
|
+
categoryFacetBreadcrumbs: testCategoryFacetBreadcrumbs,
|
|
404
|
+
hasBreadcrumbs: true,
|
|
405
|
+
};
|
|
406
|
+
storeState = testCategoryFacetBreadcrumbs.reduce((acc, breadcrumb) => {
|
|
407
|
+
acc[breadcrumb.facetId] = {
|
|
408
|
+
facetId: breadcrumb.facetId,
|
|
409
|
+
format: (item) => item.value,
|
|
410
|
+
};
|
|
411
|
+
return acc;
|
|
412
|
+
}, {});
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
it('should properly display the breadcrumb values', async () => {
|
|
416
|
+
const element = createTestComponent();
|
|
417
|
+
await flushPromises();
|
|
418
|
+
|
|
419
|
+
const categoryFacetBreadcrumbs = element.shadowRoot.querySelectorAll(
|
|
420
|
+
selectors.categoryFacetBreadcrumb
|
|
421
|
+
);
|
|
422
|
+
|
|
423
|
+
expect(categoryFacetBreadcrumbs.length).toBe(
|
|
424
|
+
testCategoryFacetBreadcrumbs.length
|
|
425
|
+
);
|
|
426
|
+
categoryFacetBreadcrumbs.forEach((categoryFacetBreadcrumb, index) => {
|
|
427
|
+
const exampleFacetBreadcrumb = testCategoryFacetBreadcrumbs[index];
|
|
428
|
+
const categoryFacetBreadcrumbValues = Array.from(
|
|
429
|
+
categoryFacetBreadcrumb.querySelectorAll(
|
|
430
|
+
selectors.categoryFacetBreadcrumbValue
|
|
431
|
+
)
|
|
432
|
+
);
|
|
433
|
+
|
|
434
|
+
expect(categoryFacetBreadcrumbValues.length).toBe(1);
|
|
435
|
+
|
|
436
|
+
const labels = categoryFacetBreadcrumbValues.map(
|
|
437
|
+
(facetBreadcrumbValue) => facetBreadcrumbValue.label
|
|
438
|
+
);
|
|
439
|
+
const values = exampleFacetBreadcrumb.path.map((item) => item.value);
|
|
440
|
+
expect(labels).toEqual([values.join(' / ')]);
|
|
441
|
+
});
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
describe('with a custom category divider', () => {
|
|
445
|
+
it('should display the breadcrumb values with the custom divider', async () => {
|
|
446
|
+
const customCategoryDivider = '*';
|
|
447
|
+
const element = createTestComponent({
|
|
448
|
+
categoryDivider: customCategoryDivider,
|
|
449
|
+
});
|
|
450
|
+
await flushPromises();
|
|
451
|
+
|
|
452
|
+
const categoryFacetBreadcrumbs = element.shadowRoot.querySelectorAll(
|
|
453
|
+
selectors.categoryFacetBreadcrumb
|
|
454
|
+
);
|
|
455
|
+
|
|
456
|
+
expect(categoryFacetBreadcrumbs.length).toBe(
|
|
457
|
+
testCategoryFacetBreadcrumbs.length
|
|
458
|
+
);
|
|
459
|
+
|
|
460
|
+
categoryFacetBreadcrumbs.forEach((categoryFacetBreadcrumb, index) => {
|
|
461
|
+
const exampleFacetBreadcrumb = testCategoryFacetBreadcrumbs[index];
|
|
462
|
+
const categoryFacetBreadcrumbValues = Array.from(
|
|
463
|
+
categoryFacetBreadcrumb.querySelectorAll(
|
|
464
|
+
selectors.categoryFacetBreadcrumbValue
|
|
465
|
+
)
|
|
466
|
+
);
|
|
467
|
+
|
|
468
|
+
expect(categoryFacetBreadcrumbValues.length).toBe(1);
|
|
469
|
+
|
|
470
|
+
const labels = categoryFacetBreadcrumbValues.map(
|
|
471
|
+
(facetBreadcrumbValue) => facetBreadcrumbValue.label
|
|
472
|
+
);
|
|
473
|
+
const values = exampleFacetBreadcrumb.path.map((item) => item.value);
|
|
474
|
+
expect(labels).toEqual([values.join(` ${customCategoryDivider} `)]);
|
|
475
|
+
});
|
|
476
|
+
});
|
|
477
|
+
});
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
describe('numeric facet breadcrumbs', () => {
|
|
481
|
+
const testNumericFacetBreadcrumbs = [
|
|
482
|
+
{
|
|
483
|
+
field: 'fieldOne',
|
|
484
|
+
facetId: 'facetIdOne',
|
|
485
|
+
values: [{value: {start: 0, end: 1}}, {value: {start: 1, end: 2}}],
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
field: 'fieldTwo',
|
|
489
|
+
facetId: 'facetIdTwo',
|
|
490
|
+
values: [{value: {start: 10, end: 11}}, {value: {start: 20, end: 21}}],
|
|
491
|
+
},
|
|
492
|
+
];
|
|
493
|
+
|
|
494
|
+
beforeAll(() => {
|
|
495
|
+
breadcrumbManagerState = {
|
|
496
|
+
...breadcrumbManagerState,
|
|
497
|
+
numericFacetBreadcrumbs: testNumericFacetBreadcrumbs,
|
|
498
|
+
hasBreadcrumbs: true,
|
|
499
|
+
};
|
|
500
|
+
storeState = testNumericFacetBreadcrumbs.reduce((acc, breadcrumb) => {
|
|
501
|
+
acc[breadcrumb.facetId] = {
|
|
502
|
+
facetId: breadcrumb.facetId,
|
|
503
|
+
format: (item) => `${item.start} - ${item.end}`,
|
|
504
|
+
};
|
|
505
|
+
return acc;
|
|
506
|
+
}, {});
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
it('should properly display the breadcrumb values', async () => {
|
|
510
|
+
const element = createTestComponent();
|
|
511
|
+
await flushPromises();
|
|
512
|
+
|
|
513
|
+
const numericFacetBreadcrumbs = element.shadowRoot.querySelectorAll(
|
|
514
|
+
selectors.numericFacetBreadcrumb
|
|
515
|
+
);
|
|
516
|
+
|
|
517
|
+
expect(numericFacetBreadcrumbs.length).toBe(
|
|
518
|
+
testNumericFacetBreadcrumbs.length
|
|
519
|
+
);
|
|
520
|
+
numericFacetBreadcrumbs.forEach((numericFacetBreadcrumb, index) => {
|
|
521
|
+
const exampleFacetBreadcrumb = testNumericFacetBreadcrumbs[index];
|
|
522
|
+
const facetBreadcrumbValues = Array.from(
|
|
523
|
+
numericFacetBreadcrumb.querySelectorAll(
|
|
524
|
+
selectors.numericFacetBreadcrumbValue
|
|
525
|
+
)
|
|
526
|
+
);
|
|
527
|
+
|
|
528
|
+
expect(facetBreadcrumbValues.length).toBe(
|
|
529
|
+
exampleFacetBreadcrumb.values.length
|
|
530
|
+
);
|
|
531
|
+
|
|
532
|
+
const labels = facetBreadcrumbValues.map(
|
|
533
|
+
(facetBreadcrumbValue) => facetBreadcrumbValue.label
|
|
534
|
+
);
|
|
535
|
+
const values = exampleFacetBreadcrumb.values.map(
|
|
536
|
+
(item) => `${item.value.start} - ${item.value.end}`
|
|
537
|
+
);
|
|
538
|
+
expect(labels).toEqual(values);
|
|
539
|
+
});
|
|
540
|
+
});
|
|
541
|
+
});
|
|
542
|
+
|
|
543
|
+
describe('date facet breadcrumbs', () => {
|
|
544
|
+
const testDateFacetBreadcrumbs = [
|
|
545
|
+
{
|
|
546
|
+
field: 'fieldOne',
|
|
547
|
+
facetId: 'facetIdOne',
|
|
548
|
+
values: [
|
|
549
|
+
{value: {start: 'yesterday', end: 'today'}},
|
|
550
|
+
{value: {start: 'today', end: 'tomorrow'}},
|
|
551
|
+
],
|
|
552
|
+
},
|
|
553
|
+
{
|
|
554
|
+
field: 'fieldTwo',
|
|
555
|
+
facetId: 'facetIdTwo',
|
|
556
|
+
values: [
|
|
557
|
+
{value: {start: 'last week', end: 'today'}},
|
|
558
|
+
{value: {start: 'tomorrow', end: 'next week'}},
|
|
559
|
+
],
|
|
560
|
+
},
|
|
561
|
+
];
|
|
562
|
+
|
|
563
|
+
beforeAll(() => {
|
|
564
|
+
breadcrumbManagerState = {
|
|
565
|
+
...breadcrumbManagerState,
|
|
566
|
+
dateFacetBreadcrumbs: testDateFacetBreadcrumbs,
|
|
567
|
+
hasBreadcrumbs: true,
|
|
568
|
+
};
|
|
569
|
+
storeState = testDateFacetBreadcrumbs.reduce((acc, breadcrumb) => {
|
|
570
|
+
acc[breadcrumb.facetId] = {
|
|
571
|
+
facetId: breadcrumb.facetId,
|
|
572
|
+
format: (item) => `${item.start} - ${item.end}`,
|
|
573
|
+
};
|
|
574
|
+
return acc;
|
|
575
|
+
}, {});
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
it('should properly display the breadcrumb values', async () => {
|
|
579
|
+
const element = createTestComponent();
|
|
580
|
+
await flushPromises();
|
|
581
|
+
|
|
582
|
+
const dateFacetBreadcrumbs = element.shadowRoot.querySelectorAll(
|
|
583
|
+
selectors.dateFacetBreadcrumb
|
|
584
|
+
);
|
|
585
|
+
|
|
586
|
+
expect(dateFacetBreadcrumbs.length).toBe(testDateFacetBreadcrumbs.length);
|
|
587
|
+
|
|
588
|
+
dateFacetBreadcrumbs.forEach((dateFacetBreadcrumb, index) => {
|
|
589
|
+
const exampleFacetBreadcrumb = testDateFacetBreadcrumbs[index];
|
|
590
|
+
const facetBreadcrumbValues = Array.from(
|
|
591
|
+
dateFacetBreadcrumb.querySelectorAll(
|
|
592
|
+
selectors.dateFacetBreadcrumbValue
|
|
593
|
+
)
|
|
594
|
+
);
|
|
595
|
+
|
|
596
|
+
expect(facetBreadcrumbValues.length).toBe(
|
|
597
|
+
exampleFacetBreadcrumb.values.length
|
|
598
|
+
);
|
|
599
|
+
|
|
600
|
+
const labels = facetBreadcrumbValues.map(
|
|
601
|
+
(facetBreadcrumbValue) => facetBreadcrumbValue.label
|
|
602
|
+
);
|
|
603
|
+
const values = exampleFacetBreadcrumb.values.map(
|
|
604
|
+
(item) => `${item.value.start} - ${item.value.end}`
|
|
605
|
+
);
|
|
606
|
+
expect(labels).toEqual(values);
|
|
607
|
+
});
|
|
608
|
+
});
|
|
609
|
+
});
|
|
610
|
+
});
|