zmdms-webui 1.5.1 → 1.5.3
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 +14 -4
- package/dist/es/button/button.js +10 -3
- package/dist/es/button/interface.d.ts +6 -1
- package/dist/es/config/ZtxkContext.d.ts +10 -0
- package/dist/es/config/ZtxkContext.js +1 -0
- package/dist/es/container/index.css +1 -1
- package/dist/es/enhanceselect/enhance-select.d.ts +6 -0
- package/dist/es/enhanceselect/enhance-select.js +39 -0
- package/dist/es/enhanceselect/index.d.ts +5 -0
- package/dist/es/enhanceselect/index.js +5 -0
- package/dist/es/enhanceselect/interface.d.ts +71 -0
- package/dist/es/enhanceselect/list-query.js +47 -0
- package/dist/es/enhanceselect/page-query.js +132 -0
- package/dist/es/node_modules/@tanstack/query-core/build/modern/focusManager.js +66 -0
- package/dist/es/node_modules/@tanstack/query-core/build/modern/infiniteQueryBehavior.js +118 -0
- package/dist/es/node_modules/@tanstack/query-core/build/modern/infiniteQueryObserver.js +66 -0
- package/dist/es/node_modules/@tanstack/query-core/build/modern/notifyManager.js +81 -0
- package/dist/es/node_modules/@tanstack/query-core/build/modern/onlineManager.js +56 -0
- package/dist/es/node_modules/@tanstack/query-core/build/modern/query.js +16 -0
- package/dist/es/node_modules/@tanstack/query-core/build/modern/queryObserver.js +453 -0
- package/dist/es/node_modules/@tanstack/query-core/build/modern/retryer.js +8 -0
- package/dist/es/node_modules/@tanstack/query-core/build/modern/subscribable.js +24 -0
- package/dist/es/node_modules/@tanstack/query-core/build/modern/thenable.js +34 -0
- package/dist/es/node_modules/@tanstack/query-core/build/modern/utils.js +126 -0
- package/dist/es/node_modules/@tanstack/react-query/build/modern/IsRestoringProvider.js +7 -0
- package/dist/es/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js +18 -0
- package/dist/es/node_modules/@tanstack/react-query/build/modern/QueryErrorResetBoundary.js +21 -0
- package/dist/es/node_modules/@tanstack/react-query/build/modern/errorBoundaryUtils.js +26 -0
- package/dist/es/node_modules/@tanstack/react-query/build/modern/suspense.js +17 -0
- package/dist/es/node_modules/@tanstack/react-query/build/modern/useBaseQuery.js +92 -0
- package/dist/es/node_modules/@tanstack/react-query/build/modern/useInfiniteQuery.js +12 -0
- package/dist/es/node_modules/@tanstack/react-query/build/modern/useQuery.js +8 -0
- package/dist/es/node_modules/@tanstack/react-query/build/modern/utils.js +11 -0
- package/dist/es/select/hooks.js +4 -0
- package/dist/index.build.d.ts +2 -0
- package/dist/index.dark.css +1 -1
- package/dist/index.default.css +1 -1
- package/dist/index.es.js +1 -0
- package/package.json +9 -6
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
```
|
|
19
19
|
因为我们组件是基于antd的做的二次开发,由于antd的国际化配置是通过ConfigProvider这个context.provider。但是并没有暴露给用户获取。所以需要额外定义一个切换的context供组件获取
|
|
20
20
|
import { ConfigProvider, ZtxkContext } from 'ztxk-webui'
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
<ConfigProvider locale={locale}>
|
|
23
23
|
<ZtxkContext.Provider value={ztxkConfig}>
|
|
24
24
|
<App />
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
};
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
2. 开发时 添加 less 支持 (less-loader 需要用 10.2.0
|
|
52
|
+
2. 开发时 添加 less 支持 (less-loader 需要用 10.2.0 以下的版本)(less已提供支持,这个可以忽略)
|
|
53
53
|
|
|
54
54
|
```
|
|
55
55
|
// 进入 react-scripts/config/webpack.config.js
|
|
@@ -95,9 +95,9 @@
|
|
|
95
95
|
2. You might be breaking the Rules of Hooks
|
|
96
96
|
3. You might have more than one copy of React in the same app
|
|
97
97
|
See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.
|
|
98
|
-
|
|
98
|
+
|
|
99
99
|
需要切换到ui库下面,将react link到开发项目的node modules下
|
|
100
|
-
|
|
100
|
+
|
|
101
101
|
cd zmdms-webui
|
|
102
102
|
npm link ..\zmdms-webmain\node_modules\react
|
|
103
103
|
```
|
|
@@ -126,3 +126,13 @@
|
|
|
126
126
|
|
|
127
127
|
/* 会被删除 */
|
|
128
128
|
```
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
# 待办事项
|
|
133
|
+
|
|
134
|
+
## 列表页面组件
|
|
135
|
+
|
|
136
|
+
## 下拉框增强组件
|
|
137
|
+
|
|
138
|
+
- 支持传入接口直接请求
|
package/dist/es/button/button.js
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import { __rest, __assign, __awaiter, __generator } from '../_virtual/_tslib.js';
|
|
2
2
|
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
3
3
|
import { useState, useRef } from 'react';
|
|
4
|
-
import { Button as Button$1, Tooltip } from 'antd';
|
|
4
|
+
import { Button as Button$1, Tooltip, Popconfirm } from 'antd';
|
|
5
5
|
import classNames from '../node_modules/classnames/index.js';
|
|
6
6
|
import ButtonDownload from './buttonDownload.js';
|
|
7
7
|
import ButtonExport from './buttonExport.js';
|
|
8
8
|
import ButtonPreview from './buttonPreview.js';
|
|
9
|
+
import '../config/ZtxkContext.js';
|
|
10
|
+
import useBaseContext from '../config/useBaseContext.js';
|
|
9
11
|
|
|
10
12
|
var Button = function (props) {
|
|
11
13
|
var _a;
|
|
12
|
-
var type = props.type, className = props.className, disabled = props.disabled, size = props.size, danger = props.danger, onClick = props.onClick, _b = props.isAuth, isAuth = _b === void 0 ? true : _b, loading = props.loading, tooltipTitle = props.tooltipTitle, tooltipConfig = props.tooltipConfig, resetProps = __rest(props, ["type", "className", "disabled", "size", "danger", "onClick", "isAuth", "loading", "tooltipTitle", "tooltipConfig"]);
|
|
14
|
+
var type = props.type, className = props.className, disabled = props.disabled, size = props.size, danger = props.danger, onClick = props.onClick, _b = props.isAuth, isAuth = _b === void 0 ? true : _b, loading = props.loading, tooltipTitle = props.tooltipTitle, tooltipConfig = props.tooltipConfig, confirmTitle = props.confirmTitle, confirmMsg = props.confirmMsg, confirmConfig = props.confirmConfig, resetProps = __rest(props, ["type", "className", "disabled", "size", "danger", "onClick", "isAuth", "loading", "tooltipTitle", "tooltipConfig", "confirmTitle", "confirmMsg", "confirmConfig"]);
|
|
13
15
|
var _c = useState(), innerLoading = _c[0], setLoading = _c[1];
|
|
16
|
+
var noPermission = useBaseContext().noPermission;
|
|
14
17
|
var classes = classNames("zt-btn", className, (_a = {},
|
|
15
18
|
_a["zt-btn-".concat(type)] = type,
|
|
16
19
|
_a["zt-btn-disabled"] = disabled || !isAuth,
|
|
@@ -61,7 +64,11 @@ var Button = function (props) {
|
|
|
61
64
|
});
|
|
62
65
|
}); };
|
|
63
66
|
var Btn = (jsx(Button$1, __assign({ className: classes, type: type, disabled: disabled || !isAuth, size: size, danger: danger, onClick: myOnClick, loading: loading || innerLoading }, resetProps)));
|
|
64
|
-
|
|
67
|
+
// 无权限时 不显示按钮模式
|
|
68
|
+
if (noPermission === "display" && !isAuth) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return tooltipTitle || tooltipConfig ? (jsx(Tooltip, __assign({}, tooltipConfig, { title: tooltipTitle || (tooltipConfig === null || tooltipConfig === void 0 ? void 0 : tooltipConfig.title) }, { children: jsx(Fragment, { children: Btn }) }))) : confirmTitle || confirmMsg || confirmConfig ? (jsx(Popconfirm, __assign({}, confirmConfig, { title: confirmTitle || confirmMsg || (confirmConfig === null || confirmConfig === void 0 ? void 0 : confirmConfig.title), onConfirm: function (e) { return myOnClick(e); } }, { children: jsx(Button$1, __assign({ className: classes, type: type, disabled: disabled || !isAuth, size: size, danger: danger, loading: loading || innerLoading }, resetProps)) }))) : (jsx(Fragment, { children: Btn }));
|
|
65
72
|
};
|
|
66
73
|
var ButtonCom = Button;
|
|
67
74
|
ButtonCom.displayName = "ZTXK_WEBUI_Button";
|
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import { Button } from 'antd';
|
|
2
2
|
import { ButtonProps } from 'antd/es/button';
|
|
3
3
|
import { TooltipProps } from 'antd/es/tooltip';
|
|
4
|
+
import { PopconfirmProps } from 'antd/es/popconfirm';
|
|
4
5
|
import ButtonDownload from './buttonDownload.js';
|
|
5
6
|
import ButtonExport from './buttonExport.js';
|
|
6
7
|
import ButtonPreview from './buttonPreview.js';
|
|
7
8
|
|
|
8
9
|
interface IButtonProps extends ButtonProps {
|
|
9
|
-
/** 是否有权限 */
|
|
10
|
+
/** 是否有权限 false无权限 true有权限 */
|
|
10
11
|
isAuth?: boolean;
|
|
11
12
|
/** tooltip相关 */
|
|
12
13
|
tooltipTitle?: string;
|
|
13
14
|
tooltipConfig?: TooltipProps;
|
|
15
|
+
/** 二次确认相关 */
|
|
16
|
+
confirmTitle?: string;
|
|
17
|
+
confirmMsg?: string;
|
|
18
|
+
confirmConfig?: PopconfirmProps;
|
|
14
19
|
}
|
|
15
20
|
interface ButtonComponent extends React.FC<IButtonProps> {
|
|
16
21
|
displayName: string;
|
|
@@ -7,6 +7,16 @@ interface IZtxkConfig {
|
|
|
7
7
|
locale: "zh-cn" | "en";
|
|
8
8
|
apiBaseUrl: string;
|
|
9
9
|
fileBaseUrl: string;
|
|
10
|
+
/**
|
|
11
|
+
* 接口请求方法
|
|
12
|
+
*/
|
|
13
|
+
request?: any;
|
|
14
|
+
/**
|
|
15
|
+
* 按钮无权限时的处理方法。默认无权限的按钮会隐藏。
|
|
16
|
+
* 如果传入: display 则按钮会隐藏
|
|
17
|
+
* 如果传入: disabled 则按钮会禁用
|
|
18
|
+
*/
|
|
19
|
+
noPermission?: "display" | "disabled";
|
|
10
20
|
}
|
|
11
21
|
declare const ZtxkContext: React__default.Context<IZtxkConfig>;
|
|
12
22
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.ztxk-container{min-height:100px;overflow:auto;position:relative}.ztxk-container .ztxk-container__loading{align-items:center;background-color:#bbc7d366;bottom:0;display:flex;flex-direction:column;justify-content:center;left:0;min-height:100px;position:absolute;right:0;text-align:center;top:0;z-index:10000}.ztxk-container .ztxk-container__content{background-color:#fff;margin:10px;overflow-y:auto;padding:10px}.ztxk-container .ztxk-container__content.ztxk-container__content--flex{display:flex;flex-direction:column}.ztxk-container .ztxk-container__content.ztxk-container__content--title{display:flex;flex-direction:column;padding:0!important}.ztxk-container .ztxk-container__content.ztxk-container__content--title .ztxk-container__content--main{flex-grow:1;overflow-y:auto;padding:10px}.ztxk-container--btn-wrap.btn-wrap--margin-top{margin-top:10px}.ztxk-container--btn-wrap>button{margin-bottom:10px;margin-right:10px}.ztxk-container--scroll-wrap{overflow-y:auto}.ztxk-container--scroll-wrap.scroll-wrap--margin-top{margin-top:10px}
|
|
1
|
+
.ztxk-container{min-height:100px;overflow:auto;position:relative}.ztxk-container .ztxk-container__loading{align-items:center;background-color:#bbc7d366;bottom:0;display:flex;flex-direction:column;justify-content:center;left:0;min-height:100px;position:absolute;right:0;text-align:center;top:0;z-index:10000}.ztxk-container .ztxk-container__content{background-color:#fff;margin:10px;overflow-y:auto;padding:10px}.ztxk-container .ztxk-container__content.ztxk-container__content--flex{display:flex;flex-direction:column}.ztxk-container .ztxk-container__content.ztxk-container__content--title{display:flex;flex-direction:column;padding:0!important}.ztxk-container .ztxk-container__content.ztxk-container__content--title .ztxk-container__content--main{flex-grow:1;overflow-y:auto;padding:10px}.ztxk-container .ztxk-container__content.ztxk-container__content--title .ztxk-container__content--main--flex{display:flex;flex-direction:column}.ztxk-container--btn-wrap.btn-wrap--margin-top{margin-top:10px}.ztxk-container--btn-wrap>button{margin-bottom:10px;margin-right:10px}.ztxk-container--scroll-wrap{overflow-y:auto}.ztxk-container--scroll-wrap.scroll-wrap--margin-top{margin-top:10px}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
import { IEnhanceSelectProps } from './interface.js';
|
|
3
|
+
|
|
4
|
+
declare const MemoEnhanceSelect: React__default.MemoExoticComponent<React__default.ForwardRefExoticComponent<IEnhanceSelectProps & React__default.RefAttributes<unknown>>>;
|
|
5
|
+
|
|
6
|
+
export { MemoEnhanceSelect as default };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { __rest, __assign } from '../_virtual/_tslib.js';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { memo, forwardRef } from 'react';
|
|
4
|
+
import MemoListQuery from './list-query.js';
|
|
5
|
+
import MemoPageQuery from './page-query.js';
|
|
6
|
+
import MemoSelect from '../select/select.js';
|
|
7
|
+
import ButtonCom from '../button/button.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 增强的Select组件
|
|
11
|
+
* 增强的功能:携带请求能力。如果你的下拉框数据,需要组件内部通过接口来获取,可以使用这个组件。
|
|
12
|
+
* 注意:如果你的下拉框数据,不需要通过接口来获取,可以使用普通的Select组件。
|
|
13
|
+
*/
|
|
14
|
+
var EnhanceSelect = function (props, ref) {
|
|
15
|
+
var isPage = props.isPage, resetProps = __rest(props, ["isPage"]);
|
|
16
|
+
return !isPage ? (jsx(MemoListQuery, __assign({}, props, { customRender: function (_a) {
|
|
17
|
+
var list = _a.list, isLoading = _a.isLoading, refetch = _a.refetch, isEnabled = _a.isEnabled;
|
|
18
|
+
return (jsx(MemoSelect, __assign({ placeholder: "\u8BF7\u9009\u62E9", list: list, loading: isLoading, dropdownButton: jsx(ButtonCom, __assign({ onClick: function () {
|
|
19
|
+
if (!isEnabled()) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
refetch();
|
|
23
|
+
} }, { children: "\u5237\u65B0\u6570\u636E" })), ref: ref }, resetProps)));
|
|
24
|
+
} }))) : (jsx(MemoPageQuery, __assign({}, props, { customRender: function (_a) {
|
|
25
|
+
var list = _a.list, isLoading = _a.isLoading, hasNextPage = _a.hasNextPage, fetchNextPage = _a.fetchNextPage, onSearchHandle = _a.onSearchHandle, onBlurHandle = _a.onBlurHandle, onClearHandle = _a.onClearHandle;
|
|
26
|
+
return (jsx(MemoSelect, __assign({ placeholder: "\u8BF7\u9009\u62E9", list: list, loading: isLoading, ref: ref, isRemoteSearch: true }, resetProps, { onPopupScroll: function (e) {
|
|
27
|
+
var target = e.target;
|
|
28
|
+
if (target.scrollTop + target.offsetHeight >=
|
|
29
|
+
target.scrollHeight - 100) {
|
|
30
|
+
if (hasNextPage && !isLoading) {
|
|
31
|
+
fetchNextPage();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}, onSearch: onSearchHandle, onClear: onClearHandle, onBlur: onBlurHandle })));
|
|
35
|
+
} })));
|
|
36
|
+
};
|
|
37
|
+
var MemoEnhanceSelect = memo(forwardRef(EnhanceSelect));
|
|
38
|
+
|
|
39
|
+
export { MemoEnhanceSelect as default };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { ISelectProps } from '../select/interface.js';
|
|
2
|
+
|
|
3
|
+
interface IEnhanceSelectProps extends ISelectProps {
|
|
4
|
+
/**
|
|
5
|
+
* 发送请求的方法(同axios),通常业务那边会封装一个代理的request方法,可以通过context获取,不是必传
|
|
6
|
+
*/
|
|
7
|
+
request?: any;
|
|
8
|
+
/**
|
|
9
|
+
* 接口请求地址。接口返回的数据,组件支持接口数据返回两种模式
|
|
10
|
+
* 一种是 { ..., data: [] }
|
|
11
|
+
* 另一种是分页的模式 { ..., records: [], total: xx, size: xx, current: xx }
|
|
12
|
+
*/
|
|
13
|
+
url?: string;
|
|
14
|
+
/**
|
|
15
|
+
* 接口请求参数。
|
|
16
|
+
*/
|
|
17
|
+
params?: any;
|
|
18
|
+
/**
|
|
19
|
+
* 请求类型
|
|
20
|
+
*/
|
|
21
|
+
method?: string;
|
|
22
|
+
/**
|
|
23
|
+
* 超时时间 单位毫秒 默认2分钟
|
|
24
|
+
* @default 120000
|
|
25
|
+
*/
|
|
26
|
+
timeout?: number;
|
|
27
|
+
/**
|
|
28
|
+
* 数据是否缓存。对于那些不分页的接口,默认是缓存数据的。
|
|
29
|
+
* 分页的接口,默认是不缓存数据的。
|
|
30
|
+
*/
|
|
31
|
+
isCache?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* 转换数据的方法。
|
|
34
|
+
* 接受接口返回的数据,返回一个数组。可以直接给下拉框使用的数组。
|
|
35
|
+
* 组件有默认实现:分页接口、不分页接口的转换。
|
|
36
|
+
* 如果接口返回的数据,跟默认有冲突,需要自定义转换方法。
|
|
37
|
+
* 如果是不分页接口:返回的数据是一个数组即可
|
|
38
|
+
* 如果是分页接口:返回的格式按照 { current: number, size: number, total: number, records: any[] }; 这种格式
|
|
39
|
+
* 大多数情况下,是按中拓这边的分页接口处理数据的,所以不需要做其他处理。除非特殊情况
|
|
40
|
+
*/
|
|
41
|
+
transformData?: (data: any) => any;
|
|
42
|
+
/**
|
|
43
|
+
* 对于那些分页接口,数据回显的时候会有一个问题。因为组件默认只会加载第一页数据,但是用户选择的时候,可能数据并不是第一页的。
|
|
44
|
+
* 这就会导致回显的时候,数据比对不上,显示一个id。
|
|
45
|
+
* 这里的做法是,通过当前选中的值,再首次加载的时候去根据id去请求数据。
|
|
46
|
+
* 查询的key是什么?默认会去 dataKey,如果你的逐渐查询不是dataKey,可以自定义。
|
|
47
|
+
* 有一个更好的方法,就是分页接口额外加一个参数,这个参数来传入主键的值。
|
|
48
|
+
* 后端查询的时候,把这个参数和状态值一起查询,不额外添加参数。查询到后,直接追加到分页的数据中。
|
|
49
|
+
* 这样做的一个好处就是,即使是第一次,也能查到应有的数据。
|
|
50
|
+
* 但是,这个方法需要后端配合。
|
|
51
|
+
*/
|
|
52
|
+
firstLoadDataKey?: string;
|
|
53
|
+
/**
|
|
54
|
+
* 接口是否分页
|
|
55
|
+
*/
|
|
56
|
+
isPage?: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* 每页多少条 默认每页50条
|
|
59
|
+
*/
|
|
60
|
+
pageSize?: number;
|
|
61
|
+
/**
|
|
62
|
+
* 远程搜索的key值。默认会采用titleKey作为搜索的key值。也可以是指定的值
|
|
63
|
+
*/
|
|
64
|
+
remoteSearchKey?: string;
|
|
65
|
+
/**
|
|
66
|
+
* 哪些查询参数有值,才进行查询
|
|
67
|
+
*/
|
|
68
|
+
mustQueryKeys?: string | string[];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export { IEnhanceSelectProps };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { __awaiter, __generator } from '../_virtual/_tslib.js';
|
|
2
|
+
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
3
|
+
import { memo } from 'react';
|
|
4
|
+
import '../config/ZtxkContext.js';
|
|
5
|
+
import useBaseContext from '../config/useBaseContext.js';
|
|
6
|
+
import { useQuery } from '../node_modules/@tanstack/react-query/build/modern/useQuery.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 不分页的查询逻辑
|
|
10
|
+
*/
|
|
11
|
+
var ListQuery = function (props) {
|
|
12
|
+
var _a;
|
|
13
|
+
var requestProps = props.request, url = props.url, params = props.params, _b = props.method, method = _b === void 0 ? "get" : _b, _c = props.timeout, timeout = _c === void 0 ? 120000 : _c, customRender = props.customRender, _d = props.isCache, isCache = _d === void 0 ? true : _d, transformData = props.transformData, mustQueryKeys = props.mustQueryKeys;
|
|
14
|
+
var request = useBaseContext().request;
|
|
15
|
+
var isEnabled = function () {
|
|
16
|
+
if (typeof mustQueryKeys === "string") {
|
|
17
|
+
return params[mustQueryKeys] != null;
|
|
18
|
+
}
|
|
19
|
+
if (Array.isArray(mustQueryKeys)) {
|
|
20
|
+
return mustQueryKeys.every(function (key) { return params[key] != null; });
|
|
21
|
+
}
|
|
22
|
+
return true;
|
|
23
|
+
};
|
|
24
|
+
// 数据请求方法(通常由业务封装),新项目可以从ZtxkContext中传入业务定义的请求方法,也可以组件单独传入
|
|
25
|
+
var requestHandle = requestProps || request;
|
|
26
|
+
var _e = useQuery({
|
|
27
|
+
queryKey: [url, params],
|
|
28
|
+
queryFn: function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
29
|
+
var res;
|
|
30
|
+
return __generator(this, function (_a) {
|
|
31
|
+
switch (_a.label) {
|
|
32
|
+
case 0: return [4 /*yield*/, requestHandle({ url: url, params: params, method: method, timeout: timeout })];
|
|
33
|
+
case 1:
|
|
34
|
+
res = _a.sent();
|
|
35
|
+
return [2 /*return*/, res]; // 返回获取到的数据
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}); },
|
|
39
|
+
staleTime: isCache ? Infinity : 0,
|
|
40
|
+
enabled: isEnabled(),
|
|
41
|
+
}), data = _e.data, isLoading = _e.isLoading, refetch = _e.refetch;
|
|
42
|
+
var list = transformData ? transformData(data) : (_a = data === null || data === void 0 ? void 0 : data.data) === null || _a === void 0 ? void 0 : _a.data;
|
|
43
|
+
return jsx(Fragment, { children: customRender === null || customRender === void 0 ? void 0 : customRender({ list: list, isLoading: isLoading, refetch: refetch, isEnabled: isEnabled }) });
|
|
44
|
+
};
|
|
45
|
+
var MemoListQuery = memo(ListQuery);
|
|
46
|
+
|
|
47
|
+
export { MemoListQuery as default };
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { __assign, __awaiter, __generator } from '../_virtual/_tslib.js';
|
|
2
|
+
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
3
|
+
import { memo, useState, useRef } from 'react';
|
|
4
|
+
import '../config/ZtxkContext.js';
|
|
5
|
+
import useBaseContext from '../config/useBaseContext.js';
|
|
6
|
+
import { useInfiniteQuery } from '../node_modules/@tanstack/react-query/build/modern/useInfiniteQuery.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 不分页的查询逻辑
|
|
10
|
+
*/
|
|
11
|
+
var PageQuery = function (props) {
|
|
12
|
+
var _a, _b;
|
|
13
|
+
var requestProps = props.request, url = props.url, params = props.params, _c = props.method, method = _c === void 0 ? "get" : _c, _d = props.timeout, timeout = _d === void 0 ? 120000 : _d, customRender = props.customRender, transformData = props.transformData, onClear = props.onClear, onBlur = props.onBlur, firstLoadDataKey = props.firstLoadDataKey, remoteSearchKey = props.remoteSearchKey, _e = props.pageSize, pageSize = _e === void 0 ? 10 : _e;
|
|
14
|
+
var request = useBaseContext().request;
|
|
15
|
+
// 输入的值
|
|
16
|
+
var _f = useSearchValue({
|
|
17
|
+
onClear: onClear,
|
|
18
|
+
onBlur: onBlur,
|
|
19
|
+
}), firsrtRef = _f.firsrtRef, searchValue = _f.searchValue, onSearchHandle = _f.onSearchHandle, onBlurHandle = _f.onBlurHandle, onClearHandle = _f.onClearHandle;
|
|
20
|
+
// 数据请求方法(通常由业务封装),新项目可以从ZtxkContext中传入业务定义的请求方法,也可以组件单独传入
|
|
21
|
+
var requestHandle = requestProps || request;
|
|
22
|
+
// 首次回显时,使用的查询接口参数key
|
|
23
|
+
var firstSearchKey = firstLoadDataKey || props.dataKey || "id";
|
|
24
|
+
// 远程搜索时,使用的key
|
|
25
|
+
var remoteSearchUseKey = remoteSearchKey || props.titleKey || "name";
|
|
26
|
+
var transformParams = firsrtRef.current && props.value
|
|
27
|
+
? // 对于分页接口,首次回显的时候,需要把value作为参数传递进去。已查到该条数据
|
|
28
|
+
__assign((_a = {}, _a[firstSearchKey] = Array.isArray(props.value)
|
|
29
|
+
? props.value.join(",")
|
|
30
|
+
: props.value, _a[remoteSearchUseKey] = searchValue, _a), params) : __assign((_b = {}, _b[remoteSearchUseKey] = searchValue, _b), params);
|
|
31
|
+
var _g = useInfiniteQuery({
|
|
32
|
+
queryKey: [url, transformParams],
|
|
33
|
+
queryFn: function (_a) {
|
|
34
|
+
var pageParam = _a.pageParam;
|
|
35
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
36
|
+
var res;
|
|
37
|
+
return __generator(this, function (_b) {
|
|
38
|
+
switch (_b.label) {
|
|
39
|
+
case 0: return [4 /*yield*/, requestHandle({
|
|
40
|
+
url: url,
|
|
41
|
+
params: __assign(__assign(__assign({}, transformParams), pageParam), { size: pageSize }),
|
|
42
|
+
method: method,
|
|
43
|
+
timeout: timeout,
|
|
44
|
+
})];
|
|
45
|
+
case 1:
|
|
46
|
+
res = _b.sent();
|
|
47
|
+
if (firsrtRef.current && props.value) {
|
|
48
|
+
// 首次回显时,需要把value作为参数传递进去。已查到该条数据
|
|
49
|
+
firsrtRef.current = false;
|
|
50
|
+
}
|
|
51
|
+
return [2 /*return*/, res];
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
},
|
|
56
|
+
initialPageParam: { current: 1 },
|
|
57
|
+
getNextPageParam: function (lastPage, pages) {
|
|
58
|
+
var _a;
|
|
59
|
+
var pageData = transformData
|
|
60
|
+
? transformData(lastPage)
|
|
61
|
+
: (_a = lastPage === null || lastPage === void 0 ? void 0 : lastPage.data) === null || _a === void 0 ? void 0 : _a.data;
|
|
62
|
+
var current = pageData.current, size = pageData.size, total = pageData.total, records = pageData.records;
|
|
63
|
+
var currentLen = (current - 1) * size + (records === null || records === void 0 ? void 0 : records.length) || 0;
|
|
64
|
+
// 如果总条数 大于 当前条数
|
|
65
|
+
if (total > currentLen) {
|
|
66
|
+
return { current: current + 1 };
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// 请求终止
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
}), data = _g.data, refetch = _g.refetch, isLoading = _g.isLoading, fetchNextPage = _g.fetchNextPage, hasNextPage = _g.hasNextPage, isFetchingNextPage = _g.isFetchingNextPage;
|
|
74
|
+
var getPageData = function (data) {
|
|
75
|
+
var _a;
|
|
76
|
+
var list = [];
|
|
77
|
+
(_a = data === null || data === void 0 ? void 0 : data.pages) === null || _a === void 0 ? void 0 : _a.forEach(function (item) {
|
|
78
|
+
var _a;
|
|
79
|
+
var pageData = transformData ? transformData(item) : (_a = item === null || item === void 0 ? void 0 : item.data) === null || _a === void 0 ? void 0 : _a.data;
|
|
80
|
+
var records = pageData.records;
|
|
81
|
+
if (Array.isArray(records)) {
|
|
82
|
+
list.push.apply(list, records);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
return list;
|
|
86
|
+
};
|
|
87
|
+
// 数据
|
|
88
|
+
var list = getPageData(data);
|
|
89
|
+
return (jsx(Fragment, { children: customRender === null || customRender === void 0 ? void 0 : customRender({
|
|
90
|
+
list: list,
|
|
91
|
+
isLoading: isLoading || isFetchingNextPage,
|
|
92
|
+
refetch: refetch,
|
|
93
|
+
fetchNextPage: fetchNextPage,
|
|
94
|
+
hasNextPage: hasNextPage,
|
|
95
|
+
onSearchHandle: onSearchHandle,
|
|
96
|
+
onBlurHandle: onBlurHandle,
|
|
97
|
+
onClearHandle: onClearHandle,
|
|
98
|
+
}) }));
|
|
99
|
+
};
|
|
100
|
+
var MemoPageQuery = memo(PageQuery);
|
|
101
|
+
/**
|
|
102
|
+
* 搜索时,失去焦点,清空输入的值
|
|
103
|
+
*/
|
|
104
|
+
function useSearchValue(props) {
|
|
105
|
+
var onSearch = props.onSearch, onBlur = props.onBlur, onClear = props.onClear;
|
|
106
|
+
var _a = useState(), searchValue = _a[0], setSearchValue = _a[1];
|
|
107
|
+
var firsrtRef = useRef(true);
|
|
108
|
+
// 搜索触发查询
|
|
109
|
+
var onSearchHandle = function (value) {
|
|
110
|
+
firsrtRef.current = false;
|
|
111
|
+
onSearch && onSearch(value);
|
|
112
|
+
setSearchValue(value);
|
|
113
|
+
};
|
|
114
|
+
// filter
|
|
115
|
+
var onBlurHandle = function (e) {
|
|
116
|
+
onBlur && onBlur(e);
|
|
117
|
+
};
|
|
118
|
+
var onClearHandle = function () {
|
|
119
|
+
firsrtRef.current = false;
|
|
120
|
+
onClear && onClear();
|
|
121
|
+
};
|
|
122
|
+
return {
|
|
123
|
+
searchValue: searchValue,
|
|
124
|
+
firsrtRef: firsrtRef,
|
|
125
|
+
setSearchValue: setSearchValue,
|
|
126
|
+
onSearchHandle: onSearchHandle,
|
|
127
|
+
onBlurHandle: onBlurHandle,
|
|
128
|
+
onClearHandle: onClearHandle,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export { MemoPageQuery as default, useSearchValue };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Subscribable } from './subscribable.js';
|
|
2
|
+
import { isServer } from './utils.js';
|
|
3
|
+
|
|
4
|
+
// src/focusManager.ts
|
|
5
|
+
var FocusManager = class extends Subscribable {
|
|
6
|
+
#focused;
|
|
7
|
+
#cleanup;
|
|
8
|
+
#setup;
|
|
9
|
+
constructor() {
|
|
10
|
+
super();
|
|
11
|
+
this.#setup = (onFocus) => {
|
|
12
|
+
if (!isServer && window.addEventListener) {
|
|
13
|
+
const listener = () => onFocus();
|
|
14
|
+
window.addEventListener("visibilitychange", listener, false);
|
|
15
|
+
return () => {
|
|
16
|
+
window.removeEventListener("visibilitychange", listener);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
return;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
onSubscribe() {
|
|
23
|
+
if (!this.#cleanup) {
|
|
24
|
+
this.setEventListener(this.#setup);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
onUnsubscribe() {
|
|
28
|
+
if (!this.hasListeners()) {
|
|
29
|
+
this.#cleanup?.();
|
|
30
|
+
this.#cleanup = void 0;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
setEventListener(setup) {
|
|
34
|
+
this.#setup = setup;
|
|
35
|
+
this.#cleanup?.();
|
|
36
|
+
this.#cleanup = setup((focused) => {
|
|
37
|
+
if (typeof focused === "boolean") {
|
|
38
|
+
this.setFocused(focused);
|
|
39
|
+
} else {
|
|
40
|
+
this.onFocus();
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
setFocused(focused) {
|
|
45
|
+
const changed = this.#focused !== focused;
|
|
46
|
+
if (changed) {
|
|
47
|
+
this.#focused = focused;
|
|
48
|
+
this.onFocus();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
onFocus() {
|
|
52
|
+
const isFocused = this.isFocused();
|
|
53
|
+
this.listeners.forEach((listener) => {
|
|
54
|
+
listener(isFocused);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
isFocused() {
|
|
58
|
+
if (typeof this.#focused === "boolean") {
|
|
59
|
+
return this.#focused;
|
|
60
|
+
}
|
|
61
|
+
return globalThis.document?.visibilityState !== "hidden";
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
var focusManager = new FocusManager();
|
|
65
|
+
|
|
66
|
+
export { FocusManager, focusManager };
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { ensureQueryFn, addToStart, addToEnd } from './utils.js';
|
|
2
|
+
|
|
3
|
+
// src/infiniteQueryBehavior.ts
|
|
4
|
+
function infiniteQueryBehavior(pages) {
|
|
5
|
+
return {
|
|
6
|
+
onFetch: (context, query) => {
|
|
7
|
+
const options = context.options;
|
|
8
|
+
const direction = context.fetchOptions?.meta?.fetchMore?.direction;
|
|
9
|
+
const oldPages = context.state.data?.pages || [];
|
|
10
|
+
const oldPageParams = context.state.data?.pageParams || [];
|
|
11
|
+
let result = { pages: [], pageParams: [] };
|
|
12
|
+
let currentPage = 0;
|
|
13
|
+
const fetchFn = async () => {
|
|
14
|
+
let cancelled = false;
|
|
15
|
+
const addSignalProperty = (object) => {
|
|
16
|
+
Object.defineProperty(object, "signal", {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: () => {
|
|
19
|
+
if (context.signal.aborted) {
|
|
20
|
+
cancelled = true;
|
|
21
|
+
} else {
|
|
22
|
+
context.signal.addEventListener("abort", () => {
|
|
23
|
+
cancelled = true;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return context.signal;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
const queryFn = ensureQueryFn(context.options, context.fetchOptions);
|
|
31
|
+
const fetchPage = async (data, param, previous) => {
|
|
32
|
+
if (cancelled) {
|
|
33
|
+
return Promise.reject();
|
|
34
|
+
}
|
|
35
|
+
if (param == null && data.pages.length) {
|
|
36
|
+
return Promise.resolve(data);
|
|
37
|
+
}
|
|
38
|
+
const queryFnContext = {
|
|
39
|
+
client: context.client,
|
|
40
|
+
queryKey: context.queryKey,
|
|
41
|
+
pageParam: param,
|
|
42
|
+
direction: previous ? "backward" : "forward",
|
|
43
|
+
meta: context.options.meta
|
|
44
|
+
};
|
|
45
|
+
addSignalProperty(queryFnContext);
|
|
46
|
+
const page = await queryFn(
|
|
47
|
+
queryFnContext
|
|
48
|
+
);
|
|
49
|
+
const { maxPages } = context.options;
|
|
50
|
+
const addTo = previous ? addToStart : addToEnd;
|
|
51
|
+
return {
|
|
52
|
+
pages: addTo(data.pages, page, maxPages),
|
|
53
|
+
pageParams: addTo(data.pageParams, param, maxPages)
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
if (direction && oldPages.length) {
|
|
57
|
+
const previous = direction === "backward";
|
|
58
|
+
const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;
|
|
59
|
+
const oldData = {
|
|
60
|
+
pages: oldPages,
|
|
61
|
+
pageParams: oldPageParams
|
|
62
|
+
};
|
|
63
|
+
const param = pageParamFn(options, oldData);
|
|
64
|
+
result = await fetchPage(oldData, param, previous);
|
|
65
|
+
} else {
|
|
66
|
+
const remainingPages = pages ?? oldPages.length;
|
|
67
|
+
do {
|
|
68
|
+
const param = currentPage === 0 ? oldPageParams[0] ?? options.initialPageParam : getNextPageParam(options, result);
|
|
69
|
+
if (currentPage > 0 && param == null) {
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
result = await fetchPage(result, param);
|
|
73
|
+
currentPage++;
|
|
74
|
+
} while (currentPage < remainingPages);
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
};
|
|
78
|
+
if (context.options.persister) {
|
|
79
|
+
context.fetchFn = () => {
|
|
80
|
+
return context.options.persister?.(
|
|
81
|
+
fetchFn,
|
|
82
|
+
{
|
|
83
|
+
client: context.client,
|
|
84
|
+
queryKey: context.queryKey,
|
|
85
|
+
meta: context.options.meta,
|
|
86
|
+
signal: context.signal
|
|
87
|
+
},
|
|
88
|
+
query
|
|
89
|
+
);
|
|
90
|
+
};
|
|
91
|
+
} else {
|
|
92
|
+
context.fetchFn = fetchFn;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function getNextPageParam(options, { pages, pageParams }) {
|
|
98
|
+
const lastIndex = pages.length - 1;
|
|
99
|
+
return pages.length > 0 ? options.getNextPageParam(
|
|
100
|
+
pages[lastIndex],
|
|
101
|
+
pages,
|
|
102
|
+
pageParams[lastIndex],
|
|
103
|
+
pageParams
|
|
104
|
+
) : void 0;
|
|
105
|
+
}
|
|
106
|
+
function getPreviousPageParam(options, { pages, pageParams }) {
|
|
107
|
+
return pages.length > 0 ? options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams) : void 0;
|
|
108
|
+
}
|
|
109
|
+
function hasNextPage(options, data) {
|
|
110
|
+
if (!data) return false;
|
|
111
|
+
return getNextPageParam(options, data) != null;
|
|
112
|
+
}
|
|
113
|
+
function hasPreviousPage(options, data) {
|
|
114
|
+
if (!data || !options.getPreviousPageParam) return false;
|
|
115
|
+
return getPreviousPageParam(options, data) != null;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export { hasNextPage, hasPreviousPage, infiniteQueryBehavior };
|