Ok so I have a kendo grid. Leaving off the definition to make not so long, but I do have autoBind: false on it. I then do the 3 functions below to add a custom multi-select filter to one column. The other thing I have is I set an initial filter on that same column in the grid definition. The problem I am having is that filter gets called twice, once with correct params and a 2nd time with the original filter, or if I have that original filter commented out; it will call it the second time using any other column filters on the grid you have set in the ui, but without using the custom filter on this one column.
I've spent all day and night trying to figure this out... Any ideas.
01.
self.onSchemaPopulated =
function
(columns, model) {
02.
03.
var
measureKey = _.find(columns,
function
(item) {
04.
return
item.field ===
'measure_key'
;
05.
});
06.
07.
measureKey.filterable =
08.
{
09.
extra:
false
,
10.
operators: {
11.
string: {
12.
eq:
"Is equal to"
13.
}
14.
},
15.
ui: self.measureKeyFilter
16.
};
17.
18.
};
19.
20.
self.measureKeyFilter =
function
(element) {
21.
22.
element.removeAttr(
"data-bind"
);
23.
24.
var
menu = $(element).parent();
25.
26.
menu.find(
".k-filter-help-text"
).text(
"Show records for measure keys in:"
);
27.
menu.find(
"[data-role=dropdownlist]"
).remove();
28.
29.
var
multiSelect = element.kendoMultiSelect({
30.
dataBound:
function
(e) {
31.
e.sender.tagList.addClass(
'k-full-button'
);
32.
e.sender.ul.addClass(
'k-multiselect-items'
);
33.
},
34.
dataSource: _.invoke(self.itemSelected().measures(),
'measure_key'
),
35.
tagMode:
'single'
,
36.
tagTemplate:
'<div>#:values.length# measures selected...</div>'
,
37.
value: _.invoke(self.itemSelected().checkedMeasures(),
'measure_key'
),
38.
}).data(
"kendoMultiSelect"
);
39.
40.
menu.find(
"[type=submit]"
).on(
"click"
, { widget: multiSelect }, self.filterByMeasureKey);
41.
42.
};
43.
44.
self.filterByMeasureKey =
function
(e) {
45.
46.
var
newFilter = { logic:
"and"
, filters: [] };
47.
var
measureFilter =
null
;
48.
var
values = e.data.widget.value();
49.
50.
if
(values.length !== self.itemSelected().measures().length) {
51.
52.
measureFilter = { logic:
"or"
, filters: [] };
53.
54.
$.each(values,
function
(i, v) {
55.
measureFilter.filters.push({ field:
"measure_key"
, operator:
"eq"
, value: v });
56.
});
57.
58.
newFilter.filters.push(measureFilter);
59.
60.
};
61.
62.
var
grid;
63.
64.
if
(self.isRelationshipSummaryToggled()) {
65.
grid = $(
'#'
+ self.rsOptions.id).data(
"kendoGrid"
);
66.
}
else
{
67.
grid = $(
'#'
+ self.rdOptions.id).data(
"kendoGrid"
);
68.
};
69.
70.
var
currentFilters = grid.dataSource.filter();
71.
72.
if
(!isNull(currentFilters)) {
73.
74.
_.each(currentFilters.filters,
function
(x) {
75.
76.
if
(!_.isArray(x.filters)) {
77.
newFilter.filters.push(x);
78.
}
else
if
(x.filters[0].field !==
'measure_key'
) {
79.
newFilter.filters.push(x);
80.
};
81.
82.
});
83.
84.
};
85.
86.
grid.dataSource.filter(newFilter);
87.
88.
};