@progress/kendo-ui
Version:
This package is part of the [Kendo UI for jQuery](http://www.telerik.com/kendo-ui) suite.
233 lines (188 loc) • 7.77 kB
JavaScript
import './kendo.core.js';
import './kendo.icons.js';
import './kendo.licensing.js';
import '@progress/kendo-licensing';
import './kendo.html.icon.js';
import './kendo.html.base.js';
import '@progress/kendo-svg-icons';
const __meta__ = {
id: "columnsorter",
name: "Column Sorter",
category: "framework",
depends: ["core", "icons"],
advanced: true
};
(function($, undefined$1) {
var kendo = window.kendo;
var ui = kendo.ui;
var Widget = ui.Widget;
var DIR = "dir";
var ASC = "asc";
var SINGLE = "single";
var MULTIPLE = "multiple";
var MIXED = "mixed";
var FIELD = "field";
var DESC = "desc";
var sorterNS = ".kendoColumnSorter";
var TLINK = ".k-link";
var ARIASORT = "aria-sort";
var ColumnSorter = Widget.extend({
init: function(element, options) {
var that = this, link;
Widget.fn.init.call(that, element, options);
that._refreshHandler = that.refresh.bind(that);
that.dataSource = that.options.dataSource.bind("change", that._refreshHandler);
that.directions = that.options.initialDirection === ASC ? [ASC, DESC] : [DESC, ASC];
link = that.element.find(TLINK);
if (!link[0]) {
link = that.element.wrapInner('<a class="k-link" href="#"/>').find(TLINK);
}
that.link = link;
that.element.on("click" + sorterNS, that._click.bind(that));
},
options: {
name: "ColumnSorter",
mode: SINGLE,
allowUnsort: true,
compare: null,
filter: "",
initialDirection: ASC,
showIndexes: false
},
events: ["change"],
destroy: function() {
var that = this;
Widget.fn.destroy.call(that);
that.element.off(sorterNS);
that.dataSource.unbind("change", that._refreshHandler);
that._refreshHandler = that.element = that.link = that.dataSource = null;
},
refresh: function(e) {
if (e && (e.action === "itemchange" || e.action === "sync")) {
return;
}
var that = this,
sort = that.dataSource.sort() || [],
dir,
table,
leafCells,
element = that.element,
field = element.attr(kendo.attr(FIELD)),
descriptor = (that.dataSource._sortFields || {})[field],
headerIndex,
sortOrder;
element.removeAttr(kendo.attr(DIR));
element.removeAttr(ARIASORT);
if (descriptor) {
dir = descriptor.dir;
element.attr(kendo.attr(DIR), dir);
sortOrder = descriptor.index;
}
if (element.is("th") && descriptor) {
table = getColsTable(element);
if (table) {
if (element.attr(kendo.attr("index"))) {
leafCells = leafDataCells(element.closest("table"));
headerIndex = leafCells.index(element);
} else {
headerIndex = element.parent().children(":visible").index(element);
}
if (headerIndex > -1) {
table.find("col:not(.k-group-col):not(.k-hierarchy-col)").eq(headerIndex).toggleClass("k-sorted", dir !== undefined$1);
}
}
}
element.toggleClass("k-sorted", dir !== undefined$1);
element.find(".k-i-sort-asc-small,.k-i-sort-desc-small,.k-svg-i-sort-asc-small,.k-svg-i-sort-desc-small,.k-sort-order,.k-sort-icon").remove();
if (dir === ASC) {
$('<span class="k-sort-icon">' + kendo.ui.icon("sort-asc-small") + '</span>').appendTo(that.link);
element.attr(ARIASORT, "ascending");
} else if (dir === DESC) {
$('<span class="k-sort-icon">' + kendo.ui.icon("sort-desc-small") + '</span>').appendTo(that.link);
element.attr(ARIASORT, "descending");
} else {
element.attr(ARIASORT, "none");
}
if (that.options.showIndexes && sort.length > 1 && sortOrder) {
$('<span class="k-sort-order" />').html(sortOrder).appendTo(that.link);
}
},
_toggleSortDirection: function(dir) {
var directions = this.directions;
if (dir === directions[directions.length - 1] && this.options.allowUnsort) {
return undefined$1;
}
return directions[0] === dir ? directions[1] : directions[0];
},
_click: function(e) {
var that = this,
element = that.element,
field = element.attr(kendo.attr(FIELD)),
dir = element.attr(kendo.attr(DIR)),
options = that.options,
compare = that.options.compare === null ? undefined$1 : that.options.compare,
sort = that.dataSource.sort() || [],
ctrlKey = e.ctrlKey || e.metaKey,
idx,
length;
e.preventDefault();
if (options.filter && !element.is(options.filter)) {
return;
}
dir = this._toggleSortDirection(dir);
if (this.trigger("change", { sort: { field: field, dir: dir, compare: compare } })) {
return;
}
if (options.mode === SINGLE || (options.mode === MIXED && !ctrlKey)) {
sort = [{ field: field, dir: dir, compare: compare }];
} else if (options.mode === MULTIPLE || (options.mode === MIXED && ctrlKey)) {
for (idx = 0, length = sort.length; idx < length; idx++) {
if (sort[idx].field === field) {
sort.splice(idx, 1);
break;
}
}
sort.push({ field: field, dir: dir, compare: compare });
}
if (this.dataSource.options.endless) {
element.closest(".k-grid").getKendoGrid()._resetEndless();
}
this.dataSource.sort(sort);
}
});
function leafDataCells(container) {
var rows = container.find("tr:not(.k-filter-row)");
var indexAttr = kendo.attr("index");
var cells = rows.find("th[" + indexAttr + "]:visible");
return [].sort.call(cells, function(a, b) {
a = $(a);
b = $(b);
var indexA = a.attr(indexAttr);
var indexB = b.attr(indexAttr);
if (indexA === undefined$1) {
indexA = $(a).index();
}
if (indexB === undefined$1) {
indexB = $(b).index();
}
indexA = parseInt(indexA, 10);
indexB = parseInt(indexB, 10);
return indexA > indexB ? 1 : (indexA < indexB ? -1 : 0);
});
}
function getColsTable(element) {
var table = null;
if (element.is("th")) {
table = element.closest("table");
if (table.parent().hasClass("k-grid-header-wrap")) {
table = table.closest(".k-grid").find(".k-grid-content > table");
} else if (table.parent().hasClass("k-grid-header-locked")) {
table = table.closest(".k-grid").find(".k-grid-content-locked > table");
}
}
return table;
}
ui.plugin(ColumnSorter);
})(window.kendo.jQuery);
var kendo$1 = kendo;
export { __meta__, kendo$1 as default };