123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- /**
- * Created with JetBrains PhpStorm.
- * User: Jinqn
- * Date: 13-10-12
- * Time: 上午10:20
- * To change this template use File | Settings | File Templates.
- */
- UE.UETable.prototype.sortTable = function(sortByCellIndex, compareFn) {
- var table = this.table,
- rows = table.rows,
- trArray = [],
- flag = rows[0].cells[0].tagName === "TH",
- lastRowIndex = 0;
- if (this.selectedTds.length) {
- var range = this.cellsRange,
- len = range.endRowIndex + 1;
- for (var i = range.beginRowIndex; i < len; i++) {
- trArray[i] = rows[i];
- }
- trArray.splice(0, range.beginRowIndex);
- lastRowIndex = range.endRowIndex + 1 === this.rowsNum
- ? 0
- : range.endRowIndex + 1;
- } else {
- for (var i = 0, len = rows.length; i < len; i++) {
- trArray[i] = rows[i];
- }
- }
- var Fn = {
- reversecurrent: function(td1, td2) {
- return 1;
- },
- orderbyasc: function(td1, td2) {
- var value1 = td1.innerText || td1.textContent,
- value2 = td2.innerText || td2.textContent;
- return value1.localeCompare(value2);
- },
- reversebyasc: function(td1, td2) {
- var value1 = td1.innerHTML,
- value2 = td2.innerHTML;
- return value2.localeCompare(value1);
- },
- orderbynum: function(td1, td2) {
- var value1 = td1[browser.ie ? "innerText" : "textContent"].match(/\d+/),
- value2 = td2[browser.ie ? "innerText" : "textContent"].match(/\d+/);
- if (value1) value1 = +value1[0];
- if (value2) value2 = +value2[0];
- return (value1 || 0) - (value2 || 0);
- },
- reversebynum: function(td1, td2) {
- var value1 = td1[browser.ie ? "innerText" : "textContent"].match(/\d+/),
- value2 = td2[browser.ie ? "innerText" : "textContent"].match(/\d+/);
- if (value1) value1 = +value1[0];
- if (value2) value2 = +value2[0];
- return (value2 || 0) - (value1 || 0);
- }
- };
- //对表格设置排序的标记data-sort-type
- table.setAttribute(
- "data-sort-type",
- compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn : ""
- );
- //th不参与排序
- flag && trArray.splice(0, 1);
- trArray = utils.sort(trArray, function(tr1, tr2) {
- var result;
- if (compareFn && typeof compareFn === "function") {
- result = compareFn.call(
- this,
- tr1.cells[sortByCellIndex],
- tr2.cells[sortByCellIndex]
- );
- } else if (compareFn && typeof compareFn === "number") {
- result = 1;
- } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) {
- result = Fn[compareFn].call(
- this,
- tr1.cells[sortByCellIndex],
- tr2.cells[sortByCellIndex]
- );
- } else {
- result = Fn["orderbyasc"].call(
- this,
- tr1.cells[sortByCellIndex],
- tr2.cells[sortByCellIndex]
- );
- }
- return result;
- });
- var fragment = table.ownerDocument.createDocumentFragment();
- for (var j = 0, len = trArray.length; j < len; j++) {
- fragment.appendChild(trArray[j]);
- }
- var tbody = table.getElementsByTagName("tbody")[0];
- if (!lastRowIndex) {
- tbody.appendChild(fragment);
- } else {
- tbody.insertBefore(
- fragment,
- rows[lastRowIndex - range.endRowIndex + range.beginRowIndex - 1]
- );
- }
- };
- UE.plugins["tablesort"] = function() {
- var me = this,
- UT = UE.UETable,
- getUETable = function(tdOrTable) {
- return UT.getUETable(tdOrTable);
- },
- getTableItemsByRange = function(editor) {
- return UT.getTableItemsByRange(editor);
- };
- me.ready(function() {
- //添加表格可排序的样式
- utils.cssRule(
- "tablesort",
- "table.sortEnabled tr.firstRow th,table.sortEnabled tr.firstRow td{padding-right:20px;background-repeat: no-repeat;background-position: center right;" +
- " background-image:url(" +
- me.options.themePath +
- me.options.theme +
- "/images/sortable.png);}",
- me.document
- );
- //做单元格合并操作时,清除可排序标识
- me.addListener("afterexeccommand", function(type, cmd) {
- if (cmd == "mergeright" || cmd == "mergedown" || cmd == "mergecells") {
- this.execCommand("disablesort");
- }
- });
- });
- //表格排序
- UE.commands["sorttable"] = {
- queryCommandState: function() {
- var me = this,
- tableItems = getTableItemsByRange(me);
- if (!tableItems.cell) return -1;
- var table = tableItems.table,
- cells = table.getElementsByTagName("td");
- for (var i = 0, cell; (cell = cells[i++]); ) {
- if (cell.rowSpan != 1 || cell.colSpan != 1) return -1;
- }
- return 0;
- },
- execCommand: function(cmd, fn) {
- var me = this,
- range = me.selection.getRange(),
- bk = range.createBookmark(true),
- tableItems = getTableItemsByRange(me),
- cell = tableItems.cell,
- ut = getUETable(tableItems.table),
- cellInfo = ut.getCellInfo(cell);
- ut.sortTable(cellInfo.cellIndex, fn);
- range.moveToBookmark(bk);
- try {
- range.select();
- } catch (e) {}
- }
- };
- //设置表格可排序,清除表格可排序
- UE.commands["enablesort"] = UE.commands["disablesort"] = {
- queryCommandState: function(cmd) {
- var table = getTableItemsByRange(this).table;
- if (table && cmd == "enablesort") {
- var cells = domUtils.getElementsByTagName(table, "th td");
- for (var i = 0; i < cells.length; i++) {
- if (
- cells[i].getAttribute("colspan") > 1 ||
- cells[i].getAttribute("rowspan") > 1
- )
- return -1;
- }
- }
- return !table
- ? -1
- : (cmd == "enablesort") ^
- (table.getAttribute("data-sort") != "sortEnabled")
- ? -1
- : 0;
- },
- execCommand: function(cmd) {
- var table = getTableItemsByRange(this).table;
- table.setAttribute(
- "data-sort",
- cmd == "enablesort" ? "sortEnabled" : "sortDisabled"
- );
- cmd == "enablesort"
- ? domUtils.addClass(table, "sortEnabled")
- : domUtils.removeClasses(table, "sortEnabled");
- }
- };
- };
|