You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
390 lines
8.7 KiB
390 lines
8.7 KiB
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,
|
|
}
|