1
1
var React = require ( 'react' ) ;
2
2
var ReactDOM = require ( 'react-dom' ) ;
3
3
4
- var utils = require ( '../lib/utils.js' ) ;
5
- var autoHide = require ( '../decorators/autoHide' ) ;
6
- var headerFooter = require ( '../decorators/headerFooter' ) ;
7
- var RefinementList = autoHide ( headerFooter ( require ( '../components/RefinementList' ) ) ) ;
4
+ var utils = require ( '../../lib/utils.js' ) ;
5
+ var bem = utils . bemHelper ( 'ais-menu' ) ;
6
+ var cx = require ( 'classnames/dedupe' ) ;
7
+ var autoHide = require ( '../../decorators/autoHide' ) ;
8
+ var headerFooter = require ( '../../decorators/headerFooter' ) ;
9
+ var RefinementList = autoHide ( headerFooter ( require ( '../../components/RefinementList' ) ) ) ;
8
10
9
- var defaultTemplates = {
10
- header : '' ,
11
- item : '<a href="{{url}}">{{name}}</a> {{count}}' ,
12
- footer : ''
13
- } ;
11
+ var defaultTemplates = require ( './defaultTemplates.js' ) ;
14
12
15
13
/**
16
14
* Create a menu out of a facet
@@ -19,35 +17,37 @@ var defaultTemplates = {
19
17
* @param {String[] } [options.sortBy=['count:desc']] How to sort refinements. Possible values: `count|isRefined|name:asc|desc`
20
18
* @param {String } [options.limit=100] How many facets values to retrieve
21
19
* @param {Object } [options.cssClasses] CSS classes to add to the wrapping elements: root, list, item
22
- * @param {String|String[] } [options.cssClasses.root] CSS class to be added to the wrapper element
23
- * @param {String|String[] } [options.cssClasses.list] CSS class to be added to the list element
24
- * @param {String|String[] } [options.cssClasses.item] CSS class to be added to each item of the list
20
+ * @param {String|String[] } [options.cssClasses.root] CSS class to add to the root element
21
+ * @param {String|String[] } [options.cssClasses.header] CSS class to add to the header element
22
+ * @param {String|String[] } [options.cssClasses.body] CSS class to add to the body element
23
+ * @param {String|String[] } [options.cssClasses.footer] CSS class to add to the footer element
24
+ * @param {String|String[] } [options.cssClasses.list] CSS class to add to the list element
25
+ * @param {String|String[] } [options.cssClasses.item] CSS class to add to each item element
26
+ * @param {String|String[] } [options.cssClasses.active] CSS class to add to each active element
27
+ * @param {String|String[] } [options.cssClasses.link] CSS class to add to each link (when using the default template)
28
+ * @param {String|String[] } [options.cssClasses.count] CSS class to add to each count element (when using the default template)
25
29
* @param {Object } [options.templates] Templates to use for the widget
26
30
* @param {String|Function } [options.templates.header=''] Header template
27
- * @param {String|Function } [options.templates.item='<a href="{{href}}">{{name}}</a> {{count}}' ] Item template, provided with `name`, `count`, `isRefined`
31
+ * @param {String|Function } [options.templates.item] Item template, provided with `name`, `count`, `isRefined`
28
32
* @param {String|Function } [options.templates.footer=''] Footer template
29
33
* @param {Function } [options.transformData] Method to change the object passed to the item template
30
34
* @param {boolean } [hideWhenNoResults=true] Hide the container when there's no results
31
35
* @return {Object }
32
36
*/
33
37
function menu ( {
34
- container = null ,
35
- facetName = null ,
38
+ container,
39
+ facetName,
36
40
sortBy = [ 'count:desc' ] ,
37
41
limit = 100 ,
38
- cssClasses = {
39
- root : null ,
40
- list : null ,
41
- item : null
42
- } ,
42
+ cssClasses = { } ,
43
43
templates = defaultTemplates ,
44
44
transformData,
45
45
hideWhenNoResults = true
46
46
} ) {
47
47
var containerNode = utils . getContainerNode ( container ) ;
48
48
var usage = 'Usage: menu({container, facetName, [sortBy, limit, cssClasses.{root,list,item}, templates.{header,item,footer}, transformData, hideWhenResults]})' ;
49
49
50
- if ( container === null || facetName === null ) {
50
+ if ( ! container || ! facetName ) {
51
51
throw new Error ( usage ) ;
52
52
}
53
53
@@ -72,6 +72,18 @@ function menu({
72
72
templates
73
73
} ) ;
74
74
75
+ cssClasses = {
76
+ root : cx ( bem ( null ) , cssClasses . root ) ,
77
+ header : cx ( bem ( 'header' ) , cssClasses . header ) ,
78
+ body : cx ( bem ( 'body' ) , cssClasses . body ) ,
79
+ footer : cx ( bem ( 'footer' ) , cssClasses . footer ) ,
80
+ list : cx ( bem ( 'list' ) , cssClasses . list ) ,
81
+ item : cx ( bem ( 'item' ) , cssClasses . item ) ,
82
+ active : cx ( bem ( 'item' , 'active' ) , cssClasses . active ) ,
83
+ link : cx ( bem ( 'link' ) , cssClasses . link ) ,
84
+ count : cx ( bem ( 'count' ) , cssClasses . count )
85
+ } ;
86
+
75
87
ReactDOM . render (
76
88
< RefinementList
77
89
createURL = { ( facetValue ) => createURL ( state . toggleRefinement ( hierarchicalFacetName , facetValue ) ) }
0 commit comments