fix(WEB): 수주 삭제 시 skippedIds 기반 리스트 제거 및 정확한 피드백 표시
- handleForceDelete/handleBulkDelete/handleConfirmDelete에서 skippedIds 처리 - 실제 삭제된 항목만 리스트 제거, skip된 항목은 warning toast 표시 - UniversalListPage config의 deleteBulk도 동일 수정
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user