필터의 라벨도 코드말고 설정한걸로 나오게 수정

This commit is contained in:
leeheejin 2026-01-06 14:43:57 +09:00
parent 68017ed0e9
commit 6ae0778b4c
1 changed files with 28 additions and 10 deletions

View File

@ -2250,9 +2250,9 @@ export const TableListComponent: React.FC<TableListComponentProps> = ({
// 🆕 편집 모드 진입 placeholder (실제 구현은 visibleColumns 정의 후)
const startEditingRef = useRef<() => void>(() => {});
// 🆕 각 컬럼의 고유값 목록 계산
// 🆕 각 컬럼의 고유값 목록 계산 (라벨 포함)
const columnUniqueValues = useMemo(() => {
const result: Record<string, string[]> = {};
const result: Record<string, Array<{ value: string; label: string }>> = {};
if (data.length === 0) return result;
@ -2260,16 +2260,34 @@ export const TableListComponent: React.FC<TableListComponentProps> = ({
if (column.columnName === "__checkbox__") return;
const mappedColumnName = joinColumnMapping[column.columnName] || column.columnName;
const values = new Set<string>();
// 라벨 컬럼 후보들 (백엔드에서 _name, _label, _value_label 등으로 반환할 수 있음)
const labelColumnCandidates = [
`${column.columnName}_name`, // 예: division_name
`${column.columnName}_label`, // 예: division_label
`${column.columnName}_value_label`, // 예: division_value_label
];
const valuesMap = new Map<string, string>(); // value -> label
data.forEach((row) => {
const val = row[mappedColumnName];
if (val !== null && val !== undefined && val !== "") {
values.add(String(val));
const valueStr = String(val);
// 라벨 컬럼 후보들 중 값이 있는 것 사용, 없으면 원본 값 사용
let label = valueStr;
for (const labelCol of labelColumnCandidates) {
if (row[labelCol] && row[labelCol] !== "") {
label = String(row[labelCol]);
break;
}
}
valuesMap.set(valueStr, label);
}
});
result[column.columnName] = Array.from(values).sort();
// value-label 쌍으로 저장하고 라벨 기준 정렬
result[column.columnName] = Array.from(valuesMap.entries())
.map(([value, label]) => ({ value, label }))
.sort((a, b) => a.label.localeCompare(b.label));
});
return result;
@ -5758,16 +5776,16 @@ export const TableListComponent: React.FC<TableListComponentProps> = ({
)}
</div>
<div className="max-h-48 space-y-1 overflow-y-auto">
{columnUniqueValues[column.columnName]?.slice(0, 50).map((val) => {
const isSelected = headerFilters[column.columnName]?.has(val);
{columnUniqueValues[column.columnName]?.slice(0, 50).map((item) => {
const isSelected = headerFilters[column.columnName]?.has(item.value);
return (
<div
key={val}
key={item.value}
className={cn(
"hover:bg-muted flex cursor-pointer items-center gap-2 rounded px-2 py-1 text-xs",
isSelected && "bg-primary/10",
)}
onClick={() => toggleHeaderFilter(column.columnName, val)}
onClick={() => toggleHeaderFilter(column.columnName, item.value)}
>
<div
className={cn(
@ -5777,7 +5795,7 @@ export const TableListComponent: React.FC<TableListComponentProps> = ({
>
{isSelected && <Check className="text-primary-foreground h-3 w-3" />}
</div>
<span className="truncate">{val || "(빈 값)"}</span>
<span className="truncate">{item.label || "(빈 값)"}</span>
</div>
);
})}