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.
121 lines
2.9 KiB
121 lines
2.9 KiB
'use strict';
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
var vue = require('vue');
|
|
require('../../../../hooks/index.js');
|
|
var hHelper = require('../h-helper.js');
|
|
var styleHelper = require('./style-helper.js');
|
|
var index = require('../../../../hooks/use-namespace/index.js');
|
|
|
|
var TableFooter = vue.defineComponent({
|
|
name: "ElTableFooter",
|
|
props: {
|
|
fixed: {
|
|
type: String,
|
|
default: ""
|
|
},
|
|
store: {
|
|
required: true,
|
|
type: Object
|
|
},
|
|
summaryMethod: Function,
|
|
sumText: String,
|
|
border: Boolean,
|
|
defaultSort: {
|
|
type: Object,
|
|
default: () => {
|
|
return {
|
|
prop: "",
|
|
order: ""
|
|
};
|
|
}
|
|
}
|
|
},
|
|
setup(props) {
|
|
const { getCellClasses, getCellStyles, columns } = styleHelper["default"](props);
|
|
const ns = index.useNamespace("table");
|
|
return {
|
|
ns,
|
|
getCellClasses,
|
|
getCellStyles,
|
|
columns
|
|
};
|
|
},
|
|
render() {
|
|
const {
|
|
columns,
|
|
getCellStyles,
|
|
getCellClasses,
|
|
summaryMethod,
|
|
sumText,
|
|
ns
|
|
} = this;
|
|
const data = this.store.states.data.value;
|
|
let sums = [];
|
|
if (summaryMethod) {
|
|
sums = summaryMethod({
|
|
columns,
|
|
data
|
|
});
|
|
} else {
|
|
columns.forEach((column, index) => {
|
|
if (index === 0) {
|
|
sums[index] = sumText;
|
|
return;
|
|
}
|
|
const values = data.map((item) => Number(item[column.property]));
|
|
const precisions = [];
|
|
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 vue.h("table", {
|
|
class: ns.e("footer"),
|
|
cellspacing: "0",
|
|
cellpadding: "0",
|
|
border: "0"
|
|
}, [
|
|
hHelper.hColgroup({
|
|
columns
|
|
}),
|
|
vue.h("tbody", [
|
|
vue.h("tr", {}, [
|
|
...columns.map((column, cellIndex) => vue.h("td", {
|
|
key: cellIndex,
|
|
colspan: column.colSpan,
|
|
rowspan: column.rowSpan,
|
|
class: getCellClasses(columns, cellIndex),
|
|
style: getCellStyles(column, cellIndex)
|
|
}, [
|
|
vue.h("div", {
|
|
class: ["cell", column.labelClassName]
|
|
}, [sums[cellIndex]])
|
|
]))
|
|
])
|
|
])
|
|
]);
|
|
}
|
|
});
|
|
|
|
exports["default"] = TableFooter;
|
|
//# sourceMappingURL=index.js.map
|
|
|