refactor: 在管理后台各项删除操作中使用自定义确认对话框替换原生 confirm
continuous-integration/drone/push Build is passing

This commit is contained in:
seahi committed 2026-08-15 11:46:10 +08:00
1 parent ffde675f3a
commit 4acf0f03b6
6 files changed
+87 -26

No files matched your search

+15 -6
View File
@@ -2,6 +2,7 @@
import { page } from '$app/stores'; import { page } from '$app/stores';
import type { PageData, ActionData } from './$types'; import type { PageData, ActionData } from './$types';
import { createSlugAutoHandler } from '$lib/utils/slugify'; import { createSlugAutoHandler } from '$lib/utils/slugify';
import { confirmState } from '$lib/stores/confirm.svelte';
let { data, form }: { data: PageData; form: ActionData } = $props(); let { data, form }: { data: PageData; form: ActionData } = $props();
@@ -111,13 +112,21 @@
action="?/delete" action="?/delete"
method="POST" method="POST"
class="inline-form" class="inline-form"
onsubmit={(e) => { onsubmit={async (e) => {
if ( if ((e.target as HTMLFormElement).dataset.confirmed === 'true') {
!confirm( (e.target as HTMLFormElement).removeAttribute('data-confirmed');
`确定要删除${$page.data.aliases?.category || '分类'} "${category.name}" 吗?删除后相关文章将归为未${$page.data.aliases?.category || '分类'}。` return;
) }
)
e.preventDefault(); e.preventDefault();
const form = e.target as HTMLFormElement;
const submitter = e.submitter;
const confirmed = await confirmState.show(
`确定要删除${$page.data.aliases?.category || '分类'} "${category.name}" 吗?删除后相关文章将归为未${$page.data.aliases?.category || '分类'}。`
);
if (confirmed) {
form.dataset.confirmed = 'true';
form.requestSubmit(submitter);
}
}} }}
> >
<input type="hidden" name="id" value={category.id} /> <input type="hidden" name="id" value={category.id} />
+14 -2
View File
@@ -4,6 +4,7 @@
import { enhance } from '$app/forms'; import { enhance } from '$app/forms';
import type { ActionData, PageData } from './$types'; import type { ActionData, PageData } from './$types';
import { addToast } from '$lib/stores/toast.svelte'; import { addToast } from '$lib/stores/toast.svelte';
import { confirmState } from '$lib/stores/confirm.svelte';
let { data, form } = $props<{ data: PageData; form: ActionData }>(); let { data, form } = $props<{ data: PageData; form: ActionData }>();
@@ -156,8 +157,19 @@
<button <button
class="action-btn delete-btn" class="action-btn delete-btn"
type="submit" type="submit"
onclick={(e) => { onclick={async (e) => {
if (!confirm('确定要删除此文件吗?此操作不可恢复。')) e.preventDefault(); if ((e.currentTarget as HTMLElement).dataset.confirmed === 'true') {
(e.currentTarget as HTMLElement).removeAttribute('data-confirmed');
return;
}
e.preventDefault();
const btn = e.currentTarget as HTMLElement;
const form = btn.closest('form');
const confirmed = await confirmState.show('确定要删除此文件吗?此操作不可恢复。');
if (confirmed && form) {
btn.dataset.confirmed = 'true';
form.requestSubmit(btn);
}
}} }}
title="删除文件" title="删除文件"
> >
+14 -6
View File
@@ -2,6 +2,7 @@
import { resolve } from '$app/paths'; import { resolve } from '$app/paths';
import { page } from '$app/stores'; import { page } from '$app/stores';
import type { PageData } from './$types'; import type { PageData } from './$types';
import { confirmState } from '$lib/stores/confirm.svelte';
let { data }: { data: PageData } = $props(); let { data }: { data: PageData } = $props();
let selectedIds = $state<string[]>([]); let selectedIds = $state<string[]>([]);
@@ -33,13 +34,20 @@
action="?/delete" action="?/delete"
method="POST" method="POST"
class="inline-form" class="inline-form"
onsubmit={(e) => { onsubmit={async (e) => {
if ( if ((e.target as HTMLFormElement).dataset.confirmed === 'true') {
!confirm( (e.target as HTMLFormElement).removeAttribute('data-confirmed');
`确定要删除选中的 ${selectedIds.length} 篇${$page.data.aliases?.page || '项目'}吗?操作不可恢复。` return;
) }
) {
e.preventDefault(); e.preventDefault();
const form = e.target as HTMLFormElement;
const submitter = e.submitter;
const confirmed = await confirmState.show(
`确定要删除选中的 ${selectedIds.length} 篇${$page.data.aliases?.page || '项目'}吗?操作不可恢复。`
);
if (confirmed) {
form.dataset.confirmed = 'true';
form.requestSubmit(submitter);
} }
}} }}
> >
+14 -6
View File
@@ -2,6 +2,7 @@
import { resolve } from '$app/paths'; import { resolve } from '$app/paths';
import { page } from '$app/stores'; import { page } from '$app/stores';
import type { PageData } from './$types'; import type { PageData } from './$types';
import { confirmState } from '$lib/stores/confirm.svelte';
let { data }: { data: PageData } = $props(); let { data }: { data: PageData } = $props();
let selectedIds = $state<string[]>([]); let selectedIds = $state<string[]>([]);
@@ -33,13 +34,20 @@
action="?/delete" action="?/delete"
method="POST" method="POST"
class="inline-form" class="inline-form"
onsubmit={(e) => { onsubmit={async (e) => {
if ( if ((e.target as HTMLFormElement).dataset.confirmed === 'true') {
!confirm( (e.target as HTMLFormElement).removeAttribute('data-confirmed');
`确定要删除选中的 ${selectedIds.length} 篇${$page.data.aliases?.post || '项目'}吗?操作不可恢复。` return;
) }
) {
e.preventDefault(); e.preventDefault();
const form = e.target as HTMLFormElement;
const submitter = e.submitter;
const confirmed = await confirmState.show(
`确定要删除选中的 ${selectedIds.length} 篇${$page.data.aliases?.post || '项目'}吗?操作不可恢复。`
);
if (confirmed) {
form.dataset.confirmed = 'true';
form.requestSubmit(submitter);
} }
}} }}
> >
+15 -2
View File
@@ -3,6 +3,7 @@
import { resolve } from '$app/paths'; import { resolve } from '$app/paths';
import type { ActionData, PageData } from './$types'; import type { ActionData, PageData } from './$types';
import { createSlugAutoHandler } from '$lib/utils/slugify'; import { createSlugAutoHandler } from '$lib/utils/slugify';
import { confirmState } from '$lib/stores/confirm.svelte';
let { data, form }: { data: PageData; form: ActionData } = $props(); let { data, form }: { data: PageData; form: ActionData } = $props();
let name = $state(''); let name = $state('');
@@ -105,9 +106,21 @@
method="POST" method="POST"
action="?/delete" action="?/delete"
class="delete-form" class="delete-form"
onsubmit={(event) => { onsubmit={async (event) => {
if (!confirm(`确定删除系列“${item.name}”吗?相关文章会保留,但不再属于任何系列。`)) if ((event.target as HTMLFormElement).dataset.confirmed === 'true') {
(event.target as HTMLFormElement).removeAttribute('data-confirmed');
return;
}
event.preventDefault(); event.preventDefault();
const form = event.target as HTMLFormElement;
const submitter = event.submitter;
const confirmed = await confirmState.show(
`确定删除系列“${item.name}”吗?相关文章会保留,但不再属于任何系列。`
);
if (confirmed) {
form.dataset.confirmed = 'true';
form.requestSubmit(submitter);
}
}} }}
> >
<input type="hidden" name="id" value={item.id} /> <input type="hidden" name="id" value={item.id} />
+15 -4
View File
@@ -1,6 +1,7 @@
<script lang="ts"> <script lang="ts">
import { page } from '$app/stores'; import { page } from '$app/stores';
import type { PageData, ActionData } from './$types'; import type { PageData, ActionData } from './$types';
import { confirmState } from '$lib/stores/confirm.svelte';
let { data, form }: { data: PageData; form: ActionData } = $props(); let { data, form }: { data: PageData; form: ActionData } = $props();
@@ -64,11 +65,21 @@
action="?/delete" action="?/delete"
method="POST" method="POST"
class="inline-form" class="inline-form"
onsubmit={(e) => { onsubmit={async (e) => {
if ( if ((e.target as HTMLFormElement).dataset.confirmed === 'true') {
!confirm(`确定要删除${$page.data.aliases?.tag || '标签'} "${tag.name}" 吗?`) (e.target as HTMLFormElement).removeAttribute('data-confirmed');
) return;
}
e.preventDefault(); e.preventDefault();
const form = e.target as HTMLFormElement;
const submitter = e.submitter;
const confirmed = await confirmState.show(
`确定要删除${$page.data.aliases?.tag || '标签'} "${tag.name}" 吗?`
);
if (confirmed) {
form.dataset.confirmed = 'true';
form.requestSubmit(submitter);
}
}} }}
> >
<input type="hidden" name="id" value={tag.id} /> <input type="hidden" name="id" value={tag.id} />