blob: bea42158fa2011b37c78f37897607e92f92c18c9 [file] [log] [blame]
<!--
ag-data-grid-filter-select renders a select list filter.
The value(s) of the filter is provided to the ```dataSource's fetch``` function
as a string value or array of string values in case of multi-selection in the
filters map. ```filters[key]: <string|string[]>```.
Values come from value field of child ag-data-grid-filter-select-item elements.
Usage:
```
<ag-data-grid-filter-select
multiple
key="status"
label="Show contacts that are">
<ag-data-grid-filter-select-item
checked
label="Online"
value="online">
</ag-data-grid-filter-select-item>
<ag-data-grid-filter-select-item
checked
label="Away"
value="away">
</ag-data-grid-filter-select-item>
<ag-data-grid-filter-select-item
checked
label="Offline"
value="offline">
</ag-data-grid-filter-select-item>
</ag-data-grid-filter-select>
```
@element ag-data-grid-filter-select
-->
<link rel="import" href="../../../polymer/polymer.html">
<link rel="import" href="../../../paper-checkbox/paper-checkbox.html">
<link rel="import" href="../../../paper-radio-button/paper-radio-button.html">
<link rel="import" href="../../../paper-radio-group/paper-radio-group.html">
<polymer-element name="ag-data-grid-filter-select" attributes="multiple key label" grid-filter expects-grid-state>
<template>
<link rel="stylesheet" href="ag-data-grid-filter-select.css">
<link rel="stylesheet" href="../common.css">
<content id="content" select="*"></content>
<div class="filter-container">
<h3>{{label}}</h3>
<template if="{{ multiple }}" bind>
<core-selector id="multiSelector" multi selectedAttribute="checked" valueattr="value" core-select="{{updateGridState}}" selected="{{ selected }}">
<template repeat="{{ item in items }}">
<paper-checkbox value="{{ item.value }}" on-change="{{ updateGridState }}" label="{{ item.label }}"></paper-checkbox>
</template>
</core-selector>
</template>
<template if="{{ !multiple }}" bind>
<paper-radio-group id="singleSelector" valueattr="value" selected="{{ selected }}">
<template repeat="{{ item in items }}">
<paper-radio-button value="{{ item.value }}" on-change="{{ updateGridState }}" label="{{ item.label }}"></paper-radio-button>
</template>
</paper-radio-group>
</template>
</div>
</template>
<script>
Polymer('ag-data-grid-filter-select', {
/**
* Whether multiple items can be selected
* @attribute multiple
* @type boolean
* @default false
*/
multiple: false,
/**
* Key that will be added to filters map passed to the fetch() function of your data
* source. value would be a string value or array of string values in case of
* multi-selection in the filters map.
* @attribute key
* @type string
* @default ''
*/
key: '',
ready: function() {
// find the selected items from the child nodes
this.items = Array.prototype.slice.call(this.$.content.getDistributedNodes());
for(var i=0; i < this.items.length; i++){
if(this.items[i].checked) {
if(this.multiple) {
this.selected = this.selected || [];
this.selected.push(this.items[i].value);
} else {
this.selected = this.items[i].value;
}
}
}
},
updateGridState: function() {
var me = this;
setTimeout(function() {
if (me.multiple ) {
// quirk: we need to copy the array so change is observed. .slice() does that
me.gridState.filters[me.key] = me.$.multiSelector.selected.slice();
} else {
me.gridState.filters[me.key] = me.$.singleSelector.selected.slice();
}
});
}
});
</script>
</polymer-element>