diff --git a/ui/README.md b/ui/README.md index 4b65718a..8c6e187a 100644 --- a/ui/README.md +++ b/ui/README.md @@ -44,7 +44,7 @@ ### UI框架与样式 - **Material-UI (@mui)** - Google Material Design组件库 - **Emotion** - CSS-in-JS样式库 -- **@c-x/ui** - 自定义组件库 +- **@ctzhian/ui** - 自定义组件库 ### 状态管理与数据 - **ahooks** - React Hooks工具库 diff --git a/ui/api-templates/http-client.ejs b/ui/api-templates/http-client.ejs index 3efb6abf..57e5a815 100644 --- a/ui/api-templates/http-client.ejs +++ b/ui/api-templates/http-client.ejs @@ -1,7 +1,7 @@ <% const { apiConfig, generateResponses, config } = it; %> -import { message as Message } from '@c-x/ui' +import { message as Message } from '@ctzhian/ui' import type { AxiosInstance, AxiosRequestConfig, HeadersDefaults, ResponseType, AxiosResponse } from "axios"; import axios from "axios"; diff --git a/ui/package.json b/ui/package.json index 0ae4e9c1..52f1a697 100644 --- a/ui/package.json +++ b/ui/package.json @@ -11,14 +11,13 @@ "preview": "vite preview" }, "dependencies": { - "@c-x/ui": "^1.0.9", + "@ctzhian/ui": "^7", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.0", "@hookform/resolvers": "^5.2.1", "@monaco-editor/react": "4.7.0", - "@mui/icons-material": "^6.4.12", - "@mui/lab": "6.0.0-beta.19", - "@mui/material": "^6.4.12", + "@mui/icons-material": "^7", + "@mui/material": "^7", "@yokowu/modelkit-ui": "2.0.6", "@tailwindcss/vite": "^4.1.12", "ahooks": "^3.8.4", diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml index a734db3c..fffb68e5 100644 --- a/ui/pnpm-lock.yaml +++ b/ui/pnpm-lock.yaml @@ -8,9 +8,9 @@ importers: .: dependencies: - '@c-x/ui': - specifier: ^1.0.9 - version: 1.0.9(87983aa74373e7bdff176d7db35e2938) + '@ctzhian/ui': + specifier: ^7 + version: 7.0.5(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/icons-material@7.3.2(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@emotion/react': specifier: ^11.14.0 version: 11.14.0(@types/react@19.1.10)(react@19.1.1) @@ -24,20 +24,17 @@ importers: specifier: 4.7.0 version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mui/icons-material': - specifier: ^6.4.12 - version: 6.5.0(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@mui/lab': - specifier: 6.0.0-beta.19 - version: 6.0.0-beta.19(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^7 + version: 7.3.2(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) '@mui/material': - specifier: ^6.4.12 - version: 6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^7 + version: 7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tailwindcss/vite': specifier: ^4.1.12 version: 4.1.12(vite@6.3.5(@types/node@24.2.1)(jiti@2.5.1)(lightningcss@1.30.1)) '@yokowu/modelkit-ui': specifier: 2.0.6 - version: 2.0.6(@mui/lab@6.0.0-beta.19(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/utils@7.3.1(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(i18next@25.5.2(typescript@5.8.3))(typescript@5.8.3) + version: 2.0.6(@mui/lab@6.0.0-beta.19(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(i18next@25.5.2(typescript@5.8.3))(typescript@5.8.3) ahooks: specifier: ^3.8.4 version: 3.9.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -308,6 +305,17 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' + '@ctzhian/ui@7.0.5': + resolution: {integrity: sha512-BPeEePM9K4U9vV43qFGT/zOkRMfH6GlgBjeECUIZpAyv9D1kLNn7mPC1ldCdYxIYhMqyv1dz3jb5rkkNHt+OTg==} + peerDependencies: + '@emotion/react': ^11 + '@emotion/styled': ^11 + '@mui/icons-material': ^7 + '@mui/material': ^7 + '@mui/utils': ^7 + react: '>=16.9.0' + react-dom: '>=16.9.0' + '@emotion/babel-plugin@11.13.5': resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} @@ -674,16 +682,8 @@ packages: '@mui/core-downloads-tracker@6.5.0': resolution: {integrity: sha512-LGb8t8i6M2ZtS3Drn3GbTI1DVhDY6FJ9crEey2lZ0aN2EMZo8IZBZj9wRf4vqbZHaWjsYgtbOnJw5V8UWbmK2Q==} - '@mui/icons-material@6.5.0': - resolution: {integrity: sha512-VPuPqXqbBPlcVSA0BmnoE4knW4/xG6Thazo8vCLWkOKusko6DtwFV6B665MMWJ9j0KFohTIf3yx2zYtYacvG1g==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@mui/material': ^6.5.0 - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + '@mui/core-downloads-tracker@7.3.2': + resolution: {integrity: sha512-AOyfHjyDKVPGJJFtxOlept3EYEdLoar/RvssBTWVAvDJGIE676dLi2oT/Kx+FoVXFoA/JdV7DEMq/BVWV3KHRw==} '@mui/icons-material@7.3.2': resolution: {integrity: sha512-TZWazBjWXBjR6iGcNkbKklnwodcwj0SrChCNHc9BhD9rBgET22J1eFhHsEmvSvru9+opDy3umqAimQjokhfJlQ==} @@ -737,6 +737,26 @@ packages: '@types/react': optional: true + '@mui/material@7.3.2': + resolution: {integrity: sha512-qXvbnawQhqUVfH1LMgMaiytP+ZpGoYhnGl7yYq2x57GYzcFL/iPzSZ3L30tlbwEjSVKNYcbiKO8tANR1tadjUg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material-pigment-css': ^7.3.2 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@mui/material-pigment-css': + optional: true + '@types/react': + optional: true + '@mui/private-theming@6.4.9': resolution: {integrity: sha512-LktcVmI5X17/Q5SkwjCcdOLBzt1hXuc14jYa7NPShog0GBDCDvKtcnP0V7a2s6EiVRlv7BzbWEJzH6+l/zaCxw==} engines: {node: '>=14.0.0'} @@ -747,6 +767,16 @@ packages: '@types/react': optional: true + '@mui/private-theming@7.3.2': + resolution: {integrity: sha512-ha7mFoOyZGJr75xeiO9lugS3joRROjc8tG1u4P50dH0KR7bwhHznVMcYg7MouochUy0OxooJm/OOSpJ7gKcMvg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@mui/styled-engine@6.5.0': resolution: {integrity: sha512-8woC2zAqF4qUDSPIBZ8v3sakj+WgweolpyM/FXf8jAx6FMls+IE4Y8VDZc+zS805J7PRz31vz73n2SovKGaYgw==} engines: {node: '>=14.0.0'} @@ -760,6 +790,19 @@ packages: '@emotion/styled': optional: true + '@mui/styled-engine@7.3.2': + resolution: {integrity: sha512-PkJzW+mTaek4e0nPYZ6qLnW5RGa0KN+eRTf5FA2nc7cFZTeM+qebmGibaTLrgQBy3UpcpemaqfzToBNkzuxqew==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@mui/system@6.5.0': resolution: {integrity: sha512-XcbBYxDS+h/lgsoGe78ExXFZXtuIlSBpn/KsZq8PtZcIkUNJInkuDqcLd2rVBQrDC1u+rvVovdaWPf2FHKJf3w==} engines: {node: '>=14.0.0'} @@ -776,6 +819,22 @@ packages: '@types/react': optional: true + '@mui/system@7.3.2': + resolution: {integrity: sha512-9d8JEvZW+H6cVkaZ+FK56R53vkJe3HsTpcjMUtH8v1xK6Y1TjzHdZ7Jck02mGXJsE6MQGWVs3ogRHTQmS9Q/rA==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + '@mui/types@7.2.24': resolution: {integrity: sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==} peerDependencies: @@ -784,8 +843,8 @@ packages: '@types/react': optional: true - '@mui/types@7.4.5': - resolution: {integrity: sha512-ZPwlAOE3e8C0piCKbaabwrqZbW4QvWz0uapVPWya7fYj6PeDkl5sSJmomT7wjOcZGPB48G/a6Ubidqreptxz4g==} + '@mui/types@7.4.6': + resolution: {integrity: sha512-NVBbIw+4CDMMppNamVxyTccNv0WxtDb7motWDlMeSC8Oy95saj1TIZMGynPpFLePt3yOD8TskzumeqORCgRGWw==} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: @@ -802,8 +861,8 @@ packages: '@types/react': optional: true - '@mui/utils@7.3.1': - resolution: {integrity: sha512-/31y4wZqVWa0jzMnzo6JPjxwP6xXy4P3+iLbosFg/mJQowL1KIou0LC+lquWW60FKVbKz5ZUWBg2H3jausa0pw==} + '@mui/utils@7.3.2': + resolution: {integrity: sha512-4DMWQGenOdLnM3y/SdFQFwKsCLM+mqxzvoWp9+x2XdEzXapkznauHLiXtSohHs/mc0+5/9UACt1GdugCX2te5g==} engines: {node: '>=14.0.0'} peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3260,26 +3319,23 @@ snapshots: - magicast - typescript - '@c-x/ui@1.0.9(87983aa74373e7bdff176d7db35e2938)': + '@c-x/ui@1.0.9(2095097f83dff6549ba477ae9943cd74)': dependencies: '@emotion/react': 11.14.0(@types/react@19.1.10)(react@19.1.1) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@mui/icons-material': 6.5.0(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@mui/lab': 6.0.0-beta.19(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/icons-material': 7.3.2(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) + '@mui/lab': 6.0.0-beta.19(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mui/material': 6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mui/utils': 7.3.1(@types/react@19.1.10)(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) react-virtuoso: 4.14.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@c-x/ui@1.0.9(9e5bbf95f65f6bba045b6e0e314ece93)': + '@ctzhian/ui@7.0.5(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/icons-material@7.3.2(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@emotion/react': 11.14.0(@types/react@19.1.10)(react@19.1.1) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@mui/icons-material': 7.3.2(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@mui/lab': 6.0.0-beta.19(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mui/material': 6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mui/utils': 7.3.1(@types/react@19.1.10)(react@19.1.1) + '@mui/icons-material': 7.3.2(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) + '@mui/material': 7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) react-virtuoso: 4.14.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -3611,9 +3667,9 @@ snapshots: '@mui/base@5.0.0-beta.66(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@floating-ui/react-dom': 2.1.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mui/types': 7.4.5(@types/react@19.1.10) + '@mui/types': 7.4.6(@types/react@19.1.10) '@mui/utils': 6.4.9(@types/react@19.1.10)(react@19.1.1) '@popperjs/core': 2.11.8 clsx: 2.1.1 @@ -3625,29 +3681,31 @@ snapshots: '@mui/core-downloads-tracker@6.5.0': {} - '@mui/icons-material@6.5.0(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1)': + '@mui/core-downloads-tracker@7.3.2': {} + + '@mui/icons-material@7.3.2(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@mui/material': 6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 optionalDependencies: '@types/react': 19.1.10 - '@mui/icons-material@7.3.2(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1)': + '@mui/icons-material@7.3.2(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1)': dependencies: '@babel/runtime': 7.28.4 - '@mui/material': 6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/material': 7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 optionalDependencies: '@types/react': 19.1.10 - '@mui/lab@6.0.0-beta.19(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mui/lab@6.0.0-beta.19(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@mui/base': 5.0.0-beta.66(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mui/material': 6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/material': 7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mui/system': 6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@mui/types': 7.4.5(@types/react@19.1.10) + '@mui/types': 7.4.6(@types/react@19.1.10) '@mui/utils': 6.4.9(@types/react@19.1.10)(react@19.1.1) clsx: 2.1.1 prop-types: 15.8.1 @@ -3660,7 +3718,7 @@ snapshots: '@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@mui/core-downloads-tracker': 6.5.0 '@mui/system': 6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) '@mui/types': 7.2.24(@types/react@19.1.10) @@ -3679,18 +3737,61 @@ snapshots: '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) '@types/react': 19.1.10 + '@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@babel/runtime': 7.28.4 + '@mui/core-downloads-tracker': 7.3.2 + '@mui/system': 7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) + '@mui/types': 7.4.6(@types/react@19.1.10) + '@mui/utils': 7.3.2(@types/react@19.1.10)(react@19.1.1) + '@popperjs/core': 2.11.8 + '@types/react-transition-group': 4.4.12(@types/react@19.1.10) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + react-is: 19.1.1 + react-transition-group: 4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@19.1.10)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) + '@types/react': 19.1.10 + '@mui/private-theming@6.4.9(@types/react@19.1.10)(react@19.1.1)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@mui/utils': 6.4.9(@types/react@19.1.10)(react@19.1.1) prop-types: 15.8.1 react: 19.1.1 optionalDependencies: '@types/react': 19.1.10 + '@mui/private-theming@7.3.2(@types/react@19.1.10)(react@19.1.1)': + dependencies: + '@babel/runtime': 7.28.4 + '@mui/utils': 7.3.2(@types/react@19.1.10)(react@19.1.1) + prop-types: 15.8.1 + react: 19.1.1 + optionalDependencies: + '@types/react': 19.1.10 + '@mui/styled-engine@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(react@19.1.1)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/sheet': 1.4.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 19.1.1 + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@19.1.10)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) + + '@mui/styled-engine@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(react@19.1.1)': + dependencies: + '@babel/runtime': 7.28.4 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 '@emotion/sheet': 1.4.0 @@ -3703,7 +3804,7 @@ snapshots: '@mui/system@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@mui/private-theming': 6.4.9(@types/react@19.1.10)(react@19.1.1) '@mui/styled-engine': 6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(react@19.1.1) '@mui/types': 7.2.24(@types/react@19.1.10) @@ -3717,19 +3818,35 @@ snapshots: '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) '@types/react': 19.1.10 + '@mui/system@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1)': + dependencies: + '@babel/runtime': 7.28.4 + '@mui/private-theming': 7.3.2(@types/react@19.1.10)(react@19.1.1) + '@mui/styled-engine': 7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(react@19.1.1) + '@mui/types': 7.4.6(@types/react@19.1.10) + '@mui/utils': 7.3.2(@types/react@19.1.10)(react@19.1.1) + clsx: 2.1.1 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 19.1.1 + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@19.1.10)(react@19.1.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) + '@types/react': 19.1.10 + '@mui/types@7.2.24(@types/react@19.1.10)': optionalDependencies: '@types/react': 19.1.10 - '@mui/types@7.4.5(@types/react@19.1.10)': + '@mui/types@7.4.6(@types/react@19.1.10)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 optionalDependencies: '@types/react': 19.1.10 '@mui/utils@6.4.9(@types/react@19.1.10)(react@19.1.1)': dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 '@mui/types': 7.2.24(@types/react@19.1.10) '@types/prop-types': 15.7.15 clsx: 2.1.1 @@ -3739,10 +3856,10 @@ snapshots: optionalDependencies: '@types/react': 19.1.10 - '@mui/utils@7.3.1(@types/react@19.1.10)(react@19.1.1)': + '@mui/utils@7.3.2(@types/react@19.1.10)(react@19.1.1)': dependencies: - '@babel/runtime': 7.28.2 - '@mui/types': 7.4.5(@types/react@19.1.10) + '@babel/runtime': 7.28.4 + '@mui/types': 7.4.6(@types/react@19.1.10) '@types/prop-types': 15.7.15 clsx: 2.1.1 prop-types: 15.8.1 @@ -4212,9 +4329,9 @@ snapshots: '@vue/shared@3.5.18': {} - '@yokowu/modelkit-ui@2.0.6(@mui/lab@6.0.0-beta.19(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/utils@7.3.1(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(i18next@25.5.2(typescript@5.8.3))(typescript@5.8.3)': + '@yokowu/modelkit-ui@2.0.6(@mui/lab@6.0.0-beta.19(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(i18next@25.5.2(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@c-x/ui': 1.0.9(9e5bbf95f65f6bba045b6e0e314ece93) + '@c-x/ui': 1.0.9(2095097f83dff6549ba477ae9943cd74) '@emotion/react': 11.14.0(@types/react@19.1.10)(react@19.1.1) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) '@mui/icons-material': 7.3.2(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) @@ -4525,7 +4642,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 csstype: 3.1.3 dotenv@17.2.1: {} @@ -4956,7 +5073,7 @@ snapshots: i18next@25.5.2(typescript@5.8.3): dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 optionalDependencies: typescript: 5.8.3 @@ -5788,7 +5905,7 @@ snapshots: react-i18next@15.7.3(i18next@25.5.2(typescript@5.8.3))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.8.3): dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 html-parse-stringify: 3.0.1 i18next: 25.5.2(typescript@5.8.3) react: 19.1.1 @@ -5846,7 +5963,7 @@ snapshots: react-transition-group@4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@babel/runtime': 7.28.2 + '@babel/runtime': 7.28.4 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 diff --git a/ui/src/api/httpClient.ts b/ui/src/api/httpClient.ts index 7cae705f..746ce2ff 100644 --- a/ui/src/api/httpClient.ts +++ b/ui/src/api/httpClient.ts @@ -10,19 +10,19 @@ * --------------------------------------------------------------- */ -import { message as Message } from "@c-x/ui"; +import { message as Message } from '@ctzhian/ui'; import type { AxiosInstance, AxiosRequestConfig, HeadersDefaults, ResponseType, -} from "axios"; -import axios from "axios"; +} from 'axios'; +import axios from 'axios'; export type QueryParamsType = Record; export interface FullRequestParams - extends Omit { + extends Omit { /** set parameter to `true` for call `securityWorker` for this request */ secure?: boolean; /** request path */ @@ -39,34 +39,34 @@ export interface FullRequestParams export type RequestParams = Omit< FullRequestParams, - "body" | "method" | "query" | "path" + 'body' | 'method' | 'query' | 'path' >; export interface ApiConfig - extends Omit { + extends Omit { securityWorker?: ( - securityData: SecurityDataType | null, + securityData: SecurityDataType | null ) => Promise | AxiosRequestConfig | void; secure?: boolean; format?: ResponseType; } export enum ContentType { - Json = "application/json", - FormData = "multipart/form-data", - UrlEncoded = "application/x-www-form-urlencoded", - Text = "text/plain", + Json = 'application/json', + FormData = 'multipart/form-data', + UrlEncoded = 'application/x-www-form-urlencoded', + Text = 'text/plain', } -const whitePathnameList = ["/user/login", "/login", "/auth", "/invite"]; -const whiteApiList = ["/api/v1/user/profile", "/api/v1/admin/profile"]; +const whitePathnameList = ['/user/login', '/login', '/auth', '/invite']; +const whiteApiList = ['/api/v1/user/profile', '/api/v1/admin/profile']; const redirectToLogin = () => { const redirectAfterLogin = encodeURIComponent(location.href); const search = `redirect=${redirectAfterLogin}`; - const pathname = location.pathname.startsWith("/user") - ? "/login" - : "/login/admin"; + const pathname = location.pathname.startsWith('/user') + ? '/login' + : '/login/admin'; window.location.href = `${pathname}`; }; @@ -75,7 +75,7 @@ type ExtractDataProp = T extends { data?: infer U } ? U : never; export class HttpClient { public instance: AxiosInstance; private securityData: SecurityDataType | null = null; - private securityWorker?: ApiConfig["securityWorker"]; + private securityWorker?: ApiConfig['securityWorker']; private secure?: boolean; private format?: ResponseType; @@ -88,7 +88,7 @@ export class HttpClient { this.instance = axios.create({ withCredentials: true, ...axiosConfig, - baseURL: axiosConfig.baseURL || "", + baseURL: axiosConfig.baseURL || '', }); this.secure = secure; this.format = format; @@ -107,20 +107,20 @@ export class HttpClient { if ( whitePathnameList.find((item) => location.pathname.startsWith(item)) ) { - return Promise.reject("尚未登录"); + return Promise.reject('尚未登录'); } - Message.error("尚未登录"); + Message.error('尚未登录'); redirectToLogin(); - return Promise.reject("尚未登录"); + return Promise.reject('尚未登录'); } // 手动取消请求 - if (err.code === "ERR_CANCELED") { + if (err.code === 'ERR_CANCELED') { return; } const msg = err?.response?.data?.message || err?.message; Message.error(msg); return Promise.reject(msg); - }, + } ); } @@ -130,7 +130,7 @@ export class HttpClient { protected mergeRequestParams( params1: AxiosRequestConfig, - params2?: AxiosRequestConfig, + params2?: AxiosRequestConfig ): AxiosRequestConfig { const method = params1.method || (params2 && params2.method); @@ -151,7 +151,7 @@ export class HttpClient { } protected stringifyFormItem(formItem: unknown) { - if (typeof formItem === "object" && formItem !== null) { + if (typeof formItem === 'object' && formItem !== null) { return JSON.stringify(formItem); } else { return `${formItem}`; @@ -168,7 +168,7 @@ export class HttpClient { const isFileType = formItem instanceof Blob || formItem instanceof File; formData.append( key, - isFileType ? formItem : this.stringifyFormItem(formItem), + isFileType ? formItem : this.stringifyFormItem(formItem) ); } @@ -186,7 +186,7 @@ export class HttpClient { ...params }: FullRequestParams): Promise> => { const secureParams = - ((typeof secure === "boolean" ? secure : this.secure) && + ((typeof secure === 'boolean' ? secure : this.secure) && this.securityWorker && (await this.securityWorker(this.securityData))) || {}; @@ -197,7 +197,7 @@ export class HttpClient { type === ContentType.FormData && body && body !== null && - typeof body === "object" + typeof body === 'object' ) { body = this.createFormData(body as Record); } @@ -206,7 +206,7 @@ export class HttpClient { type === ContentType.Text && body && body !== null && - typeof body !== "string" + typeof body !== 'string' ) { body = JSON.stringify(body); } @@ -216,7 +216,7 @@ export class HttpClient { headers: { ...(requestParams.headers || {}), ...(type && type !== ContentType.FormData - ? { "Content-Type": type } + ? { 'Content-Type': type } : {}), }, params: query, @@ -226,4 +226,4 @@ export class HttpClient { }); }; } -export default new HttpClient({ format: "json" }).request; +export default new HttpClient({ format: 'json' }).request; diff --git a/ui/src/components/card/index.tsx b/ui/src/components/card/index.tsx index bc38c7bf..70a02de9 100644 --- a/ui/src/components/card/index.tsx +++ b/ui/src/components/card/index.tsx @@ -2,7 +2,7 @@ import { styled } from '@mui/material'; const StyledCard = styled('div')(({ theme }) => ({ padding: theme.spacing(2), - borderRadius: theme.shape.borderRadius * 2.5, + borderRadius: (theme.shape.borderRadius as number) * 2.5, backgroundColor: theme.palette.background.default, })); diff --git a/ui/src/components/codescan/taskDetail.tsx b/ui/src/components/codescan/taskDetail.tsx index e3f50c5f..c9dd8ef7 100644 --- a/ui/src/components/codescan/taskDetail.tsx +++ b/ui/src/components/codescan/taskDetail.tsx @@ -1,11 +1,27 @@ import Card from '@/components/card'; -import { Ellipsis, Modal } from '@c-x/ui'; +import { Ellipsis, Modal } from '@ctzhian/ui'; import { useEffect, useRef, useState } from 'react'; -import { DomainSecurityScanningResult, DomainSecurityScanningRiskDetail } from '@/api/types'; -import { getSecurityScanningDetail, getUserSecurityScanningDetail } from '@/api'; -import { Box, CircularProgress, Grid2 as Grid, List, ListItem, ListItemButton, Stack, ToggleButton, ToggleButtonGroup } from '@mui/material'; +import { + DomainSecurityScanningResult, + DomainSecurityScanningRiskDetail, +} from '@/api/types'; +import { + getSecurityScanningDetail, + getUserSecurityScanningDetail, +} from '@/api'; +import { + Box, + CircularProgress, + Grid, + List, + ListItem, + ListItemButton, + Stack, + ToggleButton, + ToggleButtonGroup, +} from '@mui/material'; import ListAltIcon from '@mui/icons-material/ListAlt'; import ViewSidebarOutlinedIcon from '@mui/icons-material/ViewSidebarOutlined'; import MonacoEditor from '@monaco-editor/react'; @@ -36,16 +52,18 @@ const RiskLevelBox = ({ level }: RiskLevelBoxProps) => { if (!config) return null; return ( - + {config.text} ); @@ -111,17 +129,21 @@ const TaskDetail = ({ task?: DomainSecurityScanningResult; open: boolean; onClose: () => void; - admin: boolean + admin: boolean; }) => { const [loading, setLoading] = useState(true); const [vulns, setVulns] = useState([]); - const [vulDetail, setVulDetail] = useState(undefined); + const [vulDetail, setVulDetail] = useState< + DomainSecurityScanningRiskDetail | undefined + >(undefined); const [viewMode, setViewMode] = useState<'list' | 'detail'>('detail'); const fetchData = async () => { setLoading(true); - const resp = await (admin ? getSecurityScanningDetail : getUserSecurityScanningDetail)({ - id: task?.id as string + const resp = await (admin + ? getSecurityScanningDetail + : getUserSecurityScanningDetail)({ + id: task?.id as string, }); setVulns(resp); setLoading(false); @@ -131,10 +153,10 @@ const TaskDetail = ({ setVulns([]); setVulDetail(undefined); setViewMode('detail'); - console.log(!!vulDetail) + console.log(!!vulDetail); if (open) { fetchData(); - }; + } // eslint-disable-next-line react-hooks/exhaustive-deps }, [task, open]); @@ -149,86 +171,103 @@ const TaskDetail = ({ }, [vulDetail]); // 高亮显示漏洞代码 - const highlightVulnerability = (editor: Monaco.editor.IStandaloneCodeEditor, vulDetail: DomainSecurityScanningRiskDetail | undefined) => { + const highlightVulnerability = ( + editor: Monaco.editor.IStandaloneCodeEditor, + vulDetail: DomainSecurityScanningRiskDetail | undefined + ) => { // 清除之前的装饰器 - editor.deltaDecorations(editor.getModel()?.getAllDecorations().map(d => d.id) || [], []); - + editor.deltaDecorations( + editor + .getModel() + ?.getAllDecorations() + .map((d) => d.id) || [], + [] + ); + // 如果有 start 和 end 位置信息,则设置选区 if (vulDetail?.start && vulDetail?.end) { const startLine = vulDetail.start.line ?? 1; const startColumn = vulDetail.start.col ?? 1; const endLine = vulDetail.end.line ?? startLine; const endColumn = vulDetail.end.col ?? startColumn; - + // 设置选区 const selection = { startLineNumber: startLine, startColumn: startColumn, endLineNumber: endLine, - endColumn: endColumn + endColumn: endColumn, }; - + editor.setSelection(selection); - + // 添加装饰器以增强高亮效果 - editor.deltaDecorations([], [ - { - range: selection, - options: { - isWholeLine: false, - className: 'highlighted-code', - inlineClassName: 'highlighted-code-inline', - overviewRuler: { - color: 'rgba(255, 255, 0, 0.5)', - position: 1 // Monaco.Editor.OverviewRulerLane.Center - } - } - } - ]); - + editor.deltaDecorations( + [], + [ + { + range: selection, + options: { + isWholeLine: false, + className: 'highlighted-code', + inlineClassName: 'highlighted-code-inline', + overviewRuler: { + color: 'rgba(255, 255, 0, 0.5)', + position: 1, // Monaco.Editor.OverviewRulerLane.Center + }, + }, + }, + ] + ); + // 滚动到选区 editor.revealLineInCenter(startLine); } }; - const handleEditorDidMount = (editor: Monaco.editor.IStandaloneCodeEditor) => { + const handleEditorDidMount = ( + editor: Monaco.editor.IStandaloneCodeEditor + ) => { // 保存编辑器实例 editorRef.current = editor; - + // 初始高亮 highlightVulnerability(editor, vulDetail); }; return ( - - {vulDetail && { - setViewMode(value) - }} - > - - - - - - - } - - {task?.name} / {task?.project_name} - - + + {vulDetail && ( + { + setViewMode(value); + }} + > + + + + + + + + )} + + {task?.name} / {task?.project_name} + + } width={1200} open={open} @@ -237,23 +276,34 @@ const TaskDetail = ({ > - + {loading ? ( -
+
) : ( vulns.map((vuln) => ( - - + { setVulDetail(vuln); @@ -263,54 +313,90 @@ const TaskDetail = ({ borderBottomStyle: 'solid', borderBottomColor: 'background.paper', fontSize: '14px', - width: '100%' - }}> - - - - + + + + + {vuln.desc} + + + {vuln.desc} - - + }} + > {vuln.filename}:{vuln?.start?.line} - - {!!vulDetail && vulDetail?.id === vuln.id && 关键代码位于第 {vulDetail?.start?.line} 行{vulDetail?.start?.line !== vulDetail?.end?.line && `至第 ${vulDetail?.end?.line} 行`}} - {!!vulDetail && vulDetail?.id === vuln.id && -
{vulDetail?.lines}
-
} - {!!vulDetail && vulDetail?.id === vuln.id && 修改建议:{vulDetail?.fix}} + + {!!vulDetail && vulDetail?.id === vuln.id && ( + + 关键代码位于第 {vulDetail?.start?.line} 行 + {vulDetail?.start?.line !== vulDetail?.end?.line && + `至第 ${vulDetail?.end?.line} 行`} + + )} + {!!vulDetail && vulDetail?.id === vuln.id && ( + +
+                              {vulDetail?.lines}
+                            
+
+ )} + {!!vulDetail && vulDetail?.id === vuln.id && ( + + 修改建议:{vulDetail?.fix} + + )}
@@ -318,30 +404,40 @@ const TaskDetail = ({ )} - {viewMode === 'detail' && !!vulDetail && - - - + - - } + > + + + + + )} diff --git a/ui/src/components/codescan/taskList.tsx b/ui/src/components/codescan/taskList.tsx index 7134752b..edf0db94 100644 --- a/ui/src/components/codescan/taskList.tsx +++ b/ui/src/components/codescan/taskList.tsx @@ -1,19 +1,17 @@ import { useState, useEffect } from 'react'; -import { Table } from '@c-x/ui'; +import { Table } from '@ctzhian/ui'; import { getSecurityScanningList } from '@/api/SecurityScanning'; import dayjs from 'dayjs'; import Card from '@/components/card'; -import { - Autocomplete, - Box, - Stack, - TextField, - Tooltip, -} from '@mui/material'; +import { Autocomplete, Box, Stack, TextField, Tooltip } from '@mui/material'; -import { ColumnsType } from '@c-x/ui/dist/Table'; -import { DomainSecurityScanningResult, DomainSecurityScanningRiskResult, DomainUser } from '@/api/types'; +import { ColumnsType } from '@ctzhian/ui/dist/Table'; +import { + DomainSecurityScanningResult, + DomainSecurityScanningRiskResult, + DomainUser, +} from '@/api/types'; import User from '@/components/user'; import TaskDetail from './taskDetail'; import ErrorOutlineIcon from '@mui/icons-material/ErrorOutline'; @@ -23,17 +21,21 @@ import { getUserSecurityScanningList } from '@/api'; const CodeScanTaskList = ({ admin, - users + users, }: { - admin: boolean, - users: DomainUser[] + admin: boolean; + users: DomainUser[]; }) => { const [page, setPage] = useState(1); const [size, setSize] = useState(20); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); - const [dataSource, setDataSource] = useState([]); - const [detail, setDetail] = useState(); + const [dataSource, setDataSource] = useState( + [] + ); + const [detail, setDetail] = useState< + DomainSecurityScanningResult | undefined + >(); const [filterUser, setFilterUser] = useState(''); const fetchData = async (params: { @@ -43,7 +45,9 @@ const CodeScanTaskList = ({ author?: string; }) => { setLoading(true); - const res = await (admin ? getSecurityScanningList : getUserSecurityScanningList)({ + const res = await (admin + ? getSecurityScanningList + : getUserSecurityScanningList)({ page: params.page || page, size: params.size || size, author: params.author || filterUser, @@ -57,7 +61,7 @@ const CodeScanTaskList = ({ setPage(1); fetchData({ page: 1, - author: filterUser + author: filterUser, }); }, [filterUser]); @@ -69,71 +73,111 @@ const CodeScanTaskList = ({ render: (project_name, record) => { return ( - + {record?.name} - - {(record.status === 'pending') && - - 等待扫描 - } - {(record.status === 'running') && - - 正在扫描 - } - {(record.status === 'success') && - - 扫描完成 - } - {(record.status === 'failed') && + + {record.status === 'pending' && ( - - 扫描失败 + + + 等待扫描 + - } + )} + {record.status === 'running' && ( + + + + 正在扫描 + + + )} + {record.status === 'success' && ( + + + + 扫描完成 + + + )} + {record.status === 'failed' && ( + + + + + 扫描失败 + + + + )} ); @@ -145,10 +189,23 @@ const CodeScanTaskList = ({ render: (project_name, record) => { return ( - + {record?.project_name} - + {record?.path} @@ -160,28 +217,30 @@ const CodeScanTaskList = ({ title: '扫描结果', width: 260, render(risk: DomainSecurityScanningRiskResult, record) { - const hasNoRisk = record.status !== 'pending' && + const hasNoRisk = + record.status !== 'pending' && (!risk.severe_count || risk.severe_count <= 0) && (!risk.critical_count || risk.critical_count <= 0) && (!risk.suggest_count || risk.suggest_count <= 0); - const tip = [] + const tip = []; if (risk.severe_count && risk.severe_count > 0) { - tip.push(`严重安全告警 ${risk.severe_count} 个`) - } + tip.push(`严重安全告警 ${risk.severe_count} 个`); + } if (risk.critical_count && risk.critical_count > 0) { - tip.push(`高风险安全提醒 ${risk.critical_count} 个`) + tip.push(`高风险安全提醒 ${risk.critical_count} 个`); } if (risk.suggest_count && risk.suggest_count > 0) { - tip.push(`低风险安全提醒 ${risk.suggest_count} 个`) + tip.push(`低风险安全提醒 ${risk.suggest_count} 个`); } return ( - - + { if (!hasNoRisk) { - setDetail(record) + setDetail(record); } }} sx={{ @@ -190,7 +249,10 @@ const CodeScanTaskList = ({ width: '200px', height: '24px', lineHeight: '24px', - background: (record.status === 'pending' || record.status === 'running') ? 'repeating-linear-gradient(45deg, #f0f0f0, #f0f0f0 10px, #e0e0e0 10px, #e0e0e0 20px)' : '#F1F2F8', + background: + record.status === 'pending' || record.status === 'running' + ? 'repeating-linear-gradient(45deg, #f0f0f0, #f0f0f0 10px, #e0e0e0 10px, #e0e0e0 20px)' + : '#F1F2F8', backgroundSize: '30px 30px', animation: 'stripes 1s linear infinite', borderRadius: '4px', @@ -198,7 +260,7 @@ const CodeScanTaskList = ({ transition: 'box-shadow 0.3s ease', userSelect: 'none', '&:hover': { - cursor: "pointer", + cursor: 'pointer', boxShadow: hasNoRisk ? '' : '0 0px 8px #FFCF62', }, '@keyframes stripes': { @@ -209,45 +271,82 @@ const CodeScanTaskList = ({ backgroundPosition: '30px 0', }, }, - }}> - {((record.status === 'success' || record.status === 'failed') && hasNoRisk) ? ( + }} + > + {(record.status === 'success' || record.status === 'failed') && + hasNoRisk ? ( // 如果没有风险,显示"无风险" - + 暂无风险 ) : ( // 否则,显示原有的风险条 <> - {!!risk.severe_count && risk.severe_count > 0 && {risk.severe_count}} - {!!risk.critical_count && risk.critical_count > 0 && {risk.critical_count}} - {!!risk.suggest_count && risk.suggest_count > 0 && {risk.suggest_count}} + {!!risk.severe_count && risk.severe_count > 0 && ( + + {risk.severe_count} + + )} + {!!risk.critical_count && risk.critical_count > 0 && ( + + {risk.critical_count} + + )} + {!!risk.suggest_count && risk.suggest_count > 0 && ( + + {risk.suggest_count} + + )} )} - ) + ); }, }, { @@ -273,39 +372,50 @@ const CodeScanTaskList = ({ render: (text) => { return ( - + {dayjs.unix(text).format('YYYY-MM-DD')} - + {dayjs.unix(text).format('HH:mm:ss')} - ) + ); }, }, ]; return ( - {admin && - option.username || ''} - value={ - users?.find((item) => item.username === filterUser) || - null - } - onChange={(_, newValue) => - setFilterUser(newValue ? newValue.username! : '') - } - isOptionEqualToValue={(option, value) => - option.username === value.username - } - renderInput={(params) => } - clearOnEscape - /> - } + {admin && ( + + option.username || ''} + value={users?.find((item) => item.username === filterUser) || null} + onChange={(_, newValue) => + setFilterUser(newValue ? newValue.username! : '') + } + isOptionEqualToValue={(option, value) => + option.username === value.username + } + renderInput={(params) => } + clearOnEscape + /> + + )} ( // 获取颜色值 const getColor = (colorProp: string) => { // 如果是主题预设颜色 - if (['success', 'warning', 'error', 'info', 'disabled'].includes(colorProp)) { + if ( + ['success', 'warning', 'error', 'info', 'disabled'].includes(colorProp) + ) { return theme.palette[ colorProp as 'success' | 'warning' | 'error' | 'info' | 'disabled' ].main; @@ -26,10 +28,14 @@ const StyledLabel = styled('div')( // 获取背景颜色(淡化版本) const getBackgroundColor = (colorProp: string) => { - if (['success', 'warning', 'error', 'info', 'disabled'].includes(colorProp)) { + if ( + ['success', 'warning', 'error', 'info', 'disabled'].includes(colorProp) + ) { // 使用主题的 light 版本,如果没有则使用 alpha 透明度 const palette = - theme.palette[colorProp as 'success' | 'warning' | 'error' | 'info' | 'disabled']; + theme.palette[ + colorProp as 'success' | 'warning' | 'error' | 'info' | 'disabled' + ]; return alpha(palette.main, 0.15); } // 如果是 default,使用淡灰色背景 @@ -42,7 +48,7 @@ const StyledLabel = styled('div')( return { padding: theme.spacing(0.5, 1), - borderRadius: theme.shape.borderRadius * 4, + borderRadius: (theme.shape.borderRadius as number) * 4, color: textColor, backgroundColor: getBackgroundColor(color), border: `1px solid ${alpha(textColor, 0.3)}`, diff --git a/ui/src/components/markDown/index.tsx b/ui/src/components/markDown/index.tsx index b5c915fc..93c03029 100644 --- a/ui/src/components/markDown/index.tsx +++ b/ui/src/components/markDown/index.tsx @@ -1,4 +1,4 @@ -import { message } from '@c-x/ui'; +import { message } from '@ctzhian/ui'; import { Box, useTheme } from '@mui/material'; import React from 'react'; import ReactMarkdown, { Components } from 'react-markdown'; diff --git a/ui/src/components/sidebar/aboutModal.tsx b/ui/src/components/sidebar/aboutModal.tsx index be3b1465..16e33f43 100644 --- a/ui/src/components/sidebar/aboutModal.tsx +++ b/ui/src/components/sidebar/aboutModal.tsx @@ -1,6 +1,6 @@ import dayjs from 'dayjs'; import { useState } from 'react'; -import { Modal } from '@c-x/ui'; +import { Modal } from '@ctzhian/ui'; import HelpCenter from '@/assets/json/help-center.json'; import Takeoff from '@/assets/json/takeoff.json'; import IconUpgrade from '@/assets/json/upgrade.json'; @@ -22,22 +22,21 @@ const AboutModal = ({ onClose, curVersion, latestVersion, - license + license, }: LicenseModalProps) => { - const [openChangeLicense, setOpenChangeLicense] = useState(false); const editionText = (edition: any) => { if (edition === 0) { - return '开源版' + return '开源版'; } else if (edition === 1) { - return '联创版' + return '联创版'; } else if (edition === 2) { - return '企业版' + return '企业版'; } else { - return '未知' + return '未知'; } - } + }; return ( - + footer={null} + > + - 当前版本 - {curVersion} + + 当前版本 + + + {curVersion} + {latestVersion === `v${curVersion}` ? ( @@ -76,7 +88,7 @@ const AboutModal = ({ } onClick={() => { window.open( - 'https://monkeycode.docs.baizhi.cloud/node/01980d22-db84-73b4-ae13-6a188e318048', + 'https://monkeycode.docs.baizhi.cloud/node/01980d22-db84-73b4-ae13-6a188e318048' ); }} > @@ -86,9 +98,13 @@ const AboutModal = ({ - 产品型号 + + 产品型号 + {editionText(license?.edition)} + updateLicense(); + }} + > + 在线激活 + ); }; -export default ChangeLicense; \ No newline at end of file +export default ChangeLicense; diff --git a/ui/src/components/sidebar/index.tsx b/ui/src/components/sidebar/index.tsx index 1685969c..69140d35 100644 --- a/ui/src/components/sidebar/index.tsx +++ b/ui/src/components/sidebar/index.tsx @@ -1,8 +1,8 @@ import Logo from '@/assets/images/logo.png'; import { alpha, Box, Button, Stack, useTheme, styled } from '@mui/material'; -import { Icon } from '@c-x/ui'; +import { Icon } from '@ctzhian/ui'; import { NavLink, useLocation } from 'react-router-dom'; -import { Modal } from '@c-x/ui'; +import { Modal } from '@ctzhian/ui'; import { useMemo, useState } from 'react'; import Qrcode from '@/assets/images/qrcode.png'; import Version from './version'; @@ -145,7 +145,10 @@ const Sidebar = () => { } return isConfigModel ? ADMIN_MENUS.map((item) => ({ ...item, disabled: false })) - : ADMIN_MENUS.map((item) => ({ ...item, disabled: item.pathname !== 'general-setting' })); + : ADMIN_MENUS.map((item) => ({ + ...item, + disabled: item.pathname !== 'general-setting', + })); }, [pathname, isConfigModel]); return ( diff --git a/ui/src/main.tsx b/ui/src/main.tsx index 0af0a5db..5f966416 100644 --- a/ui/src/main.tsx +++ b/ui/src/main.tsx @@ -6,7 +6,7 @@ import '@/assets/fonts/font.css'; import '@/assets/fonts/iconfont'; import './index.css'; import '@/assets/styles/markdown.css'; -import { ThemeProvider } from '@c-x/ui'; +import { ThemeProvider } from '@ctzhian/ui'; import { zhCN } from 'date-fns/locale/zh-CN'; import { setDefaultOptions } from 'date-fns'; diff --git a/ui/src/pages/auth/index.tsx b/ui/src/pages/auth/index.tsx index ccc68a30..cd18abee 100644 --- a/ui/src/pages/auth/index.tsx +++ b/ui/src/pages/auth/index.tsx @@ -9,13 +9,13 @@ import { Paper, Alert, CircularProgress, - Grid2 as Grid, + Grid, InputAdornment, IconButton, Divider, Stack, } from '@mui/material'; -import { CusTabs, Icon, message } from '@c-x/ui'; +import { CusTabs, Icon, message } from '@ctzhian/ui'; // @ts-ignore import { AestheticFluidBg } from '@/assets/jsm/AestheticFluidBg.module.js'; @@ -354,9 +354,9 @@ const AuthPage = () => { { render(value: number) { return ( - + {dayjs.unix(value).format('YYYY-MM-DD')} - + {dayjs.unix(value).format('HH:mm:ss')} - ) + ); }, }, ]; diff --git a/ui/src/pages/dashboard/components/contributionModal.tsx b/ui/src/pages/dashboard/components/contributionModal.tsx index 33ee8a18..4241f6a8 100644 --- a/ui/src/pages/dashboard/components/contributionModal.tsx +++ b/ui/src/pages/dashboard/components/contributionModal.tsx @@ -1,6 +1,6 @@ import { Box, Stack } from '@mui/material'; import { DomainUserCodeRank } from '@/api/types'; -import { Modal } from '@c-x/ui'; +import { Modal } from '@ctzhian/ui'; import { StyledItem, StyledSerialNumber, StyledText } from './statisticCard'; import User from '@/components/user'; import Avatar from '@/components/avatar'; @@ -49,13 +49,13 @@ const ContributionModal = ({ minWidth: 0, }} > - - {item.username} + + {item.username} diff --git a/ui/src/pages/dashboard/components/globalStatistic.tsx b/ui/src/pages/dashboard/components/globalStatistic.tsx index a325a983..3873b7a5 100644 --- a/ui/src/pages/dashboard/components/globalStatistic.tsx +++ b/ui/src/pages/dashboard/components/globalStatistic.tsx @@ -5,12 +5,8 @@ import { getUserCodeRankDashboard, } from '@/api/Dashboard'; import { SecondTimeRange } from '@/components/ui/calendar'; -import { - getRecent60MinutesData, - getTimeRange, - getRangeData, -} from '@/utils'; -import { Grid2 as Grid, styled } from '@mui/material'; +import { getRecent60MinutesData, getTimeRange, getRangeData } from '@/utils'; +import { Grid, styled } from '@mui/material'; import { useRequest } from 'ahooks'; import { useMemo } from 'react'; import BarCharts from './barCharts'; @@ -73,12 +69,32 @@ const GlobalStatistic = ({ } = timeStatData || {}; const label = { valueLabel: 'value' }; return { - userActiveChartData: getRangeData(timeDuration, active_users, precision, label), + userActiveChartData: getRangeData( + timeDuration, + active_users, + precision, + label + ), chatChartData: getRangeData(timeDuration, chats, precision, label), - codeCompletionChartData: getRangeData(timeDuration, code_completions, precision, label), - codeLineChartData: getRangeData(timeDuration, lines_of_code, precision, label), + codeCompletionChartData: getRangeData( + timeDuration, + code_completions, + precision, + label + ), + codeLineChartData: getRangeData( + timeDuration, + lines_of_code, + precision, + label + ), realTimeTokenChartData: getRecent60MinutesData(real_time_tokens, label), - acceptedPerChartData: getRangeData(timeDuration, accepted_per, precision, label), + acceptedPerChartData: getRangeData( + timeDuration, + accepted_per, + precision, + label + ), }; }, [timeStatData, precision]); diff --git a/ui/src/pages/dashboard/components/memberInfo.tsx b/ui/src/pages/dashboard/components/memberInfo.tsx index 14895a25..ef0cc507 100644 --- a/ui/src/pages/dashboard/components/memberInfo.tsx +++ b/ui/src/pages/dashboard/components/memberInfo.tsx @@ -5,7 +5,7 @@ import { } from '@/api/types'; import Avatar from '@/components/avatar'; import Card from '@/components/card'; -import { Icon } from '@c-x/ui'; +import { Icon } from '@ctzhian/ui'; import { Box, IconButton, diff --git a/ui/src/pages/dashboard/components/memberStatistic.tsx b/ui/src/pages/dashboard/components/memberStatistic.tsx index 7d9faf29..66fb60cf 100644 --- a/ui/src/pages/dashboard/components/memberStatistic.tsx +++ b/ui/src/pages/dashboard/components/memberStatistic.tsx @@ -5,8 +5,13 @@ import { } from '@/api/Dashboard'; import { DomainUser } from '@/api/types'; import { SecondTimeRange } from '@/components/ui/calendar'; -import { getRangeData, getRecent24HoursData, getRecentDaysData, getTimeRange } from '@/utils'; -import { Grid2 as Grid } from '@mui/material'; +import { + getRangeData, + getRecent24HoursData, + getRecentDaysData, + getTimeRange, +} from '@/utils'; +import { Grid } from '@mui/material'; import { useRequest } from 'ahooks'; import { useMemo } from 'react'; import { useParams } from 'react-router-dom'; @@ -85,8 +90,18 @@ const MemberStatistic = ({ precision, label ); - const codeLineChartData = getRangeData(timeDuration, lines_of_code, precision, label); - const acceptedPerChartData = getRangeData(timeDuration, accepted_per, precision, label); + const codeLineChartData = getRangeData( + timeDuration, + lines_of_code, + precision, + label + ); + const acceptedPerChartData = getRangeData( + timeDuration, + accepted_per, + precision, + label + ); return { chatChartData, codeCompletionChartData, diff --git a/ui/src/pages/dashboard/components/statisticCard.tsx b/ui/src/pages/dashboard/components/statisticCard.tsx index 083abff6..82736ff4 100644 --- a/ui/src/pages/dashboard/components/statisticCard.tsx +++ b/ui/src/pages/dashboard/components/statisticCard.tsx @@ -1,4 +1,4 @@ -import { Empty } from '@c-x/ui'; +import { Empty } from '@ctzhian/ui'; import { Box, Stack, styled } from '@mui/material'; import dayjs from 'dayjs'; import { useState } from 'react'; @@ -117,7 +117,7 @@ export const ContributionCard = ({ gap={1.5} sx={{ flex: 1, - minWidth: 0 + minWidth: 0, }} > - {item.username} + + {item.username} diff --git a/ui/src/pages/dashboard/index.tsx b/ui/src/pages/dashboard/index.tsx index 5dfcc85c..03eca605 100644 --- a/ui/src/pages/dashboard/index.tsx +++ b/ui/src/pages/dashboard/index.tsx @@ -1,7 +1,7 @@ import { useEffect, useMemo, useState } from 'react'; import { getListUser } from '@/api/User'; import { Stack, Box } from '@mui/material'; -import { CusTabs } from '@c-x/ui'; +import { CusTabs } from '@ctzhian/ui'; import GlobalStatistic from './components/globalStatistic'; import { useRequest } from 'ahooks'; import MemberStatistic from './components/memberStatistic'; @@ -112,7 +112,7 @@ const Dashboard = () => { }; const handleTimeRangeChange = (value: any) => { if (value) { - console.log(value) + console.log(value); setTimeRange(value); } else { setTimeRange(get24HoursRange()); @@ -136,7 +136,12 @@ const Dashboard = () => { return ( - + { const [webhookOpen, setWebhookOpen] = useState(false); const [webhookUrl, setWebhookUrl] = useState< - Pick | undefined + Pick | undefined >(); const { pathname } = useLocation(); - const isUser = pathname.startsWith("/user/"); + const isUser = pathname.startsWith('/user/'); const { reset, register, @@ -79,7 +79,10 @@ const EmloyeeModal = ({ const handleChange = handleSubmit( async (data) => { const res = await (record - ? (isUser ? putUserAiemployeeUpdate : putAiemployeeUpdate)({ ...data, id: record.id }) + ? (isUser ? putUserAiemployeeUpdate : putAiemployeeUpdate)({ + ...data, + id: record.id, + }) : (isUser ? postUserAiemployeeCreate : postAiemployeeCreate)(data)); onChanged?.(); // 调用回调函数,刷新列表 setWebhookUrl(res); @@ -90,10 +93,10 @@ const EmloyeeModal = ({ } ); const checkitems = [ - { key: "issue_open", label: "自动跟进所有的 Issue" }, - { key: "mr_pr_open", label: "自动跟进所有的 Merge/Pull Request" }, - { key: "issue_at_comment", label: "允许在 Issue 中被 @" }, - { key: "mr_pr_at_comment", label: "允许在 Merge/Pull Request 中被 @" }, + { key: 'issue_open', label: '自动跟进所有的 Issue' }, + { key: 'mr_pr_open', label: '自动跟进所有的 Merge/Pull Request' }, + { key: 'issue_at_comment', label: '允许在 Issue 中被 @' }, + { key: 'mr_pr_at_comment', label: '允许在 Merge/Pull Request 中被 @' }, ] as const; useEffect(() => { if (open) reset(record || formSchema.parse({})); @@ -105,36 +108,36 @@ const EmloyeeModal = ({ return ( <> setOpenWebhook(true)} onOk={handleChange} onCancel={onClose} - okText={record ? "更新" : "创建"} - cancelText="取消" + okText={record ? '更新' : '创建'} + cancelText='取消' > - + - + AI 员工角色 ( - + Git 托管平台 ( {webhookUrl?.webhook_secret && ( .MuiStack-root > div:nth-child(2)": { + fontSize: '14px', + '& > .MuiStack-root > div:nth-child(2)': { fontWeight: 600, - bgcolor: "background.paper", + bgcolor: 'background.paper', px: 1, py: 0.5, - borderRadius: "4px", + borderRadius: '4px', }, }} > - - Webhook URL: + + Webhook URL: {webhookUrl?.webhook_url} { - message.success("复制成功"); + message.success('复制成功'); }} > - - - Webhook Secret:{" "} + + + Webhook Secret:{' '} {webhookUrl?.webhook_secret} { - message.success("复制成功"); + message.success('复制成功'); }} > diff --git a/ui/src/pages/employee/index.tsx b/ui/src/pages/employee/index.tsx index 6e266402..5ed0b6b7 100644 --- a/ui/src/pages/employee/index.tsx +++ b/ui/src/pages/employee/index.tsx @@ -1,29 +1,29 @@ -import { Ellipsis, Icon, message, Modal, Table } from "@c-x/ui"; -import { useEffect, useState } from "react"; +import { Ellipsis, Icon, message, Modal, Table } from '@ctzhian/ui'; +import { useEffect, useState } from 'react'; -import Card from "@/components/card"; -import { Box, Button, Stack } from "@mui/material"; +import Card from '@/components/card'; +import { Box, Button, Stack } from '@mui/material'; -import { deleteAiemployeeDelete, getAiemployeeList } from "@/api/AiEmployee"; +import { deleteAiemployeeDelete, getAiemployeeList } from '@/api/AiEmployee'; import { deleteUserAiemployeeDelete, getUserAiemployeeList, -} from "@/api/UserAiEmployee"; +} from '@/api/UserAiEmployee'; import { ConstsRepoPlatform, DomainAIEmployee, DomainUpdateAIEmployeeReq, -} from "@/api/types"; -import { ColumnsType } from "@c-x/ui/dist/Table"; -import dayjs from "dayjs"; -import EmloyeeModal from "./emloyeeModal"; -import { useLocation } from "react-router-dom"; +} from '@/api/types'; +import { ColumnsType } from '@ctzhian/ui/dist/Table'; +import dayjs from 'dayjs'; +import EmloyeeModal from './emloyeeModal'; +import { useLocation } from 'react-router-dom'; const gitPlatformIcons = { - [ConstsRepoPlatform.RepoPlatformGitHub]: "icon-github", - [ConstsRepoPlatform.RepoPlatformGitLab]: "icon-gitlab", - [ConstsRepoPlatform.RepoPlatformGitee]: "icon-gitee", - [ConstsRepoPlatform.RepoPlatformGitea]: "icon-gitea", + [ConstsRepoPlatform.RepoPlatformGitHub]: 'icon-github', + [ConstsRepoPlatform.RepoPlatformGitLab]: 'icon-gitlab', + [ConstsRepoPlatform.RepoPlatformGitee]: 'icon-gitee', + [ConstsRepoPlatform.RepoPlatformGitea]: 'icon-gitea', } as const; const EmployeeTaskList = () => { const [page, setPage] = useState(1); @@ -33,7 +33,7 @@ const EmployeeTaskList = () => { const [dataSource, setDataSource] = useState([]); const [detail, setDetail] = useState(); const { pathname } = useLocation(); - const isUser = pathname.startsWith("/user/"); + const isUser = pathname.startsWith('/user/'); const [open, setOpen] = useState(false); const onClose = () => { setOpen(false); @@ -71,17 +71,17 @@ const EmployeeTaskList = () => { }; const handleDelete = (record: DomainAIEmployee) => { Modal.confirm({ - title: "提示", - okText: "删除", + title: '提示', + okText: '删除', okButtonProps: { - color: "error", + color: 'error', }, content: ( <> - 确定要删除 AI 员工{" "} - + 确定要删除 AI 员工{' '} + {record!.name} - {" "} + {' '} 吗? ), @@ -89,7 +89,7 @@ const EmployeeTaskList = () => { (isUser ? deleteUserAiemployeeDelete : deleteAiemployeeDelete)({ id: record.id!, }).then(() => { - message.success("删除成功"); + message.success('删除成功'); fetchData({}); }); }, @@ -97,22 +97,22 @@ const EmployeeTaskList = () => { }; const columns: ColumnsType = [ { - dataIndex: "name", - title: "AI 员工", + dataIndex: 'name', + title: 'AI 员工', width: 240, render: (name, record) => { return ( - - + + {record?.name} @@ -120,17 +120,17 @@ const EmployeeTaskList = () => { {record?.position} @@ -141,36 +141,36 @@ const EmployeeTaskList = () => { }, }, { - title: "工作项目", - dataIndex: "platform", + title: '工作项目', + dataIndex: 'platform', width: 300, render: (platform, record) => { return ( - - + + {record?.repository_url - ? record?.repository_url.split("/").pop() + ? record?.repository_url.split('/').pop() : record?.platform} {record?.repository_url} @@ -180,27 +180,27 @@ const EmployeeTaskList = () => { }, }, { - title: "创建者", - dataIndex: "creater", + title: '创建者', + dataIndex: 'creater', render: (creater, record) => { return ( - + {record?.admin?.username} {dayjs(Number(record?.created_at) * 1000).fromNow()}创建 @@ -210,27 +210,27 @@ const EmployeeTaskList = () => { }, }, { - title: "工作状态", - dataIndex: "status", + title: '工作状态', + dataIndex: 'status', render: (status, record) => { return ( - + 共完成 {record?.completed_count || 0} 个任务 {dayjs(Number(record?.last_active_at) * 1000).fromNow()}活跃 @@ -240,17 +240,17 @@ const EmployeeTaskList = () => { }, }, { - title: "操作", - dataIndex: "opt", + title: '操作', + dataIndex: 'opt', render: (status, record) => { return ( - -
{ loading={loading} columns={columns} dataSource={dataSource} - rowKey="id" + rowKey='id' pagination={{ page, pageSize: size, diff --git a/ui/src/pages/generalSetting/components/adminLoginHistory.tsx b/ui/src/pages/generalSetting/components/adminLoginHistory.tsx index 519014aa..9309d387 100644 --- a/ui/src/pages/generalSetting/components/adminLoginHistory.tsx +++ b/ui/src/pages/generalSetting/components/adminLoginHistory.tsx @@ -1,10 +1,10 @@ import Card from '@/components/card'; import { Stack, Box } from '@mui/material'; -import { Table } from '@c-x/ui'; +import { Table } from '@ctzhian/ui'; import dayjs from 'dayjs'; import { useRequest } from 'ahooks'; import { getAdminLoginHistory } from '@/api/Admin'; -import { ColumnsType } from '@c-x/ui/dist/Table'; +import { ColumnsType } from '@ctzhian/ui/dist/Table'; import { DomainListAdminLoginHistoryResp } from '@/api/types'; import User from '@/components/user'; @@ -13,7 +13,9 @@ type LoginHistory = NonNullable< >[number]; const AdminLoginHistory = () => { - const { data, loading } = useRequest(() => getAdminLoginHistory({page: 1, size: 50})); + const { data, loading } = useRequest(() => + getAdminLoginHistory({ page: 1, size: 50 }) + ); const columns: ColumnsType = [ { title: '账号', @@ -30,7 +32,9 @@ const AdminLoginHistory = () => { {record?.ip_info?.ip} - {record?.ip_info?.country === '中国' ? ('' + record?.ip_info?.province + '-' + record?.ip_info?.city) : (record?.ip_info?.country || '未知')} + {record?.ip_info?.country === '中国' + ? '' + record?.ip_info?.province + '-' + record?.ip_info?.city + : record?.ip_info?.country || '未知'} ); @@ -45,7 +49,7 @@ const AdminLoginHistory = () => { {dayjs.unix(text).format('YYYY-MM-DD')} {dayjs.unix(text).format('HH:mm:ss')} - ) + ); }, }, ]; @@ -55,23 +59,27 @@ const AdminLoginHistory = () => { direction='row' justifyContent='space-between' alignItems='center' - sx={{ + sx={{ mb: 2, height: 32, fontWeight: 'bold', - }} + }} > - 管理员登录记录 + + 管理员登录记录 +
普通管理员 {errors.roleId && ( - + {errors.roleId?.message as string} )} @@ -186,17 +193,19 @@ const AdminUser = () => { const [open, setOpen] = useState(false); const { data, loading, refresh } = useRequest(() => getListAdminUser({})); const { data: currentAdmin } = useRequest(() => getAdminProfile({})); - + const handleRoleChange = (adminId: string, newRoleId: number) => { postGrantRole({ admin_id: adminId, role_ids: [newRoleId], - }).then(() => { - message.success('角色更新成功'); - refresh(); - }).catch(() => { - message.error('角色更新失败'); - }); + }) + .then(() => { + message.success('角色更新成功'); + refresh(); + }) + .catch(() => { + message.error('角色更新失败'); + }); }; const onDeleteAdmin = (data: DomainAdminUser) => { @@ -240,40 +249,42 @@ const AdminUser = () => { u.id)} - label='成员' - size='small' - onClose={() => setMemberSearchText('')} - onOpen={() => { - setTimeout(() => { - memberInputRef.current?.focus(); - }, 100); - }} - MenuProps={{ - autoFocus: false, - }} - renderValue={(selectedIds: string[]) => { - if (!Array.isArray(selectedIds)) return null; - const selectedUsers = (userData.data?.users || []).filter((user: DomainUser) => - user.id && selectedIds.includes(user.id) - ); - return selectedUsers.map((u: DomainUser) => ( - - )); - }} - onChange={(event: SelectChangeEvent) => { - console.log(event.target) - // 获取当前分组的成员ID列表 - const currentUserIds = (users || []).map((user: DomainUser) => user.id!); - // 获取选择的成员ID列表 - const selectedUserIds = event.target.value as string[]; - - // 计算新增的成员ID - const addedUserIds = selectedUserIds.filter(id => !currentUserIds.includes(id)); - // 计算移除的成员ID - const removedUserIds = currentUserIds.filter((id: string) => !selectedUserIds.includes(id)); - - // 调用API添加成员 - if (addedUserIds.length > 0) { - postAddUserToGroup({ - user_ids: addedUserIds, - group_ids: [record.id!] - }).then(() => { - message.success('成员添加成功'); - groupData.refresh(); - }).catch(() => { - message.error('成员添加失败'); - }); - } - - // 调用API移除成员 - if (removedUserIds.length > 0) { - deleteRemoveUserFromGroup({ - user_ids: removedUserIds, - group_id: record.id! - }).then(() => { - message.success('成员移除成功'); - groupData.refresh(); - }).catch(() => { - message.error('成员移除失败'); - }); - } - setMemberSearchText(''); - }} - > - e.stopPropagation()} - onClick={(e) => e.stopPropagation()} - onMouseDown={(e) => e.stopPropagation()} - sx={{ p: 1, position: 'sticky', top: -8, zIndex: 1, backgroundColor: 'background.paper' }} + return ( + + 成员 + - ; + e.stopPropagation()} + onClick={(e) => e.stopPropagation()} + onMouseDown={(e) => e.stopPropagation()} + sx={{ + p: 1, + position: 'sticky', + top: -8, + zIndex: 1, + backgroundColor: 'background.paper', + }} + > + setMemberSearchText(e.target.value)} + /> + + {filteredSelectUsers?.map((user) => ( + + {users.some((u: DomainUser) => { + return u.id === user.id; + }) ? ( + <> + {user.username} + + + ) : ( + <>{user.username} + )} + + ))} + + + ); }, }, { title: '管理员', dataIndex: 'admins', render: (admins, record) => { - return - 管理员 - u.id)} + label='管理员' + size='small' + onClose={() => setAdminSearchText('')} + onOpen={() => { + setTimeout(() => { + adminInputRef.current?.focus(); + }, 100); + }} + MenuProps={{ + autoFocus: false, + }} + renderValue={(selectedIds: string[]) => { + if (!Array.isArray(selectedIds)) return null; + const selectedAdmins = (adminData.data?.users || []).filter( + (user: DomainAdminUser) => + user.id && selectedIds.includes(user.id) + ); + return selectedAdmins.map((u: DomainAdminUser) => ( + + )); + }} + onChange={(event: SelectChangeEvent) => { + console.log(event.target); + // 获取当前分组的管理员ID列表 + const currentAdminIds = (admins || []).map( + (user: DomainAdminUser) => user.id! + ); + // 获取选择的管理员ID列表 + const selectedAdminIds = event.target.value as string[]; + + // 计算新增的管理员ID + const addedAdminIds = selectedAdminIds.filter( + (id) => !currentAdminIds.includes(id) + ); + // 计算移除的管理员ID + const removedAdminIds = currentAdminIds.filter( + (id: string) => !selectedAdminIds.includes(id) + ); + + // 调用API添加管理员 + if (addedAdminIds.length > 0) { + postGrantGroup({ + admin_ids: addedAdminIds, + group_ids: [record.id!], + }) + .then(() => { + message.success('管理员添加成功'); + groupData.refresh(); + }) + .catch(() => { + message.error('管理员添加失败'); + }); + } + + // 调用API移除管理员 + if (removedAdminIds.length > 0) { + deleteRemoveAdminFromGroup({ + admin_ids: removedAdminIds, + group_id: record.id!, + }) + .then(() => { + message.success('管理员移除成功'); + groupData.refresh(); + }) + .catch(() => { + message.error('管理员移除失败'); + }); + } + setAdminSearchText(''); + }} > - setAdminSearchText(e.target.value)} - /> - - {filteredSelectAdmins?.map((user) => ( - - {(admins.some((u: DomainAdminUser) => { - return u.id === user.id - })) ? <> - {user.username} - : <> - {user.username} - } - ) - )} - - ; + e.stopPropagation()} + onClick={(e) => e.stopPropagation()} + onMouseDown={(e) => e.stopPropagation()} + sx={{ + p: 1, + position: 'sticky', + top: -8, + zIndex: 1, + backgroundColor: 'background.paper', + }} + > + setAdminSearchText(e.target.value)} + /> + + {filteredSelectAdmins?.map((user) => ( + + {admins.some((u: DomainAdminUser) => { + return u.id === user.id; + }) ? ( + <> + {user.username} + + + ) : ( + <>{user.username} + )} + + ))} + + + ); }, }, { @@ -335,9 +403,7 @@ const GroupList = () => { return ( - - 修改成员组名称 - + 修改成员组名称 删除成员组 @@ -351,13 +417,21 @@ const GroupList = () => { > 成员组 - setSearchUser(e.target.value)} /> + setSearchUser(e.target.value)} + /> + disabled={ + license?.edition !== DomainLicenseEdition.LicenseEditionEnterprise + } + > + 创建成员组 +
{ color='info' sx={{ gap: 2 }} onClick={() => setThirdPartyLoginSettingModalOpen(true)} - disabled={license?.edition !== DomainLicenseEdition.LicenseEditionEnterprise} + disabled={ + license?.edition !== + DomainLicenseEdition.LicenseEditionEnterprise + } > 配置 diff --git a/ui/src/pages/memberManage/inviteUserModal.tsx b/ui/src/pages/memberManage/inviteUserModal.tsx index 669fd14c..1e70fbb6 100644 --- a/ui/src/pages/memberManage/inviteUserModal.tsx +++ b/ui/src/pages/memberManage/inviteUserModal.tsx @@ -1,5 +1,5 @@ import React, { useState, useEffect } from 'react'; -import { Modal, message, Loading } from '@c-x/ui'; +import { Modal, message, Loading } from '@ctzhian/ui'; import { Box, Typography, IconButton, Paper } from '@mui/material'; import ContentCopyIcon from '@mui/icons-material/ContentCopy'; import { CopyToClipboard } from 'react-copy-to-clipboard'; diff --git a/ui/src/pages/memberManage/loginHistory.tsx b/ui/src/pages/memberManage/loginHistory.tsx index 887c8217..8add5cdc 100644 --- a/ui/src/pages/memberManage/loginHistory.tsx +++ b/ui/src/pages/memberManage/loginHistory.tsx @@ -2,9 +2,9 @@ import Card from '@/components/card'; import { Stack, Box } from '@mui/material'; import { useRequest } from 'ahooks'; import { getLoginHistory } from '@/api/User'; -import { Table } from '@c-x/ui'; +import { Table } from '@ctzhian/ui'; import dayjs from 'dayjs'; -import { ColumnsType } from '@c-x/ui/dist/Table'; +import { ColumnsType } from '@ctzhian/ui/dist/Table'; import { DomainListLoginHistoryResp } from '@/api/types'; import User from '@/components/user'; @@ -20,7 +20,13 @@ const LoginHistory = () => { dataIndex: 'user', render: (user, record) => { return ( - + { render: (ip, record) => { return ( - + {record?.device} - + {record?.hostname} @@ -54,10 +73,23 @@ const LoginHistory = () => { render: (ip, record) => { return ( - + {record?.client_id} - + {record?.client_version} @@ -70,11 +102,26 @@ const LoginHistory = () => { render: (ip, record) => { return ( - + {record?.ip_info?.ip} - - {record?.ip_info?.country === '中国' ? ('' + record?.ip_info?.province + '-' + record?.ip_info?.city) : (record?.ip_info?.country || '未知')} + + {record?.ip_info?.country === '中国' + ? '' + record?.ip_info?.province + '-' + record?.ip_info?.city + : record?.ip_info?.country || '未知'} ); @@ -86,14 +133,26 @@ const LoginHistory = () => { render: (text) => { return ( - + {dayjs.unix(text).format('YYYY-MM-DD')} - + {dayjs.unix(text).format('HH:mm:ss')} - ) + ); }, }, ]; diff --git a/ui/src/pages/memberManage/memberManage.tsx b/ui/src/pages/memberManage/memberManage.tsx index 980bb904..2f87c81f 100644 --- a/ui/src/pages/memberManage/memberManage.tsx +++ b/ui/src/pages/memberManage/memberManage.tsx @@ -17,9 +17,9 @@ import { MenuItem, Typography, } from '@mui/material'; -import { Table, MenuSelect, Modal, message } from '@c-x/ui'; +import { Table, MenuSelect, Modal, message } from '@ctzhian/ui'; import InviteUserModal from './inviteUserModal'; -import { ColumnsType } from '@c-x/ui/dist/Table'; +import { ColumnsType } from '@ctzhian/ui/dist/Table'; import { ConstsUserStatus, DomainUser } from '@/api/types'; import dayjs from 'dayjs'; import { CopyToClipboard } from 'react-copy-to-clipboard'; @@ -150,22 +150,28 @@ const MemberManage = () => { const [open, setOpen] = useState(false); const [resetPasswordOpen, setResetPasswordOpen] = useState(false); const [currentUser, setCurrentUser] = useState(null); - const { data: originData, loading, refresh } = useRequest(() => getListUser({page: 1, size: 999})); + const { + data: originData, + loading, + refresh, + } = useRequest(() => getListUser({ page: 1, size: 999 })); const [anchorEl, setAnchorEl] = useState(null); const [searchUser, setSearchUser] = useState(''); const [data, setData] = useState([]); - useEffect(()=>{ - if(searchUser){ - setData(originData?.users?.filter((item) => { - const searchTerm = searchUser.toLowerCase(); - const username = (item.username || '').toLowerCase(); - const email = (item.email || '').toLowerCase(); - return username.includes(searchTerm) || email.includes(searchTerm); - }) || []); - }else { + useEffect(() => { + if (searchUser) { + setData( + originData?.users?.filter((item) => { + const searchTerm = searchUser.toLowerCase(); + const username = (item.username || '').toLowerCase(); + const email = (item.email || '').toLowerCase(); + return username.includes(searchTerm) || email.includes(searchTerm); + }) || [] + ); + } else { setData(originData?.users || []); } - },[searchUser, originData]) + }, [searchUser, originData]); const handleClick = ( event: React.MouseEvent, record: DomainUser @@ -344,7 +350,11 @@ const MemberManage = () => { > 成员列表 - setSearchUser(e.target.value)} /> + setSearchUser(e.target.value)} + />