rangeInput
About this widget
The rangeInput
widget allows a user to select a numeric range using a minimum and maximum input.
Requirements
The attribute provided to the widget must be added in attributes for faceting, either on the dashboard or using attributesForFaceting
with the API. The values inside the attribute must be numbers, not strings.
Examples
1
2
3
4
instantsearch.widgets.rangeInput({
container: '#range-input',
attribute: 'price',
});
Options
container
|
type: string|HTMLElement
Required
The CSS Selector or |
||
Copy
|
|||
attribute
|
type: string
Required
The name of the attribute in the record. |
||
Copy
|
|||
min
|
type: number
Optional
The minimum value for the input. When not provided, the minimum value is automatically computed by Algolia from the data in the index. |
||
Copy
|
|||
max
|
type: number
Optional
The maximum value for the input. When not provided, the maximum value is automatically computed by Algolia from the data in the index. |
||
Copy
|
|||
precision
|
type: number
default: 0
Optional
The number of digits after the decimal point to use. |
||
Copy
|
|||
templates
|
type: object
Optional
The templates to use for the widget. |
||
Copy
|
|||
cssClasses
|
type: object
default: {}
Optional
The CSS classes to override.
|
||
Copy
|
Templates
separatorText
|
type: string|function
Optional
The template for the separator, between the minimum and maximum inputs. |
||
Copy
|
|||
submitText
|
type: string|function
Optional
The template for the submit button. |
||
Copy
|
HTML output
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<div class="ais-RangeInput">
<form class="ais-RangeInput-form">
<label class="ais-RangeInput-label">
<input
class="ais-RangeInput-input ais-RangeInput-input--min"
type="number"
placeholder=""
step="1"
/>
</label>
<span class="ais-RangeInput-separator">to</span>
<label class="ais-RangeInput-label">
<input
class="ais-RangeInput-input ais-RangeInput-input--max"
type="number"
placeholder=""
step="1"
/>
</label>
<button class="ais-RangeInput-submit" type="submit">Go</button>
</form>
</div>
Customize the UI - connectRange
If you want to create your own UI of the rangeInput
widget, you can use connectors.
This connector is also used to build other widgets: RangeSlider
It’s a 3-step process:
// 1. Create a render function
const renderRangeInput = (renderOptions, isFirstRender) => {
// Rendering logic
};
// 2. Create the custom widget
const customRangeInput = instantsearch.connectors.connectRange(
renderRangeInput
);
// 3. Instantiate
search.addWidgets([
customRangeInput({
// instance params
})
]);
Create a render function
This rendering function is called before the first search (init
lifecycle step)
and each time results come back from Algolia (render
lifecycle step).
const renderRangeInput = (renderOptions, isFirstRender) => {
const {
number[] start,
object range,
boolean canRefine,
function refine,
function sendEvent,
object widgetParams,
} = renderOptions;
if (isFirstRender) {
// Do some initial rendering and bind events
}
// Render the widget
}
Rendering options
start
|
type: number[]
The current value for the refinement, with |
||
Copy
|
|||
range
|
type: object
The current available value for the range. |
||
Copy
|
|||
canRefine
|
type: boolean
Required
Indicates if search state can be refined. |
||
Copy
|
|||
refine
|
type: function
Sets a range to filter the results on. Both values are optional, and default to the higher and lower bounds. You can use |
||
Copy
|
|||
sendEvent
|
type: (eventType, facetValue) => void
The function to send
|
||
Copy
|
|||
widgetParams
|
type: object
All original widget options forwarded to the render function. |
||
Copy
|
Create and instantiate the custom widget
We first create custom widgets from our rendering function, then we instantiate them. When doing that, there are two types of parameters you can give:
- Instance parameters: they are predefined parameters that you can use to configure the behavior of Algolia.
- Your own parameters: to make the custom widget generic.
Both instance and custom parameters are available in connector.widgetParams
, inside the renderFunction
.
const customRangeInput = instantsearch.connectors.connectRange(
renderRangeInput
);
search.addWidgets([
customRangeInput({
attribute: string,
// Optional parameters
min: number,
max: number,
precision: number,
})
]);
Instance options
attribute
|
type: string
Required
The name of the attribute in the record. |
||
Copy
|
|||
min
|
type: number
Optional
The minimum value for the input. When not provided, the minimum value is automatically computed by Algolia from the data in the index. |
||
Copy
|
|||
max
|
type: number
Optional
The maximum value for the input. When not provided, the maximum value is automatically computed by Algolia from the data in the index. |
||
Copy
|
|||
precision
|
type: number
default: 0
Optional
The number of digits after the decimal point to use. |
||
Copy
|
Full example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Create the render function
const renderRangeInput = (renderOptions, isFirstRender) => {
const { start, range, refine, widgetParams } = renderOptions;
const [min, max] = start;
if (isFirstRender) {
const form = document.createElement('form');
form.addEventListener('submit', event => {
event.preventDefault();
const rawMinInputValue = parseFloat(event.target.elements.min.value);
const rawMaxInputValue = parseFloat(event.target.elements.max.value);
refine([
Number.isFinite(rawMinInputValue) ? rawMinInputValue : undefined,
Number.isFinite(rawMaxInputValue) ? rawMaxInputValue : undefined,
]);
});
widgetParams.container.appendChild(form);
return;
}
widgetParams.container.querySelector('form').innerHTML = `
<input
type="number"
name="min"
placeholder="${range.min}"
value="${Number.isFinite(min) ? min : ''}"
/>
<span>to</span>
<input
type="number"
name="max"
placeholder="${range.max}"
value="${Number.isFinite(max) ? max : ''}"
/>
<input type="submit" hidden />
`;
};
// Create the custom widget
const customRangeInput = instantsearch.connectors.connectRange(
renderRangeInput
);
// Instantiate the custom widget
search.addWidgets([
customRangeInput({
container: document.querySelector('#range-input'),
attribute: 'price',
})
]);