@tsingroc/tsingroc-components 2.0.1 → 2.2.0
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/dist/components/Auth.d.ts +162 -0
- package/dist/components/Auth.js +83 -0
- package/dist/components/Auth.js.map +1 -0
- package/dist/components/SegmentedButtons.d.ts +1 -1
- package/dist/components/SegmentedButtons.js +1 -1
- package/dist/components/TmsSidebar.d.ts +46 -0
- package/dist/components/TmsSidebar.js +63 -0
- package/dist/components/TmsSidebar.js.map +1 -0
- package/dist/echarts/coordinateSystem.d.ts +1 -1
- package/dist/echarts/gl.d.ts +1 -1
- package/dist/echarts/series.d.ts +2 -2
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +8 -7
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type JwtPayload } from "jwt-decode";
|
|
3
|
+
import Sdk from "casdoor-js-sdk";
|
|
4
|
+
import type { SdkConfig } from "casdoor-js-sdk/lib/esm/sdk";
|
|
5
|
+
/** 获取全局的 Casdoor SDK,如果还没有初始化,就用 `config` 新建一个。*/
|
|
6
|
+
export declare function getCasdoorSdk(config: SdkConfig): Sdk;
|
|
7
|
+
/** 获取全局的 access token。未登录时返回 `null`。*/
|
|
8
|
+
export declare function getAccessToken(): string | null;
|
|
9
|
+
export interface AccessTokenPayload extends JwtPayload {
|
|
10
|
+
/**
|
|
11
|
+
* Token 的发布者。见 [JWT 标准][1]。
|
|
12
|
+
*
|
|
13
|
+
* [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
|
|
14
|
+
*/
|
|
15
|
+
iss: string;
|
|
16
|
+
/**
|
|
17
|
+
* Token 的主题。见 [JWT 标准][1]。
|
|
18
|
+
*
|
|
19
|
+
* [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
|
|
20
|
+
*/
|
|
21
|
+
sub: string;
|
|
22
|
+
/**
|
|
23
|
+
* Token 的目标应用 ID。见 [JWT 标准][1]。
|
|
24
|
+
*
|
|
25
|
+
* [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
|
|
26
|
+
*/
|
|
27
|
+
aud: string[];
|
|
28
|
+
/**
|
|
29
|
+
* 使用 Token 的应用 ID。见 [JWT 标准][1]。
|
|
30
|
+
*
|
|
31
|
+
* [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
|
|
32
|
+
*/
|
|
33
|
+
azp: string;
|
|
34
|
+
/**
|
|
35
|
+
* Token 的唯一标识符。见 [JWT 标准][1]。
|
|
36
|
+
*
|
|
37
|
+
* [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
|
|
38
|
+
*/
|
|
39
|
+
jti: string;
|
|
40
|
+
/** Token 的过期时间(Unix 时间戳)。*/
|
|
41
|
+
exp: number;
|
|
42
|
+
/** Token 的生效时间(Unix 时间戳)。*/
|
|
43
|
+
nbf: number;
|
|
44
|
+
/** Token 的签发时间(Unix 时间戳)。*/
|
|
45
|
+
iat: number;
|
|
46
|
+
/** 用户的登录名。*/
|
|
47
|
+
name: string;
|
|
48
|
+
/** 用户的 UUID。*/
|
|
49
|
+
id: string;
|
|
50
|
+
/** 用户的显示名。*/
|
|
51
|
+
displayName: string;
|
|
52
|
+
/** 用户的头像 URL。*/
|
|
53
|
+
avatar: string;
|
|
54
|
+
/** 用户的邮件地址。*/
|
|
55
|
+
email: string;
|
|
56
|
+
/** 用户的手机号。*/
|
|
57
|
+
phone: string;
|
|
58
|
+
owner: "tsingroc";
|
|
59
|
+
tokenType: "access-token";
|
|
60
|
+
scope: "profile";
|
|
61
|
+
}
|
|
62
|
+
/** 获取全局的 access token 并解码。解码得到的 payload 中也有一些用户信息,
|
|
63
|
+
* 可以在一定程度上代替通过 API 获取用户信息。未登录时返回 `null`。*/
|
|
64
|
+
export declare function getDecodedAccessToken(): AccessTokenPayload | undefined;
|
|
65
|
+
export interface UserInfo {
|
|
66
|
+
/**
|
|
67
|
+
* Token 的发布者。见 [JWT 标准][1]。
|
|
68
|
+
*
|
|
69
|
+
* [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
|
|
70
|
+
*/
|
|
71
|
+
iss: string;
|
|
72
|
+
/**
|
|
73
|
+
* Token 的主题。见 [JWT 标准][1]。
|
|
74
|
+
*
|
|
75
|
+
* [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
|
|
76
|
+
*/
|
|
77
|
+
sub: string;
|
|
78
|
+
/**
|
|
79
|
+
* Token 的目标应用 ID。见 [JWT 标准][1]。
|
|
80
|
+
*
|
|
81
|
+
* [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
|
|
82
|
+
*/
|
|
83
|
+
aud: string;
|
|
84
|
+
/** 用户的全名(显示名)。*/
|
|
85
|
+
name: string;
|
|
86
|
+
/** 短用户名(登录名)。*/
|
|
87
|
+
prefered_username: string;
|
|
88
|
+
/** 用户的邮件地址。*/
|
|
89
|
+
email?: string;
|
|
90
|
+
/** 用户的邮件地址是否已确认。*/
|
|
91
|
+
email_verified?: boolean;
|
|
92
|
+
/** 用户的手机号。*/
|
|
93
|
+
phone?: string;
|
|
94
|
+
/** 用户的头像 URL。*/
|
|
95
|
+
picture: string;
|
|
96
|
+
/** 用户的地址。*/
|
|
97
|
+
address?: string;
|
|
98
|
+
/** 用户所属的用户组。*/
|
|
99
|
+
groups: string[];
|
|
100
|
+
/** 用户的角色。*/
|
|
101
|
+
roles: string[];
|
|
102
|
+
}
|
|
103
|
+
/** 获取用户信息。必须在开启了 `onlineCheck` 的 {@linkcode AuthProvider} 内部使用,否则返回 `undefined`。*/
|
|
104
|
+
export declare function useUserInfo(): UserInfo | undefined;
|
|
105
|
+
export interface AuthProviderProps {
|
|
106
|
+
/**
|
|
107
|
+
* Casdoor SDK 的配置。
|
|
108
|
+
*
|
|
109
|
+
* **注意**:初始化的 SDK 将保存为全局变量,因此一个项目内不可有多个不同的 SDK 配置。
|
|
110
|
+
* 通过 {@linkcode getCasdoorSdk} 可以获取到全局的 SDK。
|
|
111
|
+
*/
|
|
112
|
+
sdkConfig: SdkConfig;
|
|
113
|
+
/**
|
|
114
|
+
* 是否联网检查用户登录状态有效性。如果检查,那么在内部还可以使用 {@linkcode useUserInfo} 访问到用户信息。
|
|
115
|
+
* @default false
|
|
116
|
+
*/
|
|
117
|
+
onlineCheck?: boolean;
|
|
118
|
+
/**
|
|
119
|
+
* 如果开启了 `onlineCheck`,在检查过程中时向用户显示的加载界面。
|
|
120
|
+
* @default "正在登录……"
|
|
121
|
+
*/
|
|
122
|
+
loading?: ReactNode;
|
|
123
|
+
/** 用户登录后显示的内容。*/
|
|
124
|
+
children: ReactNode;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 确保只有已登录的用户可以访问到内部的内容,未登录的用户将被重定向到登录界面。
|
|
128
|
+
*/
|
|
129
|
+
export declare function AuthProvider(props: AuthProviderProps): ReactNode;
|
|
130
|
+
export interface AuthCallbackProps {
|
|
131
|
+
/**
|
|
132
|
+
* Casdoor SDK 的配置。
|
|
133
|
+
*
|
|
134
|
+
* **注意**:初始化的 SDK 将保存为全局变量,因此一个项目内不可有多个不同的 SDK 配置。
|
|
135
|
+
* 通过 {@linkcode getCasdoorSdk} 可以获取到全局的 SDK。
|
|
136
|
+
*/
|
|
137
|
+
sdkConfig: SdkConfig;
|
|
138
|
+
/** 登录的 API 源点,末尾不带 `/`。*/
|
|
139
|
+
signinOrigin: string;
|
|
140
|
+
/**
|
|
141
|
+
* 登陆的 API 路径。
|
|
142
|
+
* @default "/api/signin"
|
|
143
|
+
*/
|
|
144
|
+
signinPath?: string;
|
|
145
|
+
/**
|
|
146
|
+
* 跳转时的回调。可以使用 React Router 的跳转函数。
|
|
147
|
+
* @default () => { location.href = "/"; }
|
|
148
|
+
*/
|
|
149
|
+
onRedirect?: () => void;
|
|
150
|
+
/**
|
|
151
|
+
* 发生错误时显示的内容。
|
|
152
|
+
* @default (err) => err.toString()
|
|
153
|
+
*/
|
|
154
|
+
error?: (err: unknown) => ReactNode;
|
|
155
|
+
/**
|
|
156
|
+
* 跳转前显示的内容。
|
|
157
|
+
* @default "正在跳转……"
|
|
158
|
+
*/
|
|
159
|
+
children?: ReactNode;
|
|
160
|
+
}
|
|
161
|
+
/** 登录的回调页面。*/
|
|
162
|
+
export declare function AuthCallback(props: AuthCallbackProps): ReactNode;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useEffect, useState, } from "react";
|
|
3
|
+
import { jwtDecode } from "jwt-decode";
|
|
4
|
+
import Sdk from "casdoor-js-sdk";
|
|
5
|
+
let casdoorSdk;
|
|
6
|
+
/** 获取全局的 Casdoor SDK,如果还没有初始化,就用 `config` 新建一个。*/
|
|
7
|
+
export function getCasdoorSdk(config) {
|
|
8
|
+
return (casdoorSdk ?? (casdoorSdk = new Sdk(config)));
|
|
9
|
+
}
|
|
10
|
+
/** 获取全局的 access token。未登录时返回 `null`。*/
|
|
11
|
+
export function getAccessToken() {
|
|
12
|
+
return localStorage.getItem("access_token");
|
|
13
|
+
}
|
|
14
|
+
/** 获取全局的 access token 并解码。解码得到的 payload 中也有一些用户信息,
|
|
15
|
+
* 可以在一定程度上代替通过 API 获取用户信息。未登录时返回 `null`。*/
|
|
16
|
+
export function getDecodedAccessToken() {
|
|
17
|
+
const token = getAccessToken();
|
|
18
|
+
if (token === null)
|
|
19
|
+
return;
|
|
20
|
+
return jwtDecode(token);
|
|
21
|
+
}
|
|
22
|
+
const AuthContext = createContext(undefined);
|
|
23
|
+
/** 获取用户信息。必须在开启了 `onlineCheck` 的 {@linkcode AuthProvider} 内部使用,否则返回 `undefined`。*/
|
|
24
|
+
export function useUserInfo() {
|
|
25
|
+
return useContext(AuthContext);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 确保只有已登录的用户可以访问到内部的内容,未登录的用户将被重定向到登录界面。
|
|
29
|
+
*/
|
|
30
|
+
export function AuthProvider(props) {
|
|
31
|
+
const sdk = getCasdoorSdk(props.sdkConfig);
|
|
32
|
+
const token = getAccessToken();
|
|
33
|
+
const [userInfo, setUserInfo] = useState();
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (token === null) {
|
|
36
|
+
location.href = sdk.getSigninUrl();
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
if (props.onlineCheck) {
|
|
40
|
+
sdk.getUserInfo(token).then((_resp) => {
|
|
41
|
+
// sdk 的类型声明有误
|
|
42
|
+
const resp = _resp;
|
|
43
|
+
if ("status" in resp) {
|
|
44
|
+
location.href = sdk.getSigninUrl();
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
setUserInfo(resp);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}, [token, props.onlineCheck]);
|
|
53
|
+
return token === null ? ("正在跳转到登录页……") : props.onlineCheck && userInfo === undefined ? ((props.loading ?? "正在登录……")) : (_jsx(AuthContext.Provider, { value: userInfo, children: props.children }));
|
|
54
|
+
}
|
|
55
|
+
/** 登录的回调页面。*/
|
|
56
|
+
export function AuthCallback(props) {
|
|
57
|
+
const [error, setError] = useState();
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
getCasdoorSdk(props.sdkConfig)
|
|
60
|
+
.signin(props.signinOrigin, props.signinPath)
|
|
61
|
+
.then((_resp) => {
|
|
62
|
+
// sdk 的类型声明有误
|
|
63
|
+
const resp = _resp;
|
|
64
|
+
if (!resp.token) {
|
|
65
|
+
throw new Error("登录 API 返回了异常的结果:" + JSON.stringify(resp));
|
|
66
|
+
}
|
|
67
|
+
localStorage.setItem("access_token", resp.token);
|
|
68
|
+
if (props.onRedirect) {
|
|
69
|
+
props.onRedirect();
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
location.href = "/";
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
.catch((err) => setError(err));
|
|
76
|
+
}, []);
|
|
77
|
+
return error
|
|
78
|
+
? props.error
|
|
79
|
+
? props.error(error)
|
|
80
|
+
: error.toString()
|
|
81
|
+
: (props.children ?? "正在跳转……");
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=Auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Auth.js","sourceRoot":"","sources":["../../src/components/Auth.tsx"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@ export interface TimeUnitSwitcherProps extends Omit<RadioGroupProps, "onChange">
|
|
|
14
14
|
/**
|
|
15
15
|
* 时间单位(日/周/月)切换按钮。
|
|
16
16
|
*
|
|
17
|
-
* 该组件是 {@
|
|
17
|
+
* 该组件是 {@linkcode SegmentedButtons} 的特化版本。更多属性参见 [`Radio.Group`][1]。
|
|
18
18
|
*
|
|
19
19
|
* [1]: https://ant-design.antgroup.com/components/radio-cn#radiogroup
|
|
20
20
|
*/
|
|
@@ -19,7 +19,7 @@ const TIME_UNIT_OPTIONS = [
|
|
|
19
19
|
/**
|
|
20
20
|
* 时间单位(日/周/月)切换按钮。
|
|
21
21
|
*
|
|
22
|
-
* 该组件是 {@
|
|
22
|
+
* 该组件是 {@linkcode SegmentedButtons} 的特化版本。更多属性参见 [`Radio.Group`][1]。
|
|
23
23
|
*
|
|
24
24
|
* [1]: https://ant-design.antgroup.com/components/radio-cn#radiogroup
|
|
25
25
|
*/
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { MenuProps } from "antd";
|
|
2
|
+
export type MenuItem = Required<MenuProps>["items"][number];
|
|
3
|
+
/**
|
|
4
|
+
* TmsSidebar组件的属性接口
|
|
5
|
+
*/
|
|
6
|
+
export interface TmsSidebarProps extends MenuProps {
|
|
7
|
+
/**
|
|
8
|
+
* 侧边栏宽度。
|
|
9
|
+
* @default 260
|
|
10
|
+
*/
|
|
11
|
+
width?: number | string;
|
|
12
|
+
/**
|
|
13
|
+
* 网站 Logo 的 URL。
|
|
14
|
+
*
|
|
15
|
+
* 建议导入图片,然后将导入得到的地址填入 `logo`,而不要硬编码地址。
|
|
16
|
+
*/
|
|
17
|
+
logo?: string;
|
|
18
|
+
/**
|
|
19
|
+
* 菜单项配置,默认与 TMS 系统的菜单相同。
|
|
20
|
+
*
|
|
21
|
+
* 该属性以及其余属性的用法可参考 [`Menu` 组件的文档][1]。
|
|
22
|
+
*
|
|
23
|
+
* [1]: https://ant-design.antgroup.com/components/menu-cn
|
|
24
|
+
*/
|
|
25
|
+
items?: MenuItem[];
|
|
26
|
+
/** 当前选中的菜单项 key 数组。 */
|
|
27
|
+
selectedKeys?: string[];
|
|
28
|
+
/** 当前展开的子菜单 key 数组。 */
|
|
29
|
+
openKeys?: string[];
|
|
30
|
+
/** 菜单项被选中时的回调函数。 */
|
|
31
|
+
onSelect?: MenuProps["onSelect"];
|
|
32
|
+
/** 子菜单展开/收起时的回调函数。 */
|
|
33
|
+
onOpenChange?: MenuProps["onOpenChange"];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* TMS 系统的侧边栏组件。该组件需要放置在 [Ant Design 的 `Layout` 组件][1]内部才能正常工作。
|
|
37
|
+
*
|
|
38
|
+
* 除了文档中列出的属性之外,该组件会把额外的属性全部传递给内部的菜单 [`Menu` 组件][2]。
|
|
39
|
+
*
|
|
40
|
+
* 该组件不支持暗色模式。
|
|
41
|
+
*
|
|
42
|
+
* [1]: https://ant-design.antgroup.com/components/layout-cn
|
|
43
|
+
* [2]: https://ant-design.antgroup.com/components/menu-cn
|
|
44
|
+
*/
|
|
45
|
+
declare function TmsSidebar(props: TmsSidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
46
|
+
export default TmsSidebar;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { BarChartOutlined, SwapOutlined, TeamOutlined, } from "@ant-design/icons";
|
|
3
|
+
import { ConfigProvider, Layout, Menu } from "antd";
|
|
4
|
+
const { Sider } = Layout;
|
|
5
|
+
const menuItem = (label, key, icon, children) => ({ key, icon, children, label });
|
|
6
|
+
/** 默认菜单项配置,可以作为参考或默认值 */
|
|
7
|
+
const DEFAULT_MENU_ITEMS = [
|
|
8
|
+
menuItem("数据看板", "data-board", _jsx(BarChartOutlined, {}), [
|
|
9
|
+
menuItem("宏观数据", "macro-data"),
|
|
10
|
+
menuItem("合约看板", "contract-overview"),
|
|
11
|
+
menuItem("数据复盘", "data-review"),
|
|
12
|
+
]),
|
|
13
|
+
menuItem("交易管理", "trade-management", _jsx(SwapOutlined, {}), [
|
|
14
|
+
menuItem("日前交易", "day-ahead-trade"),
|
|
15
|
+
menuItem("现货交易", "spot-trade"),
|
|
16
|
+
menuItem("中长期交易", "long-term-trade"),
|
|
17
|
+
]),
|
|
18
|
+
menuItem("合约管理", "customer-management", _jsx(TeamOutlined, {}), [
|
|
19
|
+
menuItem("客户总览", "customer-overview"),
|
|
20
|
+
menuItem("售电合约管理", "sales-contract"),
|
|
21
|
+
menuItem("供应商管理", "supplier-management"),
|
|
22
|
+
menuItem("购电合约管理", "purchase-contract"),
|
|
23
|
+
]),
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* TMS 系统的侧边栏组件。该组件需要放置在 [Ant Design 的 `Layout` 组件][1]内部才能正常工作。
|
|
27
|
+
*
|
|
28
|
+
* 除了文档中列出的属性之外,该组件会把额外的属性全部传递给内部的菜单 [`Menu` 组件][2]。
|
|
29
|
+
*
|
|
30
|
+
* 该组件不支持暗色模式。
|
|
31
|
+
*
|
|
32
|
+
* [1]: https://ant-design.antgroup.com/components/layout-cn
|
|
33
|
+
* [2]: https://ant-design.antgroup.com/components/menu-cn
|
|
34
|
+
*/
|
|
35
|
+
function TmsSidebar(props) {
|
|
36
|
+
const { width = 260, logo, items = DEFAULT_MENU_ITEMS, selectedKeys, openKeys, onSelect, onOpenChange, ...rest } = props;
|
|
37
|
+
return (_jsxs(Sider, { theme: "light", width: width, style: {
|
|
38
|
+
boxShadow: "0 2px 8px rgba(0, 0, 0, 0.15)",
|
|
39
|
+
overflowY: "auto",
|
|
40
|
+
}, children: [_jsx("div", { style: {
|
|
41
|
+
height: "98px",
|
|
42
|
+
padding: "28px 78px",
|
|
43
|
+
display: "flex",
|
|
44
|
+
alignItems: "center",
|
|
45
|
+
justifyContent: "center",
|
|
46
|
+
transition: "all 0.3s",
|
|
47
|
+
}, children: _jsx("img", { alt: "logo", src: logo, style: {
|
|
48
|
+
width: "100%",
|
|
49
|
+
height: "100%",
|
|
50
|
+
objectFit: "contain",
|
|
51
|
+
} }) }), _jsx(ConfigProvider, { theme: {
|
|
52
|
+
components: {
|
|
53
|
+
Menu: {
|
|
54
|
+
itemMarginBlock: 0,
|
|
55
|
+
itemMarginInline: 0,
|
|
56
|
+
itemSelectedColor: "#1890FF",
|
|
57
|
+
itemSelectedBg: "#F0F7FF",
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
}, children: _jsx(Menu, { mode: "inline", style: { borderRight: 0 }, selectedKeys: selectedKeys, openKeys: openKeys, onSelect: onSelect, onOpenChange: onOpenChange, items: items, ...rest }) })] }));
|
|
61
|
+
}
|
|
62
|
+
export default TmsSidebar;
|
|
63
|
+
//# sourceMappingURL=TmsSidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TmsSidebar.js","sourceRoot":"","sources":["../../src/components/TmsSidebar.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,YAAY,GACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIpD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;AAIzB,MAAM,QAAQ,GAAG,CACf,KAAsB,EACtB,GAAc,EACd,IAAsB,EACtB,QAAqB,EACX,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAEhD,yBAAyB;AACzB,MAAM,kBAAkB,GAAe;IACrC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,KAAC,gBAAgB,KAAG,EAAE;QACnD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;QAC9B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;QACrC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;KAChC,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAC,YAAY,KAAG,EAAE;QACrD,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;QACnC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;QAC9B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;KACrC,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE,qBAAqB,EAAE,KAAC,YAAY,KAAG,EAAE;QACxD,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;QACrC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;QACpC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;QACxC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;KACxC,CAAC;CACH,CAAC;AAmCF;;;;;;;;;GASG;AACH,SAAS,UAAU,CAAC,KAAsB;IACxC,MAAM,EACJ,KAAK,GAAG,GAAG,EACX,IAAI,EACJ,KAAK,GAAG,kBAAkB,EAC1B,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,GAAG,IAAI,EACR,GAAG,KAAK,CAAC;IACV,OAAO,CACL,MAAC,KAAK,IACJ,KAAK,EAAC,OAAO,EACb,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE;YACL,SAAS,EAAE,+BAA+B;YAC1C,SAAS,EAAE,MAAM;SAClB,aAED,cACE,KAAK,EAAE;oBACL,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,WAAW;oBACpB,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,QAAQ;oBACxB,UAAU,EAAE,UAAU;iBACvB,YAED,cACE,GAAG,EAAC,MAAM,EACV,GAAG,EAAE,IAAI,EACT,KAAK,EAAE;wBACL,KAAK,EAAE,MAAM;wBACb,MAAM,EAAE,MAAM;wBACd,SAAS,EAAE,SAAS;qBACrB,GACD,GACE,EACN,KAAC,cAAc,IACb,KAAK,EAAE;oBACL,UAAU,EAAE;wBACV,IAAI,EAAE;4BACJ,eAAe,EAAE,CAAC;4BAClB,gBAAgB,EAAE,CAAC;4BACnB,iBAAiB,EAAE,SAAS;4BAC5B,cAAc,EAAE,SAAS;yBAC1B;qBACF;iBACF,YAED,KAAC,IAAI,IACH,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EACzB,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,KAAK,KACR,IAAI,GACR,GACa,IACX,CACT,CAAC;AACJ,CAAC;AAED,eAAe,UAAU,CAAC"}
|
package/dist/echarts/gl.d.ts
CHANGED
|
@@ -80,7 +80,7 @@ export interface FlowGLSeriesOption {
|
|
|
80
80
|
/**
|
|
81
81
|
* 每行数据包含四个值,分别表示位置 x、y,速度 sx、sy。
|
|
82
82
|
*
|
|
83
|
-
* 如果需要使用风场数据,可以直接调用 {@
|
|
83
|
+
* 如果需要使用风场数据,可以直接调用 {@linkcode preprocessWindData} 来将数据处理成此处需要的格式。
|
|
84
84
|
*/
|
|
85
85
|
data: [number, number, number, number][];
|
|
86
86
|
/**
|
package/dist/echarts/series.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ export interface LineSeriesOption {
|
|
|
21
21
|
/**
|
|
22
22
|
* 需要应用的配置预设。预设的优先级**高于** `option`。
|
|
23
23
|
*
|
|
24
|
-
* 可用的预设:{@
|
|
24
|
+
* 可用的预设:{@linkcode gradientArea}
|
|
25
25
|
*/
|
|
26
26
|
presets?: LineSeriesPreset[];
|
|
27
27
|
}
|
|
@@ -98,7 +98,7 @@ export interface PieSeriesOption {
|
|
|
98
98
|
/**
|
|
99
99
|
* 需要应用的配置预设。预设的优先级**高于** `option`。
|
|
100
100
|
*
|
|
101
|
-
* 可用的预设:{@
|
|
101
|
+
* 可用的预设:{@linkcode ringPie}
|
|
102
102
|
*/
|
|
103
103
|
presets?: PieSeriesPreset[];
|
|
104
104
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
export { getCasdoorSdk, getAccessToken, getDecodedAccessToken, useUserInfo, AuthProvider, type AuthProviderProps, AuthCallback, type AuthCallbackProps, } from "./components/Auth";
|
|
1
2
|
export { default as Calendar, type CalendarProps } from "./components/Calendar";
|
|
2
3
|
export { default as CircularProgress, type CircularProgressProps, } from "./components/CircularProgress";
|
|
3
|
-
|
|
4
|
-
export { ImageBackground, type ImageBackgroundProps };
|
|
4
|
+
export { default as ImageBackground, type ImageBackgroundProps, } from "./components/ImageBackground";
|
|
5
5
|
export { default as QuickDateRangePicker, type QuickDateRangePickerProps, } from "./components/QuickDateRangePicker";
|
|
6
6
|
export { default as SegmentedButtons, TimeUnitSwitcher, type TimeUnitSwitcherProps, } from "./components/SegmentedButtons";
|
|
7
|
-
|
|
8
|
-
export { TsingrocDatePicker, type DatePickerProps };
|
|
7
|
+
export { default as TmsSidebar, type TmsSidebarProps, } from "./components/TmsSidebar";
|
|
8
|
+
export { default as TsingrocDatePicker, type DatePickerProps, } from "./components/TsingrocDatePicker";
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
export { getCasdoorSdk, getAccessToken, getDecodedAccessToken, useUserInfo, AuthProvider, AuthCallback, } from "./components/Auth";
|
|
1
2
|
export { default as Calendar } from "./components/Calendar";
|
|
2
3
|
export { default as CircularProgress, } from "./components/CircularProgress";
|
|
3
|
-
|
|
4
|
-
export { ImageBackground };
|
|
4
|
+
export { default as ImageBackground, } from "./components/ImageBackground";
|
|
5
5
|
export { default as QuickDateRangePicker, } from "./components/QuickDateRangePicker";
|
|
6
6
|
export { default as SegmentedButtons, TimeUnitSwitcher, } from "./components/SegmentedButtons";
|
|
7
|
-
|
|
8
|
-
export { TsingrocDatePicker };
|
|
7
|
+
export { default as TmsSidebar, } from "./components/TmsSidebar";
|
|
8
|
+
export { default as TsingrocDatePicker, } from "./components/TsingrocDatePicker";
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAsB,MAAM,uBAAuB,CAAC;AAEhF,OAAO,EACL,OAAO,IAAI,gBAAgB,GAE5B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,eAAe,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,WAAW,EACX,YAAY,EAEZ,YAAY,GAEb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAsB,MAAM,uBAAuB,CAAC;AAEhF,OAAO,EACL,OAAO,IAAI,gBAAgB,GAE5B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,OAAO,IAAI,eAAe,GAE3B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,OAAO,IAAI,oBAAoB,GAEhC,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EACL,OAAO,IAAI,gBAAgB,EAC3B,gBAAgB,GAEjB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,OAAO,IAAI,UAAU,GAEtB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,OAAO,IAAI,kBAAkB,GAE9B,MAAM,iCAAiC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tsingroc/tsingroc-components",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -28,31 +28,32 @@
|
|
|
28
28
|
"@ant-design/icons": "^5.6.1",
|
|
29
29
|
"antd": "^5.24.6",
|
|
30
30
|
"antd-style": "^3.7.1",
|
|
31
|
+
"casdoor-js-sdk": "^0.16.0",
|
|
31
32
|
"dayjs": "^1.11.13",
|
|
32
33
|
"echarts": "^5.6.0",
|
|
33
34
|
"echarts-gl": "^2.0.9",
|
|
35
|
+
"jwt-decode": "^4.0.0",
|
|
34
36
|
"react": "^18.3.1",
|
|
35
37
|
"react-dom": "^18.3.1"
|
|
36
38
|
},
|
|
37
39
|
"devDependencies": {
|
|
38
40
|
"@eslint/js": "^9.21.0",
|
|
39
|
-
"@rsbuild/core": "^1.3.
|
|
41
|
+
"@rsbuild/core": "^1.3.4",
|
|
40
42
|
"@rsbuild/plugin-react": "^1.1.1",
|
|
41
43
|
"@rspress/plugin-preview": "^2.0.0-alpha.0",
|
|
42
|
-
"@types/node": "^22.
|
|
44
|
+
"@types/node": "^22.14.0",
|
|
43
45
|
"@types/react": "^18.3.20",
|
|
44
46
|
"@types/react-dom": "^18.3.6",
|
|
45
47
|
"echarts-for-react": "^3.0.2",
|
|
46
|
-
"eslint": "^9.
|
|
48
|
+
"eslint": "^9.24.0",
|
|
47
49
|
"eslint-plugin-react-hooks": "^5.2.0",
|
|
48
|
-
"eslint-plugin-react-refresh": "^0.4.19",
|
|
49
50
|
"globals": "^16.0.0",
|
|
50
51
|
"prettier": "^3.5.3",
|
|
51
52
|
"react-markdown": "^10.1.0",
|
|
52
53
|
"remark-gfm": "^4.0.1",
|
|
53
54
|
"rspress": "^2.0.0-alpha.8",
|
|
54
|
-
"typedoc": "^0.28.
|
|
55
|
-
"typescript": "^5.8.
|
|
55
|
+
"typedoc": "^0.28.2",
|
|
56
|
+
"typescript": "^5.8.3",
|
|
56
57
|
"typescript-eslint": "^8.29.0"
|
|
57
58
|
},
|
|
58
59
|
"directories": {
|