Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/locales/ach-UG/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,12 @@
"menu_expand_num_before": "crwdns8608:0crwdne8608:0",
"menu_expand_num_after": "crwdns8610:0crwdne8610:0",
"script_name_cannot_be_set_to_empty": "crwdns8612:0crwdne8612:0",
"edit_conflict": "Edit Conflict",
"confirm_override_when_edit_conflict": "This script was edited in another instance. Replacing it will overwrite those changes. Would you like to keep this version instead?",
"save_abort_when_edit_conflict": "The script was edited in another instance. Save aborted.",
"scriptname_conflict": "Script Name Conflict",
"confirm_save_when_scriptname_conflict": "This script name is already used by another script. Do you still want to save it?",
"save_abort_when_scriptname_conflict": "This script name is already used by another script. Save aborted.",
"eslint_config_format_error": "crwdns8614:0crwdne8614:0",
"export_success": "crwdns8616:0crwdne8616:0",
"get_backup_dir_url_failed": "crwdns8618:0crwdne8618:0",
Expand Down
6 changes: 6 additions & 0 deletions src/locales/de-DE/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,12 @@
"menu_expand_num_before": "Wenn Menüelemente mehr als",
"menu_expand_num_after": "sind, automatisch verbergen",
"script_name_cannot_be_set_to_empty": "Skriptname kann nicht leer gesetzt werden",
"edit_conflict": "Bearbeitungskonflikt",
"confirm_override_when_edit_conflict": "Dieses Skript wurde in einer anderen Instanz bearbeitet. Beim Ersetzen werden diese Änderungen überschrieben. Möchten Sie stattdessen diese Version behalten?",
"save_abort_when_edit_conflict": "Dieses Skript wurde in einer anderen Instanz bearbeitet. Speichern abgebrochen.",
"scriptname_conflict": "Skriptname-Konflikt",
"confirm_save_when_scriptname_conflict": "Dieser Skriptname wird bereits von einem anderen Skript verwendet. Möchten Sie ihn trotzdem speichern?",
"save_abort_when_scriptname_conflict": "Dieser Skriptname wird bereits von einem anderen Skript verwendet. Speichern abgebrochen.",
"eslint_config_format_error": "eslint-Konfigurationsformat-Fehler",
"export_success": "Export erfolgreich",
"get_backup_dir_url_failed": "Backup-Verzeichnis-Adresse abrufen fehlgeschlagen",
Expand Down
6 changes: 6 additions & 0 deletions src/locales/en-US/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,12 @@
"menu_expand_num_before": "Menu items more than",
"menu_expand_num_after": "will be hidden.",
"script_name_cannot_be_set_to_empty": "Script name cannot be empty",
"edit_conflict": "Edit Conflict",
"confirm_override_when_edit_conflict": "This script was edited in another instance. Replacing it will overwrite those changes. Would you like to keep this version instead?",
"save_abort_when_edit_conflict": "The script was edited in another instance. Save aborted.",
"scriptname_conflict": "Script Name Conflict",
"confirm_save_when_scriptname_conflict": "This script name is already used by another script. Do you still want to save it?",
"save_abort_when_scriptname_conflict": "This script name is already used by another script. Save aborted.",
"eslint_config_format_error": "eslint configuration format error",
"export_success": "Dump success saved",
"get_backup_dir_url_failed": "Failed to get backup directory address",
Expand Down
6 changes: 6 additions & 0 deletions src/locales/ja-JP/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,12 @@
"menu_expand_num_before": "メニュー項目が",
"menu_expand_num_after": "個を超えると自動的に非表示",
"script_name_cannot_be_set_to_empty": "スクリプト名を空に設定することはできません",
"edit_conflict": "編集の競合",
"confirm_override_when_edit_conflict": "このスクリプトは別のインスタンスで編集されています。置き換えるとその変更は上書きされます。このバージョンを保持しますか?",
"save_abort_when_edit_conflict": "このスクリプトは別のインスタンスで編集されています。保存は中止されました。",
"scriptname_conflict": "スクリプト名の競合",
"confirm_save_when_scriptname_conflict": "このスクリプト名はすでに別のスクリプトで使用されています。それでも保存しますか?",
"save_abort_when_scriptname_conflict": "このスクリプト名はすでに別のスクリプトで使用されています。保存を中止しました。",
"eslint_config_format_error": "ESLint設定フォーマットエラー",
"export_success": "エクスポートに成功しました",
"get_backup_dir_url_failed": "バックアップディレクトリアドレスの取得に失敗しました",
Expand Down
6 changes: 6 additions & 0 deletions src/locales/ru-RU/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,12 @@
"menu_expand_num_before": "Когда пунктов меню больше",
"menu_expand_num_after": ", автоматически скрывать",
"script_name_cannot_be_set_to_empty": "Имя скрипта не может быть пустым",
"edit_conflict": "Конфликт редактирования",
"confirm_override_when_edit_conflict": "Этот скрипт был изменён в другом экземпляре. Замена приведёт к перезаписи этих изменений. Хотите сохранить эту версию?",
"save_abort_when_edit_conflict": "Скрипт был изменён в другом экземпляре. Сохранение отменено.",
"scriptname_conflict": "Конфликт имени скрипта",
"confirm_save_when_scriptname_conflict": "Это имя скрипта уже используется другим скриптом. Вы всё равно хотите сохранить его?",
"save_abort_when_scriptname_conflict": "Это имя скрипта уже используется другим скриптом. Сохранение отменено.",
"eslint_config_format_error": "Ошибка формата конфигурации ESLint",
"export_success": "Экспорт успешен",
"get_backup_dir_url_failed": "Ошибка получения адреса папки резервных копий",
Expand Down
6 changes: 6 additions & 0 deletions src/locales/vi-VN/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,12 @@
"menu_expand_num_before": "Các mục menu nhiều hơn",
"menu_expand_num_after": "sẽ bị ẩn.",
"script_name_cannot_be_set_to_empty": "Tên script không được để trống",
"edit_conflict": "Xung đột chỉnh sửa",
"confirm_override_when_edit_conflict": "Tập lệnh này đã được chỉnh sửa ở một phiên bản khác. Việc thay thế sẽ ghi đè các thay đổi đó. Bạn có muốn giữ phiên bản này không?",
"save_abort_when_edit_conflict": "Tập lệnh đã được chỉnh sửa ở một phiên bản khác. Đã hủy lưu.",
"scriptname_conflict": "Xung đột tên script",
"confirm_save_when_scriptname_conflict": "Tên script này đã được sử dụng bởi một script khác. Bạn vẫn muốn lưu chứ?",
"save_abort_when_scriptname_conflict": "Tên script này đã được sử dụng bởi một script khác. Đã hủy lưu.",
"eslint_config_format_error": "Lỗi định dạng cấu hình eslint",
"export_success": "Đổ dữ liệu thành công đã lưu",
"get_backup_dir_url_failed": "Không thể lấy địa chỉ thư mục sao lưu",
Expand Down
6 changes: 6 additions & 0 deletions src/locales/zh-CN/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,12 @@
"menu_expand_num_before": "菜单项超过",
"menu_expand_num_after": "个时,自动隐藏",
"script_name_cannot_be_set_to_empty": "脚本name不可以设置为空",
"edit_conflict": "编辑冲突",
"confirm_override_when_edit_conflict": "此脚本已在其他实例中被修改。替换将覆盖这些更改。是否要保留此版本?",
"save_abort_when_edit_conflict": "该脚本已在其他实例中被修改,保存已中止。",
"scriptname_conflict": "脚本名称冲突",
"confirm_save_when_scriptname_conflict": "该脚本名称已被其他脚本使用,是否仍要保存?",
"save_abort_when_scriptname_conflict": "该脚本名称已被其他脚本使用,已取消保存。",
"eslint_config_format_error": "ESLint配置格式错误",
"export_success": "导出成功",
"get_backup_dir_url_failed": "获取备份目录地址失败",
Expand Down
6 changes: 6 additions & 0 deletions src/locales/zh-TW/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,12 @@
"menu_expand_num_before": "選單項目超過",
"menu_expand_num_after": "個時,自動隱藏",
"script_name_cannot_be_set_to_empty": "腳本名稱不可設定為空",
"edit_conflict": "編輯衝突",
"confirm_override_when_edit_conflict": "此腳本已在其他實例中被修改。替換將覆蓋這些變更。是否要保留此版本?",
"save_abort_when_edit_conflict": "此腳本已在其他實例中被修改,已中止儲存。",
"scriptname_conflict": "腳本名稱衝突",
"confirm_save_when_scriptname_conflict": "此腳本名稱已被其他腳本使用,是否仍要儲存?",
"save_abort_when_scriptname_conflict": "此腳本名稱已被其他腳本使用,已取消儲存。",
"eslint_config_format_error": "ESLint設定格式錯誤",
"export_success": "匯出成功",
"get_backup_dir_url_failed": "取得備份目錄網址失敗",
Expand Down
62 changes: 61 additions & 1 deletion src/pages/options/routes/script/ScriptEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -306,8 +306,38 @@ function ScriptEditor() {
const code = e.getValue();
const targetUUID = existingScript.uuid;
return prepareScriptByCode(code, existingScript.origin || "", targetUUID, false, scriptDAO, { byEditor: true })
.then((prepareScript) => {
.then(async (prepareScript) => {
const { script, oldScript } = prepareScript;
// 新增/更改名字时,有相同名字的脚本的话,提醒一下是否真的储存
if (
(!oldScript || oldScript.name !== script.name || oldScript.namespace !== script.namespace) &&
script.name &&
script.namespace
) {
const searchResult = await scriptDAO.findByNameAndNamespace(script.name, script.namespace);
if (searchResult && searchResult.uuid !== targetUUID) {
const modalResult = await new Promise((resolve) => {
modal.confirm!({
focusLock: false,
simple: false,
closable: true,
title: t("scriptname_conflict"),
content: t("confirm_save_when_scriptname_conflict"),
onOk: () => {
resolve("yes");
},
onCancel: () => {
resolve("no");
},
});
});
setTimeout(e.focus.bind(e), 50);
if (modalResult === "no") {
Message.warning(t("save_abort_when_scriptname_conflict"));
return Promise.reject(new Error("This script name is already used by another script. Save aborted."));
Copy link

Copilot AI Feb 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里在用户选择“不保存”时通过 Promise.reject(new Error(...)) 中止流程,会被外层 save().catch() 统一当作 invalid_script_code 处理并弹出错误提示;同时 run 菜单里 await save(...) 没有兜底 catch,取消保存会导致运行流程抛错/潜在未处理的 Promise rejection。建议为“用户主动取消保存”使用可识别的中止信号(如专用错误类型/错误码),并在 save() 的 catch 中对该类中止分支直接静默返回/仅保留 warning,不要走 invalid_script_code 提示;调用方(如 run)也应捕获并直接 return。

Suggested change
return Promise.reject(new Error("This script name is already used by another script. Save aborted."));
// 用户主动取消保存:中止当前保存流程,但不触发 Promise rejection
return;

Copilot uses AI. Check for mistakes.
}
}
}
if (targetUUID) {
if (existingScript.createtime !== 0) {
if (!oldScript || oldScript.uuid !== targetUUID) {
Expand All @@ -322,6 +352,36 @@ function ScriptEditor() {
Message.warning(t("script_name_cannot_be_set_to_empty"));
return Promise.reject(new Error("script name cannot be empty"));
}
const currentEditorUpdateTime = existingScript.updatetime;
const latestUpdateTime = oldScript?.updatetime ?? 0;

if (
currentEditorUpdateTime !== latestUpdateTime &&
latestUpdateTime > 0 &&
script.uuid === existingScript.uuid &&
script.uuid === oldScript?.uuid
) {
const modalResult = await new Promise((resolve) => {
modal.confirm!({
focusLock: false,
simple: false,
closable: true,
title: t("edit_conflict"),
content: t("confirm_override_when_edit_conflict"),
onOk: () => {
resolve("yes");
},
onCancel: () => {
resolve("no");
},
});
});
setTimeout(e.focus.bind(e), 50);
if (modalResult === "no") {
Message.warning(t("save_abort_when_edit_conflict"));
return Promise.reject(new Error("The script was edited in another instance. Save Aborted."));
}
}

if (script.ignoreVersion) script.ignoreVersion = "";
return scriptClient
Expand Down