Allow deleting specific HypaV3 summaries if orphaned

This commit is contained in:
alattalatta
2025-04-22 23:00:59 +09:00
parent 22a50904f8
commit 6837206755
8 changed files with 32 additions and 5 deletions

View File

@@ -800,6 +800,7 @@ export const languageChinese = {
"noSummariesLabel": "尚无总结", "noSummariesLabel": "尚无总结",
"searchPlaceholder": "输入 #N、ID 或搜索关键词", "searchPlaceholder": "输入 #N、ID 或搜索关键词",
"summaryNumberLabel": "总结 #{0}", "summaryNumberLabel": "总结 #{0}",
"deleteThisConfirmMessage": "删除此摘要?",
"deleteAfterConfirmMessage": "删除此后的所有总结?", "deleteAfterConfirmMessage": "删除此后的所有总结?",
"deleteAfterConfirmSecondMessage": "此操作无法撤销。您确定吗?", "deleteAfterConfirmSecondMessage": "此操作无法撤销。您确定吗?",
"translationLabel": "翻译", "translationLabel": "翻译",

View File

@@ -464,6 +464,7 @@ export const languageGerman = {
"noSummariesLabel": "Noch keine Zusammenfassungen", "noSummariesLabel": "Noch keine Zusammenfassungen",
"searchPlaceholder": "Geben Sie #N, ID oder Suchanfrage ein", "searchPlaceholder": "Geben Sie #N, ID oder Suchanfrage ein",
"summaryNumberLabel": "Zusammenfassung #{0}", "summaryNumberLabel": "Zusammenfassung #{0}",
"deleteThisConfirmMessage": "Diese Zusammenfassung löschen?",
"deleteAfterConfirmMessage": "Alle Zusammenfassungen nach dieser löschen?", "deleteAfterConfirmMessage": "Alle Zusammenfassungen nach dieser löschen?",
"deleteAfterConfirmSecondMessage": "Diese Aktion kann nicht rückgängig gemacht werden. Sind Sie wirklich sicher?", "deleteAfterConfirmSecondMessage": "Diese Aktion kann nicht rückgängig gemacht werden. Sind Sie wirklich sicher?",
"translationLabel": "Übersetzung", "translationLabel": "Übersetzung",

View File

@@ -1036,6 +1036,7 @@ export const languageEnglish = {
noSummariesLabel: "No summaries yet", noSummariesLabel: "No summaries yet",
searchPlaceholder: "Enter #N, ID, or query", searchPlaceholder: "Enter #N, ID, or query",
summaryNumberLabel: "Summary #{0}", summaryNumberLabel: "Summary #{0}",
deleteThisConfirmMessage: "Delete this summary?",
deleteAfterConfirmMessage: "Delete all summaries after this one?", deleteAfterConfirmMessage: "Delete all summaries after this one?",
deleteAfterConfirmSecondMessage: "This action cannot be undone. Are you really sure?", deleteAfterConfirmSecondMessage: "This action cannot be undone. Are you really sure?",
translationLabel: "Translation", translationLabel: "Translation",

View File

@@ -709,6 +709,7 @@ export const languageSpanish = {
"noSummariesLabel": "Aún no hay resúmenes", "noSummariesLabel": "Aún no hay resúmenes",
"searchPlaceholder": "Ingrese #N, ID o búsqueda", "searchPlaceholder": "Ingrese #N, ID o búsqueda",
"summaryNumberLabel": "Resumen #{0}", "summaryNumberLabel": "Resumen #{0}",
"deleteThisConfirmMessage": "¿Eliminar este resumen?",
"deleteAfterConfirmMessage": "¿Eliminar todos los resúmenes después de este?", "deleteAfterConfirmMessage": "¿Eliminar todos los resúmenes después de este?",
"deleteAfterConfirmSecondMessage": "Esta acción no se puede deshacer. ¿Está realmente seguro?", "deleteAfterConfirmSecondMessage": "Esta acción no se puede deshacer. ¿Está realmente seguro?",
"translationLabel": "Traducción", "translationLabel": "Traducción",

View File

@@ -955,6 +955,7 @@ export const languageKorean = {
"noSummariesLabel": "아직 요약이 없습니다", "noSummariesLabel": "아직 요약이 없습니다",
"searchPlaceholder": "#N, ID 또는 검색어 입력", "searchPlaceholder": "#N, ID 또는 검색어 입력",
"summaryNumberLabel": "요약 #{0}", "summaryNumberLabel": "요약 #{0}",
"deleteThisConfirmMessage": "이 요약을 삭제하시겠습니까?",
"deleteAfterConfirmMessage": "이 요약 이후의 모든 요약을 삭제하시겠습니까?", "deleteAfterConfirmMessage": "이 요약 이후의 모든 요약을 삭제하시겠습니까?",
"deleteAfterConfirmSecondMessage": "이 작업은 되돌릴 수 없습니다. 정말 삭제하시겠습니까?", "deleteAfterConfirmSecondMessage": "이 작업은 되돌릴 수 없습니다. 정말 삭제하시겠습니까?",
"translationLabel": "번역", "translationLabel": "번역",

View File

@@ -438,6 +438,7 @@ export const LanguageVietnamese = {
"noSummariesLabel": "Chưa có tóm tắt nào", "noSummariesLabel": "Chưa có tóm tắt nào",
"searchPlaceholder": "Nhập #N, ID hoặc từ khóa", "searchPlaceholder": "Nhập #N, ID hoặc từ khóa",
"summaryNumberLabel": "Tóm tắt #{0}", "summaryNumberLabel": "Tóm tắt #{0}",
"deleteThisConfirmMessage": "Xóa bản tóm tắt này?",
"deleteAfterConfirmMessage": "Xóa tất cả các tóm tắt sau tóm tắt này?", "deleteAfterConfirmMessage": "Xóa tất cả các tóm tắt sau tóm tắt này?",
"deleteAfterConfirmSecondMessage": "Hành động này không thể hoàn tác. Bạn có chắc chắn không?", "deleteAfterConfirmSecondMessage": "Hành động này không thể hoàn tác. Bạn có chắc chắn không?",
"translationLabel": "Bản dịch", "translationLabel": "Bản dịch",

View File

@@ -833,6 +833,7 @@ export const languageChineseTraditional = {
"noSummariesLabel": "尚無摘要", "noSummariesLabel": "尚無摘要",
"searchPlaceholder": "輸入 #N、ID 或搜尋關鍵字", "searchPlaceholder": "輸入 #N、ID 或搜尋關鍵字",
"summaryNumberLabel": "摘要 #{0}", "summaryNumberLabel": "摘要 #{0}",
"deleteThisConfirmMessage": "刪除此摘要?",
"deleteAfterConfirmMessage": "刪除此摘要之後的所有摘要?", "deleteAfterConfirmMessage": "刪除此摘要之後的所有摘要?",
"deleteAfterConfirmSecondMessage": "此操作無法撤銷。您確定要這樣做嗎?", "deleteAfterConfirmSecondMessage": "此操作無法撤銷。您確定要這樣做嗎?",
"translationLabel": "翻譯", "translationLabel": "翻譯",

View File

@@ -404,23 +404,23 @@
summaryUIState.isTranslating = false; summaryUIState.isTranslating = false;
} }
function isRerollable(summaryIndex: number): boolean { function isOrphan(summaryIndex: number): boolean {
const summary = hypaV3DataState.summaries[summaryIndex]; const summary = hypaV3DataState.summaries[summaryIndex];
for (const chatMemo of summary.chatMemos) { for (const chatMemo of summary.chatMemos) {
if (!getMessageFromChatMemo(chatMemo)) { if (!getMessageFromChatMemo(chatMemo)) {
return false; return true;
} }
} }
return true; return false;
} }
async function toggleReroll(summaryIndex: number): Promise<void> { async function toggleReroll(summaryIndex: number): Promise<void> {
const summaryUIState = summaryUIStates[summaryIndex]; const summaryUIState = summaryUIStates[summaryIndex];
if (summaryUIState.isRerolling) return; if (summaryUIState.isRerolling) return;
if (!isRerollable(summaryIndex)) return; if (isOrphan(summaryIndex)) return;
summaryUIState.isRerolling = true; summaryUIState.isRerolling = true;
summaryUIState.rerolledText = "Loading..."; summaryUIState.rerolledText = "Loading...";
@@ -1074,12 +1074,32 @@
<button <button
class="p-2 text-zinc-400 hover:text-zinc-200 transition-colors" class="p-2 text-zinc-400 hover:text-zinc-200 transition-colors"
tabindex="-1" tabindex="-1"
disabled={!isRerollable(i)} disabled={isOrphan(i)}
onclick={async () => await toggleReroll(i)} onclick={async () => await toggleReroll(i)}
> >
<RefreshCw class="w-4 h-4" /> <RefreshCw class="w-4 h-4" />
</button> </button>
<!-- Delete This Button -->
<button
class="p-2 text-zinc-400 hover:text-rose-300 transition-colors"
tabindex="-1"
disabled={!isOrphan(i)}
onclick={async () => {
if (
await alertConfirm(language.hypaV3Modal.deleteThisConfirmMessage)
) {
hypaV3DataState.summaries = hypaV3DataState.summaries.filter(
(_, index) => index !== i
);
}
showHypaV3Alert();
}}
>
<Trash2Icon class="w-4 h-4" />
</button>
<!-- Delete After Button --> <!-- Delete After Button -->
<button <button
class="p-2 text-zinc-400 hover:text-rose-300 transition-colors" class="p-2 text-zinc-400 hover:text-rose-300 transition-colors"