Skip to content

Commit 6a58b99

Browse files
tkruggfrancoischalifour
authored andcommitted
fix(getRefinements): provide attributeName for type: query
Closes #3205 * fix(dev-novel): add example to dev-novel with onlyListedAttributes * fix(getRefinements) test connectCurrentRefinedValues with query refinements and onlyListedAttributes: true * fix(current-refined-values): wrap query refinement with <q> * fix(current-refined-values): add tests for defaultTemplates * fix(getRefinements): simplify tests for query
1 parent 56d71fd commit 6a58b99

File tree

7 files changed

+167
-5
lines changed

7 files changed

+167
-5
lines changed

dev/app/builtin/stories/current-refined-values.stories.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,5 +105,35 @@ export default () => {
105105
},
106106
}
107107
)
108+
)
109+
.add(
110+
'with onlyListedAttributes',
111+
wrapWithHits(
112+
container => {
113+
window.search.addWidget(
114+
instantsearch.widgets.currentRefinedValues({
115+
container,
116+
onlyListedAttributes: true,
117+
clearsQuery: true,
118+
attributes: [
119+
{
120+
name: 'brand',
121+
label: 'Brand',
122+
},
123+
{
124+
name: 'query',
125+
},
126+
],
127+
})
128+
);
129+
},
130+
{
131+
searchParameters: {
132+
disjunctiveFacetsRefinements: { brand: ['Apple', 'Samsung'] },
133+
disjunctiveFacets: ['brand'],
134+
numericRefinements: { price: { '>=': [100] } },
135+
},
136+
}
137+
)
108138
);
109139
};

src/connectors/current-refined-values/__tests__/connectCurrentRefinedValues-test.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,4 +217,58 @@ describe('connectCurrentRefinedValues', () => {
217217
secondRefine(secondValue);
218218
expect(helper.state.query).toBe('');
219219
});
220+
221+
it('should provide the query as a refinement if clearsQuery is true, onlyListedAttributes is true and `query` is a listed attribute', () => {
222+
const helper = jsHelper({}, '', {});
223+
224+
const rendering = jest.fn();
225+
const makeWidget = connectCurrentRefinedValues(rendering);
226+
const widget = makeWidget({
227+
clearsQuery: true,
228+
onlyListedAttributes: true,
229+
attributes: [{ name: 'query' }],
230+
});
231+
232+
helper.setQuery('foobar');
233+
234+
widget.init({
235+
helper,
236+
state: helper.state,
237+
createURL: () => '#',
238+
onHistoryChange: () => {},
239+
});
240+
241+
const firstRenderingOptions = rendering.mock.calls[0][0];
242+
const refinements = firstRenderingOptions.refinements;
243+
expect(refinements).toHaveLength(1);
244+
const value = refinements[0];
245+
expect(value.type).toBe('query');
246+
expect(value.name).toBe('foobar');
247+
expect(value.query).toBe('foobar');
248+
});
249+
250+
it('should not provide the query as a refinement if clearsQuery is true, onlyListedAttributes is true but query is not listed in attributes', () => {
251+
const helper = jsHelper({}, '', {});
252+
253+
const rendering = jest.fn();
254+
const makeWidget = connectCurrentRefinedValues(rendering);
255+
const widget = makeWidget({
256+
clearsQuery: true,
257+
onlyListedAttributes: true,
258+
attributes: [{ name: 'brand' }],
259+
});
260+
261+
helper.setQuery('foobar');
262+
263+
widget.init({
264+
helper,
265+
state: helper.state,
266+
createURL: () => '#',
267+
onHistoryChange: () => {},
268+
});
269+
270+
const firstRenderingOptions = rendering.mock.calls[0][0];
271+
const refinements = firstRenderingOptions.refinements;
272+
expect(refinements).toHaveLength(0);
273+
});
220274
});

src/lib/__tests__/utils-test.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,31 @@ describe('utils.getRefinements', () => {
342342
);
343343
});
344344

345+
it('should inject query facet if clearQuery === true', () => {
346+
helper.setQuery('my query');
347+
const expected = [
348+
{
349+
type: 'query',
350+
attributeName: 'query',
351+
name: 'my query',
352+
query: 'my query',
353+
},
354+
];
355+
const clearsQuery = true;
356+
expect(utils.getRefinements(results, helper.state, clearsQuery)).toEqual(
357+
expected
358+
);
359+
});
360+
361+
it('should retrieve one facetRefinement and not inject query facet if clearQuery === false', () => {
362+
helper.setQuery('my query');
363+
const expected = [];
364+
const clearsQuery = false;
365+
expect(utils.getRefinements(results, helper.state, clearsQuery)).toEqual(
366+
expected
367+
);
368+
});
369+
345370
it('should retrieve multiple facetsRefinements on one facet', () => {
346371
helper
347372
.toggleRefinement('facet1', 'facet1val1')

src/lib/utils.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ function getRefinements(results, state, clearsQuery) {
232232
type: 'query',
233233
name: state.query,
234234
query: state.query,
235+
attributeName: 'query',
235236
},
236237
]
237238
: [];
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`current-refined-values defaultTemplates \`item\` template does not show \`count\` when query refinement 1`] = `"Query : <q>Samsu</q> "`;
4+
5+
exports[`current-refined-values defaultTemplates \`item\` template has a \`item\` default template 1`] = `"Brand : Samsung <span class=\\"ais-current-refined-values--count\\">4</span>"`;
6+
7+
exports[`current-refined-values defaultTemplates \`item\` template wraps query refinements with <q> 1`] = `"Query : <q>Samsu</q> "`;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import defaultTemplates from '../defaultTemplates.js';
2+
3+
describe('current-refined-values defaultTemplates', () => {
4+
describe('`item` template', () => {
5+
it('has a `item` default template', () => {
6+
const item = {
7+
type: 'disjunction',
8+
label: 'Brand',
9+
operator: ':',
10+
name: 'Samsung',
11+
count: 4,
12+
cssClasses: {
13+
count: 'ais-current-refined-values--count',
14+
},
15+
};
16+
expect(defaultTemplates.item(item)).toContain(
17+
'<span class="ais-current-refined-values--count">4</span>'
18+
);
19+
expect(defaultTemplates.item(item)).toMatchSnapshot();
20+
});
21+
it('wraps query refinements with <q>', () => {
22+
const item = {
23+
type: 'query',
24+
label: 'Query',
25+
operator: ':',
26+
name: 'Samsu',
27+
};
28+
expect(defaultTemplates.item(item)).toContain('Query : <q>Samsu</q>');
29+
expect(defaultTemplates.item(item)).toMatchSnapshot();
30+
});
31+
it('does not show `count` when query refinement', () => {
32+
const item = {
33+
type: 'query',
34+
label: 'Query',
35+
operator: ':',
36+
name: 'Samsu',
37+
count: 22,
38+
};
39+
expect(defaultTemplates.item(item)).not.toContain(22);
40+
expect(defaultTemplates.item(item)).toMatchSnapshot();
41+
});
42+
});
43+
});

src/widgets/current-refined-values/defaultTemplates.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,25 @@ export default {
66
};
77

88
function itemTemplate({
9+
type,
910
label,
1011
operator,
1112
displayOperator,
1213
exclude,
1314
name,
1415
count,
1516
cssClasses,
16-
query,
1717
}) {
1818
const computedOperator = operator ? displayOperator : '';
1919
const computedLabel = label
2020
? `${label} ${computedOperator || ':'} `
2121
: computedOperator;
2222
const countValue = count === undefined ? 0 : count;
23-
const computedCount = query
24-
? ''
25-
: `<span class="${cssClasses.count}">${countValue}</span>`;
23+
const computedCount =
24+
type === 'query'
25+
? ''
26+
: `<span class="${cssClasses.count}">${countValue}</span>`;
2627
const computedExclude = exclude ? '-' : '';
27-
return `${computedLabel} ${computedExclude} ${name} ${computedCount}`;
28+
const computedName = type === 'query' ? `<q>${name}</q>` : name;
29+
return `${computedLabel} ${computedExclude} ${computedName} ${computedCount}`;
2830
}

0 commit comments

Comments
 (0)