[agent-pipeline] pipe-20260306212316-vynh round-3

This commit is contained in:
DDD1542
2026-03-07 07:41:16 +09:00
parent 36a79f8d5d
commit 2d13f7bbff
6 changed files with 495 additions and 20 deletions

View File

@@ -257,7 +257,9 @@ export function TableSearchWidget({ component, screenId, onHeightChange }: Table
// currentTable이 준비되고 필터값이 있을 때 실행
useEffect(() => {
if (!needsFilterReapplyRef.current) return;
if (!currentTable?.onFilterChange) return;
// currentTable을 로컬 변수로 캡처하여 strict 타입 가드 적용
const table = currentTable;
if (!table?.onFilterChange) return;
// 플래그 즉시 해제 (중복 실행 방지)
needsFilterReapplyRef.current = false;
@@ -288,8 +290,8 @@ export function TableSearchWidget({ component, screenId, onHeightChange }: Table
const day = String(date.getDate()).padStart(2, "0");
return `${year}-${month}-${day}`;
};
const fromStr = filterValue.from ? formatDate(filterValue.from) : "";
const toStr = filterValue.to ? formatDate(filterValue.to) : "";
const fromStr = filterValue.from ? formatDate(filterValue.from as Date) : "";
const toStr = filterValue.to ? formatDate(filterValue.to as Date) : "";
if (fromStr && toStr) filterValue = `${fromStr}|${toStr}`;
else if (fromStr) filterValue = `${fromStr}|`;
else if (toStr) filterValue = `|${toStr}`;
@@ -298,7 +300,7 @@ export function TableSearchWidget({ component, screenId, onHeightChange }: Table
// 배열 처리
if (Array.isArray(filterValue)) {
filterValue = filterValue.join("|");
filterValue = (filterValue as unknown[]).join("|");
}
let operator: TableFilter["operator"] = "contains";
@@ -318,7 +320,7 @@ export function TableSearchWidget({ component, screenId, onHeightChange }: Table
});
// 직접 onFilterChange 호출 (applyFilters 클로저 우회)
currentTable.onFilterChange(filtersWithValues);
table.onFilterChange(filtersWithValues);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [currentTable?.onFilterChange, currentTable?.tableName, activeFilters, filterValues]);
@@ -577,8 +579,8 @@ export function TableSearchWidget({ component, screenId, onHeightChange }: Table
};
// "YYYY-MM-DD|YYYY-MM-DD" 형식으로 변환
const fromStr = filterValue.from ? formatDate(filterValue.from) : "";
const toStr = filterValue.to ? formatDate(filterValue.to) : "";
const fromStr = filterValue.from ? formatDate(filterValue.from as Date) : "";
const toStr = filterValue.to ? formatDate(filterValue.to as Date) : "";
if (fromStr && toStr) {
// 둘 다 있으면 파이프로 연결
@@ -597,24 +599,21 @@ export function TableSearchWidget({ component, screenId, onHeightChange }: Table
// 다중선택 배열을 처리 (파이프로 연결된 문자열로 변환)
// filterType에 관계없이 배열이면 파이프로 연결
if (Array.isArray(filterValue)) {
filterValue = filterValue.join("|");
filterValue = (filterValue as unknown[]).join("|");
}
// 🔧 filterType에 따라 operator 설정
// - "select" 유형: 정확히 일치 (equals)
// - "text" 유형: 부분 일치 (contains)
// - "date", "number": 각각 적절한 처리
let operator: TableFilter["operator"] = "contains"; // 기본값
// filterType에 따라 operator 설정
let operator: TableFilter["operator"] = "contains";
if (filter.filterType === "select") {
operator = "equals"; // 선택 필터는 정확히 일치
operator = "equals";
} else if (filter.filterType === "number") {
operator = "equals"; // 숫자도 정확히 일치
operator = "equals";
}
return {
...filter,
value: (filterValue || "") as string | number | boolean,
operator, // operator 추가
operator,
};
})
.filter((f): f is TableFilter => {
@@ -624,8 +623,10 @@ export function TableSearchWidget({ component, screenId, onHeightChange }: Table
return true;
});
if (currentTable?.onFilterChange) {
currentTable.onFilterChange(filtersWithValues);
// currentTable을 로컬 변수로 캡처하여 strict 타입 가드 적용
const table = currentTable;
if (table?.onFilterChange) {
table.onFilterChange(filtersWithValues);
}
};