element-react-codish
Version:
Element UI for React
259 lines (212 loc) • 7.36 kB
JavaScript
import { getScrollBarWidth } from './utils';
var MIN_COLUMN_WIDTH = 48;
export var defaultColumn = {
default: {
order: null
},
selection: {
width: 48,
minWidth: 48,
realWidth: 48,
order: null
},
index: {
width: 48,
minWidth: 48,
realWidth: 48,
order: null
},
expand: {
width: 48,
minWidth: 48,
realWidth: 48
}
};
/*
*@param: columns<Array>
*计算表格最低宽度
*计算列实际占用宽度, 必须用realWidth
*/
var calcuateColumnsTotalWidth = function calcuateColumnsTotalWidth() {
var columns = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
return columns.reduce(function (preWidth, next) {
var subColumns = next.subColumns;
var nextWidth = void 0;
if (subColumns instanceof Array) {
nextWidth = preWidth + calcuateColumnsTotalWidth(subColumns);
} else {
nextWidth = next.realWidth || next.width || MIN_COLUMN_WIDTH;
if (next.minWidth && nextWidth < next.minWidth) {
nextWidth = next.minWidth;
}
nextWidth = preWidth + nextWidth;
}
return nextWidth;
}, 0);
};
export var getDefaultColumn = function getDefaultColumn(type, options) {
var column = {};
for (var name in options) {
if (options.hasOwnProperty(name)) {
var value = options[name];
if (typeof value !== 'undefined') {
column[name] = value;
}
}
}
Object.assign(column, defaultColumn[type || 'default']);
if (!column.minWidth) {
column.minWidth = MIN_COLUMN_WIDTH;
}
column.realWidth = column.width || column.minWidth;
return column;
};
export var execColRowSpan = function execColRowSpan() {
var enhancedColumns = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var maxLevel = 0;
var getColByObject = function getColByObject(item) {
var colSpan = 0;
if (item.subColumns instanceof Array) {
for (var i = 0; i < item.subColumns.length; i++) {
colSpan += getColByObject(item.subColumns[i]);
}
} else {
colSpan = 1;
}
return colSpan;
};
var recursiveCol = function recursiveCol() {
var ehlist = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var level = arguments[1];
ehlist.forEach(function (item) {
item.level = level;
if (item.subColumns instanceof Array) {
item.colSpan = getColByObject(item);
recursiveCol(item.subColumns, ++level);
} else {
maxLevel = level > maxLevel ? level : maxLevel;
}
});
return ehlist;
};
var recursiveRow = function recursiveRow() {
var ehlist = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
ehlist.forEach(function (item) {
if (!item.subColumns) {
item.rowSpan = maxLevel - item.level + 1;
}
});
};
recursiveRow(recursiveCol(enhancedColumns, 0));
};
export var enhanceColumns = function enhanceColumns() {
var columns = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var tableId = arguments[1];
var columnIdSeed = 1;
var _columns = columns.map(function (col) {
var width = col.width && !isNaN(col.width) ? parseInt(col.width, 10) : undefined;
var minWidth = col.minWidth && !isNaN(col.minWidth) ? parseInt(col.minWidth, 10) : MIN_COLUMN_WIDTH;
var realWidth = col.width || MIN_COLUMN_WIDTH;
//如果设定的宽度小于最小宽度,就用最小宽度做为真实宽度
if (realWidth && minWidth && realWidth < minWidth) {
realWidth = width = minWidth;
}
var columnId = tableId + 'column_' + columnIdSeed++;
var ehObj = getDefaultColumn(col.type, {
id: columnId,
label: col.label,
property: col.prop || col.property,
type: col.type,
minWidth: minWidth,
width: width,
realWidth: realWidth,
align: col.align,
sortable: col.sortable,
sortMethod: col.sortMethod,
resizable: col.resizable,
showOverflowTooltip: col.showOverflowTooltip || col.showTooltipWhenOverflow,
formatter: col.formatter,
selectable: col.selectable,
reserveSelection: col.reserveSelection,
fixed: col.fixed,
filterMethod: col.filterMethod,
filters: col.filters,
filterable: col.filters || col.filterMethod,
filterMultiple: col.filterMultiple,
filterOpened: false,
filteredValue: [],
render: col.render,
expandPannel: col.expandPannel
});
if (col.subColumns instanceof Array) {
ehObj.subColumns = enhanceColumns(col.subColumns, tableId).columns;
}
return ehObj;
});
execColRowSpan(_columns);
var filterFixedLeftColumns = function filterFixedLeftColumns() {
var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
return list.filter(function (col) {
return typeof col.fixed == 'boolean' && !!col.fixed || col.fixed == 'left';
});
};
var fixedLeftColumns = filterFixedLeftColumns(_columns);
var fixedRightColumns = _columns.filter(function (col) {
return col.fixed == 'right';
});
var flattenColumns = _columns.filter(function (col) {
return !col.fixed;
});
var newColumns = fixedLeftColumns.concat(flattenColumns).concat(fixedRightColumns);
return {
fixedLeftColumns: fixedLeftColumns,
fixedRightColumns: fixedRightColumns,
columns: newColumns
};
};
export var calculateFixedWidth = function calculateFixedWidth(fxiedColumns) {
var width = fxiedColumns.reduce(function (pre, next) {
var preWidth = pre;
var nextWidth = next.realWidth || next.width || MIN_COLUMN_WIDTH;
return preWidth + nextWidth;
}, 0);
return width;
};
export var calculateBodyWidth = function calculateBodyWidth(columns, owerTableWidth) {
var bodyMinWidth = calcuateColumnsTotalWidth(columns);
return bodyMinWidth < owerTableWidth ? owerTableWidth : bodyMinWidth;
};
export var scheduleLayout = function scheduleLayout() {
var columns = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var owerTableWidth = arguments[1];
var scrollY = arguments[2];
var fit = arguments[3];
var layout = {};
var columnsWithNoWidth = columns.filter(function (col) {
return typeof col.width == 'undefined';
});
var columnsWithWidth = columns.filter(function (col) {
return typeof col.width != 'undefined';
});
//计算列占用最小宽度,不能使用realWidth
var bodyMinWidth = columns.reduce(function (preWidth, next) {
var nextWidth = next.width || MIN_COLUMN_WIDTH;
return preWidth + nextWidth;
}, 0);
var gutterWidth = scrollY ? getScrollBarWidth() : 0;
if (typeof owerTableWidth == 'number') {
owerTableWidth -= gutterWidth;
}
if (typeof owerTableWidth == 'number' && bodyMinWidth <= owerTableWidth && fit) {
var remainWidthForEach = (owerTableWidth - calcuateColumnsTotalWidth(columnsWithWidth)) / columnsWithNoWidth.length;
remainWidthForEach = remainWidthForEach < MIN_COLUMN_WIDTH ? MIN_COLUMN_WIDTH : remainWidthForEach;
columnsWithNoWidth.forEach(function (col) {
col.realWidth = remainWidthForEach;
});
bodyMinWidth = calcuateColumnsTotalWidth(columns);
} else {
bodyMinWidth = calcuateColumnsTotalWidth(columns);
}
layout.bodyWidth = bodyMinWidth;
return layout;
};