mirror of https://github.com/usememos/memos.git
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:
parent
5396c126b8
commit
8cd9c591d4
|
|
@ -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>
|
||||
);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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": "تم التحديث بنجاح",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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ě",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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.",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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": "با موفقیت بازیابی شد"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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.",
|
||||
|
|
|
|||
|
|
@ -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.",
|
||||
|
|
|
|||
|
|
@ -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": "अपडेट सफल हुआ",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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.",
|
||||
|
|
|
|||
|
|
@ -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": "変更は保存されました",
|
||||
|
|
|
|||
|
|
@ -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": "განახლება წარმატებით დასრულდა",
|
||||
|
|
|
|||
|
|
@ -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": "링크를 클립보드에 복사했습니다.",
|
||||
|
|
|
|||
|
|
@ -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": "अपडेट यशस्वी झाले",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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.",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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": "Успешно обновлено",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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": "อัปเดตเรียบร้อยแล้ว",
|
||||
|
|
|
|||
|
|
@ -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ı",
|
||||
|
|
|
|||
|
|
@ -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": "Оновлення успішне",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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": "复制链接到剪贴板成功。",
|
||||
|
|
|
|||
|
|
@ -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": "複製連結到剪貼簿成功。",
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue