This commit is contained in:
DDD1542 2026-03-17 22:06:13 +09:00
parent 13b2ebaf1f
commit 12d4d2a8b1
1 changed files with 42 additions and 21 deletions

View File

@ -318,7 +318,7 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
const [rightDraggedColumnIndex, setRightDraggedColumnIndex] = useState<number | null>(null); const [rightDraggedColumnIndex, setRightDraggedColumnIndex] = useState<number | null>(null);
const [rightDropTargetColumnIndex, setRightDropTargetColumnIndex] = useState<number | null>(null); const [rightDropTargetColumnIndex, setRightDropTargetColumnIndex] = useState<number | null>(null);
const [rightDragSource, setRightDragSource] = useState<"main" | number | null>(null); const [rightDragSource, setRightDragSource] = useState<"main" | number | null>(null);
const [runtimeColumnOrder, setRuntimeColumnOrder] = useState<Record<string, number[]>>({}); const [runtimeColumnOrder, setRuntimeColumnOrder] = useState<Record<string, string[]>>({});
// 데이터 상태 // 데이터 상태
const [leftData, setLeftData] = useState<any[]>([]); const [leftData, setLeftData] = useState<any[]>([]);
@ -2597,17 +2597,33 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
}); });
} }
} else { } else {
// 런타임 모드: 로컬 상태로 순서 변경 // 런타임 모드: 컬럼 이름 순서로 로컬 상태 관리
const key = String(source); const key = String(source);
setRuntimeColumnOrder((prev) => { const rightPanel = componentConfig.rightPanel || {};
const existing = prev[key]; let colNames: string[] = [];
const maxLen = 100;
const order = existing || Array.from({ length: maxLen }, (_, i) => i); if (source === "main") {
const reordered = [...order]; const allColumns = rightPanel.columns || [];
const [removed] = reordered.splice(fromIdx, 1); colNames = allColumns.filter((c: any) => c.showInSummary !== false).map((c: any) => c.name);
reordered.splice(targetIndex, 0, removed); } else if (typeof source === "number") {
return { ...prev, [key]: reordered }; const tabs = rightPanel.additionalTabs || [];
}); const tabConfig = tabs[source];
if (tabConfig?.columns) {
colNames = tabConfig.columns.filter((c: any) => c.showInSummary !== false).map((c: any) => c.name);
}
}
if (colNames.length > 0) {
setRuntimeColumnOrder((prev) => {
const currentOrder = prev[key] || colNames;
const reordered = [...currentOrder];
if (fromIdx >= 0 && fromIdx < reordered.length && targetIndex >= 0 && targetIndex < reordered.length) {
const [removed] = reordered.splice(fromIdx, 1);
reordered.splice(targetIndex, 0, removed);
}
return { ...prev, [key]: reordered };
});
}
} }
handleRightColumnDragEnd(); handleRightColumnDragEnd();
}, },
@ -2622,21 +2638,26 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
], ],
); );
// 런타임 컬럼 순서 적용 헬퍼 // 런타임 컬럼 순서 적용 헬퍼 (이름 기반)
const applyRuntimeOrder = useCallback( const applyRuntimeOrder = useCallback(
<T,>(columns: T[], source: "main" | number): T[] => { (columns: any[], source: "main" | number): any[] => {
const key = String(source); const key = String(source);
const order = runtimeColumnOrder[key]; const order = runtimeColumnOrder[key];
if (!order) return columns; if (!order || order.length === 0) return columns;
const result: T[] = []; const colMap = new Map(columns.map((col) => [col.name, col]));
for (const idx of order) { const result: any[] = [];
if (idx < columns.length) result.push(columns[idx]); for (const name of order) {
const col = colMap.get(name);
if (col) {
result.push(col);
colMap.delete(name);
}
} }
// order에 없는 나머지 컬럼 추가 // order에 없는 나머지 컬럼 뒤에 추가
for (let i = 0; i < columns.length; i++) { for (const col of colMap.values()) {
if (!order.includes(i)) result.push(columns[i]); result.push(col);
} }
return result.length > 0 ? result : columns; return result;
}, },
[runtimeColumnOrder], [runtimeColumnOrder],
); );