yuand 1.0.5 → 1.0.6
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/es/components/Table/index.js +12 -3
- package/es/components/Table/types.d.ts +0 -1
- package/es/components/Table/useTable.js +0 -21
- package/es/components/TableUseFetch/index.js +12 -3
- package/es/components/TableUseFetch/types.d.ts +0 -2
- package/es/components/TableUseFetch/useTable.js +0 -16
- package/lib/components/Table/index.js +12 -3
- package/lib/components/Table/types.d.ts +0 -1
- package/lib/components/Table/useTable.js +0 -17
- package/lib/components/TableUseFetch/index.js +12 -3
- package/lib/components/TableUseFetch/types.d.ts +0 -2
- package/lib/components/TableUseFetch/useTable.js +0 -14
- package/package.json +2 -6
- package/README.test.md +0 -112
|
@@ -163,13 +163,22 @@ var ProTable = function ProTable(props) {
|
|
|
163
163
|
}
|
|
164
164
|
}, [data, useData]);
|
|
165
165
|
var _useMemo = useMemo(function () {
|
|
166
|
+
var isFunctionColumns = typeof columns === 'function';
|
|
167
|
+
var column = isFunctionColumns ? columns(data) : columns;
|
|
168
|
+
if (!isFunctionColumns) {
|
|
169
|
+
column.map(function (col) {
|
|
170
|
+
if (col.sorter) {
|
|
171
|
+
col.sortOrder = sorter && sorter.field === col.dataIndex ? sorter.order : null;
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
166
175
|
return {
|
|
167
|
-
column:
|
|
176
|
+
column: column,
|
|
168
177
|
dataSource: getDataSource(data, dataKey),
|
|
169
178
|
renderAlert: typeof alert === "function" ? alert(data) : alert,
|
|
170
179
|
total: getTotal(totalKey, data)
|
|
171
180
|
};
|
|
172
|
-
}, [columns, data, dataKey, totalKey]),
|
|
181
|
+
}, [columns, data, dataKey, totalKey, sorter]),
|
|
173
182
|
dataSource = _useMemo.dataSource,
|
|
174
183
|
total = _useMemo.total,
|
|
175
184
|
column = _useMemo.column,
|
|
@@ -224,7 +233,7 @@ var ProTable = function ProTable(props) {
|
|
|
224
233
|
return function () {
|
|
225
234
|
table.resetStore();
|
|
226
235
|
};
|
|
227
|
-
}, [
|
|
236
|
+
}, []);
|
|
228
237
|
var onFinish = useCallback(function (values) {
|
|
229
238
|
if (formHandleValues) {
|
|
230
239
|
values = formHandleValues(values);
|
|
@@ -40,13 +40,6 @@ var useTable = function useTable() {
|
|
|
40
40
|
clear: function clear() {},
|
|
41
41
|
refresh: function refresh() {},
|
|
42
42
|
reset: function reset() {},
|
|
43
|
-
sortOrder: function sortOrder(key) {
|
|
44
|
-
var sorter = useStore.getState().sorter;
|
|
45
|
-
if (sorter && sorter.field === key) {
|
|
46
|
-
return sorter.order;
|
|
47
|
-
}
|
|
48
|
-
return null;
|
|
49
|
-
},
|
|
50
43
|
resetStore: function resetStore() {
|
|
51
44
|
useStore.getState().setState(initState);
|
|
52
45
|
},
|
|
@@ -56,20 +49,6 @@ var useTable = function useTable() {
|
|
|
56
49
|
});
|
|
57
50
|
}
|
|
58
51
|
};
|
|
59
|
-
useStore.subscribe(function (state, prevState) {
|
|
60
|
-
var _state$sorter, _prevState$sorter, _state$sorter2, _prevState$sorter2;
|
|
61
|
-
// 只在排序真正变化时才触发更新
|
|
62
|
-
var sorterChanged = state.sorter !== prevState.sorter;
|
|
63
|
-
var orderChanged = ((_state$sorter = state.sorter) === null || _state$sorter === void 0 ? void 0 : _state$sorter.order) !== ((_prevState$sorter = prevState.sorter) === null || _prevState$sorter === void 0 ? void 0 : _prevState$sorter.order);
|
|
64
|
-
var fieldChanged = ((_state$sorter2 = state.sorter) === null || _state$sorter2 === void 0 ? void 0 : _state$sorter2.field) !== ((_prevState$sorter2 = prevState.sorter) === null || _prevState$sorter2 === void 0 ? void 0 : _prevState$sorter2.field);
|
|
65
|
-
if (sorterChanged && (orderChanged || fieldChanged)) {
|
|
66
|
-
// 创建新的引用以触发使用 tableRef.current 的组件更新
|
|
67
|
-
tableRef.current = _objectSpread({}, tableRef.current);
|
|
68
|
-
_update(function (v) {
|
|
69
|
-
return v + 1;
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
52
|
}
|
|
74
53
|
return [tableRef.current];
|
|
75
54
|
};
|
|
@@ -119,13 +119,22 @@ var ProTable = function ProTable(props) {
|
|
|
119
119
|
}),
|
|
120
120
|
loading = _useFetch.loading;
|
|
121
121
|
var _useMemo = useMemo(function () {
|
|
122
|
+
var isFunctionColumns = typeof columns === 'function';
|
|
123
|
+
var column = isFunctionColumns ? columns(data) : columns;
|
|
124
|
+
if (!isFunctionColumns) {
|
|
125
|
+
column.map(function (col) {
|
|
126
|
+
if (col.sorter) {
|
|
127
|
+
col.sortOrder = sorter && sorter.field === col.dataIndex ? sorter.order : null;
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
122
131
|
return {
|
|
123
|
-
column:
|
|
132
|
+
column: column,
|
|
124
133
|
dataSource: getDataSource(data, dataKey),
|
|
125
134
|
renderAlert: typeof alert === "function" ? alert(data) : alert,
|
|
126
135
|
total: getTotal(totalKey, data)
|
|
127
136
|
};
|
|
128
|
-
}, [columns, data, dataKey, totalKey]),
|
|
137
|
+
}, [columns, data, dataKey, totalKey, sorter]),
|
|
129
138
|
dataSource = _useMemo.dataSource,
|
|
130
139
|
total = _useMemo.total,
|
|
131
140
|
column = _useMemo.column,
|
|
@@ -175,7 +184,7 @@ var ProTable = function ProTable(props) {
|
|
|
175
184
|
return function () {
|
|
176
185
|
table.resetStore();
|
|
177
186
|
};
|
|
178
|
-
}, [
|
|
187
|
+
}, []);
|
|
179
188
|
var onFinish = function onFinish(values) {
|
|
180
189
|
if (formHandleValues) {
|
|
181
190
|
values = formHandleValues(values);
|
|
@@ -25,7 +25,6 @@ export interface TableInstance<TData = any> {
|
|
|
25
25
|
clear: () => void;
|
|
26
26
|
refresh: () => void;
|
|
27
27
|
reset: () => void;
|
|
28
|
-
sortOrder: (key: string) => any;
|
|
29
28
|
update: () => void;
|
|
30
29
|
resetStore: () => void;
|
|
31
30
|
form?: FormInstance;
|
|
@@ -86,7 +85,6 @@ export interface TableRef {
|
|
|
86
85
|
clear: () => void;
|
|
87
86
|
refresh: () => void;
|
|
88
87
|
reset: () => void;
|
|
89
|
-
sortOrder: (key: string) => "ascend" | "descend" | null;
|
|
90
88
|
resetStore: () => void;
|
|
91
89
|
update: () => void;
|
|
92
90
|
}
|
|
@@ -47,13 +47,6 @@ var useTable = function useTable() {
|
|
|
47
47
|
});
|
|
48
48
|
},
|
|
49
49
|
reset: function reset() {},
|
|
50
|
-
sortOrder: function sortOrder(key) {
|
|
51
|
-
var sorter = useStore.getState().sorter;
|
|
52
|
-
if (sorter && sorter.field === key) {
|
|
53
|
-
return sorter.order;
|
|
54
|
-
}
|
|
55
|
-
return null;
|
|
56
|
-
},
|
|
57
50
|
resetStore: function resetStore() {
|
|
58
51
|
useStore.getState().setState(initState);
|
|
59
52
|
},
|
|
@@ -63,15 +56,6 @@ var useTable = function useTable() {
|
|
|
63
56
|
});
|
|
64
57
|
}
|
|
65
58
|
};
|
|
66
|
-
useStore.subscribe(function (state, prevState) {
|
|
67
|
-
var _state$sorter, _prevState$sorter;
|
|
68
|
-
if (state.sorter !== prevState.sorter && ((_state$sorter = state.sorter) === null || _state$sorter === void 0 ? void 0 : _state$sorter.order) !== ((_prevState$sorter = prevState.sorter) === null || _prevState$sorter === void 0 ? void 0 : _prevState$sorter.order)) {
|
|
69
|
-
tableRef.current = _objectSpread({}, tableRef.current);
|
|
70
|
-
_update(function (v) {
|
|
71
|
-
return v + 1;
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
59
|
}
|
|
76
60
|
return [tableRef.current];
|
|
77
61
|
};
|
|
@@ -154,13 +154,22 @@ var ProTable = (props) => {
|
|
|
154
154
|
}
|
|
155
155
|
}, [data, useData]);
|
|
156
156
|
const { dataSource, total, column, renderAlert } = (0, import_react.useMemo)(() => {
|
|
157
|
+
const isFunctionColumns = typeof columns === "function";
|
|
158
|
+
let column2 = isFunctionColumns ? columns(data) : columns;
|
|
159
|
+
if (!isFunctionColumns) {
|
|
160
|
+
column2.map((col) => {
|
|
161
|
+
if (col.sorter) {
|
|
162
|
+
col.sortOrder = sorter && sorter.field === col.dataIndex ? sorter.order : null;
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
157
166
|
return {
|
|
158
|
-
column:
|
|
167
|
+
column: column2,
|
|
159
168
|
dataSource: (0, import_table.getDataSource)(data, dataKey),
|
|
160
169
|
renderAlert: typeof alert === "function" ? alert(data) : alert,
|
|
161
170
|
total: (0, import_table.getTotal)(totalKey, data)
|
|
162
171
|
};
|
|
163
|
-
}, [columns, data, dataKey, totalKey]);
|
|
172
|
+
}, [columns, data, dataKey, totalKey, sorter]);
|
|
164
173
|
const onSearch = () => {
|
|
165
174
|
if (formItems) {
|
|
166
175
|
table.form.submit();
|
|
@@ -211,7 +220,7 @@ var ProTable = (props) => {
|
|
|
211
220
|
return () => {
|
|
212
221
|
table.resetStore();
|
|
213
222
|
};
|
|
214
|
-
}, [
|
|
223
|
+
}, []);
|
|
215
224
|
const onFinish = (0, import_react.useCallback)((values) => {
|
|
216
225
|
if (formHandleValues) {
|
|
217
226
|
values = formHandleValues(values);
|
|
@@ -57,28 +57,11 @@ var useTable = (options = {}) => {
|
|
|
57
57
|
},
|
|
58
58
|
reset: () => {
|
|
59
59
|
},
|
|
60
|
-
sortOrder(key) {
|
|
61
|
-
const sorter = useStore.getState().sorter;
|
|
62
|
-
if (sorter && sorter.field === key) {
|
|
63
|
-
return sorter.order;
|
|
64
|
-
}
|
|
65
|
-
return null;
|
|
66
|
-
},
|
|
67
60
|
resetStore() {
|
|
68
61
|
useStore.getState().setState(initState);
|
|
69
62
|
},
|
|
70
63
|
update: () => update((v) => v + 1)
|
|
71
64
|
};
|
|
72
|
-
useStore.subscribe((state, prevState) => {
|
|
73
|
-
var _a, _b, _c, _d;
|
|
74
|
-
const sorterChanged = state.sorter !== prevState.sorter;
|
|
75
|
-
const orderChanged = ((_a = state.sorter) == null ? void 0 : _a.order) !== ((_b = prevState.sorter) == null ? void 0 : _b.order);
|
|
76
|
-
const fieldChanged = ((_c = state.sorter) == null ? void 0 : _c.field) !== ((_d = prevState.sorter) == null ? void 0 : _d.field);
|
|
77
|
-
if (sorterChanged && (orderChanged || fieldChanged)) {
|
|
78
|
-
tableRef.current = { ...tableRef.current };
|
|
79
|
-
update((v) => v + 1);
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
65
|
}
|
|
83
66
|
return [tableRef.current];
|
|
84
67
|
};
|
|
@@ -128,13 +128,22 @@ var ProTable = (props) => {
|
|
|
128
128
|
}
|
|
129
129
|
});
|
|
130
130
|
const { dataSource, total, column, renderAlert } = (0, import_react.useMemo)(() => {
|
|
131
|
+
const isFunctionColumns = typeof columns === "function";
|
|
132
|
+
let column2 = isFunctionColumns ? columns(data) : columns;
|
|
133
|
+
if (!isFunctionColumns) {
|
|
134
|
+
column2.map((col) => {
|
|
135
|
+
if (col.sorter) {
|
|
136
|
+
col.sortOrder = sorter && sorter.field === col.dataIndex ? sorter.order : null;
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
131
140
|
return {
|
|
132
|
-
column:
|
|
141
|
+
column: column2,
|
|
133
142
|
dataSource: (0, import_table.getDataSource)(data, dataKey),
|
|
134
143
|
renderAlert: typeof alert === "function" ? alert(data) : alert,
|
|
135
144
|
total: (0, import_table.getTotal)(totalKey, data)
|
|
136
145
|
};
|
|
137
|
-
}, [columns, data, dataKey, totalKey]);
|
|
146
|
+
}, [columns, data, dataKey, totalKey, sorter]);
|
|
138
147
|
const onSearch = () => {
|
|
139
148
|
if (formItems) {
|
|
140
149
|
table.form.submit();
|
|
@@ -182,7 +191,7 @@ var ProTable = (props) => {
|
|
|
182
191
|
return () => {
|
|
183
192
|
table.resetStore();
|
|
184
193
|
};
|
|
185
|
-
}, [
|
|
194
|
+
}, []);
|
|
186
195
|
const onFinish = (values) => {
|
|
187
196
|
if (formHandleValues) {
|
|
188
197
|
values = formHandleValues(values);
|
|
@@ -25,7 +25,6 @@ export interface TableInstance<TData = any> {
|
|
|
25
25
|
clear: () => void;
|
|
26
26
|
refresh: () => void;
|
|
27
27
|
reset: () => void;
|
|
28
|
-
sortOrder: (key: string) => any;
|
|
29
28
|
update: () => void;
|
|
30
29
|
resetStore: () => void;
|
|
31
30
|
form?: FormInstance;
|
|
@@ -86,7 +85,6 @@ export interface TableRef {
|
|
|
86
85
|
clear: () => void;
|
|
87
86
|
refresh: () => void;
|
|
88
87
|
reset: () => void;
|
|
89
|
-
sortOrder: (key: string) => "ascend" | "descend" | null;
|
|
90
88
|
resetStore: () => void;
|
|
91
89
|
update: () => void;
|
|
92
90
|
}
|
|
@@ -62,25 +62,11 @@ var useTable = (options = {}) => {
|
|
|
62
62
|
},
|
|
63
63
|
reset: () => {
|
|
64
64
|
},
|
|
65
|
-
sortOrder(key) {
|
|
66
|
-
const sorter = useStore.getState().sorter;
|
|
67
|
-
if (sorter && sorter.field === key) {
|
|
68
|
-
return sorter.order;
|
|
69
|
-
}
|
|
70
|
-
return null;
|
|
71
|
-
},
|
|
72
65
|
resetStore() {
|
|
73
66
|
useStore.getState().setState(initState);
|
|
74
67
|
},
|
|
75
68
|
update: () => update((v) => v + 1)
|
|
76
69
|
};
|
|
77
|
-
useStore.subscribe((state, prevState) => {
|
|
78
|
-
var _a, _b;
|
|
79
|
-
if (state.sorter !== prevState.sorter && ((_a = state.sorter) == null ? void 0 : _a.order) !== ((_b = prevState.sorter) == null ? void 0 : _b.order)) {
|
|
80
|
-
tableRef.current = { ...tableRef.current };
|
|
81
|
-
update((v) => v + 1);
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
70
|
}
|
|
85
71
|
return [tableRef.current];
|
|
86
72
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yuand",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"description": "hyu",
|
|
5
5
|
"module": "./es/index",
|
|
6
6
|
"main": "./lib/index",
|
|
@@ -10,11 +10,7 @@
|
|
|
10
10
|
"dev": "father dev",
|
|
11
11
|
"build": "sudo father build",
|
|
12
12
|
"build:deps": "father prebundle",
|
|
13
|
-
"prepublishOnly": "father doctor && npm run build"
|
|
14
|
-
"publish": "npm publish --access public",
|
|
15
|
-
"test": "vitest",
|
|
16
|
-
"test:ui": "vitest --ui",
|
|
17
|
-
"test:coverage": "vitest --coverage"
|
|
13
|
+
"prepublishOnly": "father doctor && npm run build"
|
|
18
14
|
},
|
|
19
15
|
"keywords": [],
|
|
20
16
|
"authors": [
|
package/README.test.md
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
# Table 组件测试说明
|
|
2
|
-
|
|
3
|
-
## 安装测试依赖
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
npm install -D vitest @vitest/ui @vitejs/plugin-react jsdom
|
|
7
|
-
npm install -D @testing-library/react @testing-library/user-event @testing-library/jest-dom
|
|
8
|
-
npm install -D @types/testing-library__jest-dom
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## 运行测试
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
# 运行所有测试
|
|
15
|
-
npm test
|
|
16
|
-
|
|
17
|
-
# 监听模式
|
|
18
|
-
npm test -- --watch
|
|
19
|
-
|
|
20
|
-
# 生成覆盖率报告
|
|
21
|
-
npm test -- --coverage
|
|
22
|
-
|
|
23
|
-
# 运行 UI 界面
|
|
24
|
-
npm test -- --ui
|
|
25
|
-
|
|
26
|
-
# 运行特定测试文件
|
|
27
|
-
npm test src/components/Table/__tests__/index.test.tsx
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## 测试覆盖范围
|
|
31
|
-
|
|
32
|
-
### 1. 组件基础功能测试 (`index.test.tsx`)
|
|
33
|
-
- ✅ 基础渲染
|
|
34
|
-
- ✅ 加载状态
|
|
35
|
-
- ✅ 自定义 classNames 和 styles
|
|
36
|
-
- ✅ 自定义 dataKey 和 totalKey
|
|
37
|
-
- ✅ 表单搜索功能
|
|
38
|
-
- ✅ 表单提交和重置
|
|
39
|
-
- ✅ handleValues 表单值处理
|
|
40
|
-
- ✅ 分页器显示和切换
|
|
41
|
-
- ✅ 每页大小变化
|
|
42
|
-
- ✅ 列排序功能
|
|
43
|
-
- ✅ Table 实例方法(run, reset, refresh, sortOrder)
|
|
44
|
-
- ✅ 动态列配置(函数形式 columns)
|
|
45
|
-
- ✅ Alert 和 Toolbar 渲染
|
|
46
|
-
- ✅ 国际化支持
|
|
47
|
-
- ✅ 静态方法(config, formatDate, removeEmpty)
|
|
48
|
-
|
|
49
|
-
### 2. useTable Hook 测试 (`useTable.test.ts`)
|
|
50
|
-
- ✅ 返回正确的实例结构
|
|
51
|
-
- ✅ 默认和自定义初始状态
|
|
52
|
-
- ✅ 状态更新
|
|
53
|
-
- ✅ sortOrder 方法
|
|
54
|
-
- ✅ resetStore 方法
|
|
55
|
-
- ✅ 实例稳定性(多次渲染)
|
|
56
|
-
- ✅ subscribe 回调
|
|
57
|
-
- ✅ sorter 变化触发更新
|
|
58
|
-
- ✅ Form 实例
|
|
59
|
-
- ✅ 多实例独立性
|
|
60
|
-
|
|
61
|
-
### 3. 集成测试 (`integration.test.tsx`)
|
|
62
|
-
- ✅ 完整的搜索-分页-排序流程
|
|
63
|
-
- ✅ 表单验证与条件搜索
|
|
64
|
-
- ✅ 自定义 handleValues 转换
|
|
65
|
-
- ✅ 动态列与数据联动
|
|
66
|
-
- ✅ Alert 统计信息显示
|
|
67
|
-
- ✅ 外部控制刷新与清空
|
|
68
|
-
|
|
69
|
-
## 测试配置文件
|
|
70
|
-
|
|
71
|
-
### vitest.config.ts
|
|
72
|
-
配置了测试环境、覆盖率报告、路径别名等。
|
|
73
|
-
|
|
74
|
-
### src/test/setup.ts
|
|
75
|
-
测试环境初始化,包括:
|
|
76
|
-
- jest-dom 断言扩展
|
|
77
|
-
- 自动清理
|
|
78
|
-
- window.matchMedia mock
|
|
79
|
-
- IntersectionObserver mock
|
|
80
|
-
- ResizeObserver mock
|
|
81
|
-
|
|
82
|
-
## 覆盖率目标
|
|
83
|
-
|
|
84
|
-
- **语句覆盖率**: > 80%
|
|
85
|
-
- **分支覆盖率**: > 75%
|
|
86
|
-
- **函数覆盖率**: > 80%
|
|
87
|
-
- **行覆盖率**: > 80%
|
|
88
|
-
|
|
89
|
-
## 常见问题
|
|
90
|
-
|
|
91
|
-
### Q: 如何调试测试?
|
|
92
|
-
A: 使用 `--ui` 参数打开 Vitest UI 界面进行可视化调试。
|
|
93
|
-
|
|
94
|
-
### Q: 测试运行很慢怎么办?
|
|
95
|
-
A: 可以使用 `--run` 参数禁用监听模式,或使用 `--isolate=false` 提升性能。
|
|
96
|
-
|
|
97
|
-
### Q: 如何 mock API 请求?
|
|
98
|
-
A: 在测试文件中使用 `vi.mock()` mock fetch 模块,参考测试文件中的示例。
|
|
99
|
-
|
|
100
|
-
## package.json 脚本配置
|
|
101
|
-
|
|
102
|
-
在 package.json 中添加以下脚本:
|
|
103
|
-
|
|
104
|
-
```json
|
|
105
|
-
{
|
|
106
|
-
"scripts": {
|
|
107
|
-
"test": "vitest",
|
|
108
|
-
"test:ui": "vitest --ui",
|
|
109
|
-
"test:coverage": "vitest --coverage"
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
```
|