Skip to content

Commit 885aff6

Browse files
author
vvo
committed
feat(slider): second iteration
+ using `algolia/react-nouislider` was able to externalize it even being written in ES6 (just use babel-cli) + moved lib/widget-utils to lib/utils because used in both widgets and components
1 parent 49520f1 commit 885aff6

29 files changed

+189
-363
lines changed

README.md

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ API is unstable. We welcome any idea.
2020
- [toggle](#toggle)
2121
- [refinementList](#refinementlist)
2222
- [menu](#menu)
23+
- [rangeSlider](#rangeslider)
2324

2425
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
2526

@@ -99,7 +100,7 @@ npm run test:coverage
99100
[toggle]: ./widgets-screenshots/toggle.png
100101
[refinementList]: ./widgets-screenshots/refinement-list.png
101102
[menu]: ./widgets-screenshots/menu.png
102-
[rangeSlider]: ./widgets-screenshots/rangeSlider.png
103+
[rangeSlider]: ./widgets-screenshots/range-slider.png
103104

104105
### searchBox
105106

@@ -353,7 +354,14 @@ search.addWidget(
353354
#### API
354355

355356
```js
356-
357+
/**
358+
* Instantiate a slider based on a numeric attribute
359+
* @param {String|DOMElement} options.container Valid CSS Selector as a string or DOMElement
360+
* @param {String} options.facetName Name of the attribute for faceting
361+
* @param {Boolean|Object} [options.tooltips=true] Should we show tooltips or not.
362+
* You can also provide tooltips: {format: function(formattedValue, rawValue) {return string}} option object
363+
* @return {Object}
364+
*/
357365
```
358366

359367

@@ -367,7 +375,12 @@ search.addWidget(
367375
search.addWidget(
368376
instantsearch.widgets.rangeSlider({
369377
container: '#price',
370-
facetName: 'price'
378+
facetName: 'price',
379+
tooltips: {
380+
format: function(formattedValue) {
381+
return '$' + formattedValue;
382+
}
383+
}
371384
})
372385
);
373386
```

components/Slider/index.css

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
.as-range-slider--target,
2+
.as-range-slider--target * {
3+
-webkit-touch-callout: none;
4+
-webkit-user-select: none;
5+
-ms-touch-action: none;
6+
-ms-user-select: none;
7+
-moz-user-select: none;
8+
-moz-box-sizing: border-box;
9+
box-sizing: border-box;
10+
}
11+
.as-range-slider--target {
12+
position: relative;
13+
direction: ltr;
14+
padding: 0 15px;
15+
border-radius: 5px;
16+
background: #f3f4f7;
17+
height: 18px;
18+
}
19+
.as-range-slider--base {
20+
width: 100%;
21+
height: 100%;
22+
position: relative;
23+
z-index: 1; /* Fix 401 */
24+
}
25+
.as-range-slider--origin {
26+
position: absolute;
27+
right: 0;
28+
top: 0;
29+
left: 0;
30+
bottom: 0;
31+
}
32+
.as-range-slider--state-tap .as-range-slider--origin {
33+
-webkit-transition: left 0.3s, top 0.3s;
34+
transition: left 0.3s, top 0.3s;
35+
}
36+
.as-range-slider--state-drag * {
37+
cursor: inherit !important;
38+
}
39+
40+
/* Painting and performance;
41+
* Browsers can paint handles in their own layer.
42+
*/
43+
.as-range-slider--base {
44+
-webkit-transform: translate3d(0,0,0);
45+
transform: translate3d(0,0,0);
46+
}
47+
48+
.as-range-slider--connect {
49+
background: #46aeda;
50+
-webkit-transition: background 450ms;
51+
transition: background 450ms;
52+
}
53+
54+
.as-range-slider--background {
55+
background: #f3f4f7;
56+
}
57+
58+
.as-range-slider--handle {
59+
width: 1px;
60+
height: 28px;
61+
position: relative;
62+
z-index: 1;
63+
background: #8191b1;
64+
cursor: pointer;
65+
}
66+
67+
.as-range-slider--handle-lower {
68+
bottom: 10px;
69+
}
70+
71+
.as-range-slider--active {
72+
background: #1f3b5d;
73+
}
74+
75+
.as-range-slider--tooltip {
76+
position: absolute;
77+
color: #1f3b5d;
78+
border: 1px solid #8191b1;
79+
background: #ffffff;
80+
padding: 2px 3px;
81+
}
82+
83+
.as-range-slider--handle:hover {
84+
background: #1f3b5d;
85+
}
86+
87+
.as-range-slider--active .as-range-slider--tooltip, .as-range-slider--handle:hover .as-range-slider--tooltip {
88+
background: #46aeda;
89+
color: #ffffff;
90+
border-color: #1f3b5d;
91+
}
92+
93+
.as-range-slider--handle-lower .as-range-slider--tooltip {
94+
border-radius: 5px 5px 5px 0;
95+
top: -24px;
96+
}
97+
98+
.as-range-slider--handle-upper .as-range-slider--tooltip {
99+
bottom: -24px;
100+
border-radius: 5px 0 5px 5px;
101+
right: 0;
102+
}

components/Slider.js renamed to components/Slider/index.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
var React = require('react');
22

3-
var Nouislider = require('./react-nouislider/');
3+
var Nouislider = require('react-nouislider');
4+
5+
require('./index.css');
6+
7+
var cssPrefix = 'as-range-slider--';
48

59
class Slider extends React.Component {
610

@@ -14,6 +18,10 @@ class Slider extends React.Component {
1418
<Nouislider
1519
{...this.props}
1620
onChange={this.handleChange.bind(this)}
21+
animate={false}
22+
behaviour={'snap'}
23+
connect
24+
cssPrefix={cssPrefix}
1725
/>
1826
);
1927
}
@@ -23,7 +31,11 @@ Slider.propTypes = {
2331
onSlide: React.PropTypes.func,
2432
onChange: React.PropTypes.func,
2533
range: React.PropTypes.object.isRequired,
26-
start: React.PropTypes.arrayOf(React.PropTypes.number).isRequired
34+
start: React.PropTypes.arrayOf(React.PropTypes.number).isRequired,
35+
tooltips: React.PropTypes.oneOfType([
36+
React.PropTypes.bool,
37+
React.PropTypes.object
38+
])
2739
};
2840

2941
module.exports = Slider;

components/Template.js

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
1-
var hogan = require('hogan.js');
21
var React = require('react');
32

3+
var renderTemplate = require('../lib/utils').renderTemplate;
4+
45
class Template {
56
render() {
6-
var content;
7-
8-
if (typeof this.props.template === 'string') {
9-
content = hogan.compile(this.props.template).render(this.props.data);
10-
} else {
11-
content = this.props.template(this.props.data);
12-
}
7+
var content = renderTemplate(this.props.template, this.props.data);
138

149
return <div dangerouslySetInnerHTML={{__html: content}} />;
1510
}

components/react-nouislider/.eslintrc

Lines changed: 0 additions & 7 deletions
This file was deleted.

components/react-nouislider/.travis.yml

Lines changed: 0 additions & 16 deletions
This file was deleted.

components/react-nouislider/HISTORY.md

Lines changed: 0 additions & 8 deletions
This file was deleted.

components/react-nouislider/LICENSE

Lines changed: 0 additions & 22 deletions
This file was deleted.

components/react-nouislider/README.md

Lines changed: 0 additions & 5 deletions
This file was deleted.

components/react-nouislider/index.js

Lines changed: 0 additions & 60 deletions
This file was deleted.

components/react-nouislider/package.json

Lines changed: 0 additions & 37 deletions
This file was deleted.

components/react-nouislider/scripts/lint.sh

Lines changed: 0 additions & 7 deletions
This file was deleted.

example/app.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,12 @@ search.addWidget(
9696
search.addWidget(
9797
instantsearch.widgets.rangeSlider({
9898
container: '#price',
99-
facetName: 'price'
99+
facetName: 'price',
100+
tooltips: {
101+
format: function(formattedValue) {
102+
return '$' + formattedValue;
103+
}
104+
}
100105
})
101106
);
102107

0 commit comments

Comments
 (0)