chore: deprecate remove completed tasks action

- Remove menu item and dialog from MemoActionMenu
- Remove removeCompletedTasks() and hasCompletedTasks() utilities
- Remove translation keys from all 34 locale files
- Feature was not aligned with standard note-taking UX patterns
This commit is contained in:
Johnny 2026-01-31 21:03:05 +08:00
parent 5396c126b8
commit 8cd9c591d4
35 changed files with 1 additions and 173 deletions

View File

@ -8,7 +8,6 @@ import {
FileTextIcon,
LinkIcon,
MoreVerticalIcon,
SquareCheckIcon,
TrashIcon,
} from "lucide-react";
import { useState } from "react";
@ -25,7 +24,6 @@ import {
} from "@/components/ui/dropdown-menu";
import { State } from "@/types/proto/api/v1/common_pb";
import { useTranslate } from "@/utils/i18n";
import { hasCompletedTasks } from "@/utils/markdown-manipulation";
import { useMemoActionHandlers } from "./hooks";
import type { MemoActionMenuProps } from "./types";
@ -35,10 +33,8 @@ const MemoActionMenu = (props: MemoActionMenuProps) => {
// Dialog state
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
const [removeTasksDialogOpen, setRemoveTasksDialogOpen] = useState(false);
// Derived state
const hasCompletedTaskList = hasCompletedTasks(memo.content);
const isComment = Boolean(memo.parent);
const isArchived = memo.state === State.ARCHIVED;
@ -51,13 +47,10 @@ const MemoActionMenu = (props: MemoActionMenuProps) => {
handleCopyContent,
handleDeleteMemoClick,
confirmDeleteMemo,
handleRemoveCompletedTaskListItemsClick,
confirmRemoveCompletedTaskListItems,
} = useMemoActionHandlers({
memo,
onEdit: props.onEdit,
setDeleteDialogOpen,
setRemoveTasksDialogOpen,
});
return (
@ -107,14 +100,6 @@ const MemoActionMenu = (props: MemoActionMenuProps) => {
{/* Write actions (non-readonly) */}
{!readonly && (
<>
{/* Remove completed tasks (non-archived, non-comment, has completed tasks) */}
{!isArchived && !isComment && hasCompletedTaskList && (
<DropdownMenuItem onClick={handleRemoveCompletedTaskListItemsClick}>
<SquareCheckIcon className="w-4 h-auto" />
{t("memo.remove-completed-task-list-items")}
</DropdownMenuItem>
)}
{/* Archive/Restore (non-comment) */}
{!isComment && (
<DropdownMenuItem onClick={handleToggleMemoStatusClick}>
@ -143,17 +128,6 @@ const MemoActionMenu = (props: MemoActionMenuProps) => {
onConfirm={confirmDeleteMemo}
confirmVariant="destructive"
/>
{/* Remove completed tasks confirmation */}
<ConfirmDialog
open={removeTasksDialogOpen}
onOpenChange={setRemoveTasksDialogOpen}
title={t("memo.remove-completed-task-list-items-confirm")}
confirmLabel={t("common.confirm")}
cancelLabel={t("common.cancel")}
onConfirm={confirmRemoveCompletedTaskListItems}
confirmVariant="destructive"
/>
</DropdownMenu>
);
};

View File

@ -11,16 +11,14 @@ import { handleError } from "@/lib/error";
import { State } from "@/types/proto/api/v1/common_pb";
import type { Memo } from "@/types/proto/api/v1/memo_service_pb";
import { useTranslate } from "@/utils/i18n";
import { removeCompletedTasks } from "@/utils/markdown-manipulation";
interface UseMemoActionHandlersOptions {
memo: Memo;
onEdit?: () => void;
setDeleteDialogOpen: (open: boolean) => void;
setRemoveTasksDialogOpen: (open: boolean) => void;
}
export const useMemoActionHandlers = ({ memo, onEdit, setDeleteDialogOpen, setRemoveTasksDialogOpen }: UseMemoActionHandlersOptions) => {
export const useMemoActionHandlers = ({ memo, onEdit, setDeleteDialogOpen }: UseMemoActionHandlersOptions) => {
const t = useTranslate();
const location = useLocation();
const navigateTo = useNavigateTo();
@ -108,23 +106,6 @@ export const useMemoActionHandlers = ({ memo, onEdit, setDeleteDialogOpen, setRe
memoUpdatedCallback();
}, [memo.name, t, isInMemoDetailPage, navigateTo, memoUpdatedCallback, deleteMemo]);
const handleRemoveCompletedTaskListItemsClick = useCallback(() => {
setRemoveTasksDialogOpen(true);
}, [setRemoveTasksDialogOpen]);
const confirmRemoveCompletedTaskListItems = useCallback(async () => {
const newContent = removeCompletedTasks(memo.content);
await updateMemo({
update: {
name: memo.name,
content: newContent,
},
updateMask: ["content"],
});
toast.success(t("message.remove-completed-task-list-items-successfully"));
memoUpdatedCallback();
}, [memo.name, memo.content, t, memoUpdatedCallback, updateMemo]);
return {
handleTogglePinMemoBtnClick,
handleEditMemoClick,
@ -133,7 +114,5 @@ export const useMemoActionHandlers = ({ memo, onEdit, setDeleteDialogOpen, setRe
handleCopyContent,
handleDeleteMemoClick,
confirmDeleteMemo,
handleRemoveCompletedTaskListItemsClick,
confirmRemoveCompletedTaskListItems,
};
};

View File

@ -152,8 +152,6 @@
"no-archived-memos": "لا يوجد مذكرات مؤرشفة",
"no-memos": "لا يوجد مذكرات.",
"order-by": "ترتيب حسب",
"remove-completed-task-list-items": "إزالة المنجز",
"remove-completed-task-list-items-confirm": "هل أنت متأكد أنك تريد إزالة جميع المهام المنجزة؟ (هذه العملية لا يمكن التراجع عنها)",
"search-placeholder": "ابحث عن مذكرة...",
"show-less": "عرض أقل",
"show-more": "عرض المزيد",
@ -183,7 +181,6 @@
"no-data": "لا توجد بيانات.",
"password-changed": "تم تغيير كلمة المرور",
"password-not-match": "كلمات المرور غير متطابقة.",
"remove-completed-task-list-items-successfully": "تمت الإزالة بنجاح",
"restored-successfully": "تمت الاستعادة بنجاح",
"succeed-copy-link": "تم نسخ الرابط بنجاح.",
"update-succeed": "تم التحديث بنجاح",

View File

@ -152,8 +152,6 @@
"no-archived-memos": "No hi ha notes arxivades.",
"no-memos": "No hi ha notes.",
"order-by": "Ordena per",
"remove-completed-task-list-items": "Elimina fets",
"remove-completed-task-list-items-confirm": "Estàs segur que vols eliminar totes les tasques completades? AQUESTA ACCIÓ ÉS IRREVERSIBLE",
"search-placeholder": "Cerca notes...",
"show-less": "Mostra menys",
"show-more": "Mostra més",
@ -183,7 +181,6 @@
"no-data": "No s'han trobat dades.",
"password-changed": "Contrasenya canviada",
"password-not-match": "Les contrasenyes no coincideixen.",
"remove-completed-task-list-items-successfully": "Eliminació correcta",
"restored-successfully": "Restaurat correctament",
"succeed-copy-link": "Enllaç copiat correctament.",
"update-succeed": "Actualització correcta",

View File

@ -152,8 +152,6 @@
"no-archived-memos": "Žádné archivované poznámky.",
"no-memos": "Žádné poznámky.",
"order-by": "Řadit dle",
"remove-completed-task-list-items": "Odstranit dokončené",
"remove-completed-task-list-items-confirm": "Jste si jisti, že chcete odstranit všechny dokončené úkoly? TATO AKCE JE NEVRATNÁ",
"search-placeholder": "Hledat poznámky...",
"show-less": "Zobrazit méně",
"show-more": "Zobrazit více",
@ -181,7 +179,6 @@
"no-data": "Nebyly nalezeny žádné údaje.",
"password-changed": "Heslo změněno",
"password-not-match": "Hesla nesouhlasí.",
"remove-completed-task-list-items-successfully": "Úspěšně odstraněno",
"restored-successfully": "Úspěšně obnoveno",
"succeed-copy-link": "Odkaz byl úspěšně zkopírován.",
"update-succeed": "Aktualizace proběhla úspěšně",

View File

@ -169,8 +169,6 @@
"no-archived-memos": "Keine archivierten Notizen.",
"no-memos": "Keine Notizen.",
"order-by": "Sortieren nach",
"remove-completed-task-list-items": "Erledigte entfernen",
"remove-completed-task-list-items-confirm": "Sind Sie sicher, dass Sie alle abgeschlossenen Aufgaben entfernen möchten?\n\nDIESE AKTION KANN NICHT RÜCKGÄNGIG GEMACHT WERDEN.",
"search-placeholder": "Notizen durchsuchen...",
"show-less": "Weniger anzeigen",
"show-more": "Mehr anzeigen",
@ -198,7 +196,6 @@
"no-data": "Keine Daten gefunden.",
"password-changed": "Passwort geändert",
"password-not-match": "Passwörter stimmen nicht überein.",
"remove-completed-task-list-items-successfully": "Erfolgreich entfernt!",
"restored-successfully": "Erfolgreich wiederhergestellt",
"succeed-copy-content": "Inhalt erfolgreich kopiert.",
"succeed-copy-link": "Link erfolgreich kopiert",

View File

@ -168,8 +168,6 @@
"no-archived-memos": "No archived memos.",
"no-memos": "No memos.",
"order-by": "Order By",
"remove-completed-task-list-items": "Remove done",
"remove-completed-task-list-items-confirm": "Are you sure you want to remove all completed to-dos? THIS ACTION IS IRREVERSIBLE",
"search-placeholder": "Search memos...",
"show-less": "Show less",
"show-more": "Show more",
@ -199,7 +197,6 @@
"no-data": "No data found.",
"password-changed": "Password Changed",
"password-not-match": "Passwords do not match.",
"remove-completed-task-list-items-successfully": "The removal was successful",
"restored-successfully": "Restored successfully",
"succeed-copy-content": "Content copied successfully.",
"succeed-copy-link": "Link copied successfully.",

View File

@ -150,8 +150,6 @@
"no-archived-memos": "No hay memos archivados.",
"no-memos": "No hay memos.",
"order-by": "Ordenar por",
"remove-completed-task-list-items": "Eliminar completados",
"remove-completed-task-list-items-confirm": "¿Estás seguro de que quieres eliminar todas las tareas completadas? ESTA ACCIÓN ES IRREVERSIBLE",
"search-placeholder": "Buscar memos...",
"show-less": "Mostrar menos",
"show-more": "Mostrar más",
@ -179,7 +177,6 @@
"no-data": "No se encontraron datos.",
"password-changed": "Contraseña cambiada",
"password-not-match": "Las contraseñas no coinciden.",
"remove-completed-task-list-items-successfully": "¡Eliminado con éxito!",
"restored-successfully": "Restaurado con éxito",
"succeed-copy-link": "Enlace copiado correctamente.",
"update-succeed": "Actualización exitosa",

View File

@ -138,8 +138,6 @@
"no-archived-memos": "یادداشت آرشیو شده‌ای وجود ندارد.",
"no-memos": "یادداشتی یافت نشد.",
"order-by": "مرتب‌سازی بر اساس",
"remove-completed-task-list-items": "حذف کارهای انجام شده",
"remove-completed-task-list-items-confirm": "آیا از حذف همه کارهای انجام شده اطمینان دارید؟ این عمل غیرقابل بازگشت است",
"search-placeholder": "جستجوی یادداشت‌ها...",
"show-less": "نمایش کمتر",
"show-more": "نمایش بیشتر",
@ -160,7 +158,6 @@
"description-is-required": "توضیحات اجباری است",
"failed-to-embed-memo": "درج یادداشت ناموفق بود",
"fill-all-required-fields": "لطفا همه فیلدهای ضروری را پر کنید",
"remove-completed-task-list-items-successfully": "حذف با موفقیت انجام شد",
"update-succeed": "بروزرسانی موفق بود",
"restored-successfully": "با موفقیت بازیابی شد"
},

View File

@ -170,8 +170,6 @@
"no-archived-memos": "Aucune note archivée.",
"no-memos": "Aucune note.",
"order-by": "Trier par",
"remove-completed-task-list-items": "Supprimer les tâches terminées",
"remove-completed-task-list-items-confirm": "Êtes-vous sûr de vouloir supprimer toutes les tâches terminées ? CETTE ACTION EST IRRÉVERSIBLE",
"search-placeholder": "Rechercher des notes...",
"show-less": "Afficher moins",
"show-more": "Afficher plus",
@ -199,7 +197,6 @@
"no-data": "Aucune donnée trouvée.",
"password-changed": "Mot de passe modifié",
"password-not-match": "Les mots de passe ne correspondent pas.",
"remove-completed-task-list-items-successfully": "Suppression réussie",
"restored-successfully": "Restauré avec succès",
"succeed-copy-content": "Contenu copié avec succès.",
"succeed-copy-link": "Lien copié avec succès.",

View File

@ -166,8 +166,6 @@
"no-archived-memos": "Sen memos arquivadas.",
"no-memos": "Sen memos.",
"order-by": "Orde por",
"remove-completed-task-list-items": "Eliminada",
"remove-completed-task-list-items-confirm": "Tes certeza de querer eliminar todas as tarefas completadas? A ACCIÓN NON SE PODE REVERTER",
"search-placeholder": "Buscar memos...",
"show-less": "Mostrar menos",
"show-more": "Mostrar máis",
@ -197,7 +195,6 @@
"no-data": "Non hai datos.",
"password-changed": "Contrasinal cambiado",
"password-not-match": "Non concordan os contrasinais.",
"remove-completed-task-list-items-successfully": "Eliminación correcta",
"restored-successfully": "Recuperación correcta",
"succeed-copy-content": "Contido copiado correctamente.",
"succeed-copy-link": "Ligazón copiada correctamente.",

View File

@ -152,8 +152,6 @@
"no-archived-memos": "कोई संग्रहीत मेमो नहीं।",
"no-memos": "कोई मेमो नहीं।",
"order-by": "क्रमबद्ध करें",
"remove-completed-task-list-items": "पूरा किए गए हटाएँ",
"remove-completed-task-list-items-confirm": "क्या आप सभी पूरे कार्यों को हटाना चाहते हैं? यह कार्रवाई वापस नहीं की जा सकती।",
"search-placeholder": "मेमो खोजें...",
"show-less": "कम दिखाएँ",
"show-more": "और दिखाएँ",
@ -183,7 +181,6 @@
"no-data": "कोई डेटा नहीं मिला।",
"password-changed": "पासवर्ड बदल दिया गया",
"password-not-match": "पासवर्ड मेल नहीं खाते।",
"remove-completed-task-list-items-successfully": "सफलतापूर्वक हटाया गया",
"restored-successfully": "सफलतापूर्वक पुनर्स्थापित किया गया",
"succeed-copy-link": "लिंक सफलतापूर्वक कॉपी किया गया।",
"update-succeed": "अपडेट सफल हुआ",

View File

@ -154,8 +154,6 @@
"no-archived-memos": "Nema arhiviranih memoa.",
"no-memos": "Nema memoa.",
"order-by": "Sortiraj po",
"remove-completed-task-list-items": "Ukloni završene",
"remove-completed-task-list-items-confirm": "Jesi li siguran da želiš ukloniti sve završene zadatke? OVA AKCIJA JE NEPOVRATNA",
"search-placeholder": "Pretraži memoe...",
"show-less": "Prikaži manje",
"show-more": "Prikaži više",
@ -183,7 +181,6 @@
"no-data": "Nema podataka.",
"password-changed": "Lozinka je promijenjena",
"password-not-match": "Lozinke se ne podudaraju.",
"remove-completed-task-list-items-successfully": "Uspješno uklonjeno",
"restored-successfully": "Uspješno vraćeno",
"succeed-copy-link": "Link je uspješno kopiran.",
"update-succeed": "Ažuriranje uspješno",

View File

@ -154,8 +154,6 @@
"no-archived-memos": "Nincsenek archivált jegyzetek.",
"no-memos": "Nincsenek jegyzetek.",
"order-by": "Rendezés",
"remove-completed-task-list-items": "Kész feladatok törlése",
"remove-completed-task-list-items-confirm": "Biztos, hogy törölni akarod az összes kész feladatot? EZ A MŰVELET VÉGLEGES",
"search-placeholder": "Jegyzetek keresése...",
"show-less": "Kevesebb mutatása",
"show-more": "Több mutatása",
@ -183,7 +181,6 @@
"no-data": "Nem található adat.",
"password-changed": "Jelszó megváltoztatva",
"password-not-match": "A jelszavak nem egyeznek.",
"remove-completed-task-list-items-successfully": "Sikeresen eltávolítva!",
"restored-successfully": "Sikeres visszaállítás",
"succeed-copy-link": "Hivatkozás sikeresen másolva.",
"update-succeed": "Sikeres frissítés",

View File

@ -152,8 +152,6 @@
"no-archived-memos": "Tidak ada memo yang diarsipkan.",
"no-memos": "Tidak ada memo.",
"order-by": "Urutkan Berdasarkan",
"remove-completed-task-list-items": "Hapus yang selesai",
"remove-completed-task-list-items-confirm": "Anda yakin ingin menghapus semua daftar tugas yang selesai? TINDAKAN INI TIDAK DAPAT DIBATALKAN",
"search-placeholder": "Cari memo",
"show-less": "Tampilkan lebih sedikit",
"show-more": "Tampilkan lebih banyak",
@ -183,7 +181,6 @@
"no-data": "Data tidak ditemukan.",
"password-changed": "Kata sandi diubah",
"password-not-match": "Kata sandi tidak cocok.",
"remove-completed-task-list-items-successfully": "Berhasil dihapus",
"restored-successfully": "Berhasil dipulihkan",
"succeed-copy-link": "Tautan berhasil disalin.",
"update-succeed": "Pembaruan berhasil",

View File

@ -163,8 +163,6 @@
"no-archived-memos": "Nessun memo archiviato.",
"no-memos": "Nessun memo.",
"order-by": "Ordina per",
"remove-completed-task-list-items": "Rimuovi completati",
"remove-completed-task-list-items-confirm": "Confermi di voler rimuovere tutti i compiti completati? QUESTA AZIONE È IRREVERSIBILE",
"search-placeholder": "Cerca memo...",
"show-less": "Mostra meno",
"show-more": "Mostra di più",
@ -194,7 +192,6 @@
"no-data": "Nessun dato",
"password-changed": "Password cambiata",
"password-not-match": "Le password non corrispondono",
"remove-completed-task-list-items-successfully": "Rimosso con successo!",
"restored-successfully": "Ripristinato con successo",
"succeed-copy-content": "Contenuto copiato con successo.",
"succeed-copy-link": "Link copiato.",

View File

@ -154,8 +154,6 @@
"no-archived-memos": "アーカイブされたメモはありません。",
"no-memos": "メモがありません。",
"order-by": "並び替え",
"remove-completed-task-list-items": "完了を削除",
"remove-completed-task-list-items-confirm": "すべての完了したタスクを削除してもよろしいですか?この操作は元に戻せません。",
"search-placeholder": "メモを検索...",
"show-less": "少なく表示",
"show-more": "もっと見る",
@ -183,7 +181,6 @@
"no-data": "データが見つかりませんでした。",
"password-changed": "パスワードを変更しました",
"password-not-match": "パスワードが一致しません。",
"remove-completed-task-list-items-successfully": "削除が成功しました!",
"restored-successfully": "リストア成功",
"succeed-copy-link": "リンクのコピーに成功しました。",
"update-succeed": "変更は保存されました",

View File

@ -154,8 +154,6 @@
"no-archived-memos": "დაარქივებული მემოები არ არის.",
"no-memos": "მემოები არ არის.",
"order-by": "დალაგება",
"remove-completed-task-list-items": "დასრულებულების წაშლა",
"remove-completed-task-list-items-confirm": "დარწმუნებული ხართ, რომ გსურთ ყველა დასრულებული ამოცანის წაშლა? ეს ქმედება შეუქცევადია",
"search-placeholder": "მემოების ძიება...",
"show-less": "ნაკლების ჩვენება",
"show-more": "მეტის ჩვენება",
@ -183,7 +181,6 @@
"no-data": "მონაცემები არ მოიძებნა.",
"password-changed": "პაროლი შეიცვალა",
"password-not-match": "პაროლები არ ემთხვევა.",
"remove-completed-task-list-items-successfully": "წარმატებით წაიშალა",
"restored-successfully": "წარმატებით აღდგა",
"succeed-copy-link": "ლინკი წარმატებით კოპირდა.",
"update-succeed": "განახლება წარმატებით დასრულდა",

View File

@ -167,8 +167,6 @@
"no-archived-memos": "보관처리된 메모가 없습니다.",
"no-memos": "메모가 없습니다.",
"order-by": "정렬 기준",
"remove-completed-task-list-items": "완료 제거",
"remove-completed-task-list-items-confirm": "모든 완료된 작업을 삭제하겠습니까? 이 작업은 되돌릴 수 없습니다",
"search-placeholder": "메모 검색하기...",
"show-less": "간략히 보기",
"show-more": "더보기",
@ -198,7 +196,6 @@
"no-data": "데이터가 없습니다.",
"password-changed": "비밀번호를 변경했습니다",
"password-not-match": "비밀번호가 맞지 않습니다.",
"remove-completed-task-list-items-successfully": "성공적으로 제거되었습니다",
"restored-successfully": "성공적으로 복구했습니다",
"succeed-copy-content": "콘텐츠를 클립보드에 복사했습니다.",
"succeed-copy-link": "링크를 클립보드에 복사했습니다.",

View File

@ -154,8 +154,6 @@
"no-archived-memos": "कोणतेही संग्रहित मेमो नाहीत.",
"no-memos": "कोणतेही मेमो नाहीत.",
"order-by": "क्रमवारी",
"remove-completed-task-list-items": "हटवा केलेले",
"remove-completed-task-list-items-confirm": "तुम्ही सगळ्या पूर्ण केलेल्या कामांचे हटवणार आहात का? ही क्रिया अपरिवर्तनीय आहे",
"search-placeholder": "मेमोज शोधा...",
"show-less": "कमी दाखवा",
"show-more": "अधिक दाखवा",
@ -183,7 +181,6 @@
"no-data": "माहिती आढळली नाही.",
"password-changed": "पासवर्ड बदलला",
"password-not-match": "पासवर्ड जुळत नाही.",
"remove-completed-task-list-items-successfully": "सफळताने हटवा झाले!",
"restored-successfully": "यशस्वीरित्या पुनर्संचयित केले",
"succeed-copy-link": "लिंक यशस्वीरित्या कॉपी केली.",
"update-succeed": "अपडेट यशस्वी झाले",

View File

@ -152,8 +152,6 @@
"no-archived-memos": "Ingen arkiverte memoer.",
"no-memos": "Ingen memoer.",
"order-by": "Sorter etter",
"remove-completed-task-list-items": "Fjerning utført",
"remove-completed-task-list-items-confirm": "Er du sikker på at du vil fjerne alle utførte gjøremål? DENNE HANDLINGEN KAN IKKE ANGRES.",
"search-placeholder": "Søk etter memoer...",
"show-less": "Vis mindre",
"show-more": "Vis mer",
@ -183,7 +181,6 @@
"no-data": "Ingen data funnet.",
"password-changed": "Passord endret",
"password-not-match": "Passordene samsvarer ikke",
"remove-completed-task-list-items-successfully": "Fjerning vellykket",
"restored-successfully": "Gjenoppretting vellykket",
"succeed-copy-link": "Link kopiert.",
"update-succeed": "Oppdatering vellykket",

View File

@ -152,8 +152,6 @@
"no-archived-memos": "Geen gearchiveerde memos.",
"no-memos": "Geen memos.",
"order-by": "Sorteren op",
"remove-completed-task-list-items": "Verwijdering voltooid",
"remove-completed-task-list-items-confirm": "Weet je zeker dat je alle voltooide taken wilt verwijderen? DEZE ACTIE IS NIET TERUG TE DRAAIEN",
"search-placeholder": "Memos zoeken…",
"show-less": "Minder tonen",
"show-more": "Meer tonen",
@ -183,7 +181,6 @@
"no-data": "Geen gegevens gevonden.",
"password-changed": "Wachtwoord gewijzigd.",
"password-not-match": "Wachtwoorden komen niet overeen.",
"remove-completed-task-list-items-successfully": "Succesvol verwijderd!",
"restored-successfully": "Succesvol teruggezet",
"succeed-copy-link": "Link gekopieërd naar klembord.",
"update-succeed": "Update voltooid",

View File

@ -167,8 +167,6 @@
"no-archived-memos": "Brak zarchiwizowanych notatek.",
"no-memos": "Brak notatek.",
"order-by": "Sortuj według",
"remove-completed-task-list-items": "Usuń zakończone",
"remove-completed-task-list-items-confirm": "Czy jesteś pewny, że chcesz usunąć wszystkie zakończone zadania? TA AKCJA JEST NIEODWRACALNA",
"search-placeholder": "Szukaj notatek",
"show-less": "Pokaż mniej",
"show-more": "Pokaż więcej",
@ -198,7 +196,6 @@
"no-data": "Nie znaleziono danych.",
"password-changed": "Hasło zostało zmienione",
"password-not-match": "Hasła nie pasują do siebie.",
"remove-completed-task-list-items-successfully": "Pomyślnie usunięto!",
"restored-successfully": "Przywrócono pomyślnie",
"succeed-copy-content": "Treść została pomyślnie skopiowana.",
"succeed-copy-link": "Link skopiowany pomyślnie.",

View File

@ -152,8 +152,6 @@
"no-archived-memos": "Nenhum memo arquivado.",
"no-memos": "Nenhum memo.",
"order-by": "Ordenar por",
"remove-completed-task-list-items": "Remover concluídos",
"remove-completed-task-list-items-confirm": "Você tem certeza de que deseja remover todos os itens concluídos? ESTA AÇÃO É IRREVERSÍVEL",
"search-placeholder": "Pesquisar memos...",
"show-less": "Mostrar menos",
"show-more": "Mostrar mais",
@ -183,7 +181,6 @@
"no-data": "Nenhum dado encontrado.",
"password-changed": "Senha alterada",
"password-not-match": "As senhas não coincidem.",
"remove-completed-task-list-items-successfully": "Remoção bem-sucedida!",
"restored-successfully": "Restaurado com êxito",
"succeed-copy-link": "Link copiado com êxito.",
"update-succeed": "Atualizado com êxito",

View File

@ -152,8 +152,6 @@
"no-archived-memos": "Não existem memos arquivados.",
"no-memos": "Não existem memos.",
"order-by": "Ordenar por",
"remove-completed-task-list-items": "Remover concluídos",
"remove-completed-task-list-items-confirm": "Tem a certeza de que deseja remover todas as tarefas concluídas? ESTA AÇÃO É IRREVERSÍVEL",
"search-placeholder": "Pesquisar memos...",
"show-less": "Mostrar menos",
"show-more": "Mostrar mais",
@ -183,7 +181,6 @@
"no-data": "Nenhum dado encontrado.",
"password-changed": "Palavra-passe alterada",
"password-not-match": "As palavras-passe não coincidem.",
"remove-completed-task-list-items-successfully": "Remoção bem-sucedida",
"restored-successfully": "Restaurado com sucesso",
"succeed-copy-link": "Link copiado com sucesso.",
"update-succeed": "Atualização bem-sucedida",

View File

@ -131,8 +131,6 @@
"direction-desc": "По убыванию",
"links": "Ссылки",
"no-archived-memos": "Нет заархивированных записей.",
"remove-completed-task-list-items": "Удалить выполненные",
"remove-completed-task-list-items-confirm": "Вы уверены, что хотите удалить все выполненные задачи? (Данное действие необратимо)",
"search-placeholder": "Поиск записей",
"show-less": "Показать меньше",
"show-more": "Подробнее",
@ -162,7 +160,6 @@
"no-data": "Здесь ничего нет",
"password-changed": "Пароль изменён",
"password-not-match": "Пароли не совпадают.",
"remove-completed-task-list-items-successfully": "Удалено успешно!",
"restored-successfully": "Успешно восстановлено.",
"succeed-copy-link": "Ссылка скопирована в буфер обмена.",
"update-succeed": "Успешно обновлено",

View File

@ -152,8 +152,6 @@
"no-archived-memos": "Ni arhiviranih beležk.",
"no-memos": "Ni beležk.",
"order-by": "Razvrsti po",
"remove-completed-task-list-items": "Odstrani končane",
"remove-completed-task-list-items-confirm": "Ste prepričani, da želite odstraniti vse končane naloge? TO DEJANJE JE NEPOVRATNO",
"search-placeholder": "Poišči beležke",
"show-less": "Prikaži manj",
"show-more": "Prikaži več",
@ -183,7 +181,6 @@
"no-data": "Ne najdem podatkov.",
"password-changed": "Geslo je spremenjeno",
"password-not-match": "Gesli se ne ujemata.",
"remove-completed-task-list-items-successfully": "Odstranitev uspešna!",
"restored-successfully": "Uspešno obnovljeno",
"succeed-copy-link": "Povezava je uspešno skopirana.",
"update-succeed": "Posodobitev je uspešna",

View File

@ -152,8 +152,6 @@
"no-archived-memos": "Inga arkiverade anteckningar.",
"no-memos": "Inga anteckningar.",
"order-by": "Sortera efter",
"remove-completed-task-list-items": "Ta bort avklarade",
"remove-completed-task-list-items-confirm": "Är du säker på att du vill ta bort alla avklarade todo? DENNA ÅTGÄRD ÄR OÅTERKALLELIG",
"search-placeholder": "Sök anteckningar...",
"show-less": "Visa mindre",
"show-more": "Visa mer",
@ -183,7 +181,6 @@
"no-data": "Ingen data hittades.",
"password-changed": "Lösenord ändrat",
"password-not-match": "Lösenorden matchar inte.",
"remove-completed-task-list-items-successfully": "Borttagning avklarade todo lyckades!",
"restored-successfully": "Återställdes framgångsrikt",
"succeed-copy-link": "Länk kopierades framgångsrikt.",
"update-succeed": "Uppdatering lyckades",

View File

@ -152,8 +152,6 @@
"no-archived-memos": "ไม่มีบันทึกช่วยจำที่ถูกเก็บถาวร",
"no-memos": "ไม่มีบันทึกช่วยจำ",
"order-by": "เรียงตาม",
"remove-completed-task-list-items": "ลบที่ทำแล้ว",
"remove-completed-task-list-items-confirm": "คุณแน่ใจว่าจะลบรายการที่ทำแล้วทั้งหมดหรือไม่? การกระทำนี้ไม่สามารถย้อนกลับได้",
"search-placeholder": "ค้นหาบันทึกช่วยจำ...",
"show-less": "แสดงน้อยลง",
"show-more": "แสดงเพิ่มเติม",
@ -183,7 +181,6 @@
"no-data": "ไม่พบข้อมูล",
"password-changed": "เปลี่ยนรหัสผ่านแล้ว",
"password-not-match": "รหัสผ่านไม่ตรงกัน",
"remove-completed-task-list-items-successfully": "ลบเรียบร้อย!",
"restored-successfully": "กู้คืนเรียบร้อยแล้ว",
"succeed-copy-link": "คัดลอกลิงก์เรียบร้อยแล้ว",
"update-succeed": "อัปเดตเรียบร้อยแล้ว",

View File

@ -152,8 +152,6 @@
"no-archived-memos": "Arşivlenmiş not yok.",
"no-memos": "Not yok.",
"order-by": "Sıralama Ölçütü",
"remove-completed-task-list-items": "Tamamlananları kaldır",
"remove-completed-task-list-items-confirm": "Tamamlanan tüm görevleri kaldırmak istediğinizden emin misiniz? BU İŞLEM GERİ ALINAMAZ",
"search-placeholder": "Notlarda ara",
"show-less": "Daha az göster",
"show-more": "Daha fazla göster",
@ -183,7 +181,6 @@
"no-data": "Veri bulunamadı.",
"password-changed": "Şifre Değiştirildi",
"password-not-match": "Şifreler eşleşmiyor.",
"remove-completed-task-list-items-successfully": "Kaldırma işlemi başarılı",
"restored-successfully": "Başarıyla geri yüklendi",
"succeed-copy-link": "Bağlantı başarıyla kopyalandı.",
"update-succeed": "Güncelleme başarılı",

View File

@ -152,8 +152,6 @@
"no-archived-memos": "Немає архівованих нотаток.",
"no-memos": "Немає нотаток.",
"order-by": "Впорядкувати за",
"remove-completed-task-list-items": "Видалити виконані",
"remove-completed-task-list-items-confirm": "Ви впевнені, що хочете видалити всі виконані задачі? ЦЯ ДІЯ Є НЕВІДКЛИКНОЮ",
"search-placeholder": "Пошук нотаток...",
"show-less": "Показувати менше",
"show-more": "Показати більше",
@ -183,7 +181,6 @@
"no-data": "Дані не знайдено.",
"password-changed": "Пароль змінено",
"password-not-match": "Паролі не співпадають.",
"remove-completed-task-list-items-successfully": "Видалення виконаних успішно!",
"restored-successfully": "Успішно відновлено",
"succeed-copy-link": "Посилання успішно скопійовано.",
"update-succeed": "Оновлення успішне",

View File

@ -114,8 +114,6 @@
"links": "Liên kết",
"load-more": "Tải thêm",
"no-archived-memos": "Không có ghi chú nào được lưu trữ.",
"remove-completed-task-list-items": "Xóa đã hoàn thành",
"remove-completed-task-list-items-confirm": "Bạn có chắc chắn muốn xóa tất cả các mục đã hoàn thành không? (Hành động này không thể đảo ngược)",
"search-placeholder": "Tìm kiếm ghi chú",
"show-less": "Hiển thị ít hơn",
"show-more": "Hiển thị thêm",

View File

@ -169,8 +169,6 @@
"no-archived-memos": "没有已归档备忘录。",
"no-memos": "无备忘录",
"order-by": "排序",
"remove-completed-task-list-items": "移除已办",
"remove-completed-task-list-items-confirm": "您确定要移除所有完成的待办吗?(此操作不可逆)",
"search-placeholder": "搜索备忘录",
"show-less": "显示较少",
"show-more": "查看更多",
@ -200,7 +198,6 @@
"no-data": "未找到任何数据。",
"password-changed": "密码已修改",
"password-not-match": "密码不一致。",
"remove-completed-task-list-items-successfully": "移除成功!",
"restored-successfully": "恢复成功",
"succeed-copy-content": "复制内容到剪贴板成功。",
"succeed-copy-link": "复制链接到剪贴板成功。",

View File

@ -169,8 +169,6 @@
"no-archived-memos": "無已封存的備忘錄",
"no-memos": "無備忘錄",
"order-by": "排序",
"remove-completed-task-list-items": "移除已完成的待辦事項",
"remove-completed-task-list-items-confirm": "您確定要移除所有完成的待辦事項嗎?此操作無法恢復。",
"search-placeholder": "搜尋備忘錄",
"show-less": "顯示較少",
"show-more": "查看更多",
@ -200,7 +198,6 @@
"no-data": "或許尋覓虛空,或者改換選擇之軌跡。",
"password-changed": "密碼變更完成",
"password-not-match": "密碼不一致。",
"remove-completed-task-list-items-successfully": "移除成功",
"restored-successfully": "還原成功",
"succeed-copy-content": "內容複製到剪貼簿成功。",
"succeed-copy-link": "複製連結到剪貼簿成功。",

View File

@ -70,31 +70,6 @@ export function toggleTaskAtIndex(markdown: string, taskIndex: number, checked:
return toggleTaskAtLine(markdown, task.lineNumber, checked);
}
export function removeCompletedTasks(markdown: string): string {
const tasks = extractTasksFromAst(markdown);
const completedLineNumbers = new Set(tasks.filter((t) => t.checked).map((t) => t.lineNumber));
if (completedLineNumbers.size === 0) {
return markdown;
}
const lines = markdown.split("\n");
const result: string[] = [];
for (let i = 0; i < lines.length; i++) {
if (completedLineNumbers.has(i)) {
// Also skip the following line if it's empty (preserve spacing)
if (i + 1 < lines.length && lines[i + 1].trim() === "") {
i++;
}
continue;
}
result.push(lines[i]);
}
return result.join("\n");
}
export function countTasks(markdown: string): {
total: number;
completed: number;
@ -112,11 +87,6 @@ export function countTasks(markdown: string): {
};
}
export function hasCompletedTasks(markdown: string): boolean {
const tasks = extractTasksFromAst(markdown);
return tasks.some((t) => t.checked);
}
export function getTaskLineNumber(markdown: string, taskIndex: number): number {
const tasks = extractTasksFromAst(markdown);