ivue-material-plus
Version:
A high quality UI components Library with Vue.js
179 lines (159 loc) • 4.18 kB
text/typescript
import { defineComponent, h, PropType } from 'vue';
import useStyle from './styles';
import IvueColgroup from '../colgroup';
// type
import { TableFooter, Props } from './types';
import type { TableColumnCtx } from '../table-column/defaults';
const prefixCls = 'ivue-table-footer';
export default defineComponent({
name: prefixCls,
props: {
/**
* 是否带有纵向边框
*
* @type {Boolean}
*/
border: {
type: Boolean,
},
/**
* store
*
* @type {Object}
*/
store: {
required: true,
type: Object as PropType<TableFooter['store']>,
},
/**
* 自定义的合计计算方法
*
* @type {Function}
*/
summaryMethod: Function as PropType<TableFooter['summaryMethod']>,
/**
* 合计行第一列的文本
*
* @type {String}
*/
sumText: {
type: String,
},
/**
* 默认的排序列的 prop 和顺序。
*
* @type {Object}
*/
defaultSort: {
type: Object as PropType<TableFooter['defaultSort']>,
default: () => {
return {
prop: '',
order: '',
};
},
},
},
setup(props: Props) {
const { columns, getCellClass, getCellStyle } = useStyle(props);
// methods
// 渲染 colgroup
const renderColgroup = () => {
return h(IvueColgroup, {
columns: columns.value,
});
};
// 渲染td
const renderTd = () => {
let sums = [];
// 没行的数据
const data = props.store.states.data.value;
// 自定义的合计计算方法
if (props.summaryMethod) {
sums = props.summaryMethod({
columns: columns.value,
data,
});
}
// 没有自定义的合计计算方法
else {
columns.value.forEach((column: TableColumnCtx, index: number) => {
// 合计行第一列的文本
if (index === 0) {
sums[index] = props.sumText;
return;
}
const values = data.map((item) => {
return Number(item[column.property]);
});
const precisions: number[] = [];
let notNumber = true;
values.forEach((value) => {
if (!Number.isNaN(+value)) {
notNumber = false;
const decimal = `${value}`.split('.')[1];
precisions.push(decimal ? decimal.length : 0);
}
});
const precision = Math.max.apply(null, precisions);
// 是数字
if (!notNumber) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
// 是数字
if (!Number.isNaN(+value)) {
// 保留两位小数
return Number.parseFloat(
(prev + curr).toFixed(Math.min(precision, 20))
);
} else {
return prev;
}
}, 0);
}
// 不是数字
else {
sums[index] = '';
}
});
}
return columns.value.map((column, cellIndex) => {
return h(
'td',
{
key: cellIndex,
colspan: column.colSpan,
rowspan: column.rowSpan,
class: getCellClass(columns.value, cellIndex),
style: getCellStyle(column, cellIndex),
},
[
h(
'div',
{
class: ['cell', column.labelClassName],
},
[sums[cellIndex]]
),
]
);
});
};
return {
renderColgroup,
renderTd,
};
},
render() {
return h(
'table',
{
class: prefixCls,
cellspacing: '0',
cellpadding: '0',
border: '0',
},
[this.renderColgroup(), h('tbody', [h('tr', {}, [this.renderTd()])])]
);
},
});