From e9d8828dcd3a02b273f39161de1fe440bc189ad0 Mon Sep 17 00:00:00 2001 From: jialin Date: Thu, 4 Jul 2024 17:40:04 +0800 Subject: [PATCH] fix: dashboard re-render --- config/config.ts | 2 +- package.json | 1 - pnpm-lock.yaml | 678 +----------------- public/static/favicon.ico | Bin 4286 -> 0 bytes public/static/favicon.png | Bin 0 -> 3109 bytes src/components/charts/area.tsx | 94 --- src/components/charts/column-bar.tsx | 113 --- src/components/charts/config/index.ts | 8 - src/components/charts/gauge.tsx | 67 -- src/components/charts/h-bar.tsx | 111 --- src/components/charts/line-chart.tsx | 92 --- src/components/charts/liquid.tsx | 79 -- src/components/charts/pie-chart.tsx | 37 - src/components/echarts/bar-chart.tsx | 4 +- src/components/echarts/config.ts | 1 - src/components/echarts/h-bar.tsx | 5 +- src/components/seal-form/input-number.tsx | 3 +- src/global.less | 6 + src/hooks/use-window-resize.ts | 19 +- src/layouts/Logo.tsx | 2 +- src/locales/en-US/dashboard.ts | 2 +- src/locales/en-US/users.ts | 2 +- src/locales/zh-CN/users.ts | 2 +- src/pages/api-keys/index.tsx | 3 +- .../dashboard/components/dahboard-inner.tsx | 39 + src/pages/dashboard/components/over-view.tsx | 2 +- .../components/resource-utilization.tsx | 22 +- .../usage-inner/request-token-inner.tsx | 52 ++ .../components/usage-inner/top-user.tsx | 27 + src/pages/dashboard/components/usage.tsx | 105 +-- .../dashboard/config/dashboard-context.ts | 6 +- src/pages/dashboard/index.tsx | 34 +- src/pages/llmodels/components/add-modal.tsx | 6 +- src/pages/llmodels/config/index.ts | 3 +- src/pages/llmodels/index.tsx | 9 +- src/pages/login/components/login-form.tsx | 26 +- .../playground/components/chat-footer.tsx | 1 - .../playground/components/ground-left.tsx | 2 +- src/pages/resources/components/gpus.tsx | 3 +- src/pages/resources/components/workers.tsx | 3 +- src/pages/users/index.tsx | 3 +- src/utils/index.ts | 8 +- 42 files changed, 240 insertions(+), 1442 deletions(-) delete mode 100644 public/static/favicon.ico create mode 100644 public/static/favicon.png delete mode 100644 src/components/charts/area.tsx delete mode 100644 src/components/charts/column-bar.tsx delete mode 100644 src/components/charts/config/index.ts delete mode 100644 src/components/charts/gauge.tsx delete mode 100644 src/components/charts/h-bar.tsx delete mode 100644 src/components/charts/line-chart.tsx delete mode 100644 src/components/charts/liquid.tsx delete mode 100644 src/components/charts/pie-chart.tsx create mode 100644 src/pages/dashboard/components/dahboard-inner.tsx create mode 100644 src/pages/dashboard/components/usage-inner/request-token-inner.tsx create mode 100644 src/pages/dashboard/components/usage-inner/top-user.tsx diff --git a/config/config.ts b/config/config.ts index da064e99..b2b4d00c 100644 --- a/config/config.ts +++ b/config/config.ts @@ -68,7 +68,7 @@ export default defineConfig({ : {}), // esbuildMinifyIIFE: true, - favicons: ['/static/favicon.ico'], + favicons: ['/static/favicon.png'], jsMinifier: 'terser', cssMinifier: 'cssnano', presets: ['umi-presets-pro'], diff --git a/package.json b/package.json index a5d3a95b..6d90098c 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ }, "dependencies": { "@ant-design/icons": "^5.3.7", - "@ant-design/plots": "^2.2.2", "@ant-design/pro-components": "^2.7.1", "@huggingface/hub": "^0.15.1", "@monaco-editor/react": "^4.6.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28feedd4..fc409fb2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,6 @@ dependencies: '@ant-design/icons': specifier: ^5.3.7 version: 5.3.7(react-dom@18.3.1)(react@18.3.1) - '@ant-design/plots': - specifier: ^2.2.2 - version: 2.2.2(lodash-es@4.17.21)(react-dom@18.3.1)(react@18.3.1) '@ant-design/pro-components': specifier: ^2.7.1 version: 2.7.1(antd@5.18.3)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1) @@ -226,16 +223,6 @@ packages: resolution: {integrity: sha512-0vr5GCwM7xlAl6NxG1lPbABO+SYioNJL3HVy2FA8wTlsIMoZvQwcwsxTw6eLQCiN9V2UQ8kBtfz8DW8utVVE5w==} dev: false - /@ant-design/charts-util@0.0.1-alpha.5(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-EwTUjRPhU2CUyI2e11pAi9aOQg9oEWdFEWxv1f4j+Ta4doYXd1yTl94Zy9JvigiEj4qv8dPGl0PUd3r+qMVrAg==} - peerDependencies: - react: '>=16.8.4' - react-dom: '>=16.8.4' - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@ant-design/colors@6.0.0: resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} dependencies: @@ -323,23 +310,6 @@ packages: resolution: {integrity: sha512-MLm1FUpg02fP615ShQnCUN9la2E4RylDxKyolkGqAWTIHO4HyGM0A5x71AMALEyP/bC+UEEWBGSQ+D4/8hQ+ww==} dev: false - /@ant-design/plots@2.2.2(lodash-es@4.17.21)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-yewzzVpFaAeeP0Twri7+YcKjNBnh3O5WfmGl6UxqeCVc2MWoazew0mN12+ToSceUi/0n6BbB+Lw5345l1EnKbw==} - peerDependencies: - lodash-es: ^4.17.21 - react: '>=16.8.4' - react-dom: '>=16.8.4' - dependencies: - '@ant-design/charts-util': 0.0.1-alpha.5(react-dom@18.3.1)(react@18.3.1) - '@antv/event-emitter': 0.1.3 - '@antv/g': 6.0.5 - '@antv/g2': 5.1.20 - '@antv/g2-extension-plot': 0.2.0 - lodash-es: 4.17.21 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@ant-design/pro-card@2.6.1(antd@4.24.16)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-LiZwTUFHNU8t7bJsp51DnSmuct2uY2WHxl+dMcWCpsW2V6KRPws4raGo96SDMPfGjwbF0YrMZhR9yO7qmI5nag==} peerDependencies: @@ -889,226 +859,6 @@ packages: resolution: {integrity: sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==} dev: false - /@antv/component@2.0.1: - resolution: {integrity: sha512-VldsSv2O/JNjZYenFIzmtLeC+KD2RcpNARsCLKpi04Iz26joQ3uMtnwxM5W4bd/SCJYKp+eeQeMHMAbwaNR1pw==} - dependencies: - '@antv/g': 6.0.5 - '@antv/scale': 0.4.16 - '@antv/util': 3.3.7 - svg-path-parser: 1.1.0 - dev: false - - /@antv/coord@0.4.7: - resolution: {integrity: sha512-UTbrMLhwJUkKzqJx5KFnSRpU3BqrdLORJbwUbHK2zHSCT3q3bjcFA//ZYLVfIlwqFDXp/hzfMyRtp0c77A9ZVA==} - dependencies: - '@antv/scale': 0.4.16 - '@antv/util': 2.0.17 - gl-matrix: 3.4.3 - dev: false - - /@antv/event-emitter@0.1.3: - resolution: {integrity: sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg==} - dev: false - - /@antv/g-camera-api@2.0.4: - resolution: {integrity: sha512-cYDfiluVwSbfXp6KTcBTpagVDenSloqZnWoIUv6sYkRyyf4hKZRSRE/oFyMQv6FyzdONiyowe8VU7sbmV8ePeQ==} - dependencies: - '@antv/g-lite': 2.0.4 - '@antv/util': 3.3.7 - gl-matrix: 3.4.3 - tslib: 2.6.2 - dev: false - - /@antv/g-canvas@2.0.4: - resolution: {integrity: sha512-DA1Ru1sASV4eJIIL17+Thn6da6omPNcSZ4Lyl3ZgakRpXsXhIC6dzMT+loBgD5OUS6vqRNoRqqJI6htgGkI2ew==} - dependencies: - '@antv/g-lite': 2.0.4 - '@antv/g-plugin-canvas-path-generator': 2.0.4 - '@antv/g-plugin-canvas-picker': 2.0.4 - '@antv/g-plugin-canvas-renderer': 2.0.4 - '@antv/g-plugin-dom-interaction': 2.0.4 - '@antv/g-plugin-html-renderer': 2.0.4 - '@antv/g-plugin-image-loader': 2.0.4 - '@antv/util': 3.3.7 - tslib: 2.6.2 - dev: false - - /@antv/g-dom-mutation-observer-api@2.0.4: - resolution: {integrity: sha512-UuDA8jagEvjvSLfF6YdGt2YacAaz9N5XXcnaGyikfvvCcayga5J2BNB1WJwVDrMccrvvXEr7i6PmcZ7X9qXUzg==} - dependencies: - '@antv/g-lite': 2.0.4 - dev: false - - /@antv/g-lite@2.0.4: - resolution: {integrity: sha512-2X8b0E5JtdoSk+ixdBp7scZ0rpkN4hbtlsQpAVn3O41O90mOAOkHQ0jD4arL66WVb0UqBo87kTBoMP1I9N+jzg==} - dependencies: - '@antv/g-math': 3.0.0 - '@antv/util': 3.3.7 - d3-color: 1.4.1 - eventemitter3: 5.0.1 - gl-matrix: 3.4.3 - rbush: 3.0.1 - tslib: 2.6.2 - dev: false - - /@antv/g-math@3.0.0: - resolution: {integrity: sha512-AkmiNIEL1vgqTPeGY2wtsMdBBqKFwF7SKSgs+D1iOS/rqYMsXdhp/HvtuQ5tx/HdawE/ZzTiicIYopc520ADZw==} - dependencies: - '@antv/util': 3.3.7 - gl-matrix: 3.4.3 - tslib: 2.6.2 - dev: false - - /@antv/g-plugin-canvas-path-generator@2.0.4: - resolution: {integrity: sha512-hiGQphLKnjyRC2tioS9txoDbm6m+JcKeQCZacucoX3Sw3gW1C921OoeUHQr9XznbxPU9/+k5lBNnEHrD0ZAoWg==} - dependencies: - '@antv/g-lite': 2.0.4 - '@antv/g-math': 3.0.0 - '@antv/util': 3.3.7 - tslib: 2.6.2 - dev: false - - /@antv/g-plugin-canvas-picker@2.0.4: - resolution: {integrity: sha512-uAfN2co/peMm6TSYccPDs2obw+hw9c93sPBFhHTlHO+qBqnXRnchTWHSJosepZNLo4eRbgIO5C/KNSQZQg+nBg==} - dependencies: - '@antv/g-lite': 2.0.4 - '@antv/g-math': 3.0.0 - '@antv/g-plugin-canvas-path-generator': 2.0.4 - '@antv/g-plugin-canvas-renderer': 2.0.4 - '@antv/util': 3.3.7 - gl-matrix: 3.4.3 - tslib: 2.6.2 - dev: false - - /@antv/g-plugin-canvas-renderer@2.0.4: - resolution: {integrity: sha512-2Hqwmmttp1HPV/VwuwaXMjvD2FPaHaVGqAQ6FJF7dLllTBJCpTZAgm8mpXfnP0USa394KILs3f5fY7K53kpfAw==} - dependencies: - '@antv/g-lite': 2.0.4 - '@antv/g-math': 3.0.0 - '@antv/g-plugin-canvas-path-generator': 2.0.4 - '@antv/g-plugin-image-loader': 2.0.4 - '@antv/util': 3.3.7 - gl-matrix: 3.4.3 - tslib: 2.6.2 - dev: false - - /@antv/g-plugin-dom-interaction@2.0.4: - resolution: {integrity: sha512-3FE8vYj5u6NCvt1N6QCLHXBQUwCiKSopZUZFlWjVA7wadOyUwPHZv70gmRY1cbpEnkOVVfyyrQ9wNOr5A0qmSA==} - dependencies: - '@antv/g-lite': 2.0.4 - tslib: 2.6.2 - dev: false - - /@antv/g-plugin-dragndrop@2.0.4: - resolution: {integrity: sha512-iEvUtAXCb492wjIrOg6xI7dS9qWWeIXuFzkruRu1Q5UCfyC7p5JlBXCiaGpODwCAkSd19aPu7zQPBO4MiRYC4Q==} - dependencies: - '@antv/g-lite': 2.0.4 - '@antv/util': 3.3.7 - tslib: 2.6.2 - dev: false - - /@antv/g-plugin-html-renderer@2.0.4: - resolution: {integrity: sha512-KS1AT/TNOCMaNttWvfam8X5JC7LePYX5+OFp773Qpfo9tESEmZe+ooiXWhNaV8susaww3DwsW4kvETB1SBr5Rw==} - dependencies: - '@antv/g-lite': 2.0.4 - '@antv/util': 3.3.7 - gl-matrix: 3.4.3 - tslib: 2.6.2 - dev: false - - /@antv/g-plugin-image-loader@2.0.4: - resolution: {integrity: sha512-maWyUhywmpPfcV2ra+iLSNUu82UEULQrRYoRAvrT4BF6XAV1VQ+Sow/uW2OS0GAtcntnXobkxyGhMylMBzfaog==} - dependencies: - '@antv/g-lite': 2.0.4 - '@antv/util': 3.3.7 - gl-matrix: 3.4.3 - tslib: 2.6.2 - dev: false - - /@antv/g-web-animations-api@2.0.5: - resolution: {integrity: sha512-J05EABt1kg1DxFU1eNDlkPX6HhQ1oauHVh8o5/xRqAyqmK2dGOzYJNftsaaY7vmyrRBxRALHheclDj8kaXKlhg==} - dependencies: - '@antv/g-lite': 2.0.4 - '@antv/util': 3.3.7 - tslib: 2.6.2 - dev: false - - /@antv/g2-extension-plot@0.2.0: - resolution: {integrity: sha512-XeJquOmZw3dHTj2qRNZJZlkX5qDrGJDMhuknHHMgGsj1PoPc8sOWzACesWVHB9tmHJqwheySWmwf4KLxtUBZ9w==} - dependencies: - '@antv/g2': 5.1.20 - '@antv/util': 3.3.7 - d3-array: 3.2.4 - d3-hierarchy: 3.1.2 - dev: false - - /@antv/g2@5.1.20: - resolution: {integrity: sha512-MKenSYtxVd68q/i/lV4pz8vpUc/yhiCIJRZclWUrGyP01RD+jaO6BVQhASdTYwz34HwQACXjt2K8tBqpYHb1Ew==} - dependencies: - '@antv/component': 2.0.1 - '@antv/coord': 0.4.7 - '@antv/event-emitter': 0.1.3 - '@antv/g': 6.0.5 - '@antv/g-canvas': 2.0.4 - '@antv/g-plugin-dragndrop': 2.0.4 - '@antv/path-util': 3.0.1 - '@antv/scale': 0.4.16 - '@antv/util': 3.3.7 - d3-array: 3.2.4 - d3-dsv: 3.0.1 - d3-force: 3.0.0 - d3-format: 3.1.0 - d3-geo: 3.1.1 - d3-hierarchy: 3.1.2 - d3-path: 3.1.0 - d3-scale-chromatic: 3.1.0 - d3-shape: 3.2.0 - d3-voronoi: 1.1.4 - flru: 1.0.2 - fmin: 0.0.2 - pdfast: 0.2.0 - dev: false - - /@antv/g@6.0.5: - resolution: {integrity: sha512-qj9gszJH+or/sQvf6xCxwUAqJbaqKY1ZOm7OX1csyxGqRqmjn8uhMVCBJxoknOvlhWvMtqXBWDCcTdNs7IJBIQ==} - dependencies: - '@antv/g-camera-api': 2.0.4 - '@antv/g-dom-mutation-observer-api': 2.0.4 - '@antv/g-lite': 2.0.4 - '@antv/g-web-animations-api': 2.0.5 - dev: false - - /@antv/path-util@3.0.1: - resolution: {integrity: sha512-tpvAzMpF9Qm6ik2YSMqICNU5tco5POOW7S4XoxZAI/B0L26adU+Md/SmO0BBo2SpuywKvzPH3hPT3xmoyhr04Q==} - dependencies: - gl-matrix: 3.4.3 - lodash-es: 4.17.21 - tslib: 2.6.2 - dev: false - - /@antv/scale@0.4.16: - resolution: {integrity: sha512-5wg/zB5kXHxpTV5OYwJD3ja6R8yTiqIOkjOhmpEJiowkzRlbEC/BOyMvNUq5fqFIHnMCE9woO7+c3zxEQCKPjw==} - dependencies: - '@antv/util': 3.3.7 - color-string: 1.9.1 - fecha: 4.2.3 - dev: false - - /@antv/util@2.0.17: - resolution: {integrity: sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==} - dependencies: - csstype: 3.1.3 - tslib: 2.6.2 - dev: false - - /@antv/util@3.3.7: - resolution: {integrity: sha512-qqPg7rIPCsJyl7N56jAC25v/99mJ3ApVkgBsGijhiWrEeKvzXBPk1r5P77Pm9nCljpnn+hH8Z3t5AivbEoTJMg==} - dependencies: - fast-deep-equal: 3.1.3 - gl-matrix: 3.4.3 - tslib: 2.6.2 - dev: false - /@babel/code-frame@7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==, tarball: https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz} dependencies: @@ -4062,20 +3812,6 @@ packages: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - /@ljharb/resumer@0.0.1: - resolution: {integrity: sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw==} - engines: {node: '>= 0.4'} - dependencies: - '@ljharb/through': 2.3.13 - dev: false - - /@ljharb/through@2.3.13: - resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - dev: false - /@loadable/component@5.15.2(react@18.1.0): resolution: {integrity: sha512-ryFAZOX5P2vFkUdzaAtTG88IGnr9qxSdvLRvJySXcUA4B4xVWurUNADu3AnKPksxOZajljqTrDEDcYjeL4lvLw==} engines: {node: '>=8'} @@ -6207,20 +5943,6 @@ packages: require-from-string: 2.0.2 uri-js: 4.4.1 - /align-text@0.1.4: - resolution: {integrity: sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - longest: 1.0.1 - repeat-string: 1.6.1 - dev: false - - /amdefine@1.0.1: - resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} - engines: {node: '>=0.4.2'} - dev: false - /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, tarball: https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz} engines: {node: '>=6'} @@ -6244,11 +5966,6 @@ packages: hasBin: true dev: false - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==, tarball: https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz} - engines: {node: '>=0.10.0'} - dev: false - /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -6257,11 +5974,6 @@ packages: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, tarball: https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz} engines: {node: '>=12'} - /ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: false - /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -7079,11 +6791,6 @@ packages: quick-lru: 4.0.1 dev: false - /camelcase@1.2.1: - resolution: {integrity: sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==} - engines: {node: '>=0.10.0'} - dev: false - /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -7106,25 +6813,6 @@ packages: engines: {node: '>=4'} dev: true - /center-align@0.1.3: - resolution: {integrity: sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==} - engines: {node: '>=0.10.0'} - dependencies: - align-text: 0.1.4 - lazy-cache: 1.0.4 - dev: false - - /chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: false - /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -7258,14 +6946,6 @@ packages: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} dev: false - /cliui@2.1.0: - resolution: {integrity: sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==} - dependencies: - center-align: 0.1.3 - right-align: 0.1.3 - wordwrap: 0.0.2 - dev: false - /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -7299,13 +6979,6 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - dev: false - /colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} dev: false @@ -7426,10 +7099,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /contour_plot@0.0.1: - resolution: {integrity: sha512-Nil2HI76Xux6sVGORvhSS8v66m+/h5CwFkBJDO+U5vWaMdNC0yXNCsGDPbzPhvqOEU5koebhdEvD372LI+IyLw==} - dev: false - /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: false @@ -7720,104 +7389,6 @@ packages: resolution: {integrity: sha512-qv8s+G47V6Hq+g2kRE5th+ASzzrL7b6l+tap1DHKK25ZQJv3yIFhH96XaQ7NGL+zRW3t/RDbweJf/dJDe5Z5KA==} dev: false - /d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - dependencies: - internmap: 2.0.3 - dev: false - - /d3-color@1.4.1: - resolution: {integrity: sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==} - dev: false - - /d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - dev: false - - /d3-dispatch@3.0.1: - resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} - engines: {node: '>=12'} - dev: false - - /d3-dsv@3.0.1: - resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} - engines: {node: '>=12'} - hasBin: true - dependencies: - commander: 7.2.0 - iconv-lite: 0.6.3 - rw: 1.3.3 - dev: false - - /d3-force@3.0.0: - resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} - engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-quadtree: 3.0.1 - d3-timer: 3.0.1 - dev: false - - /d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - dev: false - - /d3-geo@3.1.1: - resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.4 - dev: false - - /d3-hierarchy@3.1.2: - resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} - engines: {node: '>=12'} - dev: false - - /d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - dependencies: - d3-color: 3.1.0 - dev: false - - /d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - dev: false - - /d3-quadtree@3.0.1: - resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} - engines: {node: '>=12'} - dev: false - - /d3-scale-chromatic@3.1.0: - resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} - engines: {node: '>=12'} - dependencies: - d3-color: 3.1.0 - d3-interpolate: 3.0.1 - dev: false - - /d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - dependencies: - d3-path: 3.1.0 - dev: false - - /d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - dev: false - - /d3-voronoi@1.1.4: - resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==} - dev: false - /d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} @@ -7914,18 +7485,6 @@ packages: engines: {node: '>=14.16'} dev: false - /deep-equal@1.1.2: - resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} - engines: {node: '>= 0.4'} - dependencies: - is-arguments: 1.1.1 - is-date-object: 1.0.5 - is-regex: 1.1.4 - object-is: 1.1.6 - object-keys: 1.1.1 - regexp.prototype.flags: 1.5.2 - dev: false - /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -7985,10 +7544,6 @@ packages: object-keys: 1.1.1 dev: false - /defined@1.0.1: - resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} - dev: false - /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, tarball: https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz} engines: {node: '>=0.4.0'} @@ -8143,13 +7698,6 @@ packages: tslib: 2.6.2 dev: false - /dotignore@0.1.2: - resolution: {integrity: sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==} - hasBin: true - dependencies: - minimatch: 3.1.2 - dev: false - /duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} dependencies: @@ -9182,6 +8730,7 @@ packages: /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true /events-okam@3.3.0: resolution: {integrity: sha512-6iR7z9hAJEwrT+D2Ywg6Fx62HSmN86OlcvPdrnq1JBeFr30dMF6l+j7M3VabjHfIi2KMtF8rO0J1rIZEfwMAwg==} @@ -9390,10 +8939,6 @@ packages: ua-parser-js: 0.7.38 dev: false - /fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - dev: false - /fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} @@ -9485,21 +9030,6 @@ packages: deprecated: flatten is deprecated in favor of utility frameworks such as lodash. dev: false - /flru@1.0.2: - resolution: {integrity: sha512-kWyh8ADvHBFz6ua5xYOPnUroZTT/bwWfrCeL0Wj1dzG4/YOmOcfJ99W8dOVyyynJN35rZ9aCOtHChqQovV7yog==} - engines: {node: '>=6'} - dev: false - - /fmin@0.0.2: - resolution: {integrity: sha512-sSi6DzInhl9d8yqssDfGZejChO8d2bAGIpysPsvYsxFe898z89XhCZg6CPNV3nhUhFefeC/AXZK2bAJxlBjN6A==} - dependencies: - contour_plot: 0.0.1 - json2module: 0.0.3 - rollup: 0.25.8 - tape: 4.17.0 - uglify-js: 2.8.29 - dev: false - /follow-redirects@1.15.6: resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==, tarball: https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz} engines: {node: '>=4.0'} @@ -9702,10 +9232,6 @@ packages: /git-hooks-list@3.1.0: resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} - /gl-matrix@3.4.3: - resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} - dev: false - /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -9871,13 +9397,6 @@ packages: resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} dev: false - /has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==, tarball: https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: false - /has-ansi@5.0.1: resolution: {integrity: sha512-Fp2IsZDnnyoJkKg22ZyQFvD7QRCcMTsLAtloKXyXWJ1joGLtItRU9Bv/k1o0tELL2NF3ZZBcycSKryZUM+Yl3g==, tarball: https://registry.npmjs.org/has-ansi/-/has-ansi-5.0.1.tgz} engines: {node: '>=12'} @@ -9920,11 +9439,6 @@ packages: has-symbols: 1.0.3 dev: false - /has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} - dev: false - /hash-base@3.0.4: resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} engines: {node: '>=4'} @@ -10259,11 +9773,6 @@ packages: side-channel: 1.0.6 dev: false - /internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - dev: false - /intersection-observer@0.12.2: resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==, tarball: https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.2.tgz} dev: false @@ -10342,10 +9851,6 @@ packages: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: false - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: false - /is-arrow-function@2.0.3: resolution: {integrity: sha512-iDStzcT1FJMzx+TjCOK//uDugSe/Mif/8a+T0htydQ3qkJGvSweTZpVYz4hpJH0baloSPiAFQdA8WslAgJphvQ==} engines: {node: '>= 0.4'} @@ -10381,10 +9886,6 @@ packages: has-tostringtag: 1.0.2 dev: false - /is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - dev: false - /is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, tarball: https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz} engines: {node: '>=4'} @@ -10874,13 +10375,6 @@ packages: /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - /json2module@0.0.3: - resolution: {integrity: sha512-qYGxqrRrt4GbB8IEOy1jJGypkNsjWoIMlZt4bAsmUScCA507Hbc2p1JOhBzqn45u3PWafUgH2OnzyNU7udO/GA==} - hasBin: true - dependencies: - rw: 1.3.3 - dev: false - /json2mq@0.2.0: resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} dependencies: @@ -10915,13 +10409,6 @@ packages: dependencies: json-buffer: 3.0.1 - /kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-buffer: 1.1.6 - dev: false - /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -10939,11 +10426,6 @@ packages: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} dev: false - /lazy-cache@1.0.4: - resolution: {integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==} - engines: {node: '>=0.10.0'} - dev: false - /lcid@3.1.1: resolution: {integrity: sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==, tarball: https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz} engines: {node: '>=8'} @@ -11201,7 +10683,7 @@ packages: p-locate: 5.0.0 /lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, tarball: https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz} dev: false /lodash.debounce@4.0.8: @@ -11257,11 +10739,6 @@ packages: resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==, tarball: https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz} dev: false - /longest@1.0.1: - resolution: {integrity: sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==} - engines: {node: '>=0.10.0'} - dev: false - /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -11561,18 +11038,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dev: false - /mock-property@1.0.3: - resolution: {integrity: sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - functions-have-names: 1.2.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - hasown: 2.0.2 - isarray: 2.0.5 - dev: false - /mock.js@0.2.0: resolution: {integrity: sha512-DKI8Rh/h7Mma+fg+6aD0uUvwn0QXAjKG6q3s+lTaCboCQ/kvQMBN9IXRBzgEaz4aPiYoRnKU9jVsfZp0mHpWrQ==, tarball: https://registry.npmjs.org/mock.js/-/mock.js-0.2.0.tgz} dev: false @@ -11894,22 +11359,10 @@ packages: engines: {node: '>=0.10.0'} dev: false - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: false - /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: false - /object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - dev: false - /object-keys@0.4.0: resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} dev: false @@ -12240,10 +11693,6 @@ packages: sha.js: 2.4.11 dev: false - /pdfast@0.2.0: - resolution: {integrity: sha512-cq6TTu6qKSFUHwEahi68k/kqN2mfepjkGrG9Un70cgdRRKLKY6Rf8P8uvP2NvZktaQZNF3YE7agEkLj0vGK9bA==} - dev: false - /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==, tarball: https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz} dev: false @@ -13075,10 +12524,6 @@ packages: engines: {node: '>=8'} dev: false - /quickselect@2.0.0: - resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} - dev: false - /raf@3.4.1: resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==, tarball: https://registry.npmjs.org/raf/-/raf-3.4.1.tgz} dependencies: @@ -13112,12 +12557,6 @@ packages: unpipe: 1.0.0 dev: false - /rbush@3.0.1: - resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==} - dependencies: - quickselect: 2.0.0 - dev: false - /rc-align@2.4.5: resolution: {integrity: sha512-nv9wYUYdfyfK+qskThf4BQUSIadeI/dCsfaMZfNEoxm9HwOIioQ+LyqmMK6jWHAZQgOzMLaqawhuBXlF63vgjw==, tarball: https://registry.npmjs.org/rc-align/-/rc-align-2.4.5.tgz} dependencies: @@ -14859,13 +14298,6 @@ packages: resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} dev: true - /right-align@0.1.3: - resolution: {integrity: sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==} - engines: {node: '>=0.10.0'} - dependencies: - align-text: 0.1.4 - dev: false - /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true @@ -15071,15 +14503,6 @@ packages: yargs: 17.7.2 dev: false - /rollup@0.25.8: - resolution: {integrity: sha512-a2S4Bh3bgrdO4BhKr2E4nZkjTvrJ2m2bWjMTzVYtoqSCn0HnuxosXnaJUHrMEziOWr3CzL9GjilQQKcyCQpJoA==} - hasBin: true - dependencies: - chalk: 1.1.3 - minimist: 1.2.8 - source-map-support: 0.3.3 - dev: false - /rollup@3.29.4: resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -15100,10 +14523,6 @@ packages: dependencies: queue-microtask: 1.2.3 - /rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - dev: false - /safe-array-concat@1.1.2: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} @@ -15370,12 +14789,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - dependencies: - is-arrayish: 0.3.2 - dev: false - /single-spa@5.9.5: resolution: {integrity: sha512-9SQdmsyz4HSP+3gs6PJzhkaMEg+6zTlu9oxIghnwUX3eq+ajq4ft5egl0iyR55LAmO/UwvU8NgIWs/ZyQMa6dw==} dev: false @@ -15465,25 +14878,12 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} - /source-map-support@0.3.3: - resolution: {integrity: sha512-9O4+y9n64RewmFoKUZ/5Tx9IHIcXM6Q+RTSw6ehnqybUz4a7iwR3Eaw80uLtqqQ5D0C+5H03D4KKGo9PdP33Gg==} - dependencies: - source-map: 0.1.32 - dev: false - /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - /source-map@0.1.32: - resolution: {integrity: sha512-htQyLrrRLkQ87Zfrir4/yN+vAUd6DNjVayEjTSHXu29AYQJw57I4/xEL/M6p6E/woPNJwvZt6rVlzc7gFEJccQ==} - engines: {node: '>=0.8.0'} - dependencies: - amdefine: 1.0.1 - dev: false - /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} @@ -15724,13 +15124,6 @@ packages: safe-buffer: 5.2.1 dev: false - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: false - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -15995,11 +15388,6 @@ packages: copy-anything: 3.0.5 dev: false - /supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: false - /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -16035,10 +15423,6 @@ packages: resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} dev: false - /svg-path-parser@1.1.0: - resolution: {integrity: sha512-jGCUqcQyXpfe38R7RFfhrMyfXcBmpMNJI/B+4CE9/Unkh98UporAc461GTthv+TVDuZXsBx7/WiwJb1Oh4tt4A==} - dev: false - /svg-tags@1.0.0: resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} dev: false @@ -16130,28 +15514,6 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, tarball: https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz} engines: {node: '>=6'} - /tape@4.17.0: - resolution: {integrity: sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw==} - hasBin: true - dependencies: - '@ljharb/resumer': 0.0.1 - '@ljharb/through': 2.3.13 - call-bind: 1.0.7 - deep-equal: 1.1.2 - defined: 1.0.1 - dotignore: 0.1.2 - for-each: 0.3.3 - glob: 7.2.3 - has: 1.0.4 - inherits: 2.0.4 - is-regex: 1.1.4 - minimist: 1.2.8 - mock-property: 1.0.3 - object-inspect: 1.12.3 - resolve: 1.22.8 - string.prototype.trim: 1.2.9 - dev: false - /terser-webpack-plugin@5.3.10(webpack@5.91.0): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==, tarball: https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz} engines: {node: '>= 10.13.0'} @@ -16452,23 +15814,6 @@ packages: resolution: {integrity: sha512-fYmIy7fKTSFAhG3fuPlubeGaMoAd6r0rSnfEsO5nEY55i26KSLt9EH7PLQiiqPUhNqYIJvSkTy1oArIcXAbPbA==, tarball: https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.38.tgz} dev: false - /uglify-js@2.8.29: - resolution: {integrity: sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==} - engines: {node: '>=0.8.0'} - hasBin: true - dependencies: - source-map: 0.5.7 - yargs: 3.10.0 - optionalDependencies: - uglify-to-browserify: 1.0.2 - dev: false - - /uglify-to-browserify@1.0.2: - resolution: {integrity: sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==, tarball: https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz} - requiresBuild: true - dev: false - optional: true - /umi-presets-pro@2.0.3(@babel/core@7.24.5)(@types/react-dom@18.3.0)(@types/react@18.3.1)(antd@5.18.3)(dva@2.5.0-beta.2)(rc-field-form@1.44.0)(react-dom@18.3.1)(react@18.3.1)(umi@4.2.1): resolution: {integrity: sha512-sHKynw/fi7UeUftzTRPRsrV5GHV4BWvWYhyvwkg8s+shmt0ROPW/52y4gxBziEvetxl8yWMKUCWk50OUDOcrww==, tarball: https://registry.npmjs.org/umi-presets-pro/-/umi-presets-pro-2.0.3.tgz} dependencies: @@ -17066,20 +16411,10 @@ packages: dependencies: isexe: 2.0.0 - /window-size@0.1.0: - resolution: {integrity: sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==} - engines: {node: '>= 0.8.0'} - dev: false - /word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - /wordwrap@0.0.2: - resolution: {integrity: sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==} - engines: {node: '>=0.4.0'} - dev: false - /workerpool@9.1.1: resolution: {integrity: sha512-EFoFTSEo9m4V4wNrwzVRjxnf/E/oBpOzcI/R5CIugJhl9RsCiq525rszo4AtqcjQQoqFdu2E3H82AnbtpaQHvg==} dev: false @@ -17188,15 +16523,6 @@ packages: yargs-parser: 21.1.1 dev: false - /yargs@3.10.0: - resolution: {integrity: sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==} - dependencies: - camelcase: 1.2.1 - cliui: 2.1.0 - decamelize: 1.2.0 - window-size: 0.1.0 - dev: false - /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/public/static/favicon.ico b/public/static/favicon.ico deleted file mode 100644 index 76597beaa72f5ed586307fa9185d13a7871eb3be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmdT{K}b|V7#>YbBuqr2&Cp#9kq8eKQ4zI>M0hBOkm%Gw!o#jwhYlsVA|ah5qJxL< z5Mt1&Q;0-LghYp3vj~x>kdTN-S;CFX>HFT!JcjY@^R2aqo_zlQ{PTbR|G$}eGqXYz z;V&E({4X9>3b9KF(FDLGq5$pAgTDXyneC2wkHvx0$+-%emF?`-C_^}!(dk(X=9=KhQJ+-CWa_XzN_K>2?oZq6M5edWOW0_E1@ zcMS2X-t=r-3b5ZSaBkMXwb%?q&AC8(2k;%xb(-=A><8#)KXT+C;|%BEdBvjbBI7_l1}2r>=n;e8$~#~Vmx^Nq;i?IJIXeu{envH`V?2^vL*Kr_uPYiUHQ9f4eb_XTZPQ|t$Ec1 zf3=p}IW+V04inWp=-lf*0H1LVxOc+2xO1!tDc}`{E;jHE_)C0sL7R=u!LHA#fHHKhQXu!PUOR zwZ%2VI{0n!+&l+t*r#a&c$SR<4OU@IJ&kG`>RT8X>4_J0GVncOl_A^6v=fVo~;Q{mjRZ6 zj|x*l)J$hY&A^(dNvw-dqF;oDqzDbmL})aNqmT|@yOES4JtM{Hl1wZu%0zNSPMyuj UO#j-+^?tcCEoEYxl*@JU4`YEvK>z>% diff --git a/public/static/favicon.png b/public/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c3fe7ef1f77f7ceb8ea2f443e84c9a22c25f2cb3 GIT binary patch literal 3109 zcmaJ@X*iT^8y;l~g-Th9F|s8yV~lOg*k%YtvSch_jG@7pF*6ujwh}2zN=if4UKLrQ zBuf%mvP@-PvPF_tB0Jyct={j)*Y_O9^W67+9oKnY=XGD_k0;i`{P=D@aXtV5u-n8K zW655D+b=IS`%4Q7T3|0?bVDrNitJ7gz)=YReK)cz0cb+Pc@QiKIJZFGCIS)w*eOS} z#?rB7ClPou35?s$0W(MxHW~mx>M|%eycdBEbR~EYeNdpkD{DYNq8kcit7Zl@qo4`r zh{i!wf>n^YH9p7-ujK~P)d3 zy164PF-AX&u}>(_IXaz!fItEQ0>A;PU^3MMqN1gx1%bjKFqkqsLzx!nL&q_ceP}Yj z7%&7Ho=T+9iDVz(HY3iJ>_qGl_PwX3mFmM!z3K+WG)2~D`v;Ut; zBK^*$(Jcx8>iwU@H0wYL0b)s@k^QK6_T=1Uwo6eEXet3mCsVD-Wba?sXmO5AC)3W6 zDL@zu3Lo^x+g=@loVKHR9ABo^Y|Alq?7pwM1?6w_96n13{flBlzxEWE&B;b#( z5yU@hf&G#1C)VxHT2%jtg|NjywrBfav;Gxg8)$p`+q&$-Z}Ss;*p8>Nt!>gLIu8Kw z-Y~)FTQm9|+Xhl>-izr@rdL*@Ac2rzgS`sU$9naQ0oe~Z?vwNd9GHriYn{sudvmp9 zG4DrRHq=HdzdJg%|HT=j#M~G`-lUQX;b*wylVrV3Bom&G7X)ZcE(|OgT<+pLcS-x( z8?B}E;P$1p^TR7CakYa^LefKO<;^yOtR1|Kz8Ay~w6AkTVzICF<4&3=VDj$|eez#F zT=l96HmLv+flao)=nmD1w{jD&2#IZYG6;+&W{27u-z(I$;OLZilS>nI1!-kLacUG}uNx?@tK zwJ)NS8*R>6xIYbRpK`y|`NMv%d*aJ|Y9bmMOGJkZ{vng(#DMwzZI(z;45ZvZMttYj z@BS}Pp+_NtVv+A@lOk)^^RGGD#ivp)+!CG9mea#~7j?!OB`B7MJ$_)(yDS&!-+x#Y zz?{gn_?vI^t!~)m<)ztur3WEY>*_Vz`rXIgA%^Yi)KV|i9`0Ud%mwZOff z-Y=1K9-aY@WfFmXL0r8`&42ZEMreof{6>DCk`5W9_B?5nV|X&DkH~qh?}?ZNwWQ+VGrJDn{;pC?Bt$aLD8@ko$y=;a+-ovq5_ zca+Tt@%D`uf7=N!F-S;9`e`V>I|FA;{>`meY>#T^W_~sMp1H1{A1qmb1pU6xN9K=Q*_b z>Brc&pElL!=DtlopORPAKQ)jhC#)_+OZF%pIIK2SRvUlTXo>;K z3%s7*)*mg%KiISI{mZeUmq{|TTA73$XQ)7{_<~`Xa-DRCRIsfUe+}cf_AK&U_@RAL zT7bW$!uTNk&CI>ZhTx=w`}8N5cB|}A$+LX zPl*%Mo(b1@zrk@~K+%4D>U20Cze2}i|7yoc*k8w2lv8fuA$Ny7PUb6`w%@J;T)2G@ zy#LEsgX?15tA+Km+Wl>(QgaN=;r8RjHpu3a-B-I>Hqu?|gShelsby__GALS~%tw^4 zbS=yTR;TBp#K|piTx?hBoWTn~mXlZ9K+pP~1Q<)0u9@{UT85Y+8@Dmi?W7S?({4N$ z^+n3lC{3z#-oVcP9xiW&TSDyB^;~CAk=Ci00@qD^c8YRm6SyaUfj_{!Q z@mP$c%e~Nj9hH^XC05&Mr`NRVXXe7qErro3x=K49O>SNF3!bQJT&a6;G1~jc4ToeN zYf@j8Do1Sx#97$lyriI&)k9Z5kyD!E2Rz!Zb$-xC`t@*4nXP5es$`YlsF5aU(cY5J z$EEAdIi?~$wyZX7tUb-)=i{&HGCWcBT|{Yp#I}q1wR=FSYx?t>XjaP`W^hIa-ITjR zD}XtHrz|rxH^A;yHD&0HHL0yR zXDPeod6sqYtni+rm$~*Ri`A1EXx9`6y|03IiahBlgioWc?d1hoi8pp}OqXWb@OgTc zq$7q>Yhqb5HB)eWnh{DW|6Qm>b|FMj#J%-whx|MTOUbMBqBCSH9CVW!?4SEWtPHde zWclinN9yMtrY9DIGD5QGAty?od^lJGkNwDaU`Rh8(tD{b?Pi5bV_W3S-M6>ottwKi ztK$@P?^<@-nNHjwKVMhvf|pUT7HgrEF%M6}8FlX*N~7{6KnR!6Wio zTAE!+h+%)l;^*Rr66wVc&ZC*L^bh5x?p>;wI)z4*SfZRKN0U&*vw;5ZJ#Tdjc0S8n zT5)#C8wT`NXmfSF6R_+mEQ^tSg_xc$=`n5Lx$%7Uc8IK|aIm<7r~?1CM)<-u_l9f&ywnR|*`yKVDs( z_ULUF*-Srw_mR+EuB4V`7BRRIbnsv$%)RXhQtm8s?fZO5x5O83?`w`xJSI^MsKohf zwFmTwPM^utR|1?Z)M#;mMnUr6-r@Cmd+MjOl*&!5T zt=^GDSWB~2*fPt0E7RtIilt5Kj<>ZcZ(^1=`Yt}Iw$L4ZVv8ynLsJ*mSAtnav9qJ2 z5$*Z*&Gl+E6DUK&`J$%e3+pW5JA+@U`>QsUYXRzui*u3k;zip(?k0xjm_h@W$o~LE Cx@3X? literal 0 HcmV?d00001 diff --git a/src/components/charts/area.tsx b/src/components/charts/area.tsx deleted file mode 100644 index 5f9834bf..00000000 --- a/src/components/charts/area.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import { Area } from '@ant-design/plots'; -import EmptyData from './empty-data'; - -interface LineChartProps { - title?: string; - height?: number; - data: any[]; - color?: string; - xField?: string; - yField?: string; - locale?: string; - labelFormatter?: (v: any) => string; - slider?: any; -} -const LineChart: React.FC = (props) => { - const { - data, - title, - color, - xField, - locale, - yField, - slider, - height, - labelFormatter - } = props; - const config = { - height, - xField: xField || 'time', - yField: yField || 'value', - autoFit: true, - slider, - // shapeField: 'smooth', - axis: { - x: { - textStyle: { - autoRoate: true - }, - labelFormatter - }, - y: { - tick: false, - // size: 14, - // title: '%', - titlePosition: 'top', - titleFontSize: 12 - } - }, - style: { - fill: (params: any) => { - console.log('area param=========', params); - return color || 'rgba(84, 204, 152,0.8)'; - }, - stroke: (params: any) => { - console.log('area param========2=', params); - return color || 'rgba(84, 204, 152,0.8)'; - } - }, - title: { - title, - style: { - align: 'center', - titleFontSize: 14, - titleFill: 'rgba(0,0,0,0.88)', - titleFontWeight: 500 - } - }, - legend: { - color: { - layout: { justifyContent: 'center' } - }, - - size: { - itemLabelFontSize: 14, - itemLabelFontWeight: 500 - } - }, - tooltip: { - title: 'time', - items: [{ channel: 'y' }] - } - }; - return ( - <> - {data.length === 0 ? ( - - ) : ( - - )} - - ); -}; - -export default LineChart; diff --git a/src/components/charts/column-bar.tsx b/src/components/charts/column-bar.tsx deleted file mode 100644 index dd0b878c..00000000 --- a/src/components/charts/column-bar.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import { Column } from '@ant-design/plots'; - -import EmptyData from './empty-data'; - -interface BarChartProps { - data: any[]; - xField: string; - yField: string; - title?: string; - height?: number; - group?: boolean; - colorField?: string; - seriesField?: string; - stack?: boolean; - legend?: any; - labelFormatter?: (v: any) => string; -} -const BarChart: React.FC = (props) => { - const { - data, - xField, - yField, - title, - height = 260, - group, - colorField, - seriesField, - stack, - legend = undefined, - labelFormatter - } = props; - const config = { - data, - xField, - yField, - colorField: colorField || 'name', - direction: 'vertical', - stack, - seriesField, - height, - group, - scale: { - x: { - type: 'band', - padding: 0.5 - } - }, - legend: - legend === 'undefined' - ? { - color: { - position: 'top', - layout: { - justifyContent: 'center' - } - } - } - : legend, - axis: { - x: { - xAxis: true, - tick: false, - labelFormatter - }, - y: { - tick: false, - labelAutoWrap: true - } - }, - title: { - title, - style: { - align: 'center', - titleFontSize: 14, - titleFill: 'rgba(0,0,0,0.88)', - titleFontWeight: 500 - } - }, - split: { - type: 'line', - line: { - color: 'red', - style: { - color: 'red', - lineDash: [4, 5] - } - } - }, - - style: { - fill: (params: any) => { - console.log('colbar=====', params); - return params.color || 'rgba(84, 204, 152,0.8)'; - }, - // radiusTopLeft: 12, - // radiusTopRight: 12, - align: 'center', - width: 20 - } - }; - - return ( - <> - {data.length > 0 ? ( - - ) : ( - - )} - - ); -}; - -export default BarChart; diff --git a/src/components/charts/config/index.ts b/src/components/charts/config/index.ts deleted file mode 100644 index fbd5fd7c..00000000 --- a/src/components/charts/config/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const titleStyle = { - style: { - align: 'center', - titleFontSize: 14, - titleFill: 'rgba(0,0,0,0.88)', - titleFontWeight: 500 - } -}; diff --git a/src/components/charts/gauge.tsx b/src/components/charts/gauge.tsx deleted file mode 100644 index e226e247..00000000 --- a/src/components/charts/gauge.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { Gauge } from '@ant-design/plots'; -import React from 'react'; - -interface GaugeChartProps { - target: number; - total: number; - width?: number; - height?: number; - title?: string; - thresholds: number[]; - rangColor: string[]; -} - -const GaugeChart: React.FC = (props) => { - const { target, total, width, height, thresholds, rangColor, title } = props; - const config = { - width, - height, - box: { - padding: [0, 0, 0, 0], - style: { - padding: [0, 0, 0, 0] - } - }, - guide: { - arc: { - style: { - lineWidth: 30 - } - } - }, - autoFit: true, - data: { - target, - total, - name: 'score', - thresholds - }, - legend: false, - scale: { - color: { - range: rangColor - } - }, - startAngle: Math.PI, - endAngle: 0, - title: { - title, - size: 0, - style: { - align: 'center', - titleFontSize: 14, - titleFill: 'rgba(0,0,0,0.88)', - titleFontWeight: 500 - } - }, - style: { - arcShape: 'round', - textContent: (target: number, total: number) => { - return `${(target / total) * 100}%`; - } - } - }; - return ; -}; - -export default GaugeChart; diff --git a/src/components/charts/h-bar.tsx b/src/components/charts/h-bar.tsx deleted file mode 100644 index da8a3f49..00000000 --- a/src/components/charts/h-bar.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { Bar } from '@ant-design/plots'; -import EmptyData from './empty-data'; - -interface BarChartProps { - data: any[]; - xField: string; - yField: string; - title?: string; - height?: number; - group?: boolean; - colorField?: string; - seriesField?: string; - stack?: boolean; - legend?: any; - showYAxis?: boolean; -} -const BarChart: React.FC = (props) => { - const { - data, - xField, - yField, - title, - height, - group, - colorField, - seriesField, - stack, - showYAxis = true, - legend = undefined - } = props; - const config = { - data, - xField, - yField, - colorField: colorField || 'name', - direction: 'vertical', - seriesField, - height, - group, - stack, - legend: - legend === 'undefined' - ? { - color: { - position: 'top', - layout: { - justifyContent: 'center' - } - } - } - : legend, - scale: { - x: { - type: 'band', - padding: 0.5 - } - }, - axis: { - x: { - xAxis: true, - tick: false - }, - y: showYAxis - ? { - tick: false - } - : null - }, - title: { - title, - style: { - align: 'start', - titleFontSize: 14, - titleFill: 'rgba(0,0,0,0.88)', - titleFontWeight: 500 - } - }, - split: { - type: 'line', - line: { - style: { - lineDash: [4, 5] - } - } - }, - markBackground: {}, - style: { - fill: (params: any) => { - return ( - params.color || - 'linear-gradient(90deg,rgba(84, 204, 152,0.8) 0%,rgb(0, 168, 143,.7) 100%)' - ); - }, - // radiusTopLeft: 12, - // radiusTopRight: 12, - height: 20 - } - }; - - return ( - <> - {data.length === 0 ? ( - - ) : ( - - )} - - ); -}; - -export default BarChart; diff --git a/src/components/charts/line-chart.tsx b/src/components/charts/line-chart.tsx deleted file mode 100644 index 2228a6bc..00000000 --- a/src/components/charts/line-chart.tsx +++ /dev/null @@ -1,92 +0,0 @@ -import { Line } from '@ant-design/plots'; -import EmptyData from './empty-data'; - -interface LineChartProps { - title?: string; - height?: number; - data: any[]; - color?: string[]; - xField?: string; - yField?: string; - locale?: string; - labelFormatter?: (v: any) => string; - slider?: any; -} -const LineChart: React.FC = (props) => { - const { - data, - title, - color, - xField, - locale, - yField, - slider, - height, - labelFormatter - } = props; - const config = { - title, - height, - xField: xField || 'time', - yField: yField || 'value', - // color: color || ['red', 'blue', 'green', 'yellow'], - colorField: 'type', - autoFit: true, - slider, - shapeField: 'smooth', - axis: { - x: { - textStyle: { - autoRoate: true - } - }, - y: { - tick: false, - // size: 14, - // title: '%', - titlePosition: 'top', - titleFontSize: 12, - labelFormatter - } - }, - // point: { - // shapeField: 'circle', - // sizeField: 2 - // }, - style: { - lineWidth: 1.5, - opacity: 0.7 - // fill: (params: any) => { - // return params.color; - // } - // stroke: (params: any) => { - // console.log('line param=========', params.color); - // return params.color; - // } - }, - legend: { - color: { - layout: { justifyContent: 'center' } - }, - size: { - itemLabelFontSize: 14, - itemLabelFontWeight: 500 - } - }, - tooltip: { - title: 'time', - items: [{ channel: 'y' }] - } - }; - return ( - <> - {data.length === 0 ? ( - - ) : ( - - )} - - ); -}; - -export default LineChart; diff --git a/src/components/charts/liquid.tsx b/src/components/charts/liquid.tsx deleted file mode 100644 index 3b7a0513..00000000 --- a/src/components/charts/liquid.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { Liquid } from '@ant-design/plots'; -import { useEffect, useState } from 'react'; - -interface LiquidChartProps { - percent: number; - color?: string; - title?: string; - height?: number; - width?: number; - thresholds?: number[]; - rangColor?: string[]; -} -const LiquidChart: React.FC = (props) => { - const { - percent = 0, - color, - title, - width, - height, - thresholds = [], - rangColor = [] - } = props; - - const primaryColor = 'rgba(84, 204, 152,0.8)'; - const [fillColor, setFillColor] = useState(primaryColor); - - const calcColorByPercent = () => { - if (color) { - return color; - } - if (!rangColor.length) { - return primaryColor; - } - - if (rangColor.length && thresholds.length) { - let index = 0; - for (let i = 0; i < thresholds.length; i++) { - if (percent <= thresholds[i]) { - index = i; - break; - } - } - return rangColor[index]; - } - return primaryColor; - }; - - useEffect(() => { - const fc = calcColorByPercent(); - setFillColor(fc); - }, [percent]); - - const config = { - percent, - textAlign: 'center', - autoFit: true, - title: { - title, - size: 0, - style: { - align: 'center', - titleFontSize: 12, - titleFill: 'rgba(0,0,0,0.88)', - titleFontWeight: 500 - } - }, - - style: { - textAlign: 'center', - outlineBorder: 2, - waveLength: 128, - stroke: fillColor, - fill: fillColor - } - }; - return ; -}; - -export default LiquidChart; diff --git a/src/components/charts/pie-chart.tsx b/src/components/charts/pie-chart.tsx deleted file mode 100644 index de24bd93..00000000 --- a/src/components/charts/pie-chart.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { Pie } from '@ant-design/plots'; -import numeral from 'numeral'; - -interface PieChartProps { - data: { label: string; value: number }[]; - height?: number; - radius?: number; -} -const PieChart: React.FC = (props) => { - const { data, height = 340, radius = 0.9 } = props; - - return ( - { - return `${item.label}: ${numeral(item.value).format('0,0')}`; - } - }} - /> - ); -}; - -export default PieChart; diff --git a/src/components/echarts/bar-chart.tsx b/src/components/echarts/bar-chart.tsx index 1d17d09a..7d5424d7 100644 --- a/src/components/echarts/bar-chart.tsx +++ b/src/components/echarts/bar-chart.tsx @@ -9,7 +9,7 @@ import { yAxis } from '@/components/echarts/config'; import _ from 'lodash'; -import { useEffect, useState } from 'react'; +import { memo, useEffect, useState } from 'react'; import { ChartProps } from './types'; const BarChart: React.FC = (props) => { @@ -90,4 +90,4 @@ const BarChart: React.FC = (props) => { ); }; -export default BarChart; +export default memo(BarChart); diff --git a/src/components/echarts/config.ts b/src/components/echarts/config.ts index 5213352f..8d5c07eb 100644 --- a/src/components/echarts/config.ts +++ b/src/components/echarts/config.ts @@ -37,7 +37,6 @@ export const legend = { export const xAxis = { type: 'category', - boundaryGap: true, axisTick: { show: true, lineStyle: { diff --git a/src/components/echarts/h-bar.tsx b/src/components/echarts/h-bar.tsx index 0140f078..d2b7ed26 100644 --- a/src/components/echarts/h-bar.tsx +++ b/src/components/echarts/h-bar.tsx @@ -8,7 +8,7 @@ import { yAxis } from '@/components/echarts/config'; import _ from 'lodash'; -import { useEffect, useState } from 'react'; +import { memo, useEffect, useState } from 'react'; import { ChartProps } from './types'; const BarChart: React.FC = (props) => { @@ -87,7 +87,6 @@ const BarChart: React.FC = (props) => { }, xAxis: { ...options.xAxis, - boundaryGap: true, type: 'value', splitLine: { show: false @@ -113,4 +112,4 @@ const BarChart: React.FC = (props) => { ); }; -export default BarChart; +export default memo(BarChart); diff --git a/src/components/seal-form/input-number.tsx b/src/components/seal-form/input-number.tsx index 8a7c95f5..9f4d394b 100644 --- a/src/components/seal-form/input-number.tsx +++ b/src/components/seal-form/input-number.tsx @@ -1,3 +1,4 @@ +import { isNotEmptyValue } from '@/utils/index'; import type { InputNumberProps } from 'antd'; import { Form, InputNumber } from 'antd'; import { useEffect, useRef, useState } from 'react'; @@ -24,7 +25,7 @@ const SealInputNumber: React.FC = ( } useEffect(() => { - if (props.value) { + if (isNotEmptyValue(props.value)) { setIsFocus(true); } }, [props.value]); diff --git a/src/global.less b/src/global.less index 681be492..9d18cac5 100644 --- a/src/global.less +++ b/src/global.less @@ -208,6 +208,12 @@ body { height: 40px; } + .ant-input-outlined, + .ant-input-affix-wrapper, + .ant-picker { + height: 40px; + } + .ant-input-outlined.ant-input-status-error:not(.ant-input-disabled) { border: none; box-shadow: none; diff --git a/src/hooks/use-window-resize.ts b/src/hooks/use-window-resize.ts index 9bcebb98..40ec0d2a 100644 --- a/src/hooks/use-window-resize.ts +++ b/src/hooks/use-window-resize.ts @@ -1,5 +1,6 @@ import breakpoints from '@/config/breakpoints'; -import { useEffect, useState } from 'react'; +import _ from 'lodash'; +import { useCallback, useEffect, useState } from 'react'; export default function useWindowResize() { const [size, setSize] = useState<{ width: number; height: number }>({ @@ -11,7 +12,7 @@ export default function useWindowResize() { const [isDesktop, setIsDesktop] = useState(false); const [currentPoint, setCurrentPoint] = useState(''); - const checkBreakpoint = (width: number) => { + const checkBreakpoint = useCallback((width: number) => { if (width < breakpoints.sm) { setIsMobile(true); setIsTablet(false); @@ -37,15 +38,15 @@ export default function useWindowResize() { setIsTablet(false); setIsDesktop(true); setCurrentPoint('xl'); - }; + }, []); + const handleResize = _.throttle(() => { + setSize({ + width: window.innerWidth, + height: window.innerHeight + }); + }, 200); useEffect(() => { - const handleResize = () => { - setSize({ - width: window.innerWidth, - height: window.innerHeight - }); - }; window.addEventListener('resize', handleResize); return () => { window.removeEventListener('resize', handleResize); diff --git a/src/layouts/Logo.tsx b/src/layouts/Logo.tsx index 8ebad26e..50e1e278 100644 --- a/src/layouts/Logo.tsx +++ b/src/layouts/Logo.tsx @@ -5,7 +5,7 @@ import GpustackLogo from '@/assets/images/gpustack-logo.png'; import React from 'react'; const LogoIcon: React.FC = () => { - return logo; + return logo; }; export default LogoIcon; diff --git a/src/locales/en-US/dashboard.ts b/src/locales/en-US/dashboard.ts index 6bad47bd..5a3a37e1 100644 --- a/src/locales/en-US/dashboard.ts +++ b/src/locales/en-US/dashboard.ts @@ -15,7 +15,7 @@ export default { 'dashboard.vramutilization': 'VRAM Utilization', 'dashboard.gpuutilization': 'GPU Utilization', 'dashboard.usage': 'Usage', - 'dashboard.apirequest': 'API Request', + 'dashboard.apirequest': 'API Requests', 'dashboard.tokens': 'Token Usage', 'dashboard.topusers': 'Top Users', 'dashboard.activeModels': 'Active Models', diff --git a/src/locales/en-US/users.ts b/src/locales/en-US/users.ts index 5009c508..d974f944 100644 --- a/src/locales/en-US/users.ts +++ b/src/locales/en-US/users.ts @@ -25,5 +25,5 @@ export default { 'users.password.confirm': 'Confirm New Password', 'users.password.confirm.empty': 'Please confirm the new password.', 'users.password.confirm.error': 'The two passwords entered do not match.', - 'users.login.title': 'Log in to GPUStack' + 'users.login.title': 'Log in to {name}' }; diff --git a/src/locales/zh-CN/users.ts b/src/locales/zh-CN/users.ts index 1dc9e74a..46a1a743 100644 --- a/src/locales/zh-CN/users.ts +++ b/src/locales/zh-CN/users.ts @@ -24,5 +24,5 @@ export default { 'users.password.confirm': '确认新密码', 'users.password.confirm.empty': '请确认新密码', 'users.password.confirm.error': '两次输入的密码不一致', - 'users.login.title': '登录 GPUStack' + 'users.login.title': '登录 {name}' }; diff --git a/src/pages/api-keys/index.tsx b/src/pages/api-keys/index.tsx index c387d249..594ead60 100644 --- a/src/pages/api-keys/index.tsx +++ b/src/pages/api-keys/index.tsx @@ -193,11 +193,12 @@ const Models: React.FC = () => { diff --git a/src/pages/dashboard/components/dahboard-inner.tsx b/src/pages/dashboard/components/dahboard-inner.tsx new file mode 100644 index 00000000..46253714 --- /dev/null +++ b/src/pages/dashboard/components/dahboard-inner.tsx @@ -0,0 +1,39 @@ +import { memo, useCallback, useEffect, useState } from 'react'; +import { queryDashboardData } from '../apis'; +import DashboardContext from '../config/dashboard-context'; +import { DashboardProps } from '../config/types'; +import ActiveTable from './active-table'; +import Overview from './over-view'; +import SystemLoad from './system-load'; +import Usage from './usage'; + +const Dashboard: React.FC<{ setLoading: (loading: boolean) => void }> = ({ + setLoading +}) => { + const [data, setData] = useState({} as DashboardProps); + + const getDashboardData = useCallback(async () => { + try { + setLoading(true); + const res = await queryDashboardData(); + setData(res); + setLoading(false); + } catch (error) { + setLoading(false); + setData({} as DashboardProps); + } + }, []); + useEffect(() => { + getDashboardData(); + }, []); + return ( + + + + + + + ); +}; + +export default memo(Dashboard); diff --git a/src/pages/dashboard/components/over-view.tsx b/src/pages/dashboard/components/over-view.tsx index ac4a01d4..e3c6c8c9 100644 --- a/src/pages/dashboard/components/over-view.tsx +++ b/src/pages/dashboard/components/over-view.tsx @@ -29,7 +29,7 @@ const renderCardItem = (data: { const Overview: React.FC = () => { const intl = useIntl(); const data = useContext(DashboardContext).resource_counts || {}; - + console.log('overview==='); const renderValue = ( value: | number diff --git a/src/pages/dashboard/components/resource-utilization.tsx b/src/pages/dashboard/components/resource-utilization.tsx index a06d9250..12c858da 100644 --- a/src/pages/dashboard/components/resource-utilization.tsx +++ b/src/pages/dashboard/components/resource-utilization.tsx @@ -2,7 +2,7 @@ import Chart from '@/components/echarts/chart'; import { getLocale, useIntl } from '@umijs/max'; import dayjs from 'dayjs'; import _ from 'lodash'; -import { useCallback, useContext, useEffect, useState } from 'react'; +import { useContext } from 'react'; import { DashboardContext } from '../config/dashboard-context'; const chartColorMap = { @@ -110,9 +110,11 @@ const option = { }; const UtilizationOvertime: React.FC = () => { + console.log('systemload====================='); const intl = useIntl(); const locale = getLocale(); - const [dataOptions, setDataOptions] = useState(option); + let dataOptions: any = {}; + // const [dataOptions, setDataOptions] = useState(option); const data = useContext(DashboardContext)?.system_load?.history || {}; const typeList = ['gpu', 'cpu', 'memory', 'gpu_memory']; @@ -121,7 +123,7 @@ const UtilizationOvertime: React.FC = () => { return `${value}%`; }; - const generateData = useCallback(() => { + const generateData = () => { const legendData: string[] = []; const xAxisData: string[] = []; let list: { value: number; time: string; type: string }[] = []; @@ -157,7 +159,7 @@ const UtilizationOvertime: React.FC = () => { }; }); - setDataOptions({ + dataOptions = { ...option, legend: { ...option.legend, @@ -168,12 +170,12 @@ const UtilizationOvertime: React.FC = () => { data: _.uniq(xAxisData) }, series: list - }); - }, [data, locale]); - - useEffect(() => { - generateData(); - }, [data, locale]); + }; + }; + generateData(); + // useEffect(() => { + // generateData(); + // }, [data, locale]); return ( <> diff --git a/src/pages/dashboard/components/usage-inner/request-token-inner.tsx b/src/pages/dashboard/components/usage-inner/request-token-inner.tsx new file mode 100644 index 00000000..bbabb2aa --- /dev/null +++ b/src/pages/dashboard/components/usage-inner/request-token-inner.tsx @@ -0,0 +1,52 @@ +import CardWrapper from '@/components/card-wrapper'; +import BarChart from '@/components/echarts/bar-chart'; +import LineChart from '@/components/echarts/line-chart'; +import { useIntl } from '@umijs/max'; +import { Col, Row } from 'antd'; +import dayjs from 'dayjs'; +import React from 'react'; + +interface RequestTokenInnerProps { + requestData: { + name: string; + color: string; + areaStyle: any; + data: { time: string; value: number }[]; + }[]; + tokenData: { time: string; value: number }[]; + xAxisData: string[]; +} +const RequestTokenInner: React.FC = (props) => { + console.log('request token inner====================='); + const { requestData, tokenData, xAxisData } = props; + const intl = useIntl(); + const labelFormatter = (v: any) => { + return dayjs(v).format('MM-DD'); + }; + return ( + + + + + + + + + + + ); +}; + +export default React.memo(RequestTokenInner); diff --git a/src/pages/dashboard/components/usage-inner/top-user.tsx b/src/pages/dashboard/components/usage-inner/top-user.tsx new file mode 100644 index 00000000..c82d79f9 --- /dev/null +++ b/src/pages/dashboard/components/usage-inner/top-user.tsx @@ -0,0 +1,27 @@ +import CardWrapper from '@/components/card-wrapper'; +import HBar from '@/components/echarts/h-bar'; +import { useIntl } from '@umijs/max'; +import React from 'react'; + +interface TopUserProps { + userData: { name: string; value: number }[]; + topUserList: string[]; +} +const TopUser: React.FC = (props) => { + console.log('TopUser====================='); + const { userData, topUserList } = props; + const intl = useIntl(); + + return ( + + + + ); +}; + +export default React.memo(TopUser); diff --git a/src/pages/dashboard/components/usage.tsx b/src/pages/dashboard/components/usage.tsx index fce8d457..83a16fe1 100644 --- a/src/pages/dashboard/components/usage.tsx +++ b/src/pages/dashboard/components/usage.tsx @@ -1,7 +1,3 @@ -import CardWrapper from '@/components/card-wrapper'; -import BarChart from '@/components/echarts/bar-chart'; -import HBar from '@/components/echarts/h-bar'; -import LineChart from '@/components/echarts/line-chart'; import PageTools from '@/components/page-tools'; import breakpoints from '@/config/breakpoints'; import useWindowResize from '@/hooks/use-window-resize'; @@ -11,6 +7,8 @@ import dayjs from 'dayjs'; import _ from 'lodash'; import { useContext, useEffect, useState } from 'react'; import { DashboardContext } from '../config/dashboard-context'; +import RequestTokenInner from './usage-inner/request-token-inner'; +import TopUser from './usage-inner/top-user'; const baseColorMap = { baseL2: 'rgba(13,171,219,0.8)', @@ -38,28 +36,27 @@ const Usage = () => { const intl = useIntl(); const { size } = useWindowResize(); const [paddingRight, setPaddingRight] = useState('20px'); - const [requestData, setRequestData] = useState< - { - name: string; - color: string; - areaStyle: any; - data: { time: string; value: number }[]; - }[] - >([]); + console.log('usage========'); + const currentDate = dayjs(); const currentMonthDays = getCurrentMonthDays(); - const [tokenData, setTokenData] = useState<{ time: string; value: number }[]>( - [] - ); - const [userData, setUserData] = useState<{ name: string; value: number }[]>( - [] - ); - const [xAxisData, setXAxisData] = useState(currentMonthDays); - const [topUserList, setTopUseList] = useState([]); + let requestData: { + name: string; + color: string; + areaStyle: any; + data: { time: string; value: number }[]; + }[] = []; + let tokenData: { time: string; value: number }[] = []; + let userData: { name: string; value: number }[] = []; + const xAxisData: string[] = currentMonthDays; + let topUserList: string[] = []; - const data = useContext(DashboardContext)?.model_usage || {}; + const { model_usage, fetchData } = useContext(DashboardContext); + const data = model_usage || {}; - const handleSelectDate = (date: any) => {}; + const handleSelectDate = (date: any) => { + // fetchData?.(); + }; const generateData = () => { const requestList: { @@ -68,30 +65,30 @@ const Usage = () => { areaStyle: any; data: { time: string; value: number }[]; } = { - name: 'API Request', + name: 'API requests', areaStyle: {}, color: baseColorMap.base, data: [] }; const completionData: any = { - name: 'completion_token', + name: 'Completion tokens', color: baseColorMap.base, data: [] }; const prompData: any = { - name: 'prompt_token', + name: 'Prompt tokens', color: baseColorMap.baseR3, data: [] }; const topUserPrompt: any = { - name: 'prompt_token', + name: 'Prompt tokens', color: baseColorMap.baseR3, data: [] }; const topUserCompletion: any = { - name: 'completion_token', + name: 'Completion tokens', color: baseColorMap.base, data: [] }; @@ -161,14 +158,10 @@ const Usage = () => { }); }); - setRequestData([requestList]); - setUserData([topUserCompletion, topUserPrompt]); - setTopUseList(users); - setTokenData([completionData, prompData]); - }; - - const labelFormatter = (v: any) => { - return dayjs(v).format('MM-DD'); + requestData = [requestList]; + userData = [topUserCompletion, topUserPrompt]; + topUserList = users; + tokenData = [completionData, prompData]; }; useEffect(() => { @@ -179,9 +172,7 @@ const Usage = () => { } }, [size.width]); - useEffect(() => { - generateData(); - }, [data]); + generateData(); return ( <> @@ -193,7 +184,7 @@ const Usage = () => { onChange={handleSelectDate} style={{ width: 300 }} picker="month" - defaultValue={dayjs()} + defaultValue={currentDate} /> } /> @@ -206,38 +197,14 @@ const Usage = () => { xl={16} style={{ paddingRight: paddingRight }} > - - - - - - - - - - + - - - + diff --git a/src/pages/dashboard/config/dashboard-context.ts b/src/pages/dashboard/config/dashboard-context.ts index 6d18d54e..fffb7358 100644 --- a/src/pages/dashboard/config/dashboard-context.ts +++ b/src/pages/dashboard/config/dashboard-context.ts @@ -1,8 +1,8 @@ import { createContext } from 'react'; import { DashboardProps } from './types'; -export const DashboardContext = createContext( - {} as DashboardProps -); +export const DashboardContext = createContext< + DashboardProps & { fetchData: () => Promise } +>({} as DashboardProps & { fetchData: () => Promise }); export default DashboardContext; diff --git a/src/pages/dashboard/index.tsx b/src/pages/dashboard/index.tsx index 3b78cf18..80048f75 100644 --- a/src/pages/dashboard/index.tsx +++ b/src/pages/dashboard/index.tsx @@ -1,44 +1,18 @@ import { PageContainer } from '@ant-design/pro-components'; import { Spin } from 'antd'; -import { useEffect, useState } from 'react'; -import { queryDashboardData } from './apis'; -import ActiveTable from './components/active-table'; -import Overview from './components/over-view'; -import SystemLoad from './components/system-load'; -import Usage from './components/usage'; -import DashboardContext from './config/dashboard-context'; -import { DashboardProps } from './config/types'; +import { memo, useState } from 'react'; +import DashboardInner from './components/dahboard-inner'; const Dashboard: React.FC = () => { - const [data, setData] = useState({} as DashboardProps); const [loading, setLoading] = useState(false); - const getDashboardData = async () => { - try { - setLoading(true); - const res = await queryDashboardData(); - setData(res); - setLoading(false); - } catch (error) { - setLoading(false); - setData({} as DashboardProps); - } - }; - useEffect(() => { - getDashboardData(); - }, []); return ( - - - - - - + ); }; -export default Dashboard; +export default memo(Dashboard); diff --git a/src/pages/llmodels/components/add-modal.tsx b/src/pages/llmodels/components/add-modal.tsx index a27f7c46..b1d274ed 100644 --- a/src/pages/llmodels/components/add-modal.tsx +++ b/src/pages/llmodels/components/add-modal.tsx @@ -146,6 +146,7 @@ const AddModal: React.FC = (props) => { onChange={handleInputRepoChange} onSearch={debounceSearch} options={repoOptions} + disabled={action === PageAction.EDIT} addAfter={ @@ -176,6 +177,7 @@ const AddModal: React.FC = (props) => { required options={fileOptions} onFocus={handleRepoOnBlur} + disabled={action === PageAction.EDIT} > @@ -229,6 +231,7 @@ const AddModal: React.FC = (props) => { > = (props) => { ]} > = (props) => { id: 'models.form.replicas' })} required - min={1} + min={0} > name="description"> diff --git a/src/pages/llmodels/config/index.ts b/src/pages/llmodels/config/index.ts index fc02e3ac..013d156f 100644 --- a/src/pages/llmodels/config/index.ts +++ b/src/pages/llmodels/config/index.ts @@ -19,7 +19,8 @@ export const modelSourceMap = { }; export const status: any = { - Running: StatusMaps.success + Running: StatusMaps.success, + Pending: StatusMaps.transitioning }; export const ActionList = [ diff --git a/src/pages/llmodels/index.tsx b/src/pages/llmodels/index.tsx index 08cf7896..adbfd423 100644 --- a/src/pages/llmodels/index.tsx +++ b/src/pages/llmodels/index.tsx @@ -334,9 +334,14 @@ const Models: React.FC = () => { handleViewLogs(row); } }; + useEffect(() => { + fetchData(); + return () => { + axiosToken?.cancel?.(); + }; + }, [queryParams]); useEffect(() => { - // fetchData(); createModelsChunkRequest(); return () => { chunkRequedtRef.current?.current?.cancel?.(); @@ -430,7 +435,7 @@ const Models: React.FC = () => { > diff --git a/src/pages/login/components/login-form.tsx b/src/pages/login/components/login-form.tsx index 45d8be78..3b6c87c4 100644 --- a/src/pages/login/components/login-form.tsx +++ b/src/pages/login/components/login-form.tsx @@ -11,7 +11,6 @@ import { SelectLang, history, useIntl, useModel } from '@umijs/max'; import { Button, Checkbox, Form } from 'antd'; import CryptoJS from 'crypto-js'; import { useAtom } from 'jotai'; -import { useEffect } from 'react'; import { flushSync } from 'react-dom'; import { login } from '../apis'; @@ -40,12 +39,21 @@ const renderWelCome = (intl: any) => { style={{ display: 'flex', marginBottom: 32, - fontSize: 24, + fontSize: 20, justifyContent: 'center', alignItems: 'center' }} > -
{intl?.formatMessage({ id: 'users.login.title' })}
+
+ + {intl?.formatMessage({ id: 'users.login.title' }, { name: '' })} + + logo +
); }; @@ -130,9 +138,7 @@ const LoginForm = () => { } }; - useEffect(() => { - callGetRememberMe(); - }, []); + callGetRememberMe(); return (
@@ -141,15 +147,9 @@ const LoginForm = () => { position: 'fixed', right: 0, top: 0, - left: 0, - width: '100%', - padding: '0 20px', - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center' + padding: '0 20px' }} > -
{renderLogo()}
} reload={false} />
diff --git a/src/pages/playground/components/chat-footer.tsx b/src/pages/playground/components/chat-footer.tsx index d1e02365..d77b6df1 100644 --- a/src/pages/playground/components/chat-footer.tsx +++ b/src/pages/playground/components/chat-footer.tsx @@ -47,7 +47,6 @@ const ChatFooter: React.FC = (props) => {
diff --git a/src/pages/resources/components/gpus.tsx b/src/pages/resources/components/gpus.tsx index e7605e55..21d1a5a3 100644 --- a/src/pages/resources/components/gpus.tsx +++ b/src/pages/resources/components/gpus.tsx @@ -88,11 +88,12 @@ const Models: React.FC = () => { id: 'common.filter.name' })} style={{ width: 300 }} + allowClear onChange={handleNameChange} > diff --git a/src/pages/resources/components/workers.tsx b/src/pages/resources/components/workers.tsx index 12addb7e..b7f508d3 100644 --- a/src/pages/resources/components/workers.tsx +++ b/src/pages/resources/components/workers.tsx @@ -119,11 +119,12 @@ const Models: React.FC = () => { id: 'common.filter.name' })} style={{ width: 300 }} + allowClear onChange={handleNameChange} > diff --git a/src/pages/users/index.tsx b/src/pages/users/index.tsx index ba419b88..6b9d8ba4 100644 --- a/src/pages/users/index.tsx +++ b/src/pages/users/index.tsx @@ -213,11 +213,12 @@ const Models: React.FC = () => { diff --git a/src/utils/index.ts b/src/utils/index.ts index 63c571b3..5e078d7e 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -3,13 +3,7 @@ export const isNotEmptyValue = (value: any) => { if (Array.isArray(value)) { return value.length > 0; } - return ( - value !== null && - value !== undefined && - value !== '' && - value !== false && - value !== 0 - ); + return !!value || value === 0 || value === false; }; export const handleBatchRequest = async (