mirror of
https://github.com/Tencent/tmagic-editor.git
synced 2025-12-07 10:46:58 +08:00
131 lines
3.3 KiB
Vue
131 lines
3.3 KiB
Vue
<template>
|
|
<TTable
|
|
ref="table"
|
|
:data="data"
|
|
:bordered="border"
|
|
:max-height="maxHeight"
|
|
:default-expand-all="defaultExpandAll"
|
|
:show-header="showHeader"
|
|
:row-key="rowKey"
|
|
:tree="treeProps"
|
|
:empty="emptyText"
|
|
:columns="tableColumns"
|
|
@sort-change="sortChange"
|
|
@select-change="selectHandler"
|
|
@cell-click="cellClickHandler"
|
|
@expand-change="expandChange"
|
|
/>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { computed, useTemplateRef } from 'vue';
|
|
import { Table as TTable } from 'tdesign-vue-next';
|
|
|
|
import type { TableProps } from '@tmagic/design';
|
|
|
|
defineOptions({
|
|
name: 'TTDesignAdapterTable',
|
|
});
|
|
|
|
const emit = defineEmits(['sort-change', 'select', 'select-all', 'selection-change', 'expand-change', 'cell-click']);
|
|
|
|
const props = defineProps<TableProps>();
|
|
|
|
const tableRef = useTemplateRef('table');
|
|
|
|
// 将列配置转换为 TDesign 格式
|
|
const tableColumns = computed(() => {
|
|
if (!props.columns) return [];
|
|
|
|
const columns = [];
|
|
for (const item of props.columns) {
|
|
if (item.props.type === 'expand') {
|
|
continue;
|
|
}
|
|
|
|
let colKey = item.props?.prop || item.props?.type;
|
|
|
|
if (!colKey) {
|
|
colKey = 'tmagic_table_operation';
|
|
}
|
|
|
|
const column: any = {
|
|
thClassName: item.props?.class,
|
|
colKey,
|
|
title: item.props?.label,
|
|
width: item.props?.width,
|
|
fixed: item.props?.fixed === true ? 'left' : item.props?.fixed || undefined,
|
|
ellipsis: props.showOverflowTooltip,
|
|
sorter: item.props?.sortable,
|
|
align: item.props?.align,
|
|
};
|
|
|
|
// 处理自定义单元格渲染
|
|
if (item.cell) {
|
|
column.cell = (h: any, { row, rowIndex }: any) => {
|
|
return item.cell?.({ row, $index: rowIndex });
|
|
};
|
|
}
|
|
|
|
if (item.title) {
|
|
column.title = (h: any, data: any) => {
|
|
return item.title?.(data);
|
|
};
|
|
}
|
|
|
|
columns.push(column);
|
|
}
|
|
|
|
return columns;
|
|
});
|
|
|
|
const sortChange = (data: any) => {
|
|
emit('sort-change', data);
|
|
};
|
|
|
|
const selectHandler = (selectedRowKeys: any[], options: any) => {
|
|
const { selectedRowData, type } = options;
|
|
|
|
if (type === 'check') {
|
|
emit('select', selectedRowData);
|
|
} else if (type === 'uncheck') {
|
|
emit('select', selectedRowData);
|
|
}
|
|
|
|
emit('selection-change', selectedRowData);
|
|
};
|
|
|
|
const cellClickHandler = (context: any) => {
|
|
const { row, col, e } = context;
|
|
emit('cell-click', row, col, undefined, e);
|
|
};
|
|
|
|
const expandChange = (expandedRowKeys: any[], options: any) => {
|
|
emit('expand-change', options.expandedRowData, options.currentRowData);
|
|
};
|
|
|
|
const toggleRowSelection = (_row: any, _selected: boolean) => {
|
|
// TDesign 的选择方法需要通过 selectedRowKeys 来控制
|
|
// 这里需要根据实际情况调整
|
|
console.warn('toggleRowSelection needs to be implemented based on TDesign API');
|
|
};
|
|
|
|
const toggleRowExpansion = (_row: any, _expanded: boolean) => {
|
|
// TDesign 的展开方法需要通过 expandedRowKeys 来控制
|
|
console.warn('toggleRowExpansion needs to be implemented based on TDesign API');
|
|
};
|
|
|
|
const clearSelection = () => {
|
|
// TDesign 需要通过更新 selectedRowKeys 来清空选择
|
|
console.warn('clearSelection needs to be implemented based on TDesign API');
|
|
};
|
|
|
|
defineExpose({
|
|
getEl: () => tableRef.value?.$el,
|
|
getTableRef: () => tableRef.value,
|
|
clearSelection,
|
|
toggleRowSelection,
|
|
toggleRowExpansion,
|
|
});
|
|
</script>
|