Skip to content

Commit

Permalink
Fix enhanced table (#94)
Browse files Browse the repository at this point in the history
* fix(table): ellipsis is invalid in first column of enhanced table

* fix(table): tree data is error with pagination

* test(table): update snapshots

* fix(table): scrollContainer is undefined

* docs(table): set dragSort to be developing

* feat: update common

Co-authored-by: chaishi <[email protected]>
  • Loading branch information
chaishi and chaishi authored Dec 29, 2021
1 parent 3c184ac commit cc3eca1
Show file tree
Hide file tree
Showing 11 changed files with 202 additions and 118 deletions.
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
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

0 comments on commit cc3eca1

Please sign in to comment.