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.

1304 lines
43 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div>
<div class="vol-table" :class="[textInline ? 'text-inline' : '', isChrome ? 'chrome' : '']">
<div class="mask" v-show="loading"></div>
<div class="message" v-show="loading">.....</div>
<el-table :show-summary="summary" :summary-method="
(columns, row) => {
return this.summaryData;
}
" :row-key="rowKey" :key="randomTableKey" lazy :load="loadTreeChildren" @selection-change="selectionChange"
@row-click="rowClick" @row-dblclick="rowDbClick" @header-click="headerClick" @cell-mouse-leave="
(row, column, cell) => {
!this.clickEdit && this.rowEndEdit(row, column, cell);
}
" ref="table" class="v-table" @sort-change="sortChange" tooltip-effect="dark" :height="realHeight"
:max-height="realMaxHeight" :data="url ? rowData : tableData" border :row-class-name="initIndex"
:cell-style="getCellStyle" style="width: 100%">
<el-table-column v-if="columnIndex" type="index" :fixed="ck_index_fixed" width="55" align="center">
</el-table-column>
<el-table-column v-if="ck" type="selection" :fixed="ck_index_fixed" width="55" align="center"></el-table-column>
<!-- 2020.10.10移除table第一行强制排序 -->
<el-table-column v-for="(column, cindex) in filterColumns" :key="cindex" :prop="column.field"
:label="column.title" :min-width="column.width" :formatter="formatter" :fixed="column.fixed"
:align="column.align" :sortable="column.sort ? 'custom' : false">
<template slot-scope="scope">
<!-- 2020.06.18增加render渲染自定义内容 -->
<table-render v-if="column.render && typeof column.render == 'function'" :row="scope.row"
:index="scope.$index" :column="column" :render="column.render"></table-render>
<!-- 启用双击编辑功能,带编辑功能的不会渲染下拉框文本背景颜色 -->
<!-- @click="rowBeginEdit(scope.$index,cindex)" -->
<!-- 2021.11.18增加table编辑时阻止无效事件触发 -->
<div v-else-if="column.edit" class="edit-el">
<div @click.stop v-if="column.edit.keep || edit.rowIndex == scope.$index" class="e-item">
<div>
<!-- 2020.07.24增加日期onChange事件 -->
<DatePicker :transfer="true" v-if="
column.edit.type == 'date' ||
column.edit.type == 'datetime'
" :type="column.edit.type" :format="
column.edit.type == 'date'
? 'yyyy-MM-dd'
: 'yyyy-MM-dd HH:mm:ss'
" :placeholder="column.title" :value="scope.row[column.field]" @on-change="
(time) => {
scope.row[column.field] = time;
column.onChange && column.onChange(time, column);
return time;
}
"></DatePicker>
<i-switch v-else-if="column.edit.type == 'switch'" :true-value="
typeof scope.row[column.field] == 'boolean' ? true : 1
" :false-value="
typeof scope.row[column.field] == 'boolean' ? false : 0
" v-model="scope.row[column.field]" @on-change="
(value) => {
column.onChange &&
column.onChange(
column,
scope.row,
url ? rowData : tableData,
value
);
}
">
<span slot="open">是</span>
<span slot="close">否</span>
</i-switch>
<!--如果是1或0请加上属性 true-value="1" false-value="0"
如果value是字符串数字则使用 :true-value="1" :false-value="0"
-->
<Select :transfer="true" v-else-if="column.edit.type == 'select'" v-model="scope.row[column.field]"
:filterable="
column.filter || getSelectedOptions(column).length > 10
? true
: false
" :placeholder="'请选择' + column.title" @on-change="
column.onChange &&
column.onChange(
column,
scope.row,
url ? rowData : tableData
)
" clearable>
<Option v-for="(kv, kvIndex) in getSelectedOptions(column)" :key="kvIndex"
:value="kv.key === undefined ? '' : kv.key">{{ kv.value }}</Option>
</Select>
<!-- 2020.10.18增加iview input组件on-keypress事件 -->
<Input v-else clearable :ref="column.field + scope.$index" @on-change="
(event) => {
onChange(scope, scope.row[column.field], event, column);
}
" @on-keypress="
($event) => {
column.onKeyPress &&
column.onKeyPress($event, scope, column);
}
" v-model="scope.row[column.field]" :placeholder="'请输入' + column.title"></Input>
</div>
<div class="extra" v-if="column.extra && edit.rowIndex == scope.$index">
<a :style="column.extra.style" @click="
() => {
column.extra.click &&
column.extra.click(
column,
scope.row,
url ? rowData : tableData
);
}
">
<Icon v-if="column.extra.icon" :type="column.extra.icon" />
{{ column.extra.text }}
</a>
</div>
</div>
<template v-else>
<div v-if="column.formatter" v-html="column.formatter(scope.row, column)"></div>
<div v-else>{{ formatter(scope.row, column, true) }}</div>
</template>
</div>
<!--没有编辑功能的直接渲染标签-->
<template v-else>
<a href="javascript:void(0)" @click="link(scope.row, column, $event)" v-if="column.link"
v-text="scope.row[column.field]"></a>
<img v-else-if="column.type == 'img'" v-for="(file, vIndex) in getFilePath(
scope.row[column.field],
column
)" :key="vIndex" :onerror="defaultImg" @click="viewImg(scope.row, column, file.path)" class="table-img"
:src="file.path" />
<a style="margin-right: 15px" v-else-if="column.type == 'file' || column.type == 'excel'" class="t-file"
v-for="(file, vIndex) in getFilePath(
scope.row[column.field],
column
)" :key="vIndex" @click="dowloadFile(file)">{{ file.name }}</a>
<Tag v-else-if="column.type == 'date'">{{
formatterDate(scope.row, column)
}}</Tag>
<div v-else-if="column.formatter" @click="formatterClick(scope.row, column)"
v-html="column.formatter(scope.row, column)"></div>
<!--2020.09.06增加table有数据源的列可以移除或自定义显示背景颜色及点击事件-->
<div v-else-if="column.bind && column.normal" @click="formatterClick(scope.row, column)"
:style="column.getStyle && column.getStyle(scope.row, column)">
{{ formatter(scope.row, column, true) }}
</div>
<div v-else-if="column.click" @click="formatterClick(scope.row, column)">
{{ scope.row[column.field] }}
</div>
<Tag v-else-if="column.bind" :color="getColor(scope.row, column)">{{ formatter(scope.row, column, true) }}
</Tag>
<template v-else>{{
formatter(scope.row, column, true)
}}</template>
</template>
</template>
</el-table-column>
</el-table>
</div>
<div class="block pagination" v-if="!paginationHide">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page="paginations.page" :page-sizes="paginations.sizes" :page-size="paginations.size" background
layout="prev, pager, next" :total="paginations.total"></el-pagination>
</div>
</div>
</template>
<script>
import request from '@/utils/request'
import LxTableRender from "../LxTableRender/render.js"
var $vue;
export default {
components: {
"table-render": LxTableRender
},
props: {
rowKey: {
// 树形结构的主键字段如果设置值默认会开启树形table注意rowKey字段的值必须是唯一2021.05.02
typeof: String,
default: undefined,
},
loadTreeChildren: {
// 树形结构加载子节点
type: Function,
default: (tree, treeNode, resolve) => {
return resolve([]);
},
},
textInline: {
// 表格内容超出后是否换行显示2020.01.16
type: Boolean,
default: true,
},
tableData: {
// 表数据源,配置了url就不用传这个参数了
type: Array,
default: () => {
return [];
},
},
columns: {
type: Array,
default: [],
// [ {
// field: "columnType",
// title: "数据类型",
// width: 120,
// hidden:false,
// edit: { type: "text", status: false, data: [], key: "" }
// }] //列的的数据格式edit格式 type类型(text,date,datetime,select,switch),status是否默认为编辑状态
// data如果是select这里data应该有数据源如果没有数据请设置key字典编号
},
height: {
type: Number,
default: 0,
},
maxHeight: {
type: Number,
default: 0,
},
linkView: {
type: Function,
default: function() {
return 1;
},
},
pagination: {
type: Object,
default: function() {
return {
total: 0,
size: 0,
sortName: ""
};
},
},
url: {
type: String,
default: "",
},
paginationHide: {
type: Boolean,
default: true,
},
color: {
type: Boolean,
default: true,
},
index: {
// 是否创建索引号,如果需要表格编辑功能这里需要设置为true
type: Boolean,
default: false,
},
allowEmpty: {
// 表格数据为空时是否默认为--
type: Boolean,
default: true,
},
defaultLoadPage: {
// 传入了url是否默认加载表格数据
type: Boolean,
default: true,
},
loadKey: {
// 是否自动从后台加载数据源,如【审核状态】字段是的值是数字但要显示对应的文字1=审核中2=审核通过
type: Boolean,
default: false,
},
single: {
type: Boolean, // 是否单选
default: false,
},
doubleEdit: {
type: Boolean, // 是否双击启用编辑功能
default: true,
},
// clickEdit: {
// type: Boolean, // 是否点击行编辑,再次点击行时结束编辑(默认点击行编辑,鼠标离开结束编辑)
// default: false,2021.07.17设置为点击行结束编辑
// },
beginEdit: {
// 编辑开始
type: Function,
default: function(row, column, index) {
return true;
},
},
endEditBefore: {
// 结束编辑前
type: Function,
default: function(row, column, index) {
return true;
},
},
endEditAfter: {
// 结束编辑前
type: Function,
default: function(row, column, index) {
return true;
},
},
ck: {
// 是否显示checkbox
type: Boolean,
default: true,
},
columnIndex: {
// 是否显示行号(2020..11.1)
type: Boolean,
default: true,
},
},
data() {
return {
clickEdit: true, //2021.07.17设置为点击行结束编辑
randomTableKey: 1,
visiblyColumns: [],
key: "",
realHeight: 0,
realMaxHeight: 0,
enableEdit: false, // 是否启表格用编辑功能
empty: this.allowEmpty ? "" : "--",
defaultImg: 'this.src="' + require("@/assets/imgs/error.png") + '"',
loading: false,
footer: {},
total: 0,
formatConfig: {},
defaultColor: "default",
// 2020.09.06调整table列数据源的背景颜色
colors: [
"cyan",
"red",
"blue",
"green",
"magenta",
"geekblue",
"gold",
"orange",
"default",
],
rule: {
phone: /^[1][3,4,5,6,7,8,9][0-9]{9}$/,
decimal: /(^[\-0-9][0-9]*(.[0-9]+)?)$/,
number: /(^[\-0-9][0-9]*([0-9]+)?)$/,
},
columnNames: [],
rowData: [],
paginations: {
sort: "",
order: "desc",
Foots: "",
total: 10,
// 2020.08.29增加自定义分页条大小
sizes: [30, 60, 100, 120],
size: 30, // 默认分页大小
Wheres: [],
page: 1,
rows: 30,
},
errorFiled: "",
edit: {
columnIndex: -1,
rowIndex: -1
}, // 当前双击编辑的行与列坐标
editStatus: {},
summary: false, // 是否显示合计
// 目前只支持从后台返回的summaryData数据
summaryData: [],
summaryIndex: {},
remoteColumns: [], // 需要每次刷新或分页后从后台加载字典数据源的列配置
cellStyleColumns: {}, // 有背景颜色的配置
isChrome: false, //2021.06.19判断谷歌内核浏览重新计算table高度
ck_index_fixed: false, //左侧checkbox与行号是否固定
};
},
created() {
//2021.06.19判断谷歌内核浏览重新计算table高度
if (
navigator.userAgent.indexOf("Chrome") != -1 ||
navigator.userAgent.indexOf("Edge") != -1
) {
this.isChrome = true;
}
//2021.06.19调整左侧checkbox与行号是否固定规则
let hasSummary = this.columns.find((x) => {
return x.summary;
});
if (
this.columns.some((x) => {
return x.fixed;
})
) {
if (hasSummary) {
this.isChrome = false;
}
this.ck_index_fixed = true;
}
// 升级element 2.15.1版本后这个高度有问题如果有统计求和的table强制使用max-height属性
if (
this.columns.some((x) => {
return x.summary;
})
) {
this.realHeight = null;
this.realMaxHeight = this.maxHeight || this.height;
} else {
this.realHeight = this.getHeight();
this.realMaxHeight = this.getMaxHeight();
}
// 从后台加下拉框的[是否启用的]数据源
let keys = [];
let columnBind = [];
this.summaryData.push("合计");
if (this.columnIndex) {
this.summaryData.push(" ");
}
this.columns.forEach((x, _index) => {
if (x.cellStyle) {
this.cellStyleColumns[x.field] = x.cellStyle;
}
if (!x.hidden) {
// this.summaryIndex[x.field] = _index;
// 2020.10.11修复求和列错位的问题
this.summaryData.push("");
this.summaryIndex[x.field] = this.summaryData.length - 1;
}
// 求和
if (x.summary && !this.summary) {
this.summary = true;
}
if (x.bind && x.bind.key && (!x.bind.data || x.bind.data.length == 0)) {
// 写入远程
if (!x.bind.data) x.bind.data = [];
if (x.bind.remote) {
this.remoteColumns.push(x);
} else if (this.loadKey) {
keys.push(x.bind.key);
x.bind.valueTyoe = x.type;
columnBind.push(x.bind);
}
}
});
if (keys.length > 0) {
}
this.paginations.sort = this.pagination.sortName;
// 2020.08.29增加自定义分页条大小
Object.assign(this.paginations, this.pagination);
if (this.pagination.size) {
this.paginations.rows = this.pagination.size;
}
this.enableEdit = this.columns.some((x) => {
return x.hasOwnProperty("edit");
});
let keyColumn = this.columns.find((x) => {
return x.isKey;
});
if (keyColumn) {
this.key = keyColumn.field;
}
// 如果下拉框判断bind或edit.data是否有数据源妱果没有则获取数据源bind
$vue = this;
// this.$emit
this.defaultLoadPage && this.load();
},
computed: {
filterColumns() {
return this.columns.filter((x) => {
return !x.hidden;
});
},
},
methods: {
headerClick(column, event) {
if (this.clickEdit && this.edit.rowIndex != -1) {
if (
this.rowEndEdit(
this.url ?
this.rowData[this.edit.rowIndex] :
this.tableData[this.edit.rowIndex],
column
)
) {
this.edit.rowIndex = -1;
}
}
// this.edit.rowIndex = -1;
},
rowDbClick(row, column, event) {
//2021.05.23增加双击行事件
this.$emit("row-dbclick", {
row,
column,
event
});
},
rowClick(row, column, event) {
//2021.09.16修复edge浏览器可能报错的问题
if (!column) {
return;
}
// 点击行事件(2020.11.07)
this.$emit("rowClick", {
row,
column,
event
});
if (!this.doubleEdit) {
return;
}
// 点击其他行时,如果点击的行与正在编辑的行相同,保持编辑状态
if (this.clickEdit && this.edit.rowIndex != -1) {
if (row.elementIdex == this.edit.rowIndex) {
// 点击的单元格如果不可以编辑,直接结束编辑
// 2020.10.12修复结束编辑时element table高版本属性获取不到的问题
//2021.09.16修复edge浏览器可能报错的问题
let _field;
if (event && event.property) {
_field = event.property;
} else {
_field = column.property;
}
if (!this.columns.some((x) => x.field == _field && x.edit)) {
if (this.rowEndEdit(row, event)) {
this.edit.rowIndex = -1;
}
}
return;
}
if (this.rowEndEdit(row, event && event.property ? event : column)) {
this.edit.rowIndex = -1;
}
}
this.rowBeginEdit(row, column);
},
dowloadFile(file) {
this.base.dowloadFile(
file.path,
file.name, {
Authorization: this.$store.getters.getToken(),
},
//this.http.ipAddress
);
},
getFilePath(pathSring, column) {
// 获取表的图片与文件显示
if (!pathSring) return [];
// 增加图片自定义操作
// 返回格式必须是[{name:"文件名",path:"图片全路径或base64格式"}]
if (column.formatter) {
return column.formatter(pathSring);
}
let filePath = pathSring.replace(/\\/g, "/").split(",");
let fileInfo = [];
for (let index = 0; index < filePath.length; index++) {
let file = filePath[index];
// 2020.12.19增加base64图片显示
if (column.base64) {
fileInfo.push({
name: "",
path: (file.indexOf("base64,") == -1 ? "data:image/png;base64," : "") +
file,
});
} else if (file.indexOf(".") != -1) {
let splitFile = file.split("/");
if (splitFile.length > 0) {
fileInfo.push({
name: splitFile[splitFile.length - 1],
path: this.base.isUrl(file) ? file : "" //this.http.ipAddress + file,
});
}
}
}
return fileInfo;
},
// 重置table
reset() {
if (this.tableData && this.tableData.length > 0) {
this.tableData.splice(0);
}
if (this.rowData && this.rowData.length > 0) {
this.rowData.splice(0);
}
if (!this.paginationHide) {
this.paginations.page = 1;
// this.paginations.rows = 30;
if (this.paginations.wheres && this.paginations.wheres.length > 0) {
this.paginations.wheres.splice(0);
}
}
this.errorFiled = "";
this.edit.columnIndex = -1;
this.edit.rowIndex = -1;
},
getHeight() {
// 没有定义高度与最大高度使用table默认值
if (!this.height && !this.maxHeight) {
return null;
}
// 定义了最大高度则不使用高度
if (this.maxHeight) {
return null;
}
// 使用当前定义的高度
return this.height;
},
getMaxHeight() {
// 没有定义高度与最大高度使用table默认值
if (!this.height && !this.maxHeight) {
return null;
}
// 定义了最大高度使用最大高度
if (this.maxHeight) {
return null;
}
// 不使用最大高度
return null;
},
getSelectedOptions(column) {
if (column.bind && column.bind.data && column.bind.data.length > 0) {
return column.bind.data;
}
return [];
},
formatterClick(row, column, event) {
column.click && column.click(row, column, event);
},
initIndex(obj) {
if (this.index) {
obj.row.elementIdex = obj.rowIndex;
}
return "";
},
toggleEdit(event) {},
setEditStatus(status) {
this.columns.forEach((x) => {
if (x.hasOwnProperty("edit")) {
this.$set(x.edit, "status", status);
}
});
},
// 通过button按钮启用编辑
beginWithButtonEdit(scope) {
// url?rowData:tableData
this.rowBeginEdit(scope.row, this.columns[scope.$index]);
},
// 通过button结束编辑
endWithButtonEdit(scope) {
if (this.edit.rowIndex == -1) return;
if (
!this.endEditBefore(scope.row, this.columns[scope.$index], scope.$index)
) {
return;
}
for (let index = 0; index < this.columns.length; index++) {
let column = this.columns[index];
if (!column.hidden && (column.required || column.require)) {
if (!this.validateColum(column, scope.row)) return;
}
}
this.edit.rowIndex = -1;
if (
!this.endEditAfter(scope.row, this.columns[scope.$index], scope.$index)
) {}
},
rowBeginEdit(row, column) {
if (this.edit.rowIndex != -1) {
return;
}
if (!this.enableEdit) return;
// 编辑前
if (!this.beginEdit(row, column, row.elementIdex)) return;
if (row.hasOwnProperty("elementIdex")) {
if (this.edit.rowIndex == row.elementIdex) {
return;
}
this.edit.rowIndex = row.elementIdex;
}
},
validateColum(option, data) {
if (option.hidden || option.bind) return true;
let val = data[option.field];
if (option.require || option.required) {
if (val != "0" && (val == "" || val == undefined)) {
if (!this.errorFiled) {
// event.focus();
this.$Message.error(option.title + "不能为空");
}
return false;
}
}
if (!option.edit) {
return true;
}
let editType = option.edit.type;
// 验证数字
if (editType == "int" || editType == "decimal" || editType == "number") {
if (val == "" || val == undefined) return true;
if (editType == "decimal") {
if (!this.rule.decimal.test(val)) {
this.$Message.error(option.title + "只能是数字");
return false;
}
} else if (!this.rule.decimal.test(val)) {
this.$Message.error(option.title + "只能是整数");
return false;
}
if (
option.edit.min != undefined &&
typeof option.edit.min === "number" &&
val < option.edit.min
) {
this.$Message.error(option.title + "不能小于" + option.edit.min);
return false;
}
if (
option.edit.max != undefined &&
typeof option.edit.max === "number" &&
val > option.edit.max
) {
// 2020.09.26修复表格验证最大值取值错误的问题
this.$Message.error(option.title + "不能大于" + option.edit.max);
return false;
}
return true;
}
// 验证字符串
if (val && (editType == "text" || editType == "string")) {
if (
option.edit.min != undefined &&
typeof option.edit.min === "number" &&
val.length < option.edit.min
) {
this.$Message.error(
option.title + "至少" + option.edit.min + "个字符"
);
return false;
}
if (
option.edit.max != undefined &&
typeof option.edit.max === "number" &&
val.length > option.edit.max
) {
this.$Message.error(
option.title + "最多" + option.edit.max + "个字符"
);
return false;
}
return true;
}
return true;
},
rowEndEdit(row, column, event) {
if (this.clickEdit && event) {
return true;
}
if (!this.enableEdit) {
if (!this.errorFiled) {
if (
this.edit.rowIndex != -1 &&
!this.endEditAfter(row, column, this.edit.rowIndex)
) {
return false;
}
this.edit.rowIndex = -1;
}
return true;
}
if (!this.doubleEdit && event) {
return true;
}
// 结束编辑前
if (!this.endEditBefore(row, column, this.edit.rowIndex)) return false;
if (
this.edit.rowIndex != -1 &&
(!this.errorFiled || this.errorFiled == column.property)
) {
let data = (this.url ? this.rowData : this.tableData)[
this.edit.rowIndex
];
let option = this.columns.find((x) => {
return x.field == column.property;
});
if (!option || !option.edit) {
return true;
}
if (
option.edit.type == "datetime" ||
option.edit.type == "date" ||
option.edit.type == "select"
) {
if (this.edit.rowIndex == row.elementIdex) {
return true;
}
}
if (!this.validateColum(option, data)) {
this.errorFiled = option.field;
return false;
} else {
this.errorFiled = "";
}
}
if (this.errorFiled) {
return false;
}
if (!this.endEditAfter(row, column, this.edit.rowIndex)) return false;
// this.errorFiled = "";
this.edit.rowIndex = -1;
return true;
// this.edit.columnIndex=-1;
},
delRow() {
let rows = this.getSelected();
if (rows.length == 0) return this.$Message.error("请选择要删除的行!");
let data = this.url ? this.rowData : this.tableData;
let indexArr = this.getSelectedIndex();
if (indexArr.length == 0) {
return this.$Message.error(
"删除操作必须设置VolTable的属性index='true'"
);
}
// if (indexArr.length == 0 || !this.key) {
// return this.$message.error(
// "请设置index=true属性或指columns的字段为key"
// );
// }
if (indexArr.length == 0) {
// let keyValues=[]
// rows.forEach(x=>{
// if (x[this.key]) {
// }
// keyValues.push(x[this.key])
// })
// data.find(x=>)
} else {
for (let i = data.length - 1; i >= 0; i--) {
if (indexArr.indexOf(i) != -1) {
data.splice(i, 1);
}
}
}
this.edit.rowIndex = -1;
return rows;
},
addRow(row) {
if (!row) {
row = {};
}
this.columns.forEach((x) => {
if (!row.hasOwnProperty(x.field)) {
if (x.edit && x.edit.type == "switch") {
row[x.field] = x.type == "bool" ? false : 0;
} else if (!row.hidden) {
// 2020.09.06添加行时,设置默认字段
row[x.field] = undefined;
}
}
});
if (!this.url) {
this.tableData.push(row);
return;
}
this.rowData.push(row);
},
viewImg(row, column, url) {
this.base.previewImg(url);
// window.open(row[column.field]);
},
link(row, column, $e) {
$e.stopPropagation();
this.$props.linkView(row, column);
},
getSelected() {
return this.$refs.table.selection;
},
getSelectedIndex() {
if (!this.index) {
// 只有设置了属性index才有索引行
return [];
}
let indexArr = this.$refs.table.selection.map((x) => {
return x.elementIdex;
});
return indexArr || [];
},
GetTableDictionary(rows) {
// 分页或刷新或重新绑定数据源
if (this.remoteColumns.length == 0 || !rows || rows.length == 0) return;
let remoteInfo = {};
for (let index = 0; index < this.remoteColumns.length; index++) {
const column = this.remoteColumns[index];
// column.bind.data.splice(0);
let key = column.bind.key;
let data = [];
rows.forEach((row) => {
if (data.indexOf(row[column.field]) == -1) {
data.push(row[column.field]);
}
});
if (data.length > 0) {
remoteInfo[key] = data;
}
}
if (remoteInfo.length == 0) return;
// ha= Object.assign([], ha, hb)
},
load(query, isResetPage) {
// isResetPage重置分页数据
if (!this.url) return;
if (isResetPage) {
this.resetPage();
}
let param = {
page: this.paginations.page,
rows: this.paginations.rows,
sort: this.paginations.sort,
order: this.paginations.order,
wheres: [], // 查询条件,格式为[{ name: "字段", value: "xx" }]
};
let status = true;
// 合并查询信息(包查询分页、排序、查询条件等)
if (query) {
param = Object.assign(param, query);
}
/* 查询前处理(如果需要查询条件实现组件方法loadBefore方法即可:
loadBefore=(param, callBack)=>{
param.wheres = [{ name: "PhoneNo", value: "13419098211" }];
callBack(true);
})
*/
this.$emit("loadBefore", param, (result) => {
status = result;
});
if (!status) return;
if (param.wheres && param.wheres instanceof Array) {
param.wheres = JSON.stringify(param.wheres);
}
this.loading = true;
//this.http.post(this.url, param)
request({
url: this.url,
method: 'get',
params: param
})
.then(
(data) => {
//2021.06.04修复tree不刷新的问题
if (this.rowKey) {
this.randomTableKey++;
this.rowData.splice(0);
}
this.loading = false;
// 查询返回结果后处理
// 2020.10.30增加查询后返回所有的查询信息
this.$emit(
"loadAfter",
data.rows || [],
(result) => {
status = result;
},
data
);
if (!status) return;
//this.GetTableDictionary(data.rows);
this.rowData = data.rows || [];
this.paginations.total = data.total;
// 合计
this.getSummaries(data);
},
).catch(error => {
//reject(error)
})
}, // 获取统计
getSummaries(data) {
if (!this.summary || !data.summary) return;
this.summaryData.splice(0);
// 开启了行号的,+1
if (this.columnIndex) {
this.summaryData.push("");
}
// 如果有checkbox应该算作是第一行
if (this.ck) {
this.summaryData.push("");
}
this.columns.forEach((col) => {
if (!col.hidden) {
if (data.summary.hasOwnProperty(col.field)) {
this.summaryData.push(data.summary[col.field]);
} else {
this.summaryData.push("");
}
}
});
if (this.summaryData.length > 0 && this.summaryData[0] == "") {
this.summaryData[0] = "合计";
}
},
getInputChangeSummaries() {},
handleSizeChange(val) {
this.paginations.rows = val;
this.load();
},
handleCurrentChange(val) {
this.paginations.page = val;
this.load();
},
sortChange(sort) {
this.paginations.sort = sort.prop;
this.paginations.order = sort.order == "ascending" ? "asc" : "desc";
this.load();
},
resetPage() {
// 重置查询分页
// this.paginations.rows = 30;
this.paginations.page = 1;
},
selectionChange(selection) {
// console.log(selection);
// 选择行事件,只有单选才触发
if (this.single && selection.length == 1) {
this.$emit("rowChange", selection[0]); //
}
if (this.single && selection.length > 1) {
this.$refs.table.toggleRowSelection(selection[0]);
}
// this.rowChange(selection[0]);
},
getColor(row, column) {
let val = row[column.field];
// if (val == "" || val == null || val == undefined) {
// return "none";
// }
if (column.getColor && typeof column.getColor === "function") {
let _color = column.getColor(row, column);
if (_color) {
return _color;
}
}
if (!val && val != "0") {
return this.defaultColor;
}
if (!this.formatConfig[column.field]) {
this.formatConfig[column.field] = [val];
return this.colors[0];
}
let index = this.formatConfig[column.field].indexOf(val);
if (index != -1) {
return this.colors[index];
}
if (this.formatConfig[column.field].length > 15) {
return this.defaultColor;
}
if (index == -1) {
this.formatConfig[column.field].push(val);
index = this.formatConfig[column.field].length - 1;
}
return this.colors[index];
},
formatterDate(row, column) {
return (row[column.field] || "").substr(0, 10);
},
formatter(row, column, template) {
if (!template) return row[column.property];
let val = row[column.field];
// 是否值
if (column.edit && column.edit.type == "switch") {
return val ? "" : "";
}
if (!column.bind || !column.bind.data) {
return row[column.field];
}
if (!val && val != 0) return val;
// 编辑多选table显示
if (
(column.bind.type == "selectList" || column.bind.type == "checkbox") &&
typeof val === "string" &&
val.indexOf(",") != -1
) {
return this.getSelectFormatter(column, val);
}
let source = column.bind.data.filter((x) => {
// return x.key != "" && x.key == val;
// 2020.06.06修复单独使用table组件时,key为数字0时转换成文本失败的问题
return x.key !== "" && x.key !== undefined && x.key + "" === val + "";
});
if (source && source.length > 0) val = source[0].value;
return val;
},
getSelectFormatter(column, val) {
// 编辑多选table显示
let valArr = val.split(",");
for (let index = 0; index < valArr.length; index++) {
column.bind.data.forEach((x) => {
// 2020.06.06修复数据源为selectList时,key为数字0时不能转换文本的问题
if (
x.key !== "" &&
x.key !== undefined &&
x.key + "" == valArr[index] + ""
) {
valArr[index] = x.value;
}
});
}
return valArr.join(",");
},
onChange(scope, val, event, column) {
// 2020.09.03修复onChange不触发的问题
let row = scope.row;
if (column.onChange && !column.onChange(row, val, event)) {
return;
}
// 输入框求和实时计算
this.getInputSummaries(scope, val, event, column);
},
// input输入实时求和
getInputSummaries(scope, val, event, column) {
// column列设置了summary属性的才计算值
if (!column.summary) return;
let sum = 0;
let _index = 0;
(this.url ? this.rowData : this.tableData).forEach((x, index) => {
if (x.hasOwnProperty(column.field) && !isNaN(x[column.field])) {
_index = index;
sum += x[column.field] * 1;
}
});
this.$set(this.summaryData, this.summaryIndex[column.field], sum);
},
getCellStyle(row) {
// 2020.12.13增加设置单元格颜色
if (row.column.property) {
return (
this.cellStyleColumns[row.column.property] &&
this.cellStyleColumns[row.column.property](
row.row,
row.rowIndex,
row.columnIndex
)
);
}
},
},
};
</script>
<style lang="less" scoped>
.vol-table {
position: relative;
.mask {
opacity: 0.2;
position: absolute;
width: 100%;
height: 100%;
background: #d0d0d0;
z-index: 100;
}
.message {
text-align: center;
color: #635c5c;
font-size: 15px;
font-weight: 600;
background: #eee;
transform: translateY(-50%);
top: 50%;
position: absolute;
z-index: 200;
left: 0;
right: 0;
width: 150px;
margin: 0 auto;
line-height: 40px;
border-radius: 4px;
border: 1px solid #a09e9e;
}
}
.e-item {
display: flex;
>div:first-child {
flex: 1;
}
}
</style>
<style scoped>
/*表头错行 .el-table th.gutter{
display: table-cell!important;
} */
.pagination {
text-align: right;
/* margin-top: 8px; */
padding: 2px 28px;
border: 1px solid #eee;
border-top: 0px;
}
.v-table>>>.el-table__header th {
padding: 0px !important;
background-color: #f8f8f9 !important;
font-size: 13px;
height: 42px;
color: #616161;
}
.v-table>>>.el-table__header th.is-sortable {
padding: 3px !important;
}
.vol-table.text-inline>>>.el-table__body .cell {
word-break: inherit !important;
white-space: nowrap !important;
}
.v-table>>>.el-table__body td {
padding: 9px 0 !important;
}
.v-table>>>.el-table__footer td {
padding: 7px 0 !important;
}
/* 2021.01.30修复火狐checkbox错位问题 */
.vol-table>>>.el-table-column--selection .cell {
display: inline;
}
.vol-table.text-inline>>>.el-table th>.cell {
white-space: nowrap !important;
}
.vol-table>>>.el-table__body-wrapper::-webkit-scrollbar {
width: 10px;
height: 10px;
}
.vol-table>>>.el-table__body-wrapper::-webkit-scrollbar-thumb {
border-radius: 5px;
background: #ddd;
}
.vol-table .table-img {
height: 40px;
border-radius: 5px;
margin-right: 10px;
width: 40px;
object-fit: cover;
}
.vol-table .table-img:hover {
cursor: pointer;
}
.v-table>>>.ivu-tag-default {
border: none !important;
background: none !important;
}
/* .v-table >>> .el-table__fixed-body-wrapper {
top: 41px !important;
} */
.v-table>>>.el-table__fixed:before {
border-color: none !important;
}
/* 2021.06.19判断谷歌内核浏览重新计算table高度 */
.chrome>>>.el-table__fixed {
height: calc(100% - 11px) !important;
background: white;
/* box-shadow: 0px -11px 10px rgb(0 0 0 / 12%) !important; */
}
.chrome>>>.el-table__body-wrapper::-webkit-scrollbar {
width: 11px;
height: 11px;
}
.chrome>>>.el-table__body-wrapper::-webkit-scrollbar-thumb {
border-radius: 5px;
background: #ddd;
}
.chrome>>>.el-table__fixed:before {
background-color: unset;
}
.chrome>>>.el-table__fixed-footer-wrapper {
bottom: -11.5px;
}
</style>