@kne/table-page 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +276 -19
- package/dist/index.css +68 -6
- package/dist/index.css.map +1 -1
- package/dist/index.js +383 -164
- package/dist/index.js.map +1 -1
- package/dist/index.modern.js +387 -166
- package/dist/index.modern.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -305,38 +305,40 @@ const SortState = ({ sort }) => (
|
|
|
305
305
|
</div>
|
|
306
306
|
);
|
|
307
307
|
|
|
308
|
+
const TIP_TAG_STYLE = { marginRight: 8 };
|
|
309
|
+
|
|
308
310
|
const Tips = () => (
|
|
309
311
|
<div style={{ color: '#666', fontSize: 13, lineHeight: 1.8 }}>
|
|
310
312
|
<div>
|
|
311
|
-
<Tag color="blue">数据加载</Tag>
|
|
313
|
+
<Tag style={TIP_TAG_STYLE} color="blue">数据加载</Tag>
|
|
312
314
|
通过 <code>loader</code> 模拟分页接口,请求参数为 <code>data.currentPage</code>、<code>data.perPage</code>。
|
|
313
315
|
</div>
|
|
314
316
|
<div>
|
|
315
|
-
<Tag color="green">分页</Tag>
|
|
317
|
+
<Tag style={TIP_TAG_STYLE} color="green">分页</Tag>
|
|
316
318
|
分页器渲染在表格外侧,翻页时以 <code>reload</code> 方式请求;<code>pageSize</code> 会持久化到 localStorage。
|
|
317
319
|
</div>
|
|
318
320
|
<div>
|
|
319
|
-
<Tag color="gold">筛选</Tag>
|
|
321
|
+
<Tag style={TIP_TAG_STYLE} color="gold">筛选</Tag>
|
|
320
322
|
顶部工具栏集成 <code>filter</code>、<code>search</code>、<code>batchActions</code>;筛选变化自动 <code>reload</code> 并回到第 1 页。
|
|
321
323
|
</div>
|
|
322
324
|
<div>
|
|
323
|
-
<Tag color="orange">列配置</Tag>
|
|
325
|
+
<Tag style={TIP_TAG_STYLE} color="orange">列配置</Tag>
|
|
324
326
|
设置 <code>name</code> 开启列宽拖动与显示/隐藏,「薪资范围」「学历」默认隐藏;状态列使用 <code>renderType="status"</code>,绩效列使用 <code>renderType="tag"</code>,操作列使用 <code>renderType="options"</code> 且 <code>fixed="right"</code>。
|
|
325
327
|
</div>
|
|
326
328
|
<div>
|
|
327
|
-
<Tag color="cyan">排序</Tag>
|
|
329
|
+
<Tag style={TIP_TAG_STYLE} color="cyan">排序</Tag>
|
|
328
330
|
配合 <code>Table.useSort</code> 与 <code>sortRender</code>,在 <code>onSortChange</code> 中调用 <code>reload</code> 传排序参数,与翻页一样不闪烁。
|
|
329
331
|
</div>
|
|
330
332
|
<div>
|
|
331
|
-
<Tag color="geekblue">固定表头</Tag>
|
|
333
|
+
<Tag style={TIP_TAG_STYLE} color="geekblue">固定表头</Tag>
|
|
332
334
|
设置 <code>sticky</code> 与 <code>scroll.y</code>,表体在固定高度内滚动时表头保持可见;横向滚动配合 <code>scroll.x</code>。
|
|
333
335
|
</div>
|
|
334
336
|
<div>
|
|
335
|
-
<Tag color="magenta">单元格点击</Tag>
|
|
337
|
+
<Tag style={TIP_TAG_STYLE} color="magenta">单元格点击</Tag>
|
|
336
338
|
列配置 <code>onClick</code>(配合 <code>renderType="main"</code>、<code>primary</code> / <code>hover</code>),仅可点击单元格 hover 时显示手型;工号列同步演示异步点击 loading。
|
|
337
339
|
</div>
|
|
338
340
|
<div>
|
|
339
|
-
<Tag color="purple">总结栏</Tag>
|
|
341
|
+
<Tag style={TIP_TAG_STYLE} color="purple">总结栏</Tag>
|
|
340
342
|
<code>summary</code> 回调可拿到 <code>data</code>、<code>requestParams</code> 等 fetch 上下文。
|
|
341
343
|
</div>
|
|
342
344
|
</div>
|
|
@@ -474,6 +476,251 @@ render(<BaseExample />);
|
|
|
474
476
|
|
|
475
477
|
```
|
|
476
478
|
|
|
479
|
+
- TablePage sticky scroll
|
|
480
|
+
- 自包含演示区:sticky + getScrollContainer 由区内页面滚动触发表头吸顶(非 scroll.y);模拟导航在区内 sticky,不遮挡文档站顶栏
|
|
481
|
+
- _TablePage(@kne/current-lib_table-page)[import * as _TablePage from "@kne/table-page"],(@kne/current-lib_table-page/dist/index.css),antd(antd),_ReactFilter(@kne/react-filter)[import * as _ReactFilter from "@kne/react-filter"],(@kne/react-filter/dist/index.css)
|
|
482
|
+
|
|
483
|
+
```jsx
|
|
484
|
+
const { default: TablePage } = _TablePage;
|
|
485
|
+
const { fields } = _ReactFilter;
|
|
486
|
+
const { SuperSelectFilterItem } = fields;
|
|
487
|
+
const { Flex, Tag } = antd;
|
|
488
|
+
const { useRef, useMemo } = React;
|
|
489
|
+
|
|
490
|
+
const NAV_HEIGHT = 56;
|
|
491
|
+
const DEMO_HEIGHT = 600;
|
|
492
|
+
const TOTAL = 80;
|
|
493
|
+
|
|
494
|
+
const statusMap = {
|
|
495
|
+
active: { type: 'success', text: '在职' },
|
|
496
|
+
vacation: { type: 'warning', text: '休假' },
|
|
497
|
+
resigned: { type: 'default', text: '离职' },
|
|
498
|
+
probation: { type: 'processing', text: '试用期' }
|
|
499
|
+
};
|
|
500
|
+
|
|
501
|
+
const departments = ['技术研发部', '产品设计部', '市场营销部', '人力资源部', '财务部'];
|
|
502
|
+
|
|
503
|
+
const departmentOptions = departments.map(item => ({ value: item, label: item }));
|
|
504
|
+
const statusOptions = Object.entries(statusMap).map(([value, { text }]) => ({ value, label: text }));
|
|
505
|
+
|
|
506
|
+
const normalizeFilterValue = value => {
|
|
507
|
+
if (value == null) {
|
|
508
|
+
return value;
|
|
509
|
+
}
|
|
510
|
+
return Array.isArray(value) ? value[0] : value;
|
|
511
|
+
};
|
|
512
|
+
|
|
513
|
+
const applyFilters = (employees, data, requestParams) => {
|
|
514
|
+
const params = Object.assign({}, requestParams?.data, data);
|
|
515
|
+
let result = employees;
|
|
516
|
+
|
|
517
|
+
if (params.keyword) {
|
|
518
|
+
const keyword = String(params.keyword).toLowerCase();
|
|
519
|
+
result = result.filter(item => item.employeeNo.toLowerCase().includes(keyword) || item.name.includes(params.keyword));
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
const department = normalizeFilterValue(params.department);
|
|
523
|
+
if (department) {
|
|
524
|
+
result = result.filter(item => item.department === department);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
const status = normalizeFilterValue(params.status);
|
|
528
|
+
if (status) {
|
|
529
|
+
result = result.filter(item => item.status === status);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
return result;
|
|
533
|
+
};
|
|
534
|
+
|
|
535
|
+
const buildEmployee = index => {
|
|
536
|
+
const statusKeys = ['active', 'vacation', 'resigned', 'probation'];
|
|
537
|
+
return {
|
|
538
|
+
id: `EMP${String(index + 1).padStart(4, '0')}`,
|
|
539
|
+
employeeNo: `EMP-2024-${String(index + 1).padStart(4, '0')}`,
|
|
540
|
+
name: `员工${index + 1}`,
|
|
541
|
+
department: departments[index % departments.length],
|
|
542
|
+
position: ['工程师', '经理', '专员'][index % 3],
|
|
543
|
+
status: statusKeys[index % statusKeys.length],
|
|
544
|
+
joinDate: `2024-${String((index % 12) + 1).padStart(2, '0')}-15`
|
|
545
|
+
};
|
|
546
|
+
};
|
|
547
|
+
|
|
548
|
+
const allEmployees = Array.from({ length: TOTAL }, (_, index) => buildEmployee(index));
|
|
549
|
+
|
|
550
|
+
const columns = [
|
|
551
|
+
{ name: 'employeeNo', title: '工号', width: 160, min: 120, max: 220, fixed: 'left', renderType: 'small' },
|
|
552
|
+
{ name: 'name', title: '姓名', width: 100, renderType: 'main' },
|
|
553
|
+
{ name: 'department', title: '部门', width: 150 },
|
|
554
|
+
{ name: 'position', title: '职位', width: 120 },
|
|
555
|
+
{
|
|
556
|
+
name: 'status',
|
|
557
|
+
title: '状态',
|
|
558
|
+
width: 100,
|
|
559
|
+
renderType: 'status',
|
|
560
|
+
getValueOf: item => statusMap[item.status] || { type: 'default', text: item.status }
|
|
561
|
+
},
|
|
562
|
+
{ name: 'joinDate', title: '入职日期', width: 120, format: 'date' }
|
|
563
|
+
];
|
|
564
|
+
|
|
565
|
+
const TIP_TAG_STYLE = { marginRight: 8 };
|
|
566
|
+
|
|
567
|
+
const Tips = () => (
|
|
568
|
+
<div style={{ color: '#666', fontSize: 13, lineHeight: 1.8 }}>
|
|
569
|
+
<div>
|
|
570
|
+
<Tag style={TIP_TAG_STYLE} color="blue">页面滚动</Tag>
|
|
571
|
+
在下方<strong>灰色边框演示区</strong>内滚动(非 <code>scroll.y</code>);表头通过 <code>sticky</code> + <code>getScrollContainer</code> 吸顶。
|
|
572
|
+
</div>
|
|
573
|
+
<div>
|
|
574
|
+
<Tag style={TIP_TAG_STYLE} color="green">getScrollContainer</Tag>
|
|
575
|
+
指向演示区滚动容器;<code>scrollTopInset</code> 传入顶部导航占位高度(<code>{NAV_HEIGHT}px</code>),用于吸顶表头偏移与翻页滚回。
|
|
576
|
+
</div>
|
|
577
|
+
<div>
|
|
578
|
+
<Tag style={TIP_TAG_STYLE} color="gold">筛选栏</Tag>
|
|
579
|
+
顶部工具栏含 <code>search</code> 与 <code>filter</code>;筛选变化会 <code>reload</code> 并回到第 1 页,翻页后滚回工具栏顶部。
|
|
580
|
+
</div>
|
|
581
|
+
<div>
|
|
582
|
+
<Tag style={TIP_TAG_STYLE} color="purple">横向 Scroller</Tag>
|
|
583
|
+
表格底部未完全露出时,会在滚动容器底部显示横向滚动条(<code>horizontalScroller</code> 默认开启)。
|
|
584
|
+
</div>
|
|
585
|
+
<div>
|
|
586
|
+
<Tag style={TIP_TAG_STYLE} color="orange">操作提示</Tag>
|
|
587
|
+
在演示区内向下滚动,蓝色导航条会吸顶,表格表头应固定在其下方;翻页后滚回表格顶部。
|
|
588
|
+
</div>
|
|
589
|
+
</div>
|
|
590
|
+
);
|
|
591
|
+
|
|
592
|
+
const BaseExample = () => {
|
|
593
|
+
const scrollRef = useRef(null);
|
|
594
|
+
|
|
595
|
+
const loader = useMemo(
|
|
596
|
+
() =>
|
|
597
|
+
({ data, requestParams }) => {
|
|
598
|
+
const currentPage = Number(data?.currentPage) || 1;
|
|
599
|
+
const perPage = Number(data?.perPage) || 50;
|
|
600
|
+
const filteredEmployees = applyFilters(allEmployees, data, requestParams);
|
|
601
|
+
const start = (currentPage - 1) * perPage;
|
|
602
|
+
return new Promise(resolve => {
|
|
603
|
+
setTimeout(() => {
|
|
604
|
+
resolve({
|
|
605
|
+
pageData: filteredEmployees.slice(start, start + perPage),
|
|
606
|
+
totalCount: filteredEmployees.length
|
|
607
|
+
});
|
|
608
|
+
}, 200);
|
|
609
|
+
});
|
|
610
|
+
},
|
|
611
|
+
[]
|
|
612
|
+
);
|
|
613
|
+
|
|
614
|
+
return (
|
|
615
|
+
<Flex vertical gap={16}>
|
|
616
|
+
<Tips />
|
|
617
|
+
<div
|
|
618
|
+
style={{
|
|
619
|
+
border: '1px solid #f0f0f0',
|
|
620
|
+
borderRadius: 8,
|
|
621
|
+
overflow: 'hidden',
|
|
622
|
+
background: '#fff'
|
|
623
|
+
}}
|
|
624
|
+
>
|
|
625
|
+
<div
|
|
626
|
+
ref={scrollRef}
|
|
627
|
+
style={{
|
|
628
|
+
height: DEMO_HEIGHT,
|
|
629
|
+
overflow: 'auto',
|
|
630
|
+
boxSizing: 'border-box'
|
|
631
|
+
}}
|
|
632
|
+
>
|
|
633
|
+
<div
|
|
634
|
+
style={{
|
|
635
|
+
position: 'sticky',
|
|
636
|
+
top: 0,
|
|
637
|
+
zIndex: 100,
|
|
638
|
+
height: NAV_HEIGHT,
|
|
639
|
+
display: 'flex',
|
|
640
|
+
alignItems: 'center',
|
|
641
|
+
padding: '0 24px',
|
|
642
|
+
color: '#fff',
|
|
643
|
+
fontWeight: 500,
|
|
644
|
+
background: '#1677ff',
|
|
645
|
+
boxShadow: '0 2px 8px rgba(0, 0, 0, 0.12)'
|
|
646
|
+
}}
|
|
647
|
+
>
|
|
648
|
+
模拟顶部导航({NAV_HEIGHT}px)
|
|
649
|
+
</div>
|
|
650
|
+
<Flex vertical gap={16} style={{ padding: 16 }}>
|
|
651
|
+
<div
|
|
652
|
+
style={{
|
|
653
|
+
padding: '20px 24px',
|
|
654
|
+
background: '#f5f5f5',
|
|
655
|
+
borderRadius: 8,
|
|
656
|
+
color: '#666',
|
|
657
|
+
fontSize: 13
|
|
658
|
+
}}
|
|
659
|
+
>
|
|
660
|
+
在演示区内继续向下滚动 ↓
|
|
661
|
+
</div>
|
|
662
|
+
<div
|
|
663
|
+
style={{
|
|
664
|
+
height: 520,
|
|
665
|
+
borderRadius: 8,
|
|
666
|
+
background: 'linear-gradient(180deg, #f0f5ff 0%, #fff 100%)',
|
|
667
|
+
border: '1px dashed #d9d9d9',
|
|
668
|
+
display: 'flex',
|
|
669
|
+
alignItems: 'center',
|
|
670
|
+
justifyContent: 'center',
|
|
671
|
+
color: '#999'
|
|
672
|
+
}}
|
|
673
|
+
>
|
|
674
|
+
占位区域(模拟页面上方内容)
|
|
675
|
+
</div>
|
|
676
|
+
<TablePage
|
|
677
|
+
name="demo-table-page-sticky-scroll"
|
|
678
|
+
sticky
|
|
679
|
+
scrollTopInset={NAV_HEIGHT}
|
|
680
|
+
getScrollContainer={() => scrollRef.current}
|
|
681
|
+
scroll={{ x: 900 }}
|
|
682
|
+
search={{ name: 'keyword', label: '关键词', placeholder: '搜索工号/姓名', style: { width: 200 } }}
|
|
683
|
+
filter={{
|
|
684
|
+
list: [
|
|
685
|
+
[
|
|
686
|
+
{
|
|
687
|
+
type: SuperSelectFilterItem,
|
|
688
|
+
props: { name: 'department', label: '部门', single: true, options: departmentOptions }
|
|
689
|
+
},
|
|
690
|
+
{
|
|
691
|
+
type: SuperSelectFilterItem,
|
|
692
|
+
props: { name: 'status', label: '状态', single: true, options: statusOptions }
|
|
693
|
+
}
|
|
694
|
+
]
|
|
695
|
+
],
|
|
696
|
+
displayLine: 1
|
|
697
|
+
}}
|
|
698
|
+
pagination={{
|
|
699
|
+
open: true,
|
|
700
|
+
pageSize: 50,
|
|
701
|
+
cachePageSize: false,
|
|
702
|
+
showSizeChanger: true,
|
|
703
|
+
showQuickJumper: true
|
|
704
|
+
}}
|
|
705
|
+
dataFormat={data => ({
|
|
706
|
+
list: data.pageData,
|
|
707
|
+
total: data.totalCount
|
|
708
|
+
})}
|
|
709
|
+
loader={loader}
|
|
710
|
+
columns={columns}
|
|
711
|
+
/>
|
|
712
|
+
<div style={{ height: 80, color: '#999', fontSize: 13, textAlign: 'center' }}>演示区底部留白</div>
|
|
713
|
+
</Flex>
|
|
714
|
+
</div>
|
|
715
|
+
</div>
|
|
716
|
+
</Flex>
|
|
717
|
+
);
|
|
718
|
+
};
|
|
719
|
+
|
|
720
|
+
render(<BaseExample />);
|
|
721
|
+
|
|
722
|
+
```
|
|
723
|
+
|
|
477
724
|
- TableView
|
|
478
725
|
- 表格视图组件,支持行选择、列宽设置等
|
|
479
726
|
- _TablePage(@kne/current-lib_table-page)[import * as _TablePage from "@kne/table-page"],(@kne/current-lib_table-page/dist/index.css),antd(antd)
|
|
@@ -1172,14 +1419,16 @@ const columns = [
|
|
|
1172
1419
|
}
|
|
1173
1420
|
];
|
|
1174
1421
|
|
|
1422
|
+
const TIP_TAG_STYLE = { marginRight: 8 };
|
|
1423
|
+
|
|
1175
1424
|
const Tips = () => (
|
|
1176
1425
|
<div style={{ color: '#666', fontSize: 13, lineHeight: 1.8 }}>
|
|
1177
1426
|
<div>
|
|
1178
|
-
<Tag color="blue">表头省略</Tag>
|
|
1427
|
+
<Tag style={TIP_TAG_STYLE} color="blue">表头省略</Tag>
|
|
1179
1428
|
列 <code>title</code> 超出列宽时自动单行省略,悬停 tooltip 显示完整标题;带排序的列同样生效(<code>Table</code> / <code>TableView</code> 均支持,无需额外配置)。
|
|
1180
1429
|
</div>
|
|
1181
1430
|
<div>
|
|
1182
|
-
<Tag color="green">单元格省略</Tag>
|
|
1431
|
+
<Tag style={TIP_TAG_STYLE} color="green">单元格省略</Tag>
|
|
1183
1432
|
列配置 <code>ellipsis: true</code> 或 <code>ellipsis: {'{ showTitle: true }'}</code>,单元格内容超出时省略,悬停显示完整内容(基于 antd Typography)。
|
|
1184
1433
|
</div>
|
|
1185
1434
|
<div style={{ color: '#999' }}>
|
|
@@ -1469,22 +1718,24 @@ const columns = [
|
|
|
1469
1718
|
{ name: 'remark', title: '备注', width: 200, min: 120, max: 400, hidden: true, renderType: 'description' }
|
|
1470
1719
|
];
|
|
1471
1720
|
|
|
1721
|
+
const TIP_TAG_STYLE = { marginRight: 8 };
|
|
1722
|
+
|
|
1472
1723
|
const Tips = () => (
|
|
1473
1724
|
<div style={{ color: '#666', fontSize: 13, lineHeight: 1.8 }}>
|
|
1474
1725
|
<div>
|
|
1475
|
-
<Tag color="blue">列宽拖动</Tag>
|
|
1726
|
+
<Tag style={TIP_TAG_STYLE} color="blue">列宽拖动</Tag>
|
|
1476
1727
|
鼠标悬停表头列右侧,出现拖动手柄后可左右拖动调整列宽(受 <code>min</code> / <code>max</code> 约束)。仅 <code>Table</code> 组件支持。
|
|
1477
1728
|
</div>
|
|
1478
1729
|
<div>
|
|
1479
|
-
<Tag color="green">显示/隐藏</Tag>
|
|
1730
|
+
<Tag style={TIP_TAG_STYLE} color="green">显示/隐藏</Tag>
|
|
1480
1731
|
点击最后一列表头的 <strong>设置图标</strong>,可勾选显示或隐藏列、拖拽排序;配置通过 <code>name</code> 持久化到 localStorage。
|
|
1481
1732
|
</div>
|
|
1482
1733
|
<div>
|
|
1483
|
-
<Tag color="orange">默认隐藏</Tag>
|
|
1734
|
+
<Tag style={TIP_TAG_STYLE} color="orange">默认隐藏</Tag>
|
|
1484
1735
|
本示例中「备注」列设置了 <code>hidden: true</code>,可在列配置面板中重新显示。
|
|
1485
1736
|
</div>
|
|
1486
1737
|
<div>
|
|
1487
|
-
<Tag color="purple">固定列</Tag>
|
|
1738
|
+
<Tag style={TIP_TAG_STYLE} color="purple">固定列</Tag>
|
|
1488
1739
|
「订单编号」设置了 <code>fixed: 'left'</code>,固定显示且不可隐藏。
|
|
1489
1740
|
</div>
|
|
1490
1741
|
</div>
|
|
@@ -1677,19 +1928,21 @@ const columns = [
|
|
|
1677
1928
|
}
|
|
1678
1929
|
];
|
|
1679
1930
|
|
|
1931
|
+
const TIP_TAG_STYLE = { marginRight: 8 };
|
|
1932
|
+
|
|
1680
1933
|
const Tips = () => (
|
|
1681
1934
|
<div style={{ color: '#666', fontSize: 13, lineHeight: 1.8 }}>
|
|
1682
1935
|
<div>
|
|
1683
|
-
<Tag color="blue">groupHeader</Tag>
|
|
1936
|
+
<Tag style={TIP_TAG_STYLE} color="blue">groupHeader</Tag>
|
|
1684
1937
|
在列配置中通过 <code>groupHeader</code> 声明所属分组,相同 <code>name</code> 的列会自动合并为多级表头(仅 <code>Table</code> 支持)。
|
|
1685
1938
|
</div>
|
|
1686
1939
|
<div>
|
|
1687
|
-
<Tag color="green">多级分组</Tag>
|
|
1940
|
+
<Tag style={TIP_TAG_STYLE} color="green">多级分组</Tag>
|
|
1688
1941
|
<code>groupHeader</code> 为数组,按层级嵌套,例如{' '}
|
|
1689
1942
|
<code>{`[{ name: 'sales', title: '销售业绩' }, { name: 'detail', title: '明细' }]`}</code>。
|
|
1690
1943
|
</div>
|
|
1691
1944
|
<div>
|
|
1692
|
-
<Tag color="orange">排序</Tag>
|
|
1945
|
+
<Tag style={TIP_TAG_STYLE} color="orange">排序</Tag>
|
|
1693
1946
|
分组表头可与 <code>useSort</code> 配合,排序按钮显示在叶子列表头。
|
|
1694
1947
|
</div>
|
|
1695
1948
|
</div>
|
|
@@ -1732,9 +1985,10 @@ render(<BaseExample />);
|
|
|
1732
1985
|
| columns | array \| function | - | 列配置,见 TableView 的 columns 说明;也可传入函数 `(data) => columns` |
|
|
1733
1986
|
| getColumns | function | - | 根据接口数据动态生成列配置 |
|
|
1734
1987
|
| sticky | boolean | - | 是否启用粘性表头,仅 `renderType="Table"` 时生效 |
|
|
1988
|
+
| scrollTopInset | number \| string | - | 滚动容器顶部占位高度(如固定导航高度),用于吸顶表头 `top` 偏移、`scroll-margin-top` 与翻页滚回;支持 `56` / `'56px'` |
|
|
1989
|
+
| getScrollContainer | function | - | 页面级滚动容器;用于吸顶表头 `getContainer`、浮动横向滚动条定位与翻页滚回 |
|
|
1735
1990
|
| renderType | `'Table'` \| `'TableView'` | `'Table'` | 表格渲染类型 |
|
|
1736
1991
|
| horizontalScroller | boolean | `true` | 是否启用底部浮动横向滚动条(仅 `renderType="Table"` 且表格存在横向滚动时生效) |
|
|
1737
|
-
| getScrollContainer | function | - | 浮动滚动条 portal 挂载容器,默认 `document.body` |
|
|
1738
1992
|
| summary | function | - | 总结栏,回调参数包含 `data`、`requestParams`、`refresh`、`reload` 等 fetch 上下文 |
|
|
1739
1993
|
| columnRenderProps | object | `{}` | 列渲染扩展属性,会合并进列 `render` 的 context |
|
|
1740
1994
|
| filter | object | - | 顶部筛选器配置,基于 `@kne/react-filter` 的 `FilterLines`,见下方 |
|
|
@@ -1758,7 +2012,7 @@ render(<BaseExample />);
|
|
|
1758
2012
|
| showQuickJumper | boolean | `true` | 是否展示快速跳转 |
|
|
1759
2013
|
| hideOnSinglePage | boolean | `false` | 仅一页时是否隐藏分页器 |
|
|
1760
2014
|
| pageSizeOptions | array | - | 每页条数选项 |
|
|
1761
|
-
| pageSize | number | `
|
|
2015
|
+
| pageSize | number | `50` | 默认每页条数,会持久化到 localStorage |
|
|
1762
2016
|
| showTotal | function | - | 自定义总数展示 `(total) => ReactNode` |
|
|
1763
2017
|
| onChange | function | - | 自定义翻页回调 `(page, size) => void`,传入后覆盖默认请求逻辑 |
|
|
1764
2018
|
| onShowSizeChange | function | - | 每页条数变化回调,组件内部已处理持久化 |
|
|
@@ -1991,6 +2245,9 @@ const sortedData = useMemo(() => Table.sortDataSource(dataSource, sort, columns)
|
|
|
1991
2245
|
| emptyIsPlaceholder | boolean | `true` | 空值是否显示占位符 |
|
|
1992
2246
|
| empty | ReactNode | `<Empty />` | 无数据时的展示内容 |
|
|
1993
2247
|
| sticky | boolean | - | 是否启用粘性表头 |
|
|
2248
|
+
| scrollTopInset | number \| string | - | 滚动容器顶部占位高度,用于吸顶表头偏移与滚回定位;`stickyOffset` 为兼容别名 |
|
|
2249
|
+
| stickyOffset | number \| string | - | **已废弃**,请使用 `scrollTopInset` |
|
|
2250
|
+
| getStickyContainer | function | - | 页面级滚动容器,等同 TablePage 的 `getScrollContainer` |
|
|
1994
2251
|
| headerStyle | object | - | 表头自定义样式 |
|
|
1995
2252
|
| onRowSelect | function | - | 行点击回调 `(item, { columns, dataSource }) => void` |
|
|
1996
2253
|
| render | function | - | 自定义渲染 `(props) => ReactNode`,`header` 为 `null`,`renderBody` 返回 antd Table |
|
package/dist/index.css
CHANGED
|
@@ -101,7 +101,13 @@
|
|
|
101
101
|
position: relative;
|
|
102
102
|
border: 1px solid #f0f0f0;
|
|
103
103
|
border-radius: var(--radius-default, 2px);
|
|
104
|
-
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.kne-table-page_d1qN5 > .kne-table-page_KNy4z:first-child {
|
|
107
|
+
border-start-start-radius: var(--radius-default, 2px);
|
|
108
|
+
}
|
|
109
|
+
.kne-table-page_d1qN5 > .kne-table-page_KNy4z:last-child {
|
|
110
|
+
border-start-end-radius: var(--radius-default, 2px);
|
|
105
111
|
}
|
|
106
112
|
|
|
107
113
|
.kne-table-page_fUw6j {
|
|
@@ -148,6 +154,12 @@
|
|
|
148
154
|
.kne-table-page_Z6mVv:last-child > .kne-table-page_KNy4z {
|
|
149
155
|
border-bottom: none;
|
|
150
156
|
}
|
|
157
|
+
.kne-table-page_Z6mVv:last-child > .kne-table-page_KNy4z:first-child {
|
|
158
|
+
border-end-start-radius: var(--radius-default, 2px);
|
|
159
|
+
}
|
|
160
|
+
.kne-table-page_Z6mVv:last-child > .kne-table-page_KNy4z:last-child {
|
|
161
|
+
border-end-end-radius: var(--radius-default, 2px);
|
|
162
|
+
}
|
|
151
163
|
|
|
152
164
|
.kne-table-page_BSOzz {
|
|
153
165
|
word-break: break-all;
|
|
@@ -226,9 +238,14 @@
|
|
|
226
238
|
|
|
227
239
|
.kne-table-page_SRI8Q {
|
|
228
240
|
padding: 8px;
|
|
241
|
+
border-end-start-radius: var(--radius-default, 2px);
|
|
242
|
+
border-end-end-radius: var(--radius-default, 2px);
|
|
229
243
|
}
|
|
230
244
|
.kne-table-page_awa1L {
|
|
231
245
|
box-sizing: border-box;
|
|
246
|
+
position: relative;
|
|
247
|
+
border: 1px solid #f0f0f0;
|
|
248
|
+
border-radius: var(--radius-default, 2px);
|
|
232
249
|
}
|
|
233
250
|
.kne-table-page_awa1L .info-page-table-body {
|
|
234
251
|
width: 100%;
|
|
@@ -259,6 +276,8 @@
|
|
|
259
276
|
}
|
|
260
277
|
.kne-table-page_awa1L .ant-table-header {
|
|
261
278
|
background: var(--bg-color-grey-1) !important;
|
|
279
|
+
border-start-start-radius: var(--radius-default, 2px);
|
|
280
|
+
border-start-end-radius: var(--radius-default, 2px);
|
|
262
281
|
}
|
|
263
282
|
.kne-table-page_awa1L .ant-table-thead > tr > .ant-table-cell {
|
|
264
283
|
word-break: normal;
|
|
@@ -309,9 +328,21 @@
|
|
|
309
328
|
.kne-table-page_awa1L .ant-table-tbody > tr:last-child > .ant-table-cell {
|
|
310
329
|
border-bottom-color: transparent !important;
|
|
311
330
|
}
|
|
331
|
+
.kne-table-page_awa1L:not(.kne-table-page_Cb-du) .ant-table-tbody > tr:last-child > .ant-table-cell:first-child {
|
|
332
|
+
border-end-start-radius: var(--radius-default, 2px) !important;
|
|
333
|
+
}
|
|
334
|
+
.kne-table-page_awa1L:not(.kne-table-page_Cb-du) .ant-table-tbody > tr:last-child > .ant-table-cell:last-child {
|
|
335
|
+
border-end-end-radius: var(--radius-default, 2px) !important;
|
|
336
|
+
}
|
|
312
337
|
.kne-table-page_awa1L.kne-table-page_Cb-du .ant-table-tbody > tr:last-child > .ant-table-cell {
|
|
313
338
|
border-bottom-color: transparent !important;
|
|
314
339
|
}
|
|
340
|
+
.kne-table-page_awa1L.kne-table-page_Cb-du .ant-table-summary > tr > .ant-table-cell:first-child {
|
|
341
|
+
border-end-start-radius: var(--radius-default, 2px) !important;
|
|
342
|
+
}
|
|
343
|
+
.kne-table-page_awa1L.kne-table-page_Cb-du .ant-table-summary > tr > .ant-table-cell:last-child {
|
|
344
|
+
border-end-end-radius: var(--radius-default, 2px) !important;
|
|
345
|
+
}
|
|
315
346
|
.kne-table-page_awa1L.kne-table-page_Cb-du .ant-table-summary .ant-table-cell {
|
|
316
347
|
background: var(--bg-color-grey-1, #fafafa) !important;
|
|
317
348
|
font-weight: 500;
|
|
@@ -320,6 +351,8 @@
|
|
|
320
351
|
}
|
|
321
352
|
.kne-table-page_awa1L .ant-table-placeholder > .ant-table-cell {
|
|
322
353
|
border: none !important;
|
|
354
|
+
border-end-start-radius: var(--radius-default, 2px) !important;
|
|
355
|
+
border-end-end-radius: var(--radius-default, 2px) !important;
|
|
323
356
|
}
|
|
324
357
|
.kne-table-page_awa1L.kne-table-page_7qTC5 .ant-table-thead > tr > .ant-table-cell {
|
|
325
358
|
border-bottom: 1px solid #f0f0f0 !important;
|
|
@@ -339,7 +372,7 @@
|
|
|
339
372
|
}
|
|
340
373
|
.kne-table-page_awa1L.kne-table-page_jGzIR.kne-table-page_Kr-p6 .ant-table-header.ant-table-sticky-holder,
|
|
341
374
|
.kne-table-page_awa1L.kne-table-page_jGzIR.kne-table-page_Kr-p6 .ant-table-thead.ant-table-sticky-holder {
|
|
342
|
-
top: var(--sticky-offset, var(--nav-height, 0px)) !important;
|
|
375
|
+
top: var(--scroll-top-inset, var(--sticky-offset, var(--nav-height, 0px))) !important;
|
|
343
376
|
}
|
|
344
377
|
.kne-table-page_awa1L.kne-table-page_jGzIR .ant-table-measure-row {
|
|
345
378
|
height: 0;
|
|
@@ -652,18 +685,44 @@
|
|
|
652
685
|
min-width: 0;
|
|
653
686
|
}
|
|
654
687
|
.kne-table-page_dxN6N .info-page-table {
|
|
655
|
-
scroll-margin-top: var(--sticky-offset, var(--nav-height, 0px));
|
|
688
|
+
scroll-margin-top: var(--scroll-top-inset, var(--sticky-offset, var(--nav-height, 0px)));
|
|
656
689
|
}
|
|
657
690
|
|
|
658
691
|
.kne-table-page_sf06r {
|
|
659
692
|
border: 1px solid #f0f0f0;
|
|
660
693
|
border-radius: var(--radius-default, 2px);
|
|
661
|
-
|
|
694
|
+
}
|
|
695
|
+
.kne-table-page_sf06r .table-page-toolbar {
|
|
696
|
+
border-start-start-radius: var(--radius-default, 2px);
|
|
697
|
+
border-start-end-radius: var(--radius-default, 2px);
|
|
698
|
+
}
|
|
699
|
+
.kne-table-page_sf06r .table-page-toolbar-section {
|
|
700
|
+
scroll-margin-top: var(--scroll-top-inset, var(--sticky-offset, var(--nav-height, 0px)));
|
|
662
701
|
}
|
|
663
702
|
.kne-table-page_sf06r .info-page-table {
|
|
664
703
|
border: none;
|
|
665
704
|
border-radius: 0;
|
|
666
705
|
}
|
|
706
|
+
.kne-table-page_sf06r .info-page-table .ant-table-header {
|
|
707
|
+
border-start-start-radius: 0 !important;
|
|
708
|
+
border-start-end-radius: 0 !important;
|
|
709
|
+
}
|
|
710
|
+
.kne-table-page_sf06r .info-page-table:not(.kne-table-page_IRdzb) .ant-table-tbody > tr:last-child > .ant-table-cell:first-child {
|
|
711
|
+
border-end-start-radius: var(--radius-default, 2px) !important;
|
|
712
|
+
}
|
|
713
|
+
.kne-table-page_sf06r .info-page-table:not(.kne-table-page_IRdzb) .ant-table-tbody > tr:last-child > .ant-table-cell:last-child {
|
|
714
|
+
border-end-end-radius: var(--radius-default, 2px) !important;
|
|
715
|
+
}
|
|
716
|
+
.kne-table-page_sf06r .info-page-table.kne-table-page_IRdzb .ant-table-summary > tr > .ant-table-cell:first-child {
|
|
717
|
+
border-end-start-radius: var(--radius-default, 2px) !important;
|
|
718
|
+
}
|
|
719
|
+
.kne-table-page_sf06r .info-page-table.kne-table-page_IRdzb .ant-table-summary > tr > .ant-table-cell:last-child {
|
|
720
|
+
border-end-end-radius: var(--radius-default, 2px) !important;
|
|
721
|
+
}
|
|
722
|
+
.kne-table-page_sf06r .info-page-table .ant-table-placeholder > .ant-table-cell {
|
|
723
|
+
border-end-start-radius: var(--radius-default, 2px) !important;
|
|
724
|
+
border-end-end-radius: var(--radius-default, 2px) !important;
|
|
725
|
+
}
|
|
667
726
|
.kne-table-page_sf06r .table-page-toolbar-section--has-value + .info-page-table .ant-table-thead > tr.info-page-table-header:first-child > .ant-table-cell {
|
|
668
727
|
border-top: none !important;
|
|
669
728
|
}
|
|
@@ -699,6 +758,11 @@
|
|
|
699
758
|
box-sizing: border-box;
|
|
700
759
|
}
|
|
701
760
|
|
|
761
|
+
.kne-table-page_PIv-C {
|
|
762
|
+
position: sticky;
|
|
763
|
+
bottom: 0;
|
|
764
|
+
}
|
|
765
|
+
|
|
702
766
|
.kne-table-page_RjZsu {
|
|
703
767
|
position: absolute;
|
|
704
768
|
top: 50%;
|
|
@@ -764,7 +828,6 @@
|
|
|
764
828
|
.kne-table-page_pB5en .ant-input-search {
|
|
765
829
|
background: var(--bg-color-grey-1, #f5f5f5);
|
|
766
830
|
border-radius: var(--radius-default, 2px);
|
|
767
|
-
overflow: hidden;
|
|
768
831
|
}
|
|
769
832
|
.kne-table-page_pB5en .ant-input-search .ant-input-affix-wrapper,
|
|
770
833
|
.kne-table-page_pB5en .ant-input-search .ant-input {
|
|
@@ -806,7 +869,6 @@
|
|
|
806
869
|
.kne-table-page_Jyfm7 {
|
|
807
870
|
flex: 1;
|
|
808
871
|
min-width: 0;
|
|
809
|
-
overflow: hidden;
|
|
810
872
|
display: flex;
|
|
811
873
|
align-items: center;
|
|
812
874
|
}
|