ahdevicemgt-ui/src/components/TableModel/index.vue

304 lines
9.0 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<!-- 表格公共组件 -->
<div>
<!-- 表单搜索 -->
<el-form
:model="queryParams"
ref="queryFormRef"
size="small"
:inline="true"
label-width="100px"
v-show="showSearch"
>
<el-form-item
v-for="(item, v) in formLabel"
:key="v"
:label="item.f_label"
:prop="item.f_model"
>
<el-input
v-if="item.f_type === 'ipt'"
v-model="queryParams[item.f_model]"
:placeholder="`请输入${item.f_label}`"
clearable
style="width: 240px"
/>
<el-select
v-if="item.f_type === 'sel'"
v-model="queryParams[item.f_model]"
clearable
filterable
style="width: 240px"
:placeholder="`请选择${item.f_label}`"
>
<el-option
v-for="(sel, v) in item.f_selList"
:key="v"
:label="sel.label"
:value="sel.value"
/>
</el-select>
<el-cascader
v-if="item.f_type === 'selCas'"
v-model="queryParams[item.f_model]"
:options="item.f_selList"
:props="item.optionProps"
:show-all-levels="false"
clearable
style="width: 240px"
/>
<el-date-picker
v-if="item.f_type === 'date'"
v-model="queryParams[item.f_model]"
style="width: 240px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>查询</el-button
>
<el-button
type="warning"
icon="el-icon-refresh"
size="mini"
@click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form>
<!-- 按钮集群 -->
<el-row class="btn-container">
<div class="btn-handler">
<slot name="btn" :pageParams="queryParams"></slot>
</div>
<ToolbarModel
:showSearch.sync="showSearch"
:indexNumShow.sync="indexNumShow"
:selectionShow.sync="selectionShow"
:handleShow.sync="handleShow"
:columns="columCheckList"
@queryTable="getTableList"
/>
</el-row>
<!-- 表格 -->
<el-table
:data="tableList"
border
ref="tableRef"
select-on-indeterminate
style="width: 100%"
>
<el-table-column
type="selection"
width="45"
align="center"
v-if="selectionShow"
/>
<el-table-column
width="55"
align="center"
label="序号"
type="index"
v-if="indexNumShow"
/>
<el-table-column
v-for="(item, v) in tableColumCheckProps"
:key="v"
:label="item.t_label"
:prop="item.t_props"
:width="item.t_width"
align="center"
show-overflow-tooltip
>
<template slot-scope="scope">
<!-- 判断当前列数据是否需要使用插槽的数据 -->
<template v-if="item.t_slot">
<slot :data="scope.row" :name="item.t_slot"></slot>
</template>
<template v-else>
{{ scope.row[item.t_props] || '-' }}
</template>
</template>
</el-table-column>
<el-table-column
align="center"
label="操作"
v-if="handleShow"
:min-width="dynamicWidth"
>
<template slot-scope="{ row }">
<div class="optionDivRef">
<slot :data="row" name="handle">-</slot>
</div>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import ToolbarModel from '../ToolbarModel'
export default {
components: { ToolbarModel },
props: {
/** 表单查询条件 */
formLabel: {
type: Array,
default: () => [],
},
/** 列表请求接口 */
requestApi: {
type: Function,
default: () => function () {},
},
/* 列表配置项 */
columnsList: {
type: Array,
default: () => [],
},
},
computed: {
/* 根据操作栏控制表头是否显示 */
tableColumCheckProps() {
return this.columCheckList.filter((e) => {
return e.checked != false
})
},
},
watch: {
handleShow: {
handler(newValue) {
if (!newValue) {
this.dynamicWidth = 0
}
},
},
},
data() {
return {
// 列表接口查询参数
queryParams: {},
// 搜索区域是否隐藏
showSearch: true,
// 是否显示复选框
selectionShow: true,
// 是否显示序号
indexNumShow: true,
// 是否显示操作列
handleShow: true,
// 列表每列 label
columCheckList: [],
// 列表数据源
tableList: [
{ scrapNum: '测试' },
{ scrapNum: '123' },
{ scrapNum: '测试' },
],
// 操作列最小宽度
dynamicWidth: 0,
}
},
created() {
this.columCheckList = this.columnsList
this.columCheckList = this.columCheckList.map((e) => {
this.$set(e, 'checked', true)
return e
})
/* 生成查询参数 */
this.formLabel.map((e) => {
this.$set(this.queryParams, e.f_model, '')
})
this.getTableList()
},
updated() {
this.dynamicWidth = this.getOperatorWidth()
},
methods: {
/** 获取列表数据 */
async getTableList() {
const res = await this.requestApi({ ...this.queryParams })
console.log(res, '列表数据')
},
/** 查询按钮 */
handleQuery() {
this.getTableList()
},
/** 重置按钮 */
resetQuery() {
// this.$refs.queryFormRef.resetFields()
this.getTableList()
},
/** 筛选列 */
checkboxChange(list) {
this.columCheckList = list
},
/** 动态设置操作列的列宽 */
getOperatorWidth() {
const operatorColumn =
document.getElementsByClassName('optionDivRef')
// 默认宽度
let width = 100
// 内间距
let paddingSpacing = 0
// 按钮数量
let buttonCount = 0
if (operatorColumn.length > 0) {
Array.prototype.forEach.call(operatorColumn, function (item) {
// 最宽的宽度
width = width > item.offsetWidth ? width : item.offsetWidth
const buttons = item.getElementsByClassName('el-button')
buttonCount = buttons.length
buttonCount =
buttonCount > buttons.length
? buttonCount
: buttons.length
})
// 如果按钮数量大于2宽度要加上边距*(按钮数量-1
// if (buttonCount > 2) {
// width += paddingSpacing * (buttonCount - 1)
// }
return width
}
},
},
}
</script>
<style scoped lang="scss">
.btn-container {
margin-bottom: 6px;
display: flex;
align-items: center;
}
::v-deep .btn-handler {
flex: 1;
.el-button {
padding: 6px 18px;
}
}
::v-deep .optionDivRef {
white-space: nowrap;
display: inline-block;
.el-button {
padding: 6px 12px;
}
}
</style>