@pnt-team/pnt-component-frontend 0.0.130 → 0.0.133

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.
@@ -0,0 +1,225 @@
1
+ /**
2
+ * PntTable 类型定义
3
+ *
4
+ * 统一表格组件的类型契约。设计目标:
5
+ * 1. 对齐产品规范 12 章 47 条规则(管理端组件规范)
6
+ * 2. 兼容 tdesign-react 1.3.0–1.18.2 跨版本
7
+ * 3. 零业务侵入:业务项目通过 fetcher 注入数据源,不依赖组件库内部 API
8
+ */
9
+ import type { CSSProperties, ReactNode } from 'react';
10
+ /** 主题 */
11
+ export type PntTableTheme = 'business' | 'internal';
12
+ /** 数据模式 */
13
+ export type PntTableDataMode = 'server' | 'client';
14
+ /** 表格状态 */
15
+ export type PntTableStatus = 'normal' | 'empty' | 'empty-with-filter' | 'loading' | 'refreshing' | 'error' | 'no-permission';
16
+ /** 排序方向 */
17
+ export type PntSortDirection = 'asc' | 'desc';
18
+ /** 排序字段(单列,TBL-04.02 禁止多列排序) */
19
+ export interface PntSortInfo {
20
+ field: string;
21
+ direction: PntSortDirection;
22
+ }
23
+ /** 筛选值 */
24
+ export type PntFilterValue = string | number | (string | number)[];
25
+ /** 表头筛选选项 */
26
+ export interface PntFilterOption {
27
+ label: string;
28
+ /** 选项值;checkAll 项可不传(tdesign 会自动处理为空值) */
29
+ value?: string | number;
30
+ /** 标记为「全部」选项(选中后清空筛选值,对应 tdesign filter.list 的 checkAll:true) */
31
+ checkAll?: boolean;
32
+ }
33
+ /** 表头筛选配置 */
34
+ export interface PntTableFilterConfig {
35
+ /** 筛选模式:单选 Radio / 多选 Checkbox;传 'custom' 时走自定义 component */
36
+ mode: 'single' | 'multiple' | 'custom';
37
+ /** 静态选项(single/multiple 模式必填),支持 checkAll 项 */
38
+ options?: PntFilterOption[];
39
+ /** 异步加载选项(选项 > 8 项时建议用) */
40
+ fetcher?: () => Promise<PntFilterOption[]>;
41
+ /** 是否支持关键词搜索(选项 > 8 项时自动开启) */
42
+ searchable?: boolean;
43
+ /** 自定义筛选组件(mode='custom' 时必填),会透传给 tdesign filter.component */
44
+ component?: (props: any) => ReactNode;
45
+ /** 透传给 tdesign Table.filter 的额外属性(showConfirmAndReset / popupProps / resetValue / classNames 等) */
46
+ extra?: Record<string, any>;
47
+ }
48
+ /** 受控多选配置 */
49
+ export interface PntTableSelectConfig {
50
+ /** 受控初始选中(client 模式常用) */
51
+ selectedRowKeys?: (string | number)[];
52
+ /** 判断某行是否禁用勾选(禁用行不参与全选) */
53
+ disabledRowKeysFn?: (row: any) => boolean;
54
+ /** 仅当前页(默认 true;翻页自动清空勾选) */
55
+ currentPageOnly?: boolean;
56
+ }
57
+ export interface PntTableColumn {
58
+ /** 字段 key(必填) */
59
+ key: string;
60
+ /** 列标题(必填) */
61
+ title: ReactNode;
62
+ /** 列宽(必填,TBL-02.06 建议档位) */
63
+ width: number;
64
+ /** 固定 */
65
+ fixed?: 'left' | 'right';
66
+ /** 数据类型:影响对齐和比较口径 */
67
+ type?: 'text' | 'number' | 'money' | 'percent' | 'date' | 'datetime' | 'enum';
68
+ /** 对齐(默认按 type 推断) */
69
+ align?: 'left' | 'right' | 'center';
70
+ /** 单行截断(默认 true);2 = 最多 2 行 */
71
+ ellipsis?: boolean | 2;
72
+ /** 表头说明文案(TBL-03.04,点击打开 tooltip) */
73
+ help?: string;
74
+ /** 可排序 */
75
+ sort?: boolean;
76
+ /** 表头筛选 */
77
+ headerFilter?: PntTableFilterConfig;
78
+ /** 外置筛选(同字段需排序又需筛选时用,独立查询区) */
79
+ externalFilter?: boolean;
80
+ /** 列宽允许拖拽调整(扩展变体,二期实现) */
81
+ resizable?: boolean;
82
+ /** 列可隐藏(列设置功能) */
83
+ hidable?: boolean;
84
+ /** 是否系统必需列(列设置中不可隐藏) */
85
+ required?: boolean;
86
+ /** 自定义单元格渲染 */
87
+ cell?: (row: any, index: number) => ReactNode;
88
+ /** 列级权限策略 */
89
+ permission?: {
90
+ required?: string;
91
+ fallback?: 'hide' | 'disabled';
92
+ };
93
+ }
94
+ export interface PntTableQuery {
95
+ /** 外置查询条件(独立查询区草稿模式) */
96
+ query: Record<string, unknown>;
97
+ /** 表头筛选已生效条件 */
98
+ filters: Record<string, unknown>;
99
+ /** 排序:单列 { field, direction } 或 null */
100
+ sort: PntSortInfo | null;
101
+ /** 当前页(从 1 开始) */
102
+ page: number;
103
+ /** 每页条数 */
104
+ pageSize: number;
105
+ /** 业务 ID(必传) */
106
+ businessId?: string | number;
107
+ /** 环境(必传) */
108
+ env?: number;
109
+ /** 时区(必传) */
110
+ timezone?: string;
111
+ }
112
+ export interface PntTableResponse {
113
+ /** 数据行 */
114
+ rows: any[];
115
+ /** 筛选后的总记录数 */
116
+ total: number;
117
+ /** 错误码(0 或未传 = 成功) */
118
+ code?: number;
119
+ /** 错误信息 */
120
+ msg?: string;
121
+ /** 无权限时标记 */
122
+ noPermission?: boolean;
123
+ }
124
+ export type PntTableFetcher = (query: PntTableQuery) => Promise<PntTableResponse>;
125
+ export type PntTableQueryTrigger = 'sort' | 'filter' | 'pagination' | 'page-size' | 'external-query' | 'reset' | 'initial';
126
+ export interface PntTableQueryMeta {
127
+ tableId: string;
128
+ trigger: PntTableQueryTrigger;
129
+ /** 请求序号,用于请求顺序控制 */
130
+ requestId: number;
131
+ }
132
+ export interface PntTableSelectionMeta {
133
+ tableId: string;
134
+ /** 当前页所有 rowKey */
135
+ pageKeys: string[];
136
+ /** 当前页禁用行 rowKey */
137
+ disabledKeys: string[];
138
+ trigger: 'select' | 'select-all' | 'page-change' | 'reset' | 'refresh';
139
+ }
140
+ /** 业务代码通过 ref 获取的 PntTable 句柄 */
141
+ export interface PntTableRef {
142
+ /** 强制刷新(服务端重拉、客户端重新应用排序/筛选) */
143
+ refresh: () => void;
144
+ /** 清空所有表头筛选 + 重置排序 + page=1 */
145
+ reset: () => void;
146
+ /** 获取当前表格查询快照(调试/埋点用) */
147
+ getQuerySnapshot: () => {
148
+ sort: PntSortInfo | null;
149
+ filters: Record<string, unknown>;
150
+ page: number;
151
+ pageSize: number;
152
+ total: number;
153
+ };
154
+ }
155
+ export interface PntTableProps {
156
+ /** 表格唯一 ID(契约要求) */
157
+ tableId: string;
158
+ /** 主题:业务侧蓝 / 内部平台紫 */
159
+ theme: PntTableTheme;
160
+ /** 业务唯一字段,用作 rowKey(禁止用行号) */
161
+ rowKey: string;
162
+ /** 列定义 */
163
+ columns: PntTableColumn[];
164
+ /** 数据模式:server(后端分页)/ client(前端全量) */
165
+ dataMode: PntTableDataMode;
166
+ /** 数据源:server 模式传 fetcher */
167
+ fetcher?: PntTableFetcher;
168
+ /** client 模式直接传 data */
169
+ data?: any[];
170
+ /** client 模式下的总数(可选,不传则用 data.length) */
171
+ total?: number;
172
+ /** 固定操作栏:操作列固定最右(默认 false,显式列需加 fixed: 'right') */
173
+ fixedAction?: boolean;
174
+ /** 固定左侧识别列(默认 false) */
175
+ fixedLeft?: boolean;
176
+ /** 排序(默认 true;也可按列单独 col.sort: false 禁用) */
177
+ sortable?: boolean;
178
+ /** 表头筛选(默认 true;也可按列单独 col.headerFilter 配置) */
179
+ filterable?: boolean;
180
+ /** 多选行(默认 false;传对象可配置禁用行/受控初始选中) */
181
+ selectable?: boolean | PntTableSelectConfig;
182
+ /** 多选仅当前页(默认 true;翻页自动清空勾选,TBL-06.03)—— selectable 为对象时以 PntTableSelectConfig.currentPageOnly 为准 */
183
+ currentPageOnly?: boolean;
184
+ /** 分页(默认 true) */
185
+ pageable?: boolean;
186
+ /** 初始页码(默认 1,用于恢复路由/会话态) */
187
+ initialPage?: number;
188
+ /** 默认每页条数(默认 10) */
189
+ pageSize?: number;
190
+ /** 可选每页条数档位(默认 [10, 20, 50]) */
191
+ pageSizeOptions?: number[];
192
+ /** 自定义空态内容(优先级高于 emptyText) */
193
+ empty?: ReactNode;
194
+ /** 空态文案(默认 "暂无数据") */
195
+ emptyText?: string;
196
+ /** 有条件空态提示(默认 "调整条件或重置查询") */
197
+ emptyWithFilterHint?: string;
198
+ /** 是否显示边框(默认 false) */
199
+ bordered?: boolean;
200
+ /** 表格尺寸 */
201
+ size?: 'small' | 'medium' | 'large';
202
+ /** 表体最大高度(超则内部滚动,表头吸顶) */
203
+ bodyMaxHeight?: number;
204
+ /** 受控加载态(组件内部自动管理首次加载/刷新/骨架) */
205
+ loading?: boolean;
206
+ /** 受控错误态 */
207
+ error?: string | null;
208
+ /** 业务 ID(fetcher 自动透传) */
209
+ businessId?: string | number;
210
+ /** 环境 */
211
+ env?: number;
212
+ /** 时区 */
213
+ timezone?: string;
214
+ onQueryChange?: (query: PntTableQuery, meta: PntTableQueryMeta) => void;
215
+ onSelectionChange?: (selection: any[], meta: PntTableSelectionMeta) => void;
216
+ onRowAction?: (action: string, row: any, meta: {
217
+ tableId: string;
218
+ rowKey: string;
219
+ }) => void;
220
+ attach?: HTMLElement;
221
+ className?: string;
222
+ style?: CSSProperties;
223
+ /** 行样式类名(透传 TDesign rowClassName) */
224
+ rowClassName?: (row: any, index: number) => string;
225
+ }
@@ -0,0 +1,17 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __copyProps = (to, from, except, desc) => {
6
+ if (from && typeof from === "object" || typeof from === "function") {
7
+ for (let key of __getOwnPropNames(from))
8
+ if (!__hasOwnProp.call(to, key) && key !== except)
9
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
10
+ }
11
+ return to;
12
+ };
13
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
14
+
15
+ // src/components/PntTable/types.ts
16
+ var types_exports = {};
17
+ module.exports = __toCommonJS(types_exports);
@@ -0,0 +1,38 @@
1
+ /**
2
+ * useTableCore — PntTable 核心逻辑
3
+ *
4
+ * 负责:请求顺序控制、排序三态、筛选草稿/生效分离、多选三态、分页越界校验、7 种状态管理。
5
+ * 纯 React Hook,不依赖 TDesign DOM,方便单测和版本降级。
6
+ */
7
+ import type { PntSortDirection, PntSortInfo, PntTableColumn, PntTableProps, PntTableStatus } from './types';
8
+ export declare function cycleSort(currentField: string | null, currentDir: PntSortDirection | undefined, targetField: string): {
9
+ field: string;
10
+ direction: PntSortDirection;
11
+ } | null;
12
+ export declare function clampPage(page: number, total: number, pageSize: number): number;
13
+ export declare function validateJumpPage(page: number, total: number, pageSize: number): string | null;
14
+ export declare function validateColumnConflicts(columns: PntTableColumn[]): string[];
15
+ export interface UseTableCoreResult {
16
+ data: any[];
17
+ total: number;
18
+ status: PntTableStatus;
19
+ error: string | null;
20
+ sort: PntSortInfo | null;
21
+ appliedFilters: Record<string, any>;
22
+ page: number;
23
+ pageSize: number;
24
+ selection: string[];
25
+ requestId: number;
26
+ toggleSort: (field: string) => void;
27
+ applyFilters: (filters: Record<string, any>) => void;
28
+ resetFilters: () => void;
29
+ setPage: (page: number) => void;
30
+ setPageSize: (size: number) => void;
31
+ toggleRow: (rowKey: string, selected: boolean) => void;
32
+ selectAllOnPage: (rowKeys: string[], disabledKeys: string[]) => void;
33
+ clearSelection: () => void;
34
+ refresh: () => void;
35
+ isAllSelectedOnPage: (rowKeys: string[], disabledKeys: string[]) => boolean;
36
+ isIndeterminateOnPage: (rowKeys: string[], disabledKeys: string[]) => boolean;
37
+ }
38
+ export declare function useTableCore(props: Pick<PntTableProps, 'tableId' | 'rowKey' | 'columns' | 'dataMode' | 'fetcher' | 'data' | 'initialPage' | 'pageSize' | 'pageSizeOptions' | 'businessId' | 'env' | 'timezone' | 'onQueryChange' | 'onSelectionChange' | 'selectable' | 'currentPageOnly' | 'total'>): UseTableCoreResult;