import { getObjType } from '../utils/util'; import { isRealNull, isRealNum, isEditMode } from './validate'; import { isdatetime, diff } from './datecontroll'; import tooltip from './tooltip'; import editor from './editor'; import { rowlenByRange } from './getRowlen'; import { jfrefreshgrid } from './refresh'; import {checkProtectionAuthorityNormal} from '../controllers/protection'; import Store from '../store'; import locale from '../locale/locale'; import numeral from 'numeral'; //数据排序方法 function orderbydata(data, index, isAsc) { if (isAsc == null) { isAsc = true; } let a = function (x, y) { let x1 = x[index] , y1 = y[index]; if(getObjType(x[index]) == "object"){ x1 = x[index].v; } if(getObjType(y[index]) == "object"){ y1 = y[index].v; } if(isRealNull(x1)){ return 1; } if(isRealNull(y1)){ return -1; } if (isdatetime(x1) && isdatetime(y1)) { return diff(x1, y1); } else if (isRealNum(x1) && isRealNum(y1)) { return numeral(x1).value() - numeral(y1).value(); } else if (!isRealNum(x1) && !isRealNum(y1)) { return x1.localeCompare(y1, "zh"); } else if (!isRealNum(x1)) { return 1; } else if (!isRealNum(y1)) { return -1; } } let d = function (x, y) { let x1 = x[index] , y1 = y[index]; if(getObjType(x[index]) == "object"){ x1 = x[index].v; } if(getObjType(y[index]) == "object"){ y1 = y[index].v; } if(isRealNull(x1)){ return 1; } if(isRealNull(y1)){ return -1; } if (isdatetime(x1) && isdatetime(y1)) { return diff(y1, x1); } else if (isRealNum(x1) && isRealNum(y1)) { return numeral(y1).value() - numeral(x1).value(); } else if (!isRealNum(x1) && !isRealNum(y1)) { return y1.localeCompare(x1, "zh"); } else if (!isRealNum(x1)) { return -1; } else if (!isRealNum(y1)) { return 1; } } if (isAsc) { return data.sort(a); } else { return data.sort(d); } } function orderbydata1D(data, isAsc) { if (isAsc == null) { isAsc = true; } let a = function (x, y) { let x1 = x, y1 = y; if(getObjType(x) == "object"){ x1 = x.v; } if(getObjType(y) == "object"){ y1 = y.v; } if(x1 == null){ x1 = ""; } if(y1 == null){ y1 = ""; } if (isdatetime(x1) && isdatetime(y1)) { return diff(x1, y1); } else if (isRealNum(x1) && isRealNum(y1)) { return numeral(x1).value() - numeral(y1).value(); } else if (!isRealNum(x1) && !isRealNum(y1)) { return x1.localeCompare(y1, "zh"); } else if (!isRealNum(x1)) { return 1; } else if (!isRealNum(y1)) { return -1; } } let d = function (x, y) { let x1 = x, y1 = y; if(getObjType(x) == "object"){ x1 = x.v; } if(getObjType(y) == "object"){ y1 = y.v; } if(x1 == null){ x1 = ""; } if(y1 == null){ y1 = ""; } if (isdatetime(x1) && isdatetime(y1)) { return diff(y1, x1); } else if (isRealNum(x1) && isRealNum(y1)) { return numeral(y1).value() - numeral(x1).value(); } else if (!isRealNum(x1) && !isRealNum(y1)) { return y1.localeCompare(x1, "zh"); } else if (!isRealNum(x1)) { return -1; } else if (!isRealNum(y1)) { return 1; } } if (isAsc) { return data.sort(a); } else { return data.sort(d); } } //排序选区数据 function sortSelection(isAsc) { if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, "sort")){ return; } const _locale = locale(); const locale_sort = _locale.sort; if(Store.luckysheet_select_save.length > 1){ if(isEditMode()){ alert(locale_sort.noRangeError); } else{ tooltip.info(locale_sort.noRangeError, ""); } return; } if(isAsc == null){ isAsc = true; } let d = editor.deepCopyFlowData(Store.flowdata); let r1 = Store.luckysheet_select_save[0].row[0], r2 = Store.luckysheet_select_save[0].row[1]; let c1 = Store.luckysheet_select_save[0].column[0], c2 = Store.luckysheet_select_save[0].column[1]; let str, edr; for(let r = r1; r <= r2; r++){ if(d[r] != null && d[r][c1] != null){ let cell = d[r][c1]; if(cell.mc != null || isRealNull(cell.v)){ continue; } if(str == null && /[\u4e00-\u9fa5]+/g.test(cell.v)){ str = r + 1; edr = r + 1; continue; } if(str == null){ str = r; } edr = r; } } if(str == null || str > r2){ return; } let hasMc = false; //排序选区是否有合并单元格 let data = []; for(let r = str; r <= edr; r++){ let data_row = []; for(let c = c1; c <= c2; c++){ if(d[r][c] != null && d[r][c].mc != null){ hasMc = true; break; } data_row.push(d[r][c]); } data.push(data_row); } if(hasMc){ if(isEditMode()){ alert(locale_sort.mergeError); } else{ tooltip.info(locale_sort.mergeError, ""); } return; } data = orderbydata(data, 0, isAsc); for(let r = str; r <= edr; r++){ for(let c = c1; c <= c2; c++){ d[r][c] = data[r - str][c - c1]; } } let allParam = {}; if(Store.config["rowlen"] != null){ let cfg = $.extend(true, {}, Store.config); cfg = rowlenByRange(d, str, edr, cfg); allParam = { "cfg": cfg, "RowlChange": true } } jfrefreshgrid(d, [{ "row": [str, edr], "column": [c1, c2] }], allParam); } //排序一列数据 function sortColumnSeletion(colIndex, isAsc) { if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, "sort")){ return; } if(isAsc == null){ isAsc = true; } let d = editor.deepCopyFlowData(Store.flowdata); let r1 = 0, r2 = d.length - 1; let c1 = 0, c2 = d[0].length - 1; let str, edr; for(let r = r1; r <= r2; r++){ if(d[r][colIndex] != null && d[r][colIndex].mc != null){ continue; } if(d[r][colIndex] != null && !isRealNull(d[r][colIndex].v) && /[\u4e00-\u9fa5]+/g.test(d[r][colIndex].v) && str == null){ str = r + 1; edr = r + 1; continue; } if(str == null){ str = r; } if(d[r][colIndex] != null && !isRealNull(d[r][colIndex].v)){ edr = r; } } if(str == null || str > r2){ return; } let hasMc = false; //排序选区是否有合并单元格 let data = []; for(let r = str; r <= edr; r++){ let data_row = []; for(let c = c1; c <= c2; c++){ if(d[r][c] != null && d[r][c].mc != null){ hasMc = true; break; } data_row.push(d[r][c]); } data.push(data_row); } if(hasMc){ if(isEditMode()){ alert("列排序会扩展至整个表格选区,选区有合并单元格,无法执行此操作,请选择功能栏排序功能!"); } else{ tooltip.info("列排序会扩展至整个表格选区,选区有合并单元格,无法执行此操作,请选择功能栏排序功能!", ""); } return; } data = orderbydata(data, colIndex, isAsc); for(let r = str; r <= edr; r++){ for(let c = c1; c <= c2; c++){ d[r][c] = data[r - str][c - c1]; } } let allParam = {}; if(Store.config["rowlen"] != null){ let cfg = $.extend(true, {}, Store.config); cfg = rowlenByRange(d, str, edr, cfg); allParam = { "cfg": cfg, "RowlChange": true } } jfrefreshgrid(d, [{ "row": [str, edr], "column": [c1, c2] }], allParam); } export { orderbydata, orderbydata1D, sortSelection, sortColumnSeletion, }