feat: Refactor EditModal for improved INSERT/UPDATE handling
- Introduced a new state flag `isCreateModeFlag` to determine the mode (INSERT or UPDATE) directly from the event, enhancing clarity in the modal's behavior. - Updated the logic for initializing `originalData` and determining the mode, ensuring that the modal correctly identifies whether to create or update based on the provided data. - Refactored the update logic to send the entire `formData` without relying on `originalData`, streamlining the update process. - Enhanced logging for better debugging and understanding of the modal's state during operations.
This commit is contained in:
@@ -596,6 +596,11 @@ export const SelectedItemsDetailInputComponent: React.FC<SelectedItemsDetailInpu
|
||||
const additionalFields = componentConfig.additionalFields || [];
|
||||
const mainTable = componentConfig.targetTable!;
|
||||
|
||||
// 수정 모드 감지: URL에 mode=edit가 있으면 수정 모드
|
||||
// 수정 모드에서는 항상 deleteOrphans=true (기존 레코드 교체, 복제 방지)
|
||||
const urlParams = typeof window !== "undefined" ? new URLSearchParams(window.location.search) : null;
|
||||
const isEditMode = urlParams?.get("mode") === "edit";
|
||||
|
||||
// fieldGroup별 sourceTable 분류
|
||||
const groupsByTable = new Map<string, typeof groups>();
|
||||
groups.forEach((group) => {
|
||||
@@ -686,9 +691,10 @@ export const SelectedItemsDetailInputComponent: React.FC<SelectedItemsDetailInpu
|
||||
});
|
||||
});
|
||||
|
||||
// 레코드에 id(기존 DB PK)가 있으면 EDIT 모드 → 고아 삭제
|
||||
// id 없으면 CREATE 모드 → 기존 레코드 건드리지 않음
|
||||
// 수정 모드이거나 레코드에 id(기존 DB PK)가 있으면 → 고아 삭제 (기존 레코드 교체)
|
||||
// 신규 등록이고 id 없으면 → 기존 레코드 건드리지 않음
|
||||
const mappingHasDbIds = mappingRecords.some((r) => !!r.id);
|
||||
const shouldDeleteOrphans = isEditMode || mappingHasDbIds;
|
||||
// 저장된 매핑 ID를 추적 (디테일 테이블에 mapping_id 주입용)
|
||||
let savedMappingIds: string[] = [];
|
||||
try {
|
||||
@@ -696,7 +702,7 @@ export const SelectedItemsDetailInputComponent: React.FC<SelectedItemsDetailInpu
|
||||
mainTable,
|
||||
itemParentKeys,
|
||||
mappingRecords,
|
||||
{ deleteOrphans: mappingHasDbIds },
|
||||
{ deleteOrphans: shouldDeleteOrphans },
|
||||
);
|
||||
// 백엔드에서 반환된 저장된 레코드 ID 목록
|
||||
if (mappingResult.success && mappingResult.savedIds) {
|
||||
@@ -775,12 +781,13 @@ export const SelectedItemsDetailInputComponent: React.FC<SelectedItemsDetailInpu
|
||||
}
|
||||
|
||||
const priceHasDbIds = priceRecords.some((r) => !!r.id);
|
||||
const shouldDeleteDetailOrphans = isEditMode || priceHasDbIds;
|
||||
try {
|
||||
const detailResult = await dataApi.upsertGroupedRecords(
|
||||
detailTable,
|
||||
itemParentKeys,
|
||||
priceRecords,
|
||||
{ deleteOrphans: priceHasDbIds },
|
||||
{ deleteOrphans: shouldDeleteDetailOrphans },
|
||||
);
|
||||
|
||||
if (!detailResult.success) {
|
||||
@@ -805,8 +812,10 @@ export const SelectedItemsDetailInputComponent: React.FC<SelectedItemsDetailInpu
|
||||
// 단일 테이블 저장 (기존 로직 - detailTable 없는 경우)
|
||||
// ============================================================
|
||||
const records = generateCartesianProduct(items);
|
||||
const singleHasDbIds = records.some((r) => !!r.id);
|
||||
const shouldDeleteSingleOrphans = isEditMode || singleHasDbIds;
|
||||
|
||||
const result = await dataApi.upsertGroupedRecords(mainTable, parentKeys, records);
|
||||
const result = await dataApi.upsertGroupedRecords(mainTable, parentKeys, records, { deleteOrphans: shouldDeleteSingleOrphans });
|
||||
|
||||
if (result.success) {
|
||||
window.dispatchEvent(
|
||||
|
||||
Reference in New Issue
Block a user