|
|
|
|
@ -5,6 +5,7 @@ import { propTypes } from '@/utils/propTypes'
|
|
|
|
|
import { setIndex } from './helper'
|
|
|
|
|
import { getSlot } from '@/utils/tsxHelper'
|
|
|
|
|
import type { TableProps } from './types'
|
|
|
|
|
import { set } from 'lodash-es'
|
|
|
|
|
|
|
|
|
|
export default defineComponent({
|
|
|
|
|
name: 'Table',
|
|
|
|
|
@ -20,6 +21,8 @@ export default defineComponent({
|
|
|
|
|
type: Array as PropType<TableColumn[]>,
|
|
|
|
|
default: () => []
|
|
|
|
|
},
|
|
|
|
|
// 展开行
|
|
|
|
|
expand: propTypes.bool.def(false),
|
|
|
|
|
// 是否展示分页
|
|
|
|
|
pagination: {
|
|
|
|
|
type: Object as PropType<Pagination>,
|
|
|
|
|
@ -73,8 +76,22 @@ export default defineComponent({
|
|
|
|
|
outsideProps.value = props
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const setColumn = (columnProps: TableSetPropsType[], columnsChildren?: TableColumn[]) => {
|
|
|
|
|
const { columns } = unref(getProps)
|
|
|
|
|
for (const v of columnsChildren || columns) {
|
|
|
|
|
for (const item of columnProps) {
|
|
|
|
|
if (v.field === item.field) {
|
|
|
|
|
set(v, item.path, item.value)
|
|
|
|
|
} else if (v.children?.length) {
|
|
|
|
|
setColumn(columnProps, v.children)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
expose({
|
|
|
|
|
setProps
|
|
|
|
|
setProps,
|
|
|
|
|
setColumn
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const pagination = computed(() => {
|
|
|
|
|
@ -129,21 +146,73 @@ export default defineComponent({
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const renderTableSelection = () => {
|
|
|
|
|
const { selection, reserveSelection, align, headerAlign } = unref(getProps)
|
|
|
|
|
// 渲染多选
|
|
|
|
|
return unref(getProps).selection ? (
|
|
|
|
|
return selection ? (
|
|
|
|
|
<ElTableColumn
|
|
|
|
|
type="selection"
|
|
|
|
|
reserveSelection={unref(getProps).reserveSelection}
|
|
|
|
|
align={unref(getProps).align}
|
|
|
|
|
headerAlign={unref(getProps).headerAlign}
|
|
|
|
|
reserveSelection={reserveSelection}
|
|
|
|
|
align={align}
|
|
|
|
|
headerAlign={headerAlign}
|
|
|
|
|
width="50"
|
|
|
|
|
></ElTableColumn>
|
|
|
|
|
) : undefined
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const rnderTableColumn = (columns: TableColumn[]) => {
|
|
|
|
|
return [renderTableSelection()].concat(
|
|
|
|
|
columns.map((v) => {
|
|
|
|
|
const renderTableExpand = () => {
|
|
|
|
|
const { align, headerAlign } = unref(getProps)
|
|
|
|
|
// 渲染展开行
|
|
|
|
|
return unref(getProps).expand ? (
|
|
|
|
|
<ElTableColumn type="expand" align={align} headerAlign={headerAlign}>
|
|
|
|
|
{{
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
default: (data: TableSlotDefault) => getSlot(slots, 'expand', data)
|
|
|
|
|
}}
|
|
|
|
|
</ElTableColumn>
|
|
|
|
|
) : undefined
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const rnderTreeTableColumn = (columnsChildren: TableColumn[]) => {
|
|
|
|
|
const { align, headerAlign, showOverflowTooltip } = unref(getProps)
|
|
|
|
|
return columnsChildren.map((v) => {
|
|
|
|
|
const props = { ...v }
|
|
|
|
|
if (props.children) delete props.children
|
|
|
|
|
return (
|
|
|
|
|
<ElTableColumn
|
|
|
|
|
showOverflowTooltip={showOverflowTooltip}
|
|
|
|
|
align={align}
|
|
|
|
|
headerAlign={headerAlign}
|
|
|
|
|
{...props}
|
|
|
|
|
prop={v.field}
|
|
|
|
|
>
|
|
|
|
|
{{
|
|
|
|
|
default: (data: TableSlotDefault) =>
|
|
|
|
|
v.children && v.children.length
|
|
|
|
|
? rnderTableColumn(v.children)
|
|
|
|
|
: // @ts-ignore
|
|
|
|
|
getSlot(slots, v.field, data) ||
|
|
|
|
|
v?.formatter?.(data.row, data.column, data.row[v.field], data.$index) ||
|
|
|
|
|
data.row[v.field],
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
header: getSlot(slots, `${v.field}-header`)
|
|
|
|
|
}}
|
|
|
|
|
</ElTableColumn>
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const rnderTableColumn = (columnsChildren?: TableColumn[]) => {
|
|
|
|
|
const {
|
|
|
|
|
columns,
|
|
|
|
|
reserveIndex,
|
|
|
|
|
pageSize,
|
|
|
|
|
currentPage,
|
|
|
|
|
align,
|
|
|
|
|
headerAlign,
|
|
|
|
|
showOverflowTooltip
|
|
|
|
|
} = unref(getProps)
|
|
|
|
|
return [...[renderTableExpand()], ...[renderTableSelection()]].concat(
|
|
|
|
|
(columnsChildren || columns).map((v) => {
|
|
|
|
|
// 自定生成序号
|
|
|
|
|
if (v.type === 'index') {
|
|
|
|
|
return (
|
|
|
|
|
@ -152,32 +221,30 @@ export default defineComponent({
|
|
|
|
|
index={
|
|
|
|
|
v.index
|
|
|
|
|
? v.index
|
|
|
|
|
: (index) =>
|
|
|
|
|
setIndex(
|
|
|
|
|
unref(getProps).reserveIndex,
|
|
|
|
|
index,
|
|
|
|
|
unref(getProps).pageSize,
|
|
|
|
|
unref(getProps).currentPage
|
|
|
|
|
)
|
|
|
|
|
: (index) => setIndex(reserveIndex, index, pageSize, currentPage)
|
|
|
|
|
}
|
|
|
|
|
align={v.align || unref(getProps).align}
|
|
|
|
|
headerAlign={v.headerAlign || unref(getProps).headerAlign}
|
|
|
|
|
align={v.align || align}
|
|
|
|
|
headerAlign={v.headerAlign || headerAlign}
|
|
|
|
|
label={v.label}
|
|
|
|
|
width="100px"
|
|
|
|
|
></ElTableColumn>
|
|
|
|
|
)
|
|
|
|
|
} else {
|
|
|
|
|
const props = { ...v }
|
|
|
|
|
if (props.children) delete props.children
|
|
|
|
|
return (
|
|
|
|
|
<ElTableColumn
|
|
|
|
|
showOverflowTooltip={unref(getProps).showOverflowTooltip}
|
|
|
|
|
align={unref(getProps).align}
|
|
|
|
|
headerAlign={unref(getProps).headerAlign}
|
|
|
|
|
{...v}
|
|
|
|
|
showOverflowTooltip={showOverflowTooltip}
|
|
|
|
|
align={align}
|
|
|
|
|
headerAlign={headerAlign}
|
|
|
|
|
{...props}
|
|
|
|
|
prop={v.field}
|
|
|
|
|
>
|
|
|
|
|
{{
|
|
|
|
|
default: (data: TableSlotDefault) =>
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
v.children && v.children.length
|
|
|
|
|
? rnderTreeTableColumn(v.children)
|
|
|
|
|
: // @ts-ignore
|
|
|
|
|
getSlot(slots, v.field, data) ||
|
|
|
|
|
v?.formatter?.(data.row, data.column, data.row[v.field], data.$index) ||
|
|
|
|
|
data.row[v.field],
|
|
|
|
|
@ -201,7 +268,7 @@ export default defineComponent({
|
|
|
|
|
v-loading={unref(getProps).loading}
|
|
|
|
|
>
|
|
|
|
|
{{
|
|
|
|
|
default: () => rnderTableColumn(unref(getProps).columns),
|
|
|
|
|
default: () => rnderTableColumn(),
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
append: () => getSlot(slots, 'append')
|
|
|
|
|
}}
|
|
|
|
|
|