fix: race condition and delete checking for templates

This commit is contained in:
2026-02-27 20:45:56 +01:00
parent 6c2d2c48bf
commit 696b79c5d7
18 changed files with 334 additions and 51 deletions

View File

@@ -1752,11 +1752,30 @@ const TemplatesList: React.FC = () => {
const handleDeleteTemplate = async (event: React.MouseEvent, templateId: string) => {
event.stopPropagation();
try {
const deleted = await window.electronAPI?.templates.delete(templateId);
if (!deleted) {
const result = await window.electronAPI?.templates.delete(templateId);
if (!result) {
showToast.error(t('sidebar.templates.deleteFailed'));
return;
}
if (!result.deleted && result.references) {
const { postIds, tagIds } = result.references;
const confirmed = window.confirm(
t('sidebar.templates.deleteConfirmWithRefs', {
postCount: String(postIds.length),
tagCount: String(tagIds.length),
}),
);
if (!confirmed) {
return;
}
const forceResult = await window.electronAPI?.templates.delete(templateId, { force: true });
if (!forceResult?.deleted) {
showToast.error(t('sidebar.templates.deleteFailed'));
return;
}
}
setTemplates((prev) => prev.filter((tmpl) => tmpl.id !== templateId));
closeTab(templateId);
dispatchWindowEvent(BDS_EVENT_TEMPLATES_CHANGED);

View File

@@ -182,11 +182,30 @@ export const TemplatesView: React.FC<TemplatesViewProps> = ({ templateId }) => {
}
try {
const deleted = await window.electronAPI?.templates.delete(template.id);
if (!deleted) {
const result = await window.electronAPI?.templates.delete(template.id);
if (!result) {
showToast.error(t('sidebar.templates.deleteFailed'));
return;
}
if (!result.deleted && result.references) {
const { postIds, tagIds } = result.references;
const confirmed = window.confirm(
t('sidebar.templates.deleteConfirmWithRefs', {
postCount: String(postIds.length),
tagCount: String(tagIds.length),
}),
);
if (!confirmed) {
return;
}
const forceResult = await window.electronAPI?.templates.delete(template.id, { force: true });
if (!forceResult?.deleted) {
showToast.error(t('sidebar.templates.deleteFailed'));
return;
}
}
closeTab(template.id);
dispatchWindowEvent(BDS_EVENT_TEMPLATES_CHANGED);
} catch (error) {

View File

@@ -780,6 +780,7 @@
"sidebar.templates.createFailed": "Vorlage konnte nicht erstellt werden",
"sidebar.templates.deleteTemplate": "Vorlage löschen",
"sidebar.templates.deleteFailed": "Vorlage konnte nicht gelöscht werden",
"sidebar.templates.deleteConfirmWithRefs": "Diese Vorlage wird von {postCount} Beitrag/Beiträgen und {tagCount} Tag(s) referenziert. Trotzdem löschen? Die Referenzen werden entfernt.",
"sidebar.import.none": "Noch keine Importdefinitionen",
"sidebar.import.createDefinition": "Eine Importdefinition erstellen",
"sidebar.import.deleteDefinition": "Importdefinition löschen",

View File

@@ -780,6 +780,7 @@
"sidebar.templates.createFailed": "Failed to create template",
"sidebar.templates.deleteTemplate": "Delete template",
"sidebar.templates.deleteFailed": "Failed to delete template",
"sidebar.templates.deleteConfirmWithRefs": "This template is referenced by {postCount} post(s) and {tagCount} tag(s). Delete anyway? References will be cleared.",
"sidebar.import.none": "No import definitions yet",
"sidebar.import.createDefinition": "Create an import definition",
"sidebar.import.deleteDefinition": "Delete import definition",

View File

@@ -780,6 +780,7 @@
"sidebar.templates.createFailed": "No se pudo crear la plantilla",
"sidebar.templates.deleteTemplate": "Eliminar plantilla",
"sidebar.templates.deleteFailed": "No se pudo eliminar la plantilla",
"sidebar.templates.deleteConfirmWithRefs": "Esta plantilla está referenciada por {postCount} entrada(s) y {tagCount} etiqueta(s). ¿Eliminar de todos modos? Las referencias serán eliminadas.",
"sidebar.import.none": "Sin definiciones de importación",
"sidebar.import.createDefinition": "Crear definición",
"sidebar.import.deleteDefinition": "Eliminar definición",

View File

@@ -778,6 +778,7 @@
"sidebar.templates.createFailed": "Impossible de créer le modèle",
"sidebar.templates.deleteTemplate": "Supprimer le modèle",
"sidebar.templates.deleteFailed": "Impossible de supprimer le modèle",
"sidebar.templates.deleteConfirmWithRefs": "Ce modèle est référencé par {postCount} article(s) et {tagCount} tag(s). Supprimer quand même ? Les références seront supprimées.",
"sidebar.import.none": "Aucune définition dimport",
"sidebar.import.createDefinition": "Créer une définition",
"sidebar.import.deleteDefinition": "Supprimer la définition",

View File

@@ -778,6 +778,7 @@
"sidebar.templates.createFailed": "Impossibile creare il modello",
"sidebar.templates.deleteTemplate": "Elimina modello",
"sidebar.templates.deleteFailed": "Impossibile eliminare il modello",
"sidebar.templates.deleteConfirmWithRefs": "Questo modello è referenziato da {postCount} articolo/i e {tagCount} tag. Eliminare comunque? I riferimenti verranno rimossi.",
"sidebar.import.none": "Nessuna definizione di importazione",
"sidebar.import.createDefinition": "Crea definizione",
"sidebar.import.deleteDefinition": "Elimina definizione",