feat: 테이블 검색 필터 개선 - 필터 너비 설정 및 자동 wrap 기능

- FilterPanel: 필터별 너비(width) 설정 기능 추가 (50-500px)
- TableSearchWidget: 필터가 여러 줄로 자동 wrap되도록 flex-wrap 적용
- TableSearchWidget: 필터 너비 설정을 localStorage에 저장/복원
- InteractiveScreenViewerDynamic: TableSearchWidget의 높이를 auto로 설정하여 콘텐츠에 맞게 자동 조정
- globals.css: 입력 필드 포커스 시 검정 테두리 제거 (combobox, input)

주요 변경사항:
1. 필터 설정에서 각 필터의 표시 너비를 개별 설정 가능
2. 필터가 많을 때 자동으로 여러 줄로 배치 (overflow 방지)
3. 설정된 필터 너비가 새로고침 후에도 유지됨
4. TableSearchWidget 높이가 콘텐츠에 맞게 자동 조정

TODO: TableSearchWidget 높이 변화 시 아래 컴포넌트 자동 재배치 기능 구현 예정
This commit is contained in:
kjs
2025-11-12 14:50:06 +09:00
parent 5c205753e2
commit 6d1743c524
6 changed files with 131 additions and 19 deletions

View File

@@ -683,6 +683,9 @@ export const InteractiveScreenViewerDynamic: React.FC<InteractiveScreenViewerPro
// ✅ 격자 시스템 잔재 제거: style.width, style.height 무시
const { width: styleWidth, height: styleHeight, ...styleWithoutSize } = style;
// TableSearchWidget의 경우 높이를 자동으로 설정
const isTableSearchWidget = (component as any).componentId === "table-search-widget";
const componentStyle = {
position: "absolute" as const,
left: position?.x || 0,
@@ -690,7 +693,8 @@ export const InteractiveScreenViewerDynamic: React.FC<InteractiveScreenViewerPro
zIndex: position?.z || 1,
...styleWithoutSize, // width/height 제외한 스타일만 먼저 적용
width: size?.width || 200, // size의 픽셀 값이 최종 우선순위
height: size?.height || 10,
height: isTableSearchWidget ? "auto" : (size?.height || 10),
minHeight: isTableSearchWidget ? "48px" : undefined,
};
return (

View File

@@ -65,6 +65,7 @@ interface ColumnFilterConfig {
inputType: string;
enabled: boolean;
filterType: "text" | "number" | "date" | "select";
width?: number; // 필터 입력 필드 너비 (px)
selectOptions?: Array<{ label: string; value: string }>;
}
@@ -188,6 +189,7 @@ export const FilterPanel: React.FC<Props> = ({ isOpen, onClose, onFiltersApplied
operator: "contains", // 기본 연산자
value: "",
filterType: cf.filterType,
width: cf.width || 200, // 너비 포함 (기본 200px)
}));
// localStorage에 저장
@@ -285,6 +287,28 @@ export const FilterPanel: React.FC<Props> = ({ isOpen, onClose, onFiltersApplied
<SelectItem value="select"></SelectItem>
</SelectContent>
</Select>
{/* 너비 입력 */}
<Input
type="number"
value={filter.width || 200}
onChange={(e) => {
const newWidth = parseInt(e.target.value) || 200;
setColumnFilters((prev) =>
prev.map((f) =>
f.columnName === filter.columnName
? { ...f, width: newWidth }
: f
)
);
}}
disabled={!filter.enabled}
placeholder="너비"
className="h-8 w-[80px] text-xs sm:h-9 sm:text-sm"
min={50}
max={500}
/>
<span className="text-xs text-muted-foreground">px</span>
</div>
))}
</div>