fix(WEB): 수주 삭제 시 skippedIds 기반 리스트 제거 및 정확한 피드백 표시

- handleForceDelete/handleBulkDelete/handleConfirmDelete에서 skippedIds 처리
- 실제 삭제된 항목만 리스트 제거, skip된 항목은 warning toast 표시
- UniversalListPage config의 deleteBulk도 동일 수정
This commit is contained in:
2026-02-21 09:49:03 +09:00
parent 7d7d5356ff
commit b9e1b07b3c

View File

@@ -374,10 +374,18 @@ function OrderListContent() {
try {
const result = await deleteOrders(selectedIds);
if (result.success) {
setOrders(orders.filter((o) => !selectedIds.includes(o.id)));
const deletedCount = result.deletedCount ?? 0;
const skippedCount = result.skippedCount ?? 0;
const skippedSet = new Set((result.skippedIds ?? []).map(String));
// 실제 삭제된 항목만 리스트에서 제거
setOrders(orders.filter((o) => skippedSet.has(o.id) || !selectedIds.includes(o.id)));
setSelectedItems(new Set());
toast.success(`${selectedIds.length}개의 수주가 삭제되었습니다.`);
// 통계 새로고침
if (deletedCount > 0) {
toast.success(`${deletedCount}개의 수주가 삭제되었습니다.`);
}
if (skippedCount > 0) {
toast.warning(`${skippedCount}개의 수주는 상태/작업지시로 인해 삭제할 수 없습니다.`);
}
const statsResult = await getOrderStats();
if (statsResult.success && statsResult.data) {
setApiStats(statsResult.data);
@@ -400,31 +408,41 @@ function OrderListContent() {
const count = deleteTargetIds.length;
setIsDeleting(true);
try {
let success = false;
if (count === 1) {
const result = await deleteOrder(deleteTargetIds[0]);
success = result.success;
if (!success) {
if (result.success) {
setOrders(orders.filter((o) => o.id !== deleteTargetIds[0]));
setSelectedItems(new Set());
toast.success("수주가 삭제되었습니다.");
const statsResult = await getOrderStats();
if (statsResult.success && statsResult.data) {
setApiStats(statsResult.data);
}
} else {
toast.error(result.error || "삭제에 실패했습니다.");
}
} else {
const result = await deleteOrders(deleteTargetIds);
success = result.success;
if (!success) {
if (result.success) {
const deletedCount = result.deletedCount ?? 0;
const skippedCount = result.skippedCount ?? 0;
const skippedSet = new Set((result.skippedIds ?? []).map(String));
setOrders(orders.filter((o) => skippedSet.has(o.id) || !deleteTargetIds.includes(o.id)));
setSelectedItems(new Set());
if (deletedCount > 0) {
toast.success(`${deletedCount}개의 수주가 삭제되었습니다.`);
}
if (skippedCount > 0) {
toast.warning(`${skippedCount}개의 수주는 상태/작업지시로 인해 삭제할 수 없습니다.`);
}
const statsResult = await getOrderStats();
if (statsResult.success && statsResult.data) {
setApiStats(statsResult.data);
}
} else {
toast.error(result.error || "삭제에 실패했습니다.");
}
}
if (success) {
setOrders(orders.filter((o) => !deleteTargetIds.includes(o.id)));
setSelectedItems(new Set());
toast.success(`${count}개의 수주가 삭제되었습니다.`);
// 통계 새로고침
const statsResult = await getOrderStats();
if (statsResult.success && statsResult.data) {
setApiStats(statsResult.data);
}
}
} catch (error) {
console.error("Error deleting orders:", error);
toast.error("삭제 중 오류가 발생했습니다.");
@@ -444,9 +462,18 @@ function OrderListContent() {
try {
const result = await deleteOrders(selectedIds, { force: true });
if (result.success) {
setOrders(orders.filter((o) => !selectedIds.includes(o.id)));
const deletedCount = result.deletedCount ?? 0;
const skippedCount = result.skippedCount ?? 0;
const skippedSet = new Set((result.skippedIds ?? []).map(String));
// 실제 삭제된 항목만 리스트에서 제거
setOrders(orders.filter((o) => skippedSet.has(o.id) || !selectedIds.includes(o.id)));
setSelectedItems(new Set());
toast.success(`${result.deletedCount ?? selectedIds.length}개의 수주가 완전삭제되었습니다.`);
if (deletedCount > 0) {
toast.success(`${deletedCount}개의 수주가 완전삭제되었습니다.`);
}
if (skippedCount > 0) {
toast.warning(`${skippedCount}개의 수주는 삭제할 수 없습니다.`);
}
const statsResult = await getOrderStats();
if (statsResult.success && statsResult.data) {
setApiStats(statsResult.data);
@@ -687,7 +714,8 @@ function OrderListContent() {
deleteBulk: async (ids) => {
const result = await deleteOrders(ids);
if (result.success) {
setOrders((prev) => prev.filter((o) => !ids.includes(o.id)));
const skippedSet = new Set((result.skippedIds ?? []).map(String));
setOrders((prev) => prev.filter((o) => skippedSet.has(o.id) || !ids.includes(o.id)));
const statsResult = await getOrderStats();
if (statsResult.success && statsResult.data) {
setApiStats(statsResult.data);