xenos
Version:
Xenos is a data grid built upon angular2 and bootstrap.
284 lines • 11.2 kB
JavaScript
"use strict";
var filter_candidate_1 = require("./filter-candidate");
var column_filter_descriptor_1 = require("./column-filter-descriptor");
var column_sort_descriptor_1 = require("./column-sort-descriptor");
var sort_direction_1 = require("./sort-direction");
var id_generator_1 = require("./id-generator");
var default_candidate_matcher_1 = require("./default-candidate-matcher");
var Subject_1 = require("rxjs/Subject");
var Observable_1 = require("rxjs/Observable");
var async_1 = require("rxjs/scheduler/async");
require("rxjs/add/Observable/timer");
require("rxjs/add/operator/debounce");
require("rxjs/add/operator/map");
var DataGridColumn = (function () {
function DataGridColumn(config) {
var _this = this;
this.threshold = 30;
this.debounceThreshold = 200;
this.candidateQueryInternal = "";
this.candidates = [];
this.candidateFinder = new Subject_1.Subject();
this.sortDirectionCycler = new Map();
if (!config) {
config = this.getDefaultOptions();
}
if (!config.id) {
config.id = id_generator_1.IdGenerator.getNextColumnId();
}
if (!config.sortDirection) {
config.sortDirection = undefined;
}
this.config = config;
this.sortDirectionCycler.set(null, sort_direction_1.SortDirection.ascending);
this.sortDirectionCycler.set(undefined, sort_direction_1.SortDirection.ascending);
this.sortDirectionCycler.set(sort_direction_1.SortDirection.ascending, sort_direction_1.SortDirection.descending);
this.sortDirectionCycler.set(sort_direction_1.SortDirection.descending, sort_direction_1.SortDirection.ascending);
this.matchers = [new default_candidate_matcher_1.DefaultCandidateMatcher()];
this.candidateFinder.asObservable()
.debounce(function (x) { return Observable_1.Observable.timer(_this.debounceThreshold); })
.observeOn(async_1.async)
.map(function (x) { return _this.findCandidates(x); })
.subscribe(function (x) {
_this.candidates.splice(0);
x.forEach(function (x) { return _this.candidates.push(x); });
});
}
Object.defineProperty(DataGridColumn.prototype, "id", {
get: function () {
return this.config.id;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DataGridColumn.prototype, "initialSortDirection", {
get: function () {
return this.config.sortDirection;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DataGridColumn.prototype, "sortDirection", {
get: function () {
this.ensureAttachment();
var id = id_generator_1.IdGenerator.synthesizeColumnSortId(this);
var desc = this.dataGrid.sortDescriptors.find(function (x) { return x.id == id; });
return desc ? desc.direction : undefined;
},
set: function (direction) {
this.ensureAttachment();
var id = id_generator_1.IdGenerator.synthesizeColumnSortId(this);
var index = this.dataGrid.sortDescriptors.findIndex(function (x) { return x.id === id; });
if (~index) {
if (direction) {
var descriptor = new column_sort_descriptor_1.ColumnSortDescriptor(this, direction);
this.dataGrid.sortDescriptors.splice(index, 1, descriptor);
}
else {
this.dataGrid.sortDescriptors.splice(index, 1);
}
}
else {
if (direction) {
var descriptor = new column_sort_descriptor_1.ColumnSortDescriptor(this, direction);
this.dataGrid.sortDescriptors.push(descriptor);
}
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DataGridColumn.prototype, "hidden", {
get: function () {
return this.config.hidden;
},
set: function (value) {
this.config.hidden = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DataGridColumn.prototype, "disableSorting", {
get: function () {
return this.config.disableSorting;
},
set: function (value) {
this.config.disableSorting = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DataGridColumn.prototype, "disableFiltering", {
get: function () {
return this.config.disableFiltering;
},
set: function (value) {
this.config.disableFiltering = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DataGridColumn.prototype, "valueAccessor", {
get: function () {
return this.config.valueAccessor;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DataGridColumn.prototype, "cellRenderer", {
get: function () {
return this.config.cellRenderer;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DataGridColumn.prototype, "headerRenderer", {
get: function () {
return this.config.headerRenderer;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DataGridColumn.prototype, "candidateRenderer", {
get: function () {
return this.config.candidateRenderer;
},
enumerable: true,
configurable: true
});
DataGridColumn.prototype.ensureAttachment = function () {
if (!this.dataGrid) {
throw new Error("The column is not attached to a grid.");
}
};
Object.defineProperty(DataGridColumn.prototype, "activeFilters", {
get: function () {
var _this = this;
this.ensureAttachment();
return this.dataGrid.filterDescriptors
.map(function (x) { return x; })
.filter(function (x) { return x.column; })
.map(function (x) { return x; })
.filter(function (x) { return x.column.id === _this.id; });
},
enumerable: true,
configurable: true
});
Object.defineProperty(DataGridColumn.prototype, "candidateQuery", {
get: function () {
return this.candidateQueryInternal;
},
set: function (phrase) {
this.candidateQueryInternal = phrase;
this.candidateFinder.next(phrase);
},
enumerable: true,
configurable: true
});
DataGridColumn.prototype.reset = function () {
this.candidateQuery = "";
this.candidates.splice(0, this.candidates.length);
};
DataGridColumn.prototype.cycleSortDirections = function () {
this.sortDirection = this.sortDirectionCycler.get(this.sortDirection);
};
DataGridColumn.prototype.removeAllColumnFilters = function (event) {
var _this = this;
event.preventDefault();
event.stopPropagation();
this.ensureAttachment();
var filters = this.dataGrid.filterDescriptors.filter(function (x) { return x.groupId !== _this.config.id; });
this.dataGrid.filterDescriptors.splice(0);
filters.forEach(function (x) { return _this.dataGrid.filterDescriptors.push(x); });
};
DataGridColumn.prototype.removeFilter = function (event, descriptor) {
event.preventDefault();
event.stopPropagation();
this.ensureAttachment();
var index = this.dataGrid.filterDescriptors.findIndex(function (x) { return x.id === descriptor.id; });
if (~index) {
this.dataGrid.filterDescriptors.splice(index, 1);
}
};
DataGridColumn.prototype.onCandidateClicked = function (event, candidate) {
var _this = this;
event.preventDefault();
event.stopPropagation();
this.ensureAttachment();
var desc = new column_filter_descriptor_1.ColumnFilterDescriptor(this, candidate.value, function (x) {
var value = _this.valueAccessor(x);
return value === candidate.value;
});
if (this.dataGrid.filterDescriptors.find(function (x) { return x.id === desc.id; })) {
return;
}
this.dataGrid.filterDescriptors.push(desc);
};
DataGridColumn.prototype.findCandidates = function (phrase) {
var _this = this;
this.ensureAttachment();
if (!this.dataGrid.lastSnapShot) {
return [];
}
var distinctDates = new Map();
var distinctValues = new Map();
var source = this.activeFilters.length > 0
? this.dataGrid.lastSnapShot.items
: this.dataGrid.lastSnapShot.processedItems;
source.forEach(function (x) {
var value = _this.config.valueAccessor(x);
if (value instanceof Date) {
var ms = value.getTime();
if (!distinctDates.has(ms)) {
distinctDates.set(ms, value);
}
return;
}
if (!distinctValues.has(value)) {
distinctValues.set(value, value);
}
});
distinctDates.forEach(function (x) {
distinctValues.set(x, x);
});
var empty = (phrase == null || phrase == "");
if (empty && distinctValues.size < this.threshold) {
var values_1 = [];
distinctValues.forEach(function (x) {
values_1.push(new filter_candidate_1.FilterCandidate(x));
});
return values_1;
}
if (empty) {
return source;
}
var values = [];
distinctValues.forEach(function (x) {
var match = false;
_this.matchers.forEach(function (y) {
if (match) {
return;
}
match = y.match(phrase, x);
});
if (match) {
values.push(new filter_candidate_1.FilterCandidate(x));
}
});
return values;
};
DataGridColumn.prototype.getDefaultOptions = function () {
return {
id: undefined,
headerRenderer: function () { return undefined; },
disableFiltering: false,
disableSorting: false,
hidden: false,
cellRenderer: function (x) { return x; },
valueAccessor: function (x) { return x; }
};
};
return DataGridColumn;
}());
exports.DataGridColumn = DataGridColumn;
//# sourceMappingURL=data-grid-column.js.map