Merge pull request 'lhj' (#334) from lhj into main
Reviewed-on: http://39.117.244.52:3000/kjs/ERP-node/pulls/334
This commit is contained in:
commit
f2cb7d14ca
|
|
@ -2392,6 +2392,44 @@ export const TableListComponent: React.FC<TableListComponentProps> = ({
|
||||||
fetchLabels();
|
fetchLabels();
|
||||||
}, [columnUniqueValues, categoryLabelCache]);
|
}, [columnUniqueValues, categoryLabelCache]);
|
||||||
|
|
||||||
|
// 🆕 데이터에서 CATEGORY_ 코드를 찾아 라벨 미리 로드 (테이블 셀 렌더링용)
|
||||||
|
useEffect(() => {
|
||||||
|
if (data.length === 0) return;
|
||||||
|
|
||||||
|
const categoryCodesToFetch = new Set<string>();
|
||||||
|
|
||||||
|
// 모든 데이터 행에서 CATEGORY_ 코드 수집
|
||||||
|
data.forEach((row) => {
|
||||||
|
Object.entries(row).forEach(([key, value]) => {
|
||||||
|
if (value && typeof value === "string") {
|
||||||
|
// 콤마로 구분된 다중 값도 처리
|
||||||
|
const codes = value.split(",").map((v) => v.trim());
|
||||||
|
codes.forEach((code) => {
|
||||||
|
if (code.startsWith("CATEGORY_") && !categoryLabelCache[code]) {
|
||||||
|
categoryCodesToFetch.add(code);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
if (categoryCodesToFetch.size === 0) return;
|
||||||
|
|
||||||
|
// API로 라벨 조회
|
||||||
|
const fetchLabels = async () => {
|
||||||
|
try {
|
||||||
|
const response = await getCategoryLabelsByCodes(Array.from(categoryCodesToFetch));
|
||||||
|
if (response.success && response.data && Object.keys(response.data).length > 0) {
|
||||||
|
setCategoryLabelCache((prev) => ({ ...prev, ...response.data }));
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("CATEGORY_ 라벨 조회 실패:", error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
fetchLabels();
|
||||||
|
}, [data, categoryLabelCache]);
|
||||||
|
|
||||||
// 🆕 헤더 필터 토글
|
// 🆕 헤더 필터 토글
|
||||||
const toggleHeaderFilter = useCallback((columnName: string, value: string) => {
|
const toggleHeaderFilter = useCallback((columnName: string, value: string) => {
|
||||||
setHeaderFilters((prev) => {
|
setHeaderFilters((prev) => {
|
||||||
|
|
@ -4548,10 +4586,36 @@ export const TableListComponent: React.FC<TableListComponentProps> = ({
|
||||||
case "boolean":
|
case "boolean":
|
||||||
return value ? "예" : "아니오";
|
return value ? "예" : "아니오";
|
||||||
default:
|
default:
|
||||||
return String(value);
|
// 🆕 CATEGORY_ 코드 자동 변환 (inputType이 category가 아니어도)
|
||||||
|
const strValue = String(value);
|
||||||
|
if (strValue.startsWith("CATEGORY_")) {
|
||||||
|
// rowData에서 _label 필드 찾기
|
||||||
|
if (rowData) {
|
||||||
|
const labelFieldCandidates = [
|
||||||
|
`${column.columnName}_label`,
|
||||||
|
`${column.columnName}_name`,
|
||||||
|
`${column.columnName}_value_label`,
|
||||||
|
];
|
||||||
|
for (const labelField of labelFieldCandidates) {
|
||||||
|
if (rowData[labelField] && rowData[labelField] !== "") {
|
||||||
|
return String(rowData[labelField]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// categoryMappings에서 찾기
|
||||||
|
const mapping = categoryMappings[column.columnName];
|
||||||
|
if (mapping && mapping[strValue]) {
|
||||||
|
return mapping[strValue].label;
|
||||||
|
}
|
||||||
|
// categoryLabelCache에서 찾기 (필터용 캐시)
|
||||||
|
if (categoryLabelCache[strValue]) {
|
||||||
|
return categoryLabelCache[strValue];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return strValue;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[columnMeta, joinedColumnMeta, optimizedConvertCode, categoryMappings],
|
[columnMeta, joinedColumnMeta, optimizedConvertCode, categoryMappings, categoryLabelCache],
|
||||||
);
|
);
|
||||||
|
|
||||||
// ========================================
|
// ========================================
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue