feat(repeater): 하위 데이터 조회 및 조건부 입력 기능 구현, 테이블 선택 데이터 동기화 개선

Repeater 컴포넌트에 하위 데이터 조회 기능 추가 (재고/단가 조회)
조건부 입력 활성화 및 최대값 제한 기능 구현
필드 정의 순서 변경 기능 추가 (드래그앤드롭, 화살표 버튼)
TableListComponent의 DataProvider 클로저 문제 해결
ButtonPrimaryComponent에 modalDataStore fallback 로직 추가
This commit is contained in:
SeongHyun Kim
2026-01-15 10:35:34 +09:00
parent ca73685bc2
commit 2e02ace388
7 changed files with 1733 additions and 117 deletions

View File

@@ -862,17 +862,55 @@ export const TableListComponent: React.FC<TableListComponentProps> = ({
};
// 화면 컨텍스트에 데이터 제공자/수신자로 등록
// 🔧 dataProvider와 dataReceiver를 의존성에 포함하지 않고,
// 대신 data와 selectedRows가 변경될 때마다 재등록하여 최신 클로저 참조
useEffect(() => {
if (screenContext && component.id) {
screenContext.registerDataProvider(component.id, dataProvider);
screenContext.registerDataReceiver(component.id, dataReceiver);
// 🔧 매번 새로운 dataProvider를 등록하여 최신 selectedRows 참조
const currentDataProvider: DataProvidable = {
componentId: component.id,
componentType: "table-list",
getSelectedData: () => {
const selectedData = filteredData.filter((row) => {
const rowId = String(row.id || row[tableConfig.selectedTable + "_id"] || "");
return selectedRows.has(rowId);
});
console.log("📊 [TableList] getSelectedData 호출:", {
componentId: component.id,
selectedRowsSize: selectedRows.size,
filteredDataLength: filteredData.length,
resultLength: selectedData.length,
});
return selectedData;
},
getAllData: () => filteredData,
clearSelection: () => {
setSelectedRows(new Set());
setIsAllSelected(false);
},
};
const currentDataReceiver: DataReceivable = {
componentId: component.id,
componentType: "table",
receiveData: dataReceiver.receiveData,
getData: () => data,
};
screenContext.registerDataProvider(component.id, currentDataProvider);
screenContext.registerDataReceiver(component.id, currentDataReceiver);
console.log("✅ [TableList] ScreenContext에 등록:", {
componentId: component.id,
selectedRowsSize: selectedRows.size,
});
return () => {
screenContext.unregisterDataProvider(component.id);
screenContext.unregisterDataReceiver(component.id);
};
}
}, [screenContext, component.id, data, selectedRows]);
}, [screenContext, component.id, data, selectedRows, filteredData, tableConfig.selectedTable]);
// 분할 패널 컨텍스트에 데이터 수신자로 등록
// useSplitPanelPosition 훅으로 위치 가져오기 (중첩된 화면에서도 작동)