Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix enhanced table #94

Merged
merged 7 commits into from
Dec 29, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 20 additions & 21 deletions examples/table/demos/tree-select.vue
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
<template>
<div class='t-table-tree-select-demo'>
<div class="t-table-tree-select-demo">
<div>
<t-radio-group v-model="checkStrictly" variant="default-filled">
<t-radio-button value="true">父子行选中独立</t-radio-button>
<t-radio-button value="false">
<t-popup content="「父子行选中关联」由于表格数据的特殊性,父节点选中或者取消选中,会影响子节点;但子节点选中或取消不影响父元素">
<t-popup
content="「父子行选中关联」由于表格数据的特殊性,父节点选中或者取消选中,会影响子节点;但子节点选中或取消不影响父元素"
>
父子行选中关联
</t-popup>
</t-radio-button>
</t-radio-group>
</div><br>
</div>
<br />
<!-- 子节点字段不是 children,而是 childrenList -->
<!-- expandedRow 和 expanded-row-keys 控制是否显示展开收起行,以及哪些行展开 -->
<!-- !!! EnhancedTable 才支持,普通 Table 不支持 !!! -->
Expand Down Expand Up @@ -44,21 +47,21 @@ for (let i = 0; i < 5; i++) {
description: 'important.',
};
obj.childrenList = new Array(5).fill(null).map((t, j) => {
const secondIndex = (100 * j) + ((i + 1) * 10);
const secondObj = ({
const secondIndex = 100 * j + (i + 1) * 10;
const secondObj = {
...obj,
status: secondIndex % 3,
key: secondIndex,
instance: `JQTest${secondIndex}`,
});
};
secondObj.childrenList = new Array(5).fill(null).map((m, n) => {
const thirdIndex = secondIndex * 1000 + (100 * m) + ((n + 1) * 10);
return ({
const thirdIndex = secondIndex * 1000 + 100 * m + (n + 1) * 10;
return {
...obj,
status: thirdIndex % 3,
key: thirdIndex,
instance: `JQTest${thirdIndex}`,
});
};
});
return secondObj;
});
Expand Down Expand Up @@ -89,15 +92,13 @@ export default {
{
colKey: 'instance',
title: '集群名称',
width: 250,
width: 200,
},
{
colKey: 'status',
title: '状态',
width: 100,
cell: (h, { row }) => row.status === 0
? <p class="status">健康</p>
: <p class="status unhealth">异常</p>,
cell: (h, { row }) => (row.status === 0 ? <p class="status">健康</p> : <p class="status unhealth">异常</p>),
},
{ colKey: 'owner', title: '管理员' },
{ colKey: 'description', title: '描述' },
Expand Down Expand Up @@ -125,9 +126,7 @@ export default {
},

expandedRowRender(h, { row }) {
return (
<div>这是展开项数据,我是 {row.key} 号</div>
);
return <div>这是展开项数据,我是 {row.key} 号</div>;
},

onExpandChange(val) {
Expand All @@ -145,25 +144,25 @@ export default {
}
.status {
position: relative;
color: #00A870;
color: #00a870;
margin-left: 10px;
&::before {
position: absolute;
top: 50%;
left: 0px;
transform: translateY(-50%);
content: "";
background-color: #00A870;
content: '';
background-color: #00a870;
width: 6px;
height: 6px;
margin-left: -10px;
border-radius: 50%;
}
}
.status.unhealth {
color: #E34D59;
color: #e34d59;
&::before {
background-color: #E34D59;
background-color: #e34d59;
}
}
}
Expand Down
112 changes: 64 additions & 48 deletions examples/table/demos/tree.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
<template>
<div>

<div>
<t-button theme="default" @click="setData1">设置为全新的数据</t-button>&nbsp;&nbsp;
<t-button theme="default" @click="setData2">单独设置某行数据</t-button>
</div>
<br />
<!-- 第一列展开树结点,缩进为 24px,子节点字段 childrenKey 默认为 children -->
<!-- !!! EnhancedTable 才支持,普通 Table 不支持 !!! -->
<t-enhanced-table
Expand All @@ -9,14 +13,10 @@
:data="data"
:columns="columns"
:tree="{ childrenKey: 'list' }"
:pagination="pagination"
@page-change="onPageChange"
></t-enhanced-table>

<br />
<div>
<t-button theme="default" @click="setData1">设置为全新的数据</t-button>&nbsp;&nbsp;
<t-button theme="default" @click="setData2">单独设置某行数据</t-button>
</div>

<!-- 第二列展开树结点,缩进为 12px,示例代码有效,勿删 -->
<!-- indent 定义缩进距离;treeNodeColumnIndex 定义第几列作为树结点展开列 -->
<!-- 如果子结点字段不是 'children',可以使用 childrenKey 定义字段别名,如 `:tree="{ childrenKey: 'list' }"` -->
Expand All @@ -27,51 +27,62 @@
:columns="columns"
:tree="{ indent: 12, treeNodeColumnIndex: 1, childrenKey: 'list' }"
></t-enhanced-table> -->

</div>
</template>
<script lang="jsx">
import { EnhancedTable } from 'tdesign-vue';

const data = [];
for (let i = 0; i < 5; i++) {
const obj = {
key: `我是 ${i} 号`,
platform: i % 2 === 0 ? '共有' : '私有',
type: ['String', 'Number', 'Array', 'Object'][i % 4],
default: ['-', '0', '[]', '{}'][i % 4],
detail: {
postion: `读取 ${i} 个数据的嵌套信息值`,
},
needed: i % 4 === 0 ? '是' : '否',
description: '数据源',
};
obj.list = new Array(2).fill(null).map((t, j) => {
const secondIndex = (100 * j) + ((i + 1) * 10);
const secondObj = ({
...obj,
key: `我是 ${secondIndex} 号`,
function getData(currentPage = 1) {
const data = [];
const pageInfo = `第 ${currentPage} 页`;
for (let i = 0; i < 5; i++) {
const obj = {
key: `我是 ${i} 号(${pageInfo})`,
platform: i % 2 === 0 ? '共有' : '私有',
type: ['String', 'Number', 'Array', 'Object'][i % 4],
default: ['-', '0', '[]', '{}'][i % 4],
detail: {
postion: `读取 ${i} 个数据的嵌套信息值`,
},
needed: i % 4 === 0 ? '是' : '否',
description: '数据源',
};
obj.list = new Array(2).fill(null).map((t, j) => {
const secondIndex = 100 * j + (i + 1) * 10;
const secondObj = {
...obj,
key: `我是 ${secondIndex} 号(${pageInfo})`,
};
secondObj.list = new Array(3).fill(null).map((m, n) => ({
...obj,
key: `我是 ${secondIndex * 1000 + 100 * m + (n + 1) * 10} 号(${pageInfo})`,
}));
return secondObj;
});
secondObj.list = new Array(3).fill(null).map((m, n) => ({
...obj,
key: `我是 ${secondIndex * 1000 + (100 * m) + ((n + 1) * 10)} 号`,
}));
return secondObj;
});
data.push(obj);
data.push(obj);
}
return data;
}

const data = getData();

export default {
components: { TEnhancedTable: EnhancedTable },
data() {
return {
data,
pagination: {
current: 1,
pageSize: 10,
total: 100,
},
columns: [
{
width: '200',
width: 200,
className: 'row',
colKey: 'key',
title: '编号',
ellipsis: true,
},
{
colKey: 'platform',
Expand All @@ -83,26 +94,23 @@ export default {
},
{
colKey: 'operate',
width: 350,
width: 300,
title: '操作',
align: 'center',
// 增、删、改、查 等操作
// eslint-disable-next-line @typescript-eslint/no-unused-vars
cell: (h, { row }) => (
<div class="tdesign-table-demo__table-operations">
<t-button variant="text" onClick={() => this.appendTo(row)}>插入</t-button>
<t-button
variant="text"
onClick={() => this.onEditClick(row)}
>更新</t-button>
<t-button
variant="text"
onClick={() => this.onLookUp(row)}
>查看</t-button>
<t-popconfirm
content="确认删除吗"
onConfirm={() => this.onDeleteConfirm(row)}
>
<t-button variant="text" onClick={() => this.appendTo(row)}>
插入
</t-button>
<t-button variant="text" onClick={() => this.onEditClick(row)}>
更新
</t-button>
<t-button variant="text" onClick={() => this.onLookUp(row)}>
查看
</t-button>
<t-popconfirm content="确认删除吗" onConfirm={() => this.onDeleteConfirm(row)}>
<t-button variant="text">删除</t-button>
</t-popconfirm>
</div>
Expand Down Expand Up @@ -168,6 +176,14 @@ export default {
});
this.$message.success(`已插入子节点我是 ${randomKey} 号,请展开查看`);
},

onPageChange(pageInfo) {
this.pagination = {
...this.pagination,
...pageInfo,
};
this.data = getData(pageInfo.current);
},
},
};
</script>
Expand Down
6 changes: 4 additions & 2 deletions examples/table/table.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
bordered | Boolean | false | 是否显示表格边框 | N
columns | Array | [] | 列配置,泛型 T 指表格数据类型。TS 类型:`Array<BaseTableCol<T>>` | N
data | Array | [] | 数据源,泛型 T 指表格数据类型。TS 类型:`Array<T>` | N
disableDataSort | Boolean | false | 是否禁用本地数据排序。当 `data` 数据长度超过分页大小时,会自动进行本地数据排序。如果 `disabledDataSort` 设置为 true,则无论何时,都不会进行本地排序 | N
empty | String / Slot / Function | '' | 空表格呈现样式。TS 类型:`string | TNode`。[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
expandedRow | String / Slot / Function | - | 展开行内容,可自定义,泛型 T 指表格数据类型。TS 类型:`string | TNode<{ row: T; index: number }>`。[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
firstFullRow | String / Slot / Function | - | 首行内容。TS 类型:`string | TNode`。[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
Expand Down Expand Up @@ -74,6 +75,7 @@ width | String / Number | - | 列宽 | N
-- | -- | -- | -- | --
asyncLoading | String / Slot / Function | - | 异步加载状态。值为 `loading` 显示默认文字 “正在加载中,请稍后”,值为 `loading-more` 显示“点击加载更多”,值为其他,表示完全自定义异步加载区域内容。TS 类型:`'loading' | 'load-more' | TNode`。[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
columns | Array | [] | 列配置,泛型 T 指表格数据类型。TS 类型:`Array<PrimaryTableCol<T>>` | N
dragSort | Boolean | false |【开发中】是否开始拖拽排序,会显示拖拽图标 | N
expandedRow | String / Slot / Function | - | 展开行内容,泛型 T 指表格数据类型。TS 类型:`TNode<{ row: T; index: number }>`。[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
expandedRowKeys | Array | [] | 展开行。支持语法糖。TS 类型:`Array<string | number>` | N
defaultExpandedRowKeys | Array | [] | 展开行。非受控属性。TS 类型:`Array<string | number>` | N
Expand All @@ -88,8 +90,8 @@ selectedRowKeys | Array | - | 选中的行,控制属性。支持语法糖。TS
defaultSelectedRowKeys | Array | - | 选中的行,控制属性。非受控属性。TS 类型:`Array<string | number>` | N
showColumnController | Boolean | false | 【开发中】是否显示 自定义显示列控制器 | N
showDragCol | Boolean | false | 【开发中】是否显示为通过拖拽图标进行排序 | N
sort | Object / Array | - | 排序控制。sortBy 排序字段;descending 是否进行降序排列。值为数组时,表示正进行多字段排序。支持语法糖。TS 类型:`TableSort`。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/table/type.ts) | N
defaultSort | Object / Array | - | 排序控制。sortBy 排序字段;descending 是否进行降序排列。值为数组时,表示正进行多字段排序。非受控属性。TS 类型:`TableSort`。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/table/type.ts) | N
sort | Object / Array | - | 排序控制。sortBy 排序字段;descending 是否进行降序排列。值为数组时,表示正进行多字段排序。当 `data` 数据长度超过分页大小时,会自动对本地数据 `data` 进行排序,如果不希望对于 `data` 进行排序,可以设置 `disableDatasort = true`。支持语法糖。TS 类型:`TableSort`。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/table/type.ts) | N
defaultSort | Object / Array | - | 排序控制。sortBy 排序字段;descending 是否进行降序排列。值为数组时,表示正进行多字段排序。当 `data` 数据长度超过分页大小时,会自动对本地数据 `data` 进行排序,如果不希望对于 `data` 进行排序,可以设置 `disableDatasort = true`。非受控属性。TS 类型:`TableSort`。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/table/type.ts) | N
sortOnRowDraggable | Boolean | false | 允许表格行拖拽时排序 | N
`Omit<BaseTableProps<T>, 'columns'>` | - | - | 继承 `Omit<BaseTableProps<T>, 'columns'>` 中的全部 API | N
onAsyncLoadingClick | Function | | 异步加载区域被点击时触发。`(context: { status: 'loading' | 'load-more' }) => {}` | N
Expand Down
2 changes: 1 addition & 1 deletion src/_common
4 changes: 3 additions & 1 deletion src/table/base-table-props.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

/**
* 该文件为脚本自动生成文件,请勿随意修改。如需修改请联系 PMC
* updated at 2021-12-23 13:19:48
* updated at 2021-12-25 11:57:19
* */

import { TdBaseTableProps } from '../table/type';
Expand All @@ -21,6 +21,8 @@ export default {
type: Array as PropType<TdBaseTableProps['data']>,
default: (): TdBaseTableProps['data'] => [],
},
/** 是否禁用本地数据排序。当 `data` 数据长度超过分页大小时,会自动进行本地数据排序。如果 `disabledDataSort` 设置为 true,则无论何时,都不会进行本地排序 */
disableDataSort: Boolean,
/** 空表格呈现样式 */
empty: {
type: [String, Function] as PropType<TdBaseTableProps['empty']>,
Expand Down
3 changes: 2 additions & 1 deletion src/table/base-table/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ export default mixins(getConfigReceiverMixins<Vue, TableConfig>('table')).extend
dataSource(): Array<DataType> {
if (!this.hasPagination) return this.data.slice(0);
const { current, pageSize } = this;
if (this.data.length > pageSize) {
if (this.data.length > pageSize && !this.disableDataSort) {
return this.data.slice((current - 1) * pageSize, current * pageSize);
}
return this.data;
Expand Down Expand Up @@ -135,6 +135,7 @@ export default mixins(getConfigReceiverMixins<Vue, TableConfig>('table')).extend
// 检查是否还可以向左或者向右滚动
checkScrollableToLeftOrRight() {
const scrollContainer = this.$refs[this.fixedHeader ? 'scrollBody' : 'tableContent'] as HTMLElement;
if (!scrollContainer) return;
const { scrollLeft, scrollWidth, clientWidth } = scrollContainer;
this.scrollableToLeft = scrollLeft > 0;
this.scrollableToRight = scrollLeft + clientWidth < scrollWidth;
Expand Down
24 changes: 20 additions & 4 deletions src/table/base-table/table-cell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { isNodeOverflow } from '../../utils/dom';
import { TdInstance } from '../util/interface';
import { getRecord } from '../util/common';

export const ELLIPSIS_CLASS_NAME = `${prefix}-text-ellipsis`;

const overlayStyle = {
width: '100%',
maxWidth: '400px',
Expand Down Expand Up @@ -139,6 +141,7 @@ export default Vue.extend({
},
style,
};
let newCellContent = cellContent;
// 如果被截断给加上 Tooltip 提示
if (ellipsis && this.isCutOff) {
let popupCellContent = cellContent;
Expand All @@ -150,14 +153,27 @@ export default Vue.extend({
colIndex,
});
}
cellContent = (
<Popup style="display: inline;" overlayStyle={overlayStyle} placement="bottom-left" showArrow={false}>
// 处理自定义节点的超出省略显示
this.$nextTick(() => {
if (cellContent?.elm) {
const elm = cellContent.elm as HTMLElement;
elm.classList?.remove?.(ELLIPSIS_CLASS_NAME);
elm.classList?.add?.(ELLIPSIS_CLASS_NAME);
}
});
newCellContent = (
<Popup
style="display: inline;"
overlayStyle={overlayStyle}
placement="bottom-left"
showArrow={false}
content={() => popupCellContent}
>
{cellContent}
<div slot="content">{popupCellContent}</div>
</Popup>
);
}
return <td {...tdAttrs}>{cellContent}</td>;
return <td {...tdAttrs}>{newCellContent}</td>;
},
mounted() {
this.init();
Expand Down
Loading