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.
211 lines
4.8 KiB
211 lines
4.8 KiB
4 months ago
|
<template>
|
||
|
<div class="edfs-table-components">
|
||
|
<el-table
|
||
|
:data="data"
|
||
|
:fit="fit"
|
||
|
:stripe="stripe"
|
||
|
:border="border"
|
||
|
v-loading="loading"
|
||
|
:show-header="showHeader"
|
||
|
:max-height="maxHeight"
|
||
|
:highlight-current-row="highlightCurrentRow"
|
||
|
:row-class-name="rowClassName"
|
||
|
@current-change="onCurrentChange"
|
||
|
ref="ELTableRef"
|
||
|
@row-click="onRowClick"
|
||
|
@row-dblclick="onRowDblclick"
|
||
|
@selection-change="handleSelectionChange"
|
||
|
class="edfs-table"
|
||
|
:span-method="spanMethod"
|
||
|
>
|
||
|
<slot></slot>
|
||
|
</el-table>
|
||
|
<template v-if="usePaging">
|
||
|
<div class="pagination-block">
|
||
|
<el-pagination
|
||
|
v-model:current-page="currentPage"
|
||
|
v-model:page-size="pageSize"
|
||
|
:width-type="1"
|
||
|
layout="prev, pager, next, jumper"
|
||
|
:total="pageTotal"
|
||
|
background
|
||
|
@current-change="onPageCurrentChange"
|
||
|
/>
|
||
|
|
||
|
<!-- @size-change="onPageSizeChange" -->
|
||
|
</div>
|
||
|
</template>
|
||
|
</div>
|
||
|
</template>
|
||
|
|
||
|
<script setup lang="ts" generic="T">
|
||
|
import { ElTable } from 'element-plus'
|
||
|
import { type Props } from './defaults'
|
||
|
|
||
|
const props = withDefaults(defineProps<Props<T>>(), {
|
||
|
fit: true,
|
||
|
showHeader: true,
|
||
|
usePaging: true,
|
||
|
currentPage: 1,
|
||
|
pageTotal: 15,
|
||
|
loading: false,
|
||
|
})
|
||
|
|
||
|
|
||
|
const emit = defineEmits<{
|
||
|
'current-change': [currentRow: any, oldCurrentRow: any]
|
||
|
'row-click': [row: any, column: any, event: Event]
|
||
|
'row-dblclick': [row: any, column: any, event: Event]
|
||
|
// 'page-size-change': [pageSize: number]
|
||
|
'page-current-change': [currentPage: number]
|
||
|
'selection-change': [selection: any[]]
|
||
|
}>()
|
||
|
|
||
|
function onCurrentChange(currentRow: any, oldCurrentRow: any) {
|
||
|
emit('current-change', currentRow, oldCurrentRow)
|
||
|
}
|
||
|
function onRowClick(row: any, column: any, event: Event) {
|
||
|
emit('row-click', row, column, event)
|
||
|
}
|
||
|
function onRowDblclick(row: any, column: any, event: Event) {
|
||
|
emit('row-dblclick', row, column, event)
|
||
|
}
|
||
|
|
||
|
function handleSelectionChange(selection: any[]) {
|
||
|
emit('selection-change', selection)
|
||
|
}
|
||
|
|
||
|
// 分页
|
||
|
const pageSize = ref()
|
||
|
|
||
|
watch(
|
||
|
() => props.pageSize,
|
||
|
val => {
|
||
|
pageSize.value = val
|
||
|
}
|
||
|
)
|
||
|
|
||
|
const currentPage = ref()
|
||
|
watch(
|
||
|
() => props.currentPage,
|
||
|
val => {
|
||
|
currentPage.value = val
|
||
|
}
|
||
|
)
|
||
|
|
||
|
// function onPageSizeChange(pageSize: number) {
|
||
|
// emit('page-size-change', pageSize)
|
||
|
// }
|
||
|
function onPageCurrentChange(currentPage: number) {
|
||
|
emit('page-current-change', currentPage)
|
||
|
}
|
||
|
|
||
|
function getSize() {
|
||
|
const el = document.querySelector('.edfs-table-components')
|
||
|
if (!el) return 18
|
||
|
const height = Math.floor(el.getBoundingClientRect().height)
|
||
|
return Math.ceil(height / 40)
|
||
|
}
|
||
|
|
||
|
const ELTableRef = ref<InstanceType<typeof ElTable>>()
|
||
|
function clearSelection() {
|
||
|
ELTableRef.value?.clearSelection()
|
||
|
}
|
||
|
|
||
|
defineExpose({
|
||
|
getSize,
|
||
|
clearSelection,
|
||
|
})
|
||
|
</script>
|
||
|
|
||
|
<style lang="scss" scoped>
|
||
|
.edfs-table-components {
|
||
|
width: 100%;
|
||
|
height: 100%;
|
||
|
display: flex;
|
||
|
flex-direction: column;
|
||
|
box-sizing: border-box;
|
||
|
// background-color: #fff;
|
||
|
.edfs-table {
|
||
|
width: 100%;
|
||
|
height: 100%;
|
||
|
font-size: 14px;
|
||
|
}
|
||
|
|
||
|
:deep(.el-table th.el-table__cell) {
|
||
|
background-color: var(--table-header-bg);
|
||
|
font-family: Alibaba-PuHuiTi-M;
|
||
|
font-size: 14px;
|
||
|
color: var(--table-header-text-color);
|
||
|
font-weight: 500;
|
||
|
}
|
||
|
|
||
|
:deep(.el-table__row .cell) {
|
||
|
font-family: Alibaba-PuHuiTi-R;
|
||
|
line-height: 16px;
|
||
|
min-height: 20px;
|
||
|
font-weight: 400;
|
||
|
color: var(--text-color);
|
||
|
}
|
||
|
|
||
|
.pagination-block {
|
||
|
user-select: none;
|
||
|
display: flex;
|
||
|
// place-content: center;
|
||
|
align-items: center;
|
||
|
justify-content: end;
|
||
|
height: 60px;
|
||
|
:deep(.el-pagination__editor.el-input) {
|
||
|
width: 66px;
|
||
|
}
|
||
|
:deep(.el-input__wrapper) {
|
||
|
height: 30px;
|
||
|
margin-left: 8px;
|
||
|
padding: 0 10px;
|
||
|
.el-input__inner {
|
||
|
font-size: 14px;
|
||
|
height: 100%;
|
||
|
}
|
||
|
}
|
||
|
:deep(.el-pagination) {
|
||
|
// width: cvw(200);
|
||
|
}
|
||
|
:deep(.el-pagination),
|
||
|
:deep(.el-pagination .el-icon),
|
||
|
:deep(.el-pagination li) {
|
||
|
font-size: 14px;
|
||
|
}
|
||
|
|
||
|
:deep(.el-pagination .btn-next),
|
||
|
:deep(.el-pagination .btn-prev),
|
||
|
:deep(.el-pagination li) {
|
||
|
background-color: transparent;
|
||
|
}
|
||
|
:deep(.el-pager) {
|
||
|
height: 28px;
|
||
|
}
|
||
|
|
||
|
:deep(.el-pagination li) {
|
||
|
min-width: 28px;
|
||
|
height: 28px;
|
||
|
border-radius: 2px;
|
||
|
border: 1px solid var(--pagination-border-color);
|
||
|
background-color: var(--pagination-bg);
|
||
|
|
||
|
&:hover {
|
||
|
color: #619925;
|
||
|
}
|
||
|
}
|
||
|
:deep(.is-active) {
|
||
|
color: #619925 !important;
|
||
|
background: rgba(97, 153, 37, 0.06) !important;
|
||
|
border: 1px solid rgba(97, 153, 37, 1) !important;
|
||
|
border-radius: 2px;
|
||
|
}
|
||
|
:deep(.el-input__wrapper) {
|
||
|
background-color: var(--pagination-bg);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
</style>
|