Skip to content

Commit 283c8d4

Browse files
cyfung1031CodFrm
andauthored
✨ 优化编辑冲突&脚本名称冲突 (#1223)
* 重新 commit * 🐛 编辑冲突弹窗取消时不再弹出错误提示 用户在同名冲突或编辑冲突弹窗中点击取消属于主动取消, 统一使用 SAVE_CANCELED 标识并在 catch 链中跳过错误 toast。 --------- Co-authored-by: 王一之 <yz@ggnb.top>
1 parent 202b693 commit 283c8d4

9 files changed

Lines changed: 119 additions & 1 deletion

File tree

src/locales/ach-UG/translation.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,12 @@
420420
"menu_expand_num_before": "crwdns8608:0crwdne8608:0",
421421
"menu_expand_num_after": "crwdns8610:0crwdne8610:0",
422422
"script_name_cannot_be_set_to_empty": "crwdns8612:0crwdne8612:0",
423+
"edit_conflict": "Edit Conflict",
424+
"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?",
425+
"save_abort_when_edit_conflict": "The script was edited in another instance. Save aborted.",
426+
"scriptname_conflict": "Script Name Conflict",
427+
"confirm_save_when_scriptname_conflict": "This script name is already used by another script. Do you still want to save it?",
428+
"save_abort_when_scriptname_conflict": "This script name is already used by another script. Save aborted.",
423429
"eslint_config_format_error": "crwdns8614:0crwdne8614:0",
424430
"export_success": "crwdns8616:0crwdne8616:0",
425431
"get_backup_dir_url_failed": "crwdns8618:0crwdne8618:0",

src/locales/de-DE/translation.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,12 @@
429429
"menu_expand_num_before": "Wenn Menüelemente mehr als",
430430
"menu_expand_num_after": "sind, automatisch verbergen",
431431
"script_name_cannot_be_set_to_empty": "Skriptname kann nicht leer gesetzt werden",
432+
"edit_conflict": "Bearbeitungskonflikt",
433+
"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?",
434+
"save_abort_when_edit_conflict": "Dieses Skript wurde in einer anderen Instanz bearbeitet. Speichern abgebrochen.",
435+
"scriptname_conflict": "Skriptname-Konflikt",
436+
"confirm_save_when_scriptname_conflict": "Dieser Skriptname wird bereits von einem anderen Skript verwendet. Möchten Sie ihn trotzdem speichern?",
437+
"save_abort_when_scriptname_conflict": "Dieser Skriptname wird bereits von einem anderen Skript verwendet. Speichern abgebrochen.",
432438
"eslint_config_format_error": "eslint-Konfigurationsformat-Fehler",
433439
"export_success": "Export erfolgreich",
434440
"get_backup_dir_url_failed": "Backup-Verzeichnis-Adresse abrufen fehlgeschlagen",

src/locales/en-US/translation.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,12 @@
429429
"menu_expand_num_before": "Menu items more than",
430430
"menu_expand_num_after": "will be hidden.",
431431
"script_name_cannot_be_set_to_empty": "Script name cannot be empty",
432+
"edit_conflict": "Edit Conflict",
433+
"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?",
434+
"save_abort_when_edit_conflict": "The script was edited in another instance. Save aborted.",
435+
"scriptname_conflict": "Script Name Conflict",
436+
"confirm_save_when_scriptname_conflict": "This script name is already used by another script. Do you still want to save it?",
437+
"save_abort_when_scriptname_conflict": "This script name is already used by another script. Save aborted.",
432438
"eslint_config_format_error": "eslint configuration format error",
433439
"export_success": "Dump success saved",
434440
"get_backup_dir_url_failed": "Failed to get backup directory address",

src/locales/ja-JP/translation.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,12 @@
429429
"menu_expand_num_before": "メニュー項目が",
430430
"menu_expand_num_after": "個を超えると自動的に非表示",
431431
"script_name_cannot_be_set_to_empty": "スクリプト名を空に設定することはできません",
432+
"edit_conflict": "編集の競合",
433+
"confirm_override_when_edit_conflict": "このスクリプトは別のインスタンスで編集されています。置き換えるとその変更は上書きされます。このバージョンを保持しますか?",
434+
"save_abort_when_edit_conflict": "このスクリプトは別のインスタンスで編集されています。保存は中止されました。",
435+
"scriptname_conflict": "スクリプト名の競合",
436+
"confirm_save_when_scriptname_conflict": "このスクリプト名はすでに別のスクリプトで使用されています。それでも保存しますか?",
437+
"save_abort_when_scriptname_conflict": "このスクリプト名はすでに別のスクリプトで使用されています。保存を中止しました。",
432438
"eslint_config_format_error": "ESLint設定フォーマットエラー",
433439
"export_success": "エクスポートに成功しました",
434440
"get_backup_dir_url_failed": "バックアップディレクトリアドレスの取得に失敗しました",

src/locales/ru-RU/translation.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,12 @@
429429
"menu_expand_num_before": "Когда пунктов меню больше",
430430
"menu_expand_num_after": ", автоматически скрывать",
431431
"script_name_cannot_be_set_to_empty": "Имя скрипта не может быть пустым",
432+
"edit_conflict": "Конфликт редактирования",
433+
"confirm_override_when_edit_conflict": "Этот скрипт был изменён в другом экземпляре. Замена приведёт к перезаписи этих изменений. Хотите сохранить эту версию?",
434+
"save_abort_when_edit_conflict": "Скрипт был изменён в другом экземпляре. Сохранение отменено.",
435+
"scriptname_conflict": "Конфликт имени скрипта",
436+
"confirm_save_when_scriptname_conflict": "Это имя скрипта уже используется другим скриптом. Вы всё равно хотите сохранить его?",
437+
"save_abort_when_scriptname_conflict": "Это имя скрипта уже используется другим скриптом. Сохранение отменено.",
432438
"eslint_config_format_error": "Ошибка формата конфигурации ESLint",
433439
"export_success": "Экспорт успешен",
434440
"get_backup_dir_url_failed": "Ошибка получения адреса папки резервных копий",

src/locales/vi-VN/translation.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,12 @@
429429
"menu_expand_num_before": "Các mục menu nhiều hơn",
430430
"menu_expand_num_after": "sẽ bị ẩn.",
431431
"script_name_cannot_be_set_to_empty": "Tên script không được để trống",
432+
"edit_conflict": "Xung đột chỉnh sửa",
433+
"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?",
434+
"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.",
435+
"scriptname_conflict": "Xung đột tên script",
436+
"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ứ?",
437+
"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.",
432438
"eslint_config_format_error": "Lỗi định dạng cấu hình eslint",
433439
"export_success": "Đổ dữ liệu thành công đã lưu",
434440
"get_backup_dir_url_failed": "Không thể lấy địa chỉ thư mục sao lưu",

src/locales/zh-CN/translation.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,12 @@
429429
"menu_expand_num_before": "菜单项超过",
430430
"menu_expand_num_after": "个时,自动隐藏",
431431
"script_name_cannot_be_set_to_empty": "脚本name不可以设置为空",
432+
"edit_conflict": "编辑冲突",
433+
"confirm_override_when_edit_conflict": "此脚本已在其他实例中被修改。替换将覆盖这些更改。是否要保留此版本?",
434+
"save_abort_when_edit_conflict": "该脚本已在其他实例中被修改,保存已中止。",
435+
"scriptname_conflict": "脚本名称冲突",
436+
"confirm_save_when_scriptname_conflict": "该脚本名称已被其他脚本使用,是否仍要保存?",
437+
"save_abort_when_scriptname_conflict": "该脚本名称已被其他脚本使用,已取消保存。",
432438
"eslint_config_format_error": "ESLint配置格式错误",
433439
"export_success": "导出成功",
434440
"get_backup_dir_url_failed": "获取备份目录地址失败",

src/locales/zh-TW/translation.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,12 @@
429429
"menu_expand_num_before": "選單項目超過",
430430
"menu_expand_num_after": "個時,自動隱藏",
431431
"script_name_cannot_be_set_to_empty": "腳本名稱不可設定為空",
432+
"edit_conflict": "編輯衝突",
433+
"confirm_override_when_edit_conflict": "此腳本已在其他實例中被修改。替換將覆蓋這些變更。是否要保留此版本?",
434+
"save_abort_when_edit_conflict": "此腳本已在其他實例中被修改,已中止儲存。",
435+
"scriptname_conflict": "腳本名稱衝突",
436+
"confirm_save_when_scriptname_conflict": "此腳本名稱已被其他腳本使用,是否仍要儲存?",
437+
"save_abort_when_scriptname_conflict": "此腳本名稱已被其他腳本使用,已取消儲存。",
432438
"eslint_config_format_error": "ESLint設定格式錯誤",
433439
"export_success": "匯出成功",
434440
"get_backup_dir_url_failed": "取得備份目錄網址失敗",

src/pages/options/routes/script/ScriptEditor.tsx

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,39 @@ function ScriptEditor() {
305305
const code = e.getValue();
306306
const targetUUID = existingScript.uuid;
307307
return prepareScriptByCode(code, existingScript.origin || "", targetUUID, false, scriptDAO, { byEditor: true })
308-
.then((prepareScript) => {
308+
.then(async (prepareScript) => {
309309
const { script, oldScript } = prepareScript;
310+
// 新增/更改名字时,有相同名字的脚本的话,提醒一下是否真的储存
311+
if (
312+
(!oldScript || oldScript.name !== script.name || oldScript.namespace !== script.namespace) &&
313+
script.name &&
314+
script.namespace
315+
) {
316+
const searchResult = await scriptDAO.findByNameAndNamespace(script.name, script.namespace);
317+
if (searchResult && searchResult.uuid !== targetUUID) {
318+
const modalResult = await new Promise((resolve) => {
319+
modal.confirm!({
320+
focusLock: false,
321+
simple: false,
322+
closable: true,
323+
title: t("scriptname_conflict"),
324+
content: t("confirm_save_when_scriptname_conflict"),
325+
onOk: () => {
326+
resolve("yes");
327+
},
328+
onCancel: () => {
329+
resolve("no");
330+
},
331+
});
332+
});
333+
setTimeout(e.focus.bind(e), 50);
334+
if (modalResult === "no") {
335+
Message.warning(t("save_abort_when_scriptname_conflict"));
336+
// 用户主动取消,非错误
337+
return Promise.reject(new Error("SAVE_CANCELED"));
338+
}
339+
}
340+
}
310341
if (targetUUID) {
311342
if (existingScript.createtime !== 0) {
312343
if (!oldScript || oldScript.uuid !== targetUUID) {
@@ -321,6 +352,37 @@ function ScriptEditor() {
321352
Message.warning(t("script_name_cannot_be_set_to_empty"));
322353
return Promise.reject(new Error("script name cannot be empty"));
323354
}
355+
const currentEditorUpdateTime = existingScript.updatetime;
356+
const latestUpdateTime = oldScript?.updatetime ?? 0;
357+
358+
if (
359+
currentEditorUpdateTime !== latestUpdateTime &&
360+
latestUpdateTime > 0 &&
361+
script.uuid === existingScript.uuid &&
362+
script.uuid === oldScript?.uuid
363+
) {
364+
const modalResult = await new Promise((resolve) => {
365+
modal.confirm!({
366+
focusLock: false,
367+
simple: false,
368+
closable: true,
369+
title: t("edit_conflict"),
370+
content: t("confirm_override_when_edit_conflict"),
371+
onOk: () => {
372+
resolve("yes");
373+
},
374+
onCancel: () => {
375+
resolve("no");
376+
},
377+
});
378+
});
379+
setTimeout(e.focus.bind(e), 50);
380+
if (modalResult === "no") {
381+
Message.warning(t("save_abort_when_edit_conflict"));
382+
// 用户主动取消,非错误
383+
return Promise.reject(new Error("SAVE_CANCELED"));
384+
}
385+
}
324386

325387
if (script.ignoreVersion) script.ignoreVersion = "";
326388
return scriptClient
@@ -370,11 +432,19 @@ function ScriptEditor() {
370432
return script;
371433
})
372434
.catch((err: any) => {
435+
// 用户主动取消保存,不再弹出错误提示
436+
if (err instanceof Error && err.message === "SAVE_CANCELED") {
437+
return Promise.reject(err);
438+
}
373439
Message.error(`${t("save_failed")}: ${err}`);
374440
return Promise.reject(err);
375441
});
376442
})
377443
.catch((err) => {
444+
// 用户主动取消保存,不再弹出错误提示
445+
if (err instanceof Error && err.message === "SAVE_CANCELED") {
446+
return Promise.reject(err);
447+
}
378448
Message.error(`${t("invalid_script_code")}: ${err}`);
379449
return Promise.reject(err);
380450
});

0 commit comments

Comments
 (0)