From f4e17f0de7229d5df08b99b39d8eea46273916c7 Mon Sep 17 00:00:00 2001 From: scarqin Date: Tue, 7 Jan 2025 10:04:18 +0800 Subject: [PATCH 1/4] fix: i18n error --- .../common/src/locales/keyHashMap.json | 6 ++++- .../common/src/locales/scan/en-US.json | 6 ++++- .../common/src/locales/scan/ja-JP.json | 8 +++++-- .../src/locales/scan/newJson/en-US.json | 7 +++++- .../src/locales/scan/newJson/ja-JP.json | 7 +++++- .../src/locales/scan/newJson/zh-CN.json | 4 ++++ .../src/locales/scan/newJson/zh-TW.json | 7 +++++- .../src/locales/scan/oldJson/ja-JP.json | 8 +++---- .../common/src/locales/scan/zh-CN.json | 6 ++++- .../common/src/locales/scan/zh-TW.json | 6 ++++- .../src/pages/aiSetting/AiSettingModal.tsx | 6 ++--- .../aiSetting/components/ModelCardNode.tsx | 4 ++-- .../core/src/pages/keySettings/index.tsx | 2 +- frontend/prompt/Translate.md | 24 +++++++++++++++++++ 14 files changed, 82 insertions(+), 19 deletions(-) create mode 100644 frontend/prompt/Translate.md diff --git a/frontend/packages/common/src/locales/keyHashMap.json b/frontend/packages/common/src/locales/keyHashMap.json index ab4faf6f..14b2af88 100644 --- a/frontend/packages/common/src/locales/keyHashMap.json +++ b/frontend/packages/common/src/locales/keyHashMap.json @@ -333,13 +333,13 @@ "不是有效邮箱地址": "Kcbee3f8", "获取 AI providers 失败": "K94b48734", "AI 供应商": "Kf23a8988", - "预览": "K4d81a657", "AI 服务": "Kd2c34e2c", "模型": "Kfede1c7c", "已用 Token": "K89f135a7", "拦截": "Kb7df6ac1", "放行": "K5c1722fe", "编辑时间": "K1acc30b2", + "预览": "K4d81a657", "查看详情": "K35f990b0", "AI API 列表": "K91144ebd", "重置": "K50d471b2", @@ -398,6 +398,8 @@ "配置好 AI 模型后,你可以使用对应的大模型来创建 AI 服务": "K2260837a", "已设置": "Kf97448b3", "未设置": "K30d4d8df", + "保存后供应商状态变为【停用】,使用本供应商的 API 将临时使用负载优先级最高的正常供应商。": "Ke32702ac", + "保存后供应商状态变为【正常】,恢复调用本供应商的 AI 能力。": "Ka08c28d4", "默认模型": "Kc2ee5223", "负载优先级": "K608af899", "负载优先级决定在原供应商异常或停用后,优先使用哪一个供应商。优先级数字越小,优先级越高。": "K65b7a96", @@ -405,6 +407,7 @@ "请输入优先级": "Kfcf02780", "API Key(默认 Key)": "K5c6dcf58", "LLM 状态管理": "K59bf8ed9", + "当前调用状态:": "Kab8fe398", "正常": "Ke039b9b5", "停用": "Kedd64e4d", "异常": "K23a3bd72", @@ -477,6 +480,7 @@ "过期": "Kb9e7ceda", "错误": "Kac405b50", "请选择状态": "K3fde5b49", + "添加 (0) APIKey": "K4880fd04", "编辑 APIKey": "K434b7e76", "删除成功": "K28190dbc", "停用成功": "Kb5fcf5b8", diff --git a/frontend/packages/common/src/locales/scan/en-US.json b/frontend/packages/common/src/locales/scan/en-US.json index bfece0ae..c70caa9c 100644 --- a/frontend/packages/common/src/locales/scan/en-US.json +++ b/frontend/packages/common/src/locales/scan/en-US.json @@ -804,5 +804,9 @@ "Kefb03657": "APIKey Resource Pool", "Kc0352e64": "Supports creating multiple APIKeys under a single API model provider for intelligent load balancing", "Kd25acba1": "Please enter name to search", - "K6d0388a0": "Add APIKey" + "K6d0388a0": "Add APIKey", + "Ke32702ac": "After saving, the supplier status will become [Disabled]. APIs using this supplier will temporarily use the normal supplier with the highest load priority.", + "Ka08c28d4": "After saving, the supplier status will become [Normal], restoring the AI capabilities of this supplier.", + "Kab8fe398": "Current Call Status:", + "K4880fd04": "Add (0) APIKey" } diff --git a/frontend/packages/common/src/locales/scan/ja-JP.json b/frontend/packages/common/src/locales/scan/ja-JP.json index 509e031b..efe1d341 100644 --- a/frontend/packages/common/src/locales/scan/ja-JP.json +++ b/frontend/packages/common/src/locales/scan/ja-JP.json @@ -620,7 +620,7 @@ "K1cc07937": "有効期限", "K39686a7f": "先頭はアルファベットで、英数字とハイフン、アンダースコアの組み合わせをサポート", "Ka4ecfa40": "英数字またはアンダースコア、先頭は必ずアルファベット", - "K37318b68": "クラスタに接続できません。クラスタアドレスが正しいか、ファイアウォール設定を確認してください。", + "K37318b68": "クラスターに接続できません。クラスタアドレスが正しいか、ファイアウォール設定を確認してください。", "Kac172626": "申請を拒否する際は、拒否理由を記入してください。", "K7f0c746d": "成功", "K6a365d01": "失敗", @@ -826,5 +826,9 @@ "Kefb03657": "API キーリソースプール", "Kc0352e64": "単一の API モデルプロバイダーで複数の API キーを作成し、インテリジェントな負荷分散を実現できます", "Kd25acba1": "名前を入力して検索", - "K6d0388a0": "API キーを追加" + "K6d0388a0": "API キーを追加", + "Ke32702ac": "保存後、サプライヤーのステータスは【無効】となり、このサプライヤーのAPIは一時的に負荷優先度が最も高い正常なサプライヤーを使用します。", + "Ka08c28d4": "保存後、サプライヤーのステータスは【正常】となり、このサプライヤーのAI機能が復元されます。", + "Kab8fe398": "現在の呼び出し状態:", + "K4880fd04": "APIKeyを追加 (0)" } diff --git a/frontend/packages/common/src/locales/scan/newJson/en-US.json b/frontend/packages/common/src/locales/scan/newJson/en-US.json index 9e26dfee..3d1c19a5 100644 --- a/frontend/packages/common/src/locales/scan/newJson/en-US.json +++ b/frontend/packages/common/src/locales/scan/newJson/en-US.json @@ -1 +1,6 @@ -{} \ No newline at end of file +{ + "Ke32702ac": "保存后供应商状态变为【停用】,使用本供应商的 API 将临时使用负载优先级最高的正常供应商。", + "Ka08c28d4": "保存后供应商状态变为【正常】,恢复调用本供应商的 AI 能力。", + "Kab8fe398": "当前调用状态:", + "K4880fd04": "添加 (0) APIKey" +} \ No newline at end of file diff --git a/frontend/packages/common/src/locales/scan/newJson/ja-JP.json b/frontend/packages/common/src/locales/scan/newJson/ja-JP.json index 9e26dfee..3d1c19a5 100644 --- a/frontend/packages/common/src/locales/scan/newJson/ja-JP.json +++ b/frontend/packages/common/src/locales/scan/newJson/ja-JP.json @@ -1 +1,6 @@ -{} \ No newline at end of file +{ + "Ke32702ac": "保存后供应商状态变为【停用】,使用本供应商的 API 将临时使用负载优先级最高的正常供应商。", + "Ka08c28d4": "保存后供应商状态变为【正常】,恢复调用本供应商的 AI 能力。", + "Kab8fe398": "当前调用状态:", + "K4880fd04": "添加 (0) APIKey" +} \ No newline at end of file diff --git a/frontend/packages/common/src/locales/scan/newJson/zh-CN.json b/frontend/packages/common/src/locales/scan/newJson/zh-CN.json index d503c2d7..a14a907f 100644 --- a/frontend/packages/common/src/locales/scan/newJson/zh-CN.json +++ b/frontend/packages/common/src/locales/scan/newJson/zh-CN.json @@ -44,8 +44,12 @@ "Kd2850420": "待删除", "K83237c89": "输入的IP或CIDR不符合格式", "K5ae2c87a": "请正确输入路径,如/usr/*或*/usr/*", + "Ke32702ac": "保存后供应商状态变为【停用】,使用本供应商的 API 将临时使用负载优先级最高的正常供应商。", + "Ka08c28d4": "保存后供应商状态变为【正常】,恢复调用本供应商的 AI 能力。", + "Kab8fe398": "当前调用状态:", "K508d8bf4": "集成地址", "K67f4e9bb": "与外部平台集成时,获取 API 市场中文档信息的域名", + "K4880fd04": "添加 (0) APIKey", "Kc82b8374": "编辑策略", "K4b34a5e5": "策略类型", "K57f0fee8": "匹配条件", diff --git a/frontend/packages/common/src/locales/scan/newJson/zh-TW.json b/frontend/packages/common/src/locales/scan/newJson/zh-TW.json index 9e26dfee..3d1c19a5 100644 --- a/frontend/packages/common/src/locales/scan/newJson/zh-TW.json +++ b/frontend/packages/common/src/locales/scan/newJson/zh-TW.json @@ -1 +1,6 @@ -{} \ No newline at end of file +{ + "Ke32702ac": "保存后供应商状态变为【停用】,使用本供应商的 API 将临时使用负载优先级最高的正常供应商。", + "Ka08c28d4": "保存后供应商状态变为【正常】,恢复调用本供应商的 AI 能力。", + "Kab8fe398": "当前调用状态:", + "K4880fd04": "添加 (0) APIKey" +} \ No newline at end of file diff --git a/frontend/packages/common/src/locales/scan/oldJson/ja-JP.json b/frontend/packages/common/src/locales/scan/oldJson/ja-JP.json index 8b21b3dd..9cce1c7b 100644 --- a/frontend/packages/common/src/locales/scan/oldJson/ja-JP.json +++ b/frontend/packages/common/src/locales/scan/oldJson/ja-JP.json @@ -1,8 +1,8 @@ { - "Kc0e5ef9f": "Workspace", - "K4de11e23": "Home", - "Kfe93ef35": "Application", - "K61c89f5f": "API Portal", + "Kc0e5ef9f": "ワークスペース", + "K4de11e23": "ホーム", + "Kfe93ef35": "アプリケーション", + "K61c89f5f": "API ポータル", "K3fe97dcc": "設定", "Kecbb0e45": "システム", "Ka358e23d": "一般", diff --git a/frontend/packages/common/src/locales/scan/zh-CN.json b/frontend/packages/common/src/locales/scan/zh-CN.json index 8a26e875..5b9563b7 100644 --- a/frontend/packages/common/src/locales/scan/zh-CN.json +++ b/frontend/packages/common/src/locales/scan/zh-CN.json @@ -757,5 +757,9 @@ "Kefb03657": "APIKey 资源池", "Kc0352e64": "支持单个 API 模型供应商下创建多个 APIKey APIKey 进行智能负载均衡", "Kd25acba1": "请输入名称搜索", - "K6d0388a0": "添加 APIKey" + "K6d0388a0": "添加 APIKey", + "Ke32702ac": "保存后供应商状态变为【停用】,使用本供应商的 API 将临时使用负载优先级最高的正常供应商。", + "Ka08c28d4": "保存后供应商状态变为【正常】,恢复调用本供应商的 AI 能力。", + "Kab8fe398": "当前调用状态:", + "K4880fd04": "添加 (0) APIKey" } diff --git a/frontend/packages/common/src/locales/scan/zh-TW.json b/frontend/packages/common/src/locales/scan/zh-TW.json index 560dad0d..ca25b4e6 100644 --- a/frontend/packages/common/src/locales/scan/zh-TW.json +++ b/frontend/packages/common/src/locales/scan/zh-TW.json @@ -826,5 +826,9 @@ "Kefb03657": "APIKey 资源池", "Kc0352e64": "支持单个 API 模型供应商下创建多个 APIKey APIKey 进行智能负载均衡", "Kd25acba1": "请输入名称搜索", - "K6d0388a0": "添加 APIKey" + "K6d0388a0": "添加 APIKey", + "Ke32702ac": "儲存後供應商狀態變為【停用】,使用本供應商的 API 將暫時使用負載優先級最高的正常供應商。", + "Ka08c28d4": "儲存後供應商狀態變為【正常】,恢復調用本供應商的 AI 能力。", + "Kab8fe398": "目前調用狀態:", + "K4880fd04": "新增 (0) APIKey" } diff --git a/frontend/packages/core/src/pages/aiSetting/AiSettingModal.tsx b/frontend/packages/core/src/pages/aiSetting/AiSettingModal.tsx index 9527d009..a81a4c7d 100644 --- a/frontend/packages/core/src/pages/aiSetting/AiSettingModal.tsx +++ b/frontend/packages/core/src/pages/aiSetting/AiSettingModal.tsx @@ -97,9 +97,9 @@ const AiSettingModalContent = forwardRef { if (!isChecked) { - return '保存后供应商状态变为【停用】,使用本供应商的 API 将临时使用负载优先级最高的正常供应商。' + return $t('保存后供应商状态变为【停用】,使用本供应商的 API 将临时使用负载优先级最高的正常供应商。') } - return '保存后供应商状态变为【正常】,恢复调用本供应商的 AI 能力。' + return $t('保存后供应商状态变为【正常】,恢复调用本供应商的 AI 能力。') } useImperativeHandle(ref, () => ({ @@ -177,7 +177,7 @@ const AiSettingModalContent = forwardRef
- 当前调用状态: + {$t('当前调用状态:')} {entity.status === 'enabled' && {$t('正常')}} {entity.status === 'disabled' && {$t('停用')}} {entity.status === 'abnormal' && {$t('异常')}} diff --git a/frontend/packages/core/src/pages/aiSetting/components/ModelCardNode.tsx b/frontend/packages/core/src/pages/aiSetting/components/ModelCardNode.tsx index 99efbe2b..115177e1 100644 --- a/frontend/packages/core/src/pages/aiSetting/components/ModelCardNode.tsx +++ b/frontend/packages/core/src/pages/aiSetting/components/ModelCardNode.tsx @@ -1,6 +1,6 @@ +import { $t } from '@common/locales' import { Icon } from '@iconify/react' import { Handle, Position } from '@xyflow/react' -import { t } from 'i18next' import React from 'react' import { useAiSetting } from '../contexts/AiSettingContext' import { AiSettingListItem, ModelDetailData, ModelStatus } from '../types' @@ -59,7 +59,7 @@ export const ModelCardNode: React.FC<{ data: ModelCardNodeData }> = ({ data }) =
- {t('默认:')} + {$t('默认:')} {defaultLlm}
diff --git a/frontend/packages/core/src/pages/keySettings/index.tsx b/frontend/packages/core/src/pages/keySettings/index.tsx index 49a25e94..3f05d620 100644 --- a/frontend/packages/core/src/pages/keySettings/index.tsx +++ b/frontend/packages/core/src/pages/keySettings/index.tsx @@ -67,7 +67,7 @@ const KeySettings: React.FC = () => { const newEntity = entity as EditAPIKey modal.confirm({ - title: mode === 'add' ? $t(`添加 ${provider?.name} APIKey`) : $t('编辑 APIKey'), + title: mode === 'add' ? $t('添加 (0) APIKey', [provider?.name]) : $t('编辑 APIKey'), content: , onOk: () => { return new Promise((resolve, reject) => { diff --git a/frontend/prompt/Translate.md b/frontend/prompt/Translate.md new file mode 100644 index 00000000..72fb216d --- /dev/null +++ b/frontend/prompt/Translate.md @@ -0,0 +1,24 @@ +# Translation Workflow in Windsurf + +Follow these steps to manage translations in the project: + +1. **Scan for New Translations** + * Navigate to the `frontend` directory + * Run `pnpm run scan` to detect new translatable content + +2. **Locate New Translation Fields** + * Go to `packages/common/src/locales/scan/newJson` + * Find the language-specific JSON files (e.g., en-US.json, ja-JP.json) + * These files contain the new fields that need translation + +3. **Apply Translations** + * After translating the content, go to `packages/common/src/locales/scan` + * Open the corresponding language JSON file include ja-JP.json,en-US.json,zh-CH.json,zh-TW.json + * Paste the translated content into the appropriate file + +4. **Save and Apply** + * Save the file + * Changes will take effect immediately + * No additional build or restart is required + +Note: Available language files are en-US.json, ja-JP.json, zh-CN.json, and zh-TW.json. \ No newline at end of file From 4be1387c62b34a7883b4fe8b7f6c2c11c2e90ccc Mon Sep 17 00:00:00 2001 From: scarqin Date: Tue, 7 Jan 2025 10:32:03 +0800 Subject: [PATCH 2/4] fix: system logs lack of edit permission --- .../IntelligentPluginList.tsx | 28 +-- .../packages/common/src/const/permissions.ts | 8 +- .../src/pages/logsettings/LogSettings.tsx | 178 +++++++++--------- .../resourcesettings/ResourceSettings.tsx | 170 ++++++++--------- 4 files changed, 190 insertions(+), 194 deletions(-) diff --git a/frontend/packages/common/src/components/aoplatform/intelligent-plugin/IntelligentPluginList.tsx b/frontend/packages/common/src/components/aoplatform/intelligent-plugin/IntelligentPluginList.tsx index d5b7ac46..c048accf 100644 --- a/frontend/packages/common/src/components/aoplatform/intelligent-plugin/IntelligentPluginList.tsx +++ b/frontend/packages/common/src/components/aoplatform/intelligent-plugin/IntelligentPluginList.tsx @@ -1,21 +1,21 @@ +import { LoadingOutlined } from '@ant-design/icons' +import { ActionType, ParamsType } from '@ant-design/pro-components' +import { DrawerWithFooter } from '@common/components/aoplatform/DrawerWithFooter.tsx' import PageList, { PageProColumns } from '@common/components/aoplatform/PageList.tsx' +import TableBtnWithPermission from '@common/components/aoplatform/TableBtnWithPermission.tsx' +import WithPermission from '@common/components/aoplatform/WithPermission.tsx' +import { BasicResponse, COLUMNS_TITLE, DELETE_TIPS, RESPONSE_TIPS, STATUS_CODE } from '@common/const/const.tsx' +import { EntityItem } from '@common/const/type.ts' +import { useBreadcrumb } from '@common/contexts/BreadcrumbContext.tsx' +import { useGlobalContext } from '@common/contexts/GlobalStateContext.tsx' +import { useFetch } from '@common/hooks/http.ts' +import { $t } from '@common/locales/index.ts' +import { RouterParams } from '@core/components/aoplatform/RenderRoutes.tsx' import { App, Divider, Spin } from 'antd' +import { DefaultOptionType } from 'antd/es/cascader' import { useEffect, useMemo, useRef, useState } from 'react' import { useLocation, useOutletContext, useParams } from 'react-router-dom' -import { useBreadcrumb } from '@common/contexts/BreadcrumbContext.tsx' -import { ActionType, ParamsType } from '@ant-design/pro-components' -import { RouterParams } from '@core/components/aoplatform/RenderRoutes.tsx' -import { DefaultOptionType } from 'antd/es/cascader' import { IntelligentPluginConfig, IntelligentPluginConfigHandle } from './IntelligentPluginConfig.tsx' -import { BasicResponse, COLUMNS_TITLE, DELETE_TIPS, RESPONSE_TIPS, STATUS_CODE } from '@common/const/const.tsx' -import { useFetch } from '@common/hooks/http.ts' -import { EntityItem } from '@common/const/type.ts' -import WithPermission from '@common/components/aoplatform/WithPermission.tsx' -import TableBtnWithPermission from '@common/components/aoplatform/TableBtnWithPermission.tsx' -import { DrawerWithFooter } from '@common/components/aoplatform/DrawerWithFooter.tsx' -import { LoadingOutlined } from '@ant-design/icons' -import { $t } from '@common/locales/index.ts' -import { useGlobalContext } from '@common/contexts/GlobalStateContext.tsx' type DynamicTableField = { name: string @@ -233,7 +233,7 @@ export default function IntelligentPluginList() { onClick={() => { openDrawer('edit', entity) }} - btnTitle={$t('查看')} + btnTitle={$t('查看 ')} />, , { + const { moduleId } = useParams() + const [menuItems, setMenuItems] = useState([]) + const [activeMenu, setActiveMenu] = useState() + const { fetchData } = useFetch() + const [loading, setLoading] = useState(true) + const navigateTo = useNavigate() + const { state } = useGlobalContext() -const LogSettings = ()=>{ - const {moduleId} = useParams(); - const [menuItems, setMenuItems ] = useState([]) - const [activeMenu, setActiveMenu] = useState() - const {fetchData} = useFetch() - const [loading, setLoading] = useState(true) - const navigateTo = useNavigate() - const {state} = useGlobalContext() - - const getDynamicMenuList = ()=>{ - return fetchData>(`simple/dynamics/log`,{method:'GET'}).then(response=>{ - const {code,data,msg} = response - if(code === STATUS_CODE.SUCCESS){ - - setMenuItems(data.dynamics) - if(!activeMenu || activeMenu.length === 0){ - navigateTo(`/logsettings/template/${data.dynamics[0].name}`) - } - return Promise.resolve(data.dynamics) - }else{ - message.error(msg || $t(RESPONSE_TIPS.error)) - return Promise.reject(msg || $t(RESPONSE_TIPS.error)) - } - }) - } - - const menuData = useMemo(()=>{ - const newMenu = menuItems?.map((x:DynamicMenuItem)=>{ - return getItem( - {$t(x.title)}, - x.name, - undefined, - undefined, - undefined, - 'system.settings.log_configuration.view') - }) - return newMenu - },[state.language,menuItems]) - - const onMenuClick: MenuProps['onClick'] = ({key}) => { - setActiveMenu(key) - }; - - - useEffect(() => { - setActiveMenu(moduleId) - }, [ moduleId]); - - useEffect(()=>{ - setLoading(true) - Promise.all([getDynamicMenuList()]).finally(()=>setLoading(false)) - },[]) - - return ( - <> - - -
- -
- -
-
-
-
- + const getDynamicMenuList = () => { + return fetchData>(`simple/dynamics/log`, { method: 'GET' }).then( + (response) => { + const { code, data, msg } = response + if (code === STATUS_CODE.SUCCESS) { + setMenuItems(data.dynamics) + if (!activeMenu || activeMenu.length === 0) { + navigateTo(`/logsettings/template/${data.dynamics[0].name}`) + } + return Promise.resolve(data.dynamics) + } else { + message.error(msg || $t(RESPONSE_TIPS.error)) + return Promise.reject(msg || $t(RESPONSE_TIPS.error)) + } + } ) + } + + const menuData = useMemo(() => { + const newMenu = menuItems?.map((x: DynamicMenuItem) => { + return getItem( + {$t(x.title)}, + x.name, + undefined, + undefined, + undefined, + 'system.settings.log_configuration.view' + ) + }) + return newMenu + }, [state.language, menuItems]) + + const onMenuClick: MenuProps['onClick'] = ({ key }) => { + setActiveMenu(key) + } + + useEffect(() => { + setActiveMenu(moduleId) + }, [moduleId]) + + useEffect(() => { + setLoading(true) + Promise.all([getDynamicMenuList()]).finally(() => setLoading(false)) + }, []) + + return ( + <> + + +
+ +
+ +
+
+
+
+ + ) } -export default LogSettings; \ No newline at end of file +export default LogSettings diff --git a/frontend/packages/core/src/pages/resourcesettings/ResourceSettings.tsx b/frontend/packages/core/src/pages/resourcesettings/ResourceSettings.tsx index fe24c935..7928f12d 100644 --- a/frontend/packages/core/src/pages/resourcesettings/ResourceSettings.tsx +++ b/frontend/packages/core/src/pages/resourcesettings/ResourceSettings.tsx @@ -1,95 +1,89 @@ +import InsidePage from '@common/components/aoplatform/InsidePage' +import { BasicResponse, RESPONSE_TIPS, STATUS_CODE } from '@common/const/const' +import { DynamicMenuItem } from '@common/const/type' +import { useGlobalContext } from '@common/contexts/GlobalStateContext' +import { useFetch } from '@common/hooks/http' +import { $t } from '@common/locales' +import { getItem } from '@common/utils/navigation' +import { RouterParams } from '@core/components/aoplatform/RenderRoutes' +import { Menu, MenuProps, Skeleton, message } from 'antd' +import { useEffect, useMemo, useState } from 'react' +import { Link, Outlet, useNavigate, useParams } from 'react-router-dom' -import { Menu, MenuProps, Skeleton, message } from "antd"; -import { Link, Outlet, useNavigate, useParams } from "react-router-dom"; -import InsidePage from "@common/components/aoplatform/InsidePage"; -import { useEffect, useMemo, useState } from "react"; -import { BasicResponse, RESPONSE_TIPS, STATUS_CODE } from "@common/const/const"; -import { DynamicMenuItem } from "@common/const/type"; -import { useFetch } from "@common/hooks/http"; -import { getItem } from "@common/utils/navigation"; -import { RouterParams } from "@core/components/aoplatform/RenderRoutes"; -import { $t } from "@common/locales"; -import { useGlobalContext } from "@common/contexts/GlobalStateContext"; +const LogSettings = () => { + const { moduleId } = useParams() + const [menuItems, setMenuItems] = useState([]) + const [activeMenu, setActiveMenu] = useState() + const { fetchData } = useFetch() + const [loading, setLoading] = useState(true) + const navigateTo = useNavigate() + const { state } = useGlobalContext() -const LogSettings = ()=>{ - const {moduleId} = useParams(); - const [menuItems, setMenuItems ] = useState([]) - const [activeMenu, setActiveMenu] = useState() - const {fetchData} = useFetch() - const [loading, setLoading] = useState(true) - const navigateTo = useNavigate() - const {state} = useGlobalContext() - - const getDynamicMenuList = ()=>{ - setLoading(true) - fetchData>(`simple/dynamics/resource`,{method:'GET'}).then(response=>{ - const {code,data,msg} = response - if(code === STATUS_CODE.SUCCESS){ - - - setMenuItems(data.dynamics) - if(!activeMenu || activeMenu.length === 0){ - navigateTo(`/resourcesettings/template/${data.dynamics[0].name}`) - } - }else{ - message.error(msg || $t(RESPONSE_TIPS.error)) - } - }).finally(()=>setLoading(false)) - } + const getDynamicMenuList = () => { + setLoading(true) + fetchData>(`simple/dynamics/resource`, { method: 'GET' }) + .then((response) => { + const { code, data, msg } = response + if (code === STATUS_CODE.SUCCESS) { + setMenuItems(data.dynamics) + if (!activeMenu || activeMenu.length === 0) { + navigateTo(`/resourcesettings/template/${data.dynamics[0].name}`) + } + } else { + message.error(msg || $t(RESPONSE_TIPS.error)) + } + }) + .finally(() => setLoading(false)) + } - - const menuData = useMemo(()=>{ - const newMenu = menuItems?.map((x:DynamicMenuItem)=>{ - - return getItem( - {$t(x.title)}, - x.name, - undefined, - undefined, - undefined, - 'system.settings.log_configuration.view') - }) - return newMenu - },[state.language,menuItems]) + const menuData = useMemo(() => { + const newMenu = menuItems?.map((x: DynamicMenuItem) => { + return getItem( + {$t(x.title)}, + x.name, + undefined, + undefined, + undefined, + 'system.settings.log_configuration.view' + ) + }) + return newMenu + }, [state.language, menuItems]) + const onMenuClick: MenuProps['onClick'] = ({ key }) => { + setActiveMenu(key) + } - const onMenuClick: MenuProps['onClick'] = ({key}) => { - setActiveMenu(key) - }; - - useEffect(() => { - setActiveMenu(moduleId) - }, [ moduleId]); - - useEffect(()=>{ - setLoading(true) - getDynamicMenuList() - },[]) - - - return ( - <> - - -
- -
- -
-
-
-
- - ) + useEffect(() => { + setActiveMenu(moduleId) + }, [moduleId]) + + useEffect(() => { + setLoading(true) + getDynamicMenuList() + }, []) + + return ( + <> + + +
+ +
+ +
+
+
+
+ + ) } -export default LogSettings; \ No newline at end of file +export default LogSettings From 0adc9631294e5be105e0b2c50b8326cd99ac6af5 Mon Sep 17 00:00:00 2001 From: scarqin Date: Tue, 7 Jan 2025 10:45:42 +0800 Subject: [PATCH 3/4] fix: After the release log configuration is successful, there is no success prompt and the list is not refreshed --- .../aoplatform/TableBtnWithPermission.tsx | 15 ++++++++------- .../intelligent-plugin/IntelligentPluginList.tsx | 6 +++--- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/frontend/packages/common/src/components/aoplatform/TableBtnWithPermission.tsx b/frontend/packages/common/src/components/aoplatform/TableBtnWithPermission.tsx index 7c938271..b951a7c5 100644 --- a/frontend/packages/common/src/components/aoplatform/TableBtnWithPermission.tsx +++ b/frontend/packages/common/src/components/aoplatform/TableBtnWithPermission.tsx @@ -1,10 +1,10 @@ -import { Button, Tooltip } from 'antd' -import { useState, useMemo, useEffect, useCallback } from 'react' -import { useGlobalContext } from '@common/contexts/GlobalStateContext' -import { useNavigate } from 'react-router-dom' import { PERMISSION_DEFINITION } from '@common/const/permissions' -import { Icon } from '@iconify/react/dist/iconify.js' +import { useGlobalContext } from '@common/contexts/GlobalStateContext' import { $t } from '@common/locales' +import { Icon } from '@iconify/react/dist/iconify.js' +import { Button, Tooltip } from 'antd' +import { useCallback, useEffect, useMemo, useState } from 'react' +import { useNavigate } from 'react-router-dom' type TableBtnWithPermissionProps = { btnTitle: string @@ -25,6 +25,7 @@ const TableIconName = { copy: 'ic:baseline-file-copy', view: 'ic:baseline-remove-red-eye', publish: 'ic:baseline-publish', + offline: 'ic:baseline-file-download-off', approval: 'ic:baseline-approval', stop: 'ic:baseline-stop-circle', online: 'ic:baseline-check-circle', @@ -86,7 +87,7 @@ const TableBtnWithPermission = ({ - {type !== 'apiDetail' && ( + {!isAIApiPreview && ( @@ -298,7 +298,7 @@ const AiServiceInsideRouterCreate = () => { spinning={loading} wrapperClassName=" pb-PAGE_INSIDE_B pr-PAGE_INSIDE_X" > - +
{ label={$t('提示词')} name="prompt"> @@ -361,7 +361,7 @@ const AiServiceInsideRouterCreate = () => {
{$t('变量')}