c0726461fb
Most code is writen with semicolon and IDE shows errors in nearly every line
81 lines
1.7 KiB
JavaScript
81 lines
1.7 KiB
JavaScript
define(["filters/nodefilter"], function (NodeFilter) {
|
|
return function () {
|
|
var targets = [];
|
|
var filterObservers = [];
|
|
var filters = [];
|
|
var filteredData;
|
|
var data;
|
|
|
|
function remove(d) {
|
|
targets = targets.filter( function (e) { return d !== e; } );
|
|
}
|
|
|
|
function add(d) {
|
|
targets.push(d);
|
|
|
|
if (filteredData !== undefined)
|
|
d.setData(filteredData);
|
|
}
|
|
|
|
function setData(d) {
|
|
data = d;
|
|
refresh();
|
|
}
|
|
|
|
function refresh() {
|
|
if (data === undefined)
|
|
return;
|
|
|
|
var filter = filters.reduce( function (a, f) {
|
|
return function (d) {
|
|
return a(d) && f.run(d);
|
|
};
|
|
}, function () { return true; });
|
|
|
|
filteredData = new NodeFilter(filter)(data);
|
|
|
|
targets.forEach( function (t) {
|
|
t.setData(filteredData);
|
|
});
|
|
}
|
|
|
|
function notifyObservers() {
|
|
filterObservers.forEach( function (d) {
|
|
d.filtersChanged(filters);
|
|
});
|
|
}
|
|
|
|
function addFilter(d) {
|
|
filters.push(d);
|
|
notifyObservers();
|
|
d.setRefresh(refresh);
|
|
refresh();
|
|
}
|
|
|
|
function removeFilter(d) {
|
|
filters = filters.filter( function (e) { return d !== e; } );
|
|
notifyObservers();
|
|
refresh();
|
|
}
|
|
|
|
function watchFilters(d) {
|
|
filterObservers.push(d);
|
|
|
|
d.filtersChanged(filters);
|
|
|
|
return function () {
|
|
filterObservers = filterObservers.filter( function (e) { return d !== e; });
|
|
};
|
|
}
|
|
|
|
return { add: add,
|
|
remove: remove,
|
|
setData: setData,
|
|
addFilter: addFilter,
|
|
removeFilter: removeFilter,
|
|
watchFilters: watchFilters,
|
|
refresh: refresh
|
|
};
|
|
};
|
|
});
|