diff --git a/apps/client/src/translations/cn/translation.json b/apps/client/src/translations/cn/translation.json index 8b98473a6..753ffbc19 100644 --- a/apps/client/src/translations/cn/translation.json +++ b/apps/client/src/translations/cn/translation.json @@ -87,9 +87,9 @@ "delete_all_clones_description": "同时删除所有克隆(可以在最近修改中撤消)", "erase_notes_description": "通常(软)删除仅标记笔记为已删除,可以在一段时间内通过最近修改对话框撤消。选中此选项将立即擦除笔记,不可撤销。", "erase_notes_warning": "永久擦除笔记(无法撤销),包括所有克隆。这将强制应用程序重载。", - "notes_to_be_deleted": "将删除以下笔记 ({{- noteCount}})", + "notes_to_be_deleted": "将删除以下笔记 ({{notesCount}})", "no_note_to_delete": "没有笔记将被删除(仅克隆)。", - "broken_relations_to_be_deleted": "将删除以下关系并断开连接 ({{- relationCount}})", + "broken_relations_to_be_deleted": "将删除以下关系并断开连接 ({{ relationCount}})", "cancel": "取消", "ok": "确定", "deleted_relation_text": "笔记 {{- note}} (将被删除的笔记) 被以下关系 {{- relation}} 引用, 来自 {{- source}}。" diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index fa7a8f3b8..1eed6494d 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -87,9 +87,9 @@ "delete_all_clones_description": "auch alle Klone löschen (kann bei letzte Änderungen rückgängig gemacht werden)", "erase_notes_description": "Beim normalen (vorläufigen) Löschen werden die Notizen nur als gelöscht markiert und sie können innerhalb eines bestimmten Zeitraums (im Dialogfeld „Letzte Änderungen“) wiederhergestellt werden. Wenn du diese Option aktivierst, werden die Notizen sofort gelöscht und es ist nicht möglich, die Notizen wiederherzustellen.", "erase_notes_warning": "Notizen dauerhaft löschen (kann nicht rückgängig gemacht werden), einschließlich aller Klone. Dadurch wird ein Neuladen der Anwendung erzwungen.", - "notes_to_be_deleted": "Folgende Notizen werden gelöscht ()", + "notes_to_be_deleted": "Folgende Notizen werden gelöscht ({{notesCount}})", "no_note_to_delete": "Es werden keine Notizen gelöscht (nur Klone).", - "broken_relations_to_be_deleted": "Folgende Beziehungen werden gelöst und gelöscht ()", + "broken_relations_to_be_deleted": "Folgende Beziehungen werden gelöst und gelöscht ({{ relationCount}})", "cancel": "Abbrechen", "ok": "OK", "deleted_relation_text": "Notiz {{- note}} (soll gelöscht werden) wird von Beziehung {{- relation}} ausgehend von {{- source}} referenziert." diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index efa0b5d3c..43a0a7dc8 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -87,9 +87,9 @@ "delete_all_clones_description": "Delete also all clones (can be undone in recent changes)", "erase_notes_description": "Normal (soft) deletion only marks the notes as deleted and they can be undeleted (in recent changes dialog) within a period of time. Checking this option will erase the notes immediately and it won't be possible to undelete the notes.", "erase_notes_warning": "Erase notes permanently (can't be undone), including all clones. This will force application reload.", - "notes_to_be_deleted": "Following notes will be deleted ({{- noteCount}})", + "notes_to_be_deleted": "Following notes will be deleted ({{notesCount}})", "no_note_to_delete": "No note will be deleted (only clones).", - "broken_relations_to_be_deleted": "Following relations will be broken and deleted ({{- relationCount}})", + "broken_relations_to_be_deleted": "Following relations will be broken and deleted ({{ relationCount}})", "cancel": "Cancel", "ok": "OK", "deleted_relation_text": "Note {{- note}} (to be deleted) is referenced by relation {{- relation}} originating from {{- source}}." diff --git a/apps/client/src/translations/es/translation.json b/apps/client/src/translations/es/translation.json index bb5a0f958..2147f06c0 100644 --- a/apps/client/src/translations/es/translation.json +++ b/apps/client/src/translations/es/translation.json @@ -87,9 +87,9 @@ "delete_all_clones_description": "Eliminar también todos los clones (se puede deshacer en cambios recientes)", "erase_notes_description": "La eliminación normal (suave) solo marca las notas como eliminadas y se pueden recuperar (en el cuadro de diálogo de cambios recientes) dentro de un periodo de tiempo. Al marcar esta opción se borrarán las notas inmediatamente y no será posible recuperarlas.", "erase_notes_warning": "Eliminar notas permanentemente (no se puede deshacer), incluidos todos los clones. Esto forzará la recarga de la aplicación.", - "notes_to_be_deleted": "Las siguientes notas serán eliminadas ({{- noteCount}})", + "notes_to_be_deleted": "Las siguientes notas serán eliminadas ({{notesCount}})", "no_note_to_delete": "No se eliminará ninguna nota (solo clones).", - "broken_relations_to_be_deleted": "Las siguientes relaciones se romperán y serán eliminadas ({{- relationCount}})", + "broken_relations_to_be_deleted": "Las siguientes relaciones se romperán y serán eliminadas ({{ relationCount}})", "cancel": "Cancelar", "ok": "Aceptar", "deleted_relation_text": "Nota {{- note}} (para ser eliminada) está referenciado por la relación {{- relation}} que se origina en {{- source}}." diff --git a/apps/client/src/translations/fr/translation.json b/apps/client/src/translations/fr/translation.json index 3a9e4348c..168f8fb2a 100644 --- a/apps/client/src/translations/fr/translation.json +++ b/apps/client/src/translations/fr/translation.json @@ -87,9 +87,9 @@ "delete_all_clones_description": "Supprimer aussi les clones (peut être annulé dans des modifications récentes)", "erase_notes_description": "La suppression normale (douce) marque uniquement les notes comme supprimées et elles peuvent être restaurées (dans la boîte de dialogue des Modifications récentes) dans un délai donné. Cocher cette option effacera les notes immédiatement et il ne sera pas possible de les restaurer.", "erase_notes_warning": "Efface les notes de manière permanente (ne peut pas être annulée), y compris les clones. L'application va être rechargée.", - "notes_to_be_deleted": "Les notes suivantes seront supprimées ({{- noteCount}})", + "notes_to_be_deleted": "Les notes suivantes seront supprimées ({{notesCount}})", "no_note_to_delete": "Aucune note ne sera supprimée (uniquement les clones).", - "broken_relations_to_be_deleted": "Les relations suivantes seront rompues et supprimées ({{- relationCount}})", + "broken_relations_to_be_deleted": "Les relations suivantes seront rompues et supprimées ({{ relationCount}})", "cancel": "Annuler", "ok": "OK", "deleted_relation_text": "Note {{- note}} (à supprimer) est référencée dans la relation {{- relation}} provenant de {{- source}}." diff --git a/apps/client/src/translations/ro/translation.json b/apps/client/src/translations/ro/translation.json index 4e47861b4..86c16d433 100644 --- a/apps/client/src/translations/ro/translation.json +++ b/apps/client/src/translations/ro/translation.json @@ -436,14 +436,14 @@ "undelete_notes_instruction": "După ștergere, se pot recupera din ecranul Schimbări recente." }, "delete_notes": { - "broken_relations_to_be_deleted": "Următoarele relații vor fi întrerupte și șterse ({{- relationCount}})", + "broken_relations_to_be_deleted": "Următoarele relații vor fi întrerupte și șterse ({{ relationCount}})", "cancel": "Anulează", "delete_all_clones_description": "Șterge și toate clonele (se pot recupera în ecranul Schimbări recente)", "delete_notes_preview": "Previzualizare ștergerea notițelor", "erase_notes_description": "Ștergerea obișnuită doar marchează notițele ca fiind șterse și pot fi recuperate (în ecranul Schimbări recente) pentru o perioadă de timp. Dacă se bifează această opțiune, notițele vor fi șterse imediat fără posibilitatea de a le recupera.", "erase_notes_warning": "Șterge notițele permanent (nu se mai pot recupera), incluzând toate clonele. Va forța reîncărcarea aplicației.", "no_note_to_delete": "Nicio notiță nu va fi ștearsă (doar clonele).", - "notes_to_be_deleted": "Următoarele notițe vor fi șterse ({{- noteCount}})", + "notes_to_be_deleted": "Următoarele notițe vor fi șterse ({{notesCount}})", "ok": "OK", "deleted_relation_text": "Notița {{- note}} ce va fi ștearsă este referențiată de relația {{- relation}}, originând din {{- source}}.", "close": "Închide" diff --git a/apps/client/src/translations/tw/translation.json b/apps/client/src/translations/tw/translation.json index 21d2e5c3c..2f1d71b6d 100644 --- a/apps/client/src/translations/tw/translation.json +++ b/apps/client/src/translations/tw/translation.json @@ -83,9 +83,9 @@ "delete_all_clones_description": "同時刪除所有複製(可以在最近修改中撤消)", "erase_notes_description": "通常(軟)刪除僅標記筆記為已刪除,可以在一段時間內通過最近修改對話框撤消。選中此選項將立即擦除筆記,無法撤銷。", "erase_notes_warning": "永久擦除筆記(無法撤銷),包括所有複製。這將強制應用程式重新加載。", - "notes_to_be_deleted": "將刪除以下筆記 ({{- noteCount}})", + "notes_to_be_deleted": "將刪除以下筆記 ({{notesCount}})", "no_note_to_delete": "沒有筆記將被刪除(僅複製)。", - "broken_relations_to_be_deleted": "將刪除以下關係並斷開連接 ({{- relationCount}})", + "broken_relations_to_be_deleted": "將刪除以下關係並斷開連接 ({{ relationCount}})", "cancel": "取消", "ok": "確定", "deleted_relation_text": "筆記 {{- note}} (將被刪除的筆記) 被以下關係 {{- relation}} 引用, 來自 {{- source}}。" diff --git a/apps/client/src/widgets/dialogs/delete_notes.ts b/apps/client/src/widgets/dialogs/delete_notes.ts deleted file mode 100644 index b9f7f89cd..000000000 --- a/apps/client/src/widgets/dialogs/delete_notes.ts +++ /dev/null @@ -1,198 +0,0 @@ -import server from "../../services/server.js"; -import froca from "../../services/froca.js"; -import linkService from "../../services/link.js"; -import BasicWidget from "../basic_widget.js"; -import { t } from "../../services/i18n.js"; -import type { FAttributeRow } from "../../entities/fattribute.js"; -import { closeActiveDialog, openDialog } from "../../services/dialog.js"; - -// TODO: Use common with server. -interface Response { - noteIdsToBeDeleted: string[]; - brokenRelations: FAttributeRow[]; -} - -export interface ResolveOptions { - proceed: boolean; - deleteAllClones?: boolean; - eraseNotes?: boolean; -} - -interface ShowDeleteNotesDialogOpts { - branchIdsToDelete: string[]; - callback: (opts: ResolveOptions) => void; - forceDeleteAllClones: boolean; -} - -const TPL = /*html*/` -
${attr.name}
`,
- source: (await linkService.createLink(attr.noteId)).html()
- })
- )
- );
- }
- }
-
- async showDeleteNotesDialogEvent({ branchIdsToDelete, callback, forceDeleteAllClones }: ShowDeleteNotesDialogOpts) {
- this.branchIds = branchIdsToDelete;
- this.forceDeleteAllClones = forceDeleteAllClones;
-
- await this.renderDeletePreview();
-
- openDialog(this.$widget);
-
- this.$deleteAllClones.prop("checked", !!forceDeleteAllClones).prop("disabled", !!forceDeleteAllClones);
-
- this.$eraseNotes.prop("checked", false);
-
- this.resolve = callback;
- }
-
- isDeleteAllClonesChecked() {
- return this.$deleteAllClones.is(":checked");
- }
-
- isEraseNotesChecked() {
- return this.$eraseNotes.is(":checked");
- }
-}
diff --git a/apps/client/src/widgets/dialogs/delete_notes.tsx b/apps/client/src/widgets/dialogs/delete_notes.tsx
new file mode 100644
index 000000000..4a09f5b90
--- /dev/null
+++ b/apps/client/src/widgets/dialogs/delete_notes.tsx
@@ -0,0 +1,182 @@
+import { useRef, useState } from "preact/hooks";
+import { closeActiveDialog, openDialog } from "../../services/dialog.js";
+import { t } from "../../services/i18n.js";
+import FormCheckbox from "../react/FormCheckbox.js";
+import Modal from "../react/Modal.js";
+import ReactBasicWidget from "../react/ReactBasicWidget.js";
+import { useEffect } from "react";
+import type { DeleteNotesPreview } from "@triliumnext/commons";
+import server from "../../services/server.js";
+import froca from "../../services/froca.js";
+import FNote from "../../entities/fnote.js";
+import link from "../../services/link.js";
+import Button from "../react/Button.jsx";
+
+export interface ResolveOptions {
+ proceed: boolean;
+ deleteAllClones?: boolean;
+ eraseNotes?: boolean;
+}
+
+interface ShowDeleteNotesDialogOpts {
+ branchIdsToDelete?: string[];
+ callback?: (opts: ResolveOptions) => void;
+ forceDeleteAllClones?: boolean;
+}
+
+interface ShowDeleteNotesDialogProps extends ShowDeleteNotesDialogOpts { }
+
+interface BrokenRelationData {
+ note: string;
+ relation: string;
+ source: string;
+}
+
+function DeleteNotesDialogComponent({ forceDeleteAllClones, branchIdsToDelete, callback }: ShowDeleteNotesDialogProps) {
+ const [ deleteAllClones, setDeleteAllClones ] = useState(false);
+ const [ eraseNotes, setEraseNotes ] = useState(!!forceDeleteAllClones);
+ const [ brokenRelations, setBrokenRelations ] = useState${attr.name}
`,
+ source: (await link.createLink(attr.noteId)).html()
+ });
+ }
+ setNotesWithBrokenRelations(notesWithBrokenRelations);
+ });
+ }, [brokenRelations]);
+
+ if (brokenRelations.length) {
+ return (
+