From 1d85de8bf6b0c238480e95291319ca6c25d92b5e Mon Sep 17 00:00:00 2001 From: SeongHyun Kim Date: Thu, 19 Mar 2026 17:14:22 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20pop-search=20=EB=A0=88=EA=B1=B0?= =?UTF-8?q?=EC=8B=9C=20=EC=A0=95=EB=A6=AC=20+=20=ED=95=98=EC=9C=84=20?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EB=B8=94=20=EC=9E=90=EB=8F=99=20=ED=8C=90?= =?UTF-8?q?=EB=8B=A8=20+=20=EC=B4=88=EA=B8=B0=EA=B0=92=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EC=84=B8=ED=8C=85=20MES=20=EA=B3=A0?= =?UTF-8?q?=EC=A0=95=20=EA=B5=AC=EC=A1=B0=EC=97=90=20=EB=A7=9E=EA=B2=8C=20?= =?UTF-8?q?=EA=B2=80=EC=83=89/=EC=97=B0=EA=B2=B0/=ED=95=84=ED=84=B0=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A5=BC=20=EA=B0=84?= =?UTF-8?q?=EC=86=8C=ED=99=94=ED=95=98=EA=B3=A0,=20=ED=95=98=EC=9C=84=20?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EB=B8=94=20=ED=95=84=ED=84=B0=EB=A5=BC=20?= =?UTF-8?q?=EC=88=98=EB=8F=99=20=EC=84=A4=EC=A0=95=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=ED=8C=90=EB=8B=A8=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=84=ED=99=98=ED=95=9C=EB=8B=A4.=20[pop-search=20=EB=A0=88?= =?UTF-8?q?=EA=B1=B0=EC=8B=9C=20=EC=A0=95=EB=A6=AC]=20-=20LegacySearchInpu?= =?UTF-8?q?tType,=20StatusChipConfig,=20StatusChipStyle,=20=20=20SelectDat?= =?UTF-8?q?aSource=20=EB=93=B1=20=EB=AF=B8=EC=82=AC=EC=9A=A9=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EC=A0=9C=EA=B1=B0=20-=20status-chip,=20multi-selec?= =?UTF-8?q?t,=20combo=20=EC=9E=85=EB=A0=A5=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20=20=20(DB=20=ED=98=B8=ED=99=98:=20normaliz?= =?UTF-8?q?eInputType=EC=97=90=EC=84=9C=20text=EB=A1=9C=20=EC=A0=95?= =?UTF-8?q?=EA=B7=9C=ED=99=94)=20-=20=EC=84=A4=EC=A0=95=20=ED=8C=A8?= =?UTF-8?q?=EB=84=90=EC=97=90=EC=84=9C=20status-chip=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20UI/=EC=95=88=EB=82=B4=EB=AC=B8=20=EC=A0=9C=EA=B1=B0=20-=20SE?= =?UTF-8?q?ARCH=5FINPUT=5FTYPE=5FLABELS=20=EA=B0=84=EC=86=8C=ED=99=94=20(7?= =?UTF-8?q?=EC=A2=85=20->=205=EC=A2=85)=20[=ED=95=98=EC=9C=84=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=9E=90=EB=8F=99=20=ED=8C=90=EB=8B=A8]?= =?UTF-8?q?=20-=20PopCardListV2Component:=20subTableKeys=20useMemo=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=20=20(processFlow=20rawData=20=ED=82=A4?= =?UTF-8?q?=EC=85=8B=EC=97=90=EC=84=9C=20=ED=95=98=EC=9C=84=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=BB=AC=EB=9F=BC=20=EC=9E=90=EB=8F=99=20?= =?UTF-8?q?=EC=B6=94=EC=B6=9C)=20-=20isSubTableColumn=20useCallback:=20fil?= =?UTF-8?q?terConfig.isSubTable=20=ED=95=98=EC=9C=84=20=ED=98=B8=ED=99=98?= =?UTF-8?q?=20+=20=20=20subTableKeys=20=EA=B8=B0=EB=B0=98=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=ED=8C=90=EB=8B=A8=EC=9C=BC=EB=A1=9C=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8/=ED=95=98=EC=9C=84=20=ED=95=84=ED=84=B0=20=EB=B6=84?= =?UTF-8?q?=EB=A5=98=20-=20ConnectionEditor:=20"=ED=95=98=EC=9C=84=20?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EB=B8=94=20=EA=B8=B0=EC=A4=80=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=ED=95=84=ED=84=B0"=20=EC=B2=B4=ED=81=AC=EB=B0=95?= =?UTF-8?q?=EC=8A=A4=20UI=20=EC=A0=9C=EA=B1=B0,=20=20=20isSubTable=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EB=B0=8F=20setIsSubTable=20=EC=A0=84?= =?UTF-8?q?=EB=B6=80=20=EC=A0=9C=EA=B1=B0=20-=20=EC=BB=AC=EB=9F=BC=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=20=EB=93=9C=EB=A1=AD=EB=8B=A4=EC=9A=B4:=20?= =?UTF-8?q?=EB=A9=94=EC=9D=B8+=ED=95=98=EC=9C=84=20=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=B8=94=20=EC=BB=AC=EB=9F=BC=20=ED=86=B5=ED=95=A9=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C=20-=20=EA=B8=B0=EC=A1=B4=20=EC=97=B0=EA=B2=B0=20?= =?UTF-8?q?=EB=B0=B0=EC=A7=80=20"=ED=95=98=EC=9C=84=20=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=B8=94"=20->=20"=EC=9E=90=EB=8F=99=20=ED=8C=90=EB=8B=A8"?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20[=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=EA=B0=92=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=84=B8=ED=8C=85]?= =?UTF-8?q?=20-=20PopSearchConfig.initialValueSource=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20=20=20({=20type:=20"user=5Fprofile",=20?= =?UTF-8?q?column:=20string=20})=20-=20PopSearchComponent:=20useAuth=20+?= =?UTF-8?q?=20useEffect=EB=A1=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EA=B0=92=20=20=20=EC=9E=90=EB=8F=99=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=20=EB=B0=9C=ED=96=89=20(userId,=20deptCode,?= =?UTF-8?q?=20positionCode=20=EB=93=B1)=20-=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=ED=8C=A8=EB=84=90:=20"=EC=B4=88=EA=B8=B0=EA=B0=92=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EC=84=B8=ED=8C=85"=20Select=20=EB=93=9C=EB=A1=AD?= =?UTF-8?q?=EB=8B=A4=EC=9A=B4=20=EC=B6=94=EA=B0=80=20=20=20(=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20=EC=95=88=20=ED=95=A8=20/=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90ID=20/=20=EB=B6=80=EC=84=9C=EC=BD=94=EB=93=9C=20/=20?= =?UTF-8?q?=EC=A7=81=EA=B8=89=20=EB=93=B1=207=EA=B0=9C=20=EC=98=B5?= =?UTF-8?q?=EC=85=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../pop/designer/panels/ConnectionEditor.tsx | 127 ++++++++---------- .../PopCardListV2Component.tsx | 34 +++-- .../pop-search/PopSearchComponent.tsx | 24 +++- .../pop-search/PopSearchConfig.tsx | 42 ++++-- .../pop-components/pop-search/types.ts | 58 ++------ 6 files changed, 147 insertions(+), 139 deletions(-) diff --git a/.gitignore b/.gitignore index ac7c9e27..d713bdd4 100644 --- a/.gitignore +++ b/.gitignore @@ -181,5 +181,6 @@ scripts/browser-test-*.js # 개인 작업 문서 popdocs/ +kshdocs/ .cursor/rules/popdocs-safety.mdc .cursor/rules/overtime-registration.mdc diff --git a/frontend/components/pop/designer/panels/ConnectionEditor.tsx b/frontend/components/pop/designer/panels/ConnectionEditor.tsx index 0a64e82a..c6ebde8e 100644 --- a/frontend/components/pop/designer/panels/ConnectionEditor.tsx +++ b/frontend/components/pop/designer/panels/ConnectionEditor.tsx @@ -4,7 +4,6 @@ import React from "react"; import { ArrowRight, Link2, Unlink2, Plus, Trash2, Pencil, X, Loader2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; -import { Checkbox } from "@/components/ui/checkbox"; import { Select, SelectContent, @@ -172,7 +171,7 @@ function SendSection({ {conn.filterConfig.isSubTable && ( - 하위 테이블 + 자동 판단 )} @@ -229,9 +228,6 @@ function SimpleConnectionForm({ const [selectedTargetId, setSelectedTargetId] = React.useState( initial?.targetComponent || "" ); - const [isSubTable, setIsSubTable] = React.useState( - initial?.filterConfig?.isSubTable || false - ); const [targetColumn, setTargetColumn] = React.useState( initial?.filterConfig?.targetColumn || "" ); @@ -255,23 +251,34 @@ function SimpleConnectionForm({ && targetReg?.connectionMeta?.receivable?.some((r) => r.type === "filter_value"); const subTableName = targetComp ? extractSubTableName(targetComp) : null; + const mainTableName = (() => { + const cfg = targetComp?.config as Record | undefined; + const ds = cfg?.dataSource as { tableName?: string } | undefined; + return ds?.tableName || null; + })(); React.useEffect(() => { - if (!isSubTable || !subTableName) { + if (!isFilterConnection || !selectedTargetId) { setSubColumns([]); return; } + const tables = [mainTableName, subTableName].filter(Boolean) as string[]; + if (tables.length === 0) { setSubColumns([]); return; } setLoadingColumns(true); - getTableColumns(subTableName) - .then((res) => { - const cols = res.success && res.data?.columns; - if (Array.isArray(cols)) { - setSubColumns(cols.map((c) => c.columnName || "").filter(Boolean)); + Promise.all(tables.map((t) => getTableColumns(t))) + .then((results) => { + const allCols = new Set(); + for (const res of results) { + const cols = res.success && res.data?.columns; + if (Array.isArray(cols)) { + cols.forEach((c) => { if (c.columnName) allCols.add(c.columnName); }); + } } + setSubColumns([...allCols].sort()); }) .catch(() => setSubColumns([])) .finally(() => setLoadingColumns(false)); - }, [isSubTable, subTableName]); + }, [isFilterConnection, selectedTargetId, mainTableName, subTableName]); const handleSubmit = () => { if (!selectedTargetId) return; @@ -290,11 +297,10 @@ function SimpleConnectionForm({ label: `${srcLabel} → ${tgtLabel}`, }; - if (isFilterConnection && isSubTable && targetColumn) { + if (isFilterConnection && targetColumn) { conn.filterConfig = { targetColumn, filterMode: filterMode as "equals" | "contains" | "starts_with" | "range", - isSubTable: true, }; } @@ -302,7 +308,6 @@ function SimpleConnectionForm({ if (!initial) { setSelectedTargetId(""); - setIsSubTable(false); setTargetColumn(""); setFilterMode("equals"); } @@ -328,7 +333,6 @@ function SimpleConnectionForm({ value={selectedTargetId} onValueChange={(v) => { setSelectedTargetId(v); - setIsSubTable(false); setTargetColumn(""); }} > @@ -345,62 +349,47 @@ function SimpleConnectionForm({ - {isFilterConnection && selectedTargetId && subTableName && ( + {isFilterConnection && selectedTargetId && (
-
- { - setIsSubTable(v === true); - if (!v) setTargetColumn(""); - }} - /> - +
+ 대상 컬럼 + {loadingColumns ? ( +
+ + 컬럼 로딩 중... +
+ ) : ( + + )}
- {isSubTable && ( -
-
- 대상 컬럼 - {loadingColumns ? ( -
- - 컬럼 로딩 중... -
- ) : ( - - )} -
- -
- 비교 방식 - -
-
- )} +
+ 비교 방식 + +
+

+ 메인/하위 테이블 구분은 자동으로 판단됩니다 +

)} diff --git a/frontend/lib/registry/pop-components/pop-card-list-v2/PopCardListV2Component.tsx b/frontend/lib/registry/pop-components/pop-card-list-v2/PopCardListV2Component.tsx index a6c26838..56296c87 100644 --- a/frontend/lib/registry/pop-components/pop-card-list-v2/PopCardListV2Component.tsx +++ b/frontend/lib/registry/pop-components/pop-card-list-v2/PopCardListV2Component.tsx @@ -569,23 +569,39 @@ export function PopCardListV2Component({ ); }, [timelineSource]); - // 외부 필터 (메인 테이블 + 하위 테이블 분기) + // processFlow rawData 키셋 (하위 테이블 컬럼 자동 판단용) + const subTableKeys = useMemo(() => { + for (const row of rows) { + const pf = row.__processFlow__ as TimelineProcessStep[] | undefined; + if (pf?.[0]?.rawData) return new Set(Object.keys(pf[0].rawData)); + } + return new Set(); + }, [rows]); + + // 필터 컬럼이 하위 테이블에 속하는지 자동 판단 + const isSubTableColumn = useCallback((filter: { fieldName: string; filterConfig?: { targetColumn: string; isSubTable?: boolean } }) => { + if (filter.filterConfig?.isSubTable) return true; + const col = filter.filterConfig?.targetColumn || filter.fieldName; + return col ? subTableKeys.has(col) : false; + }, [subTableKeys]); + + // 외부 필터 (자동 분류: 컬럼이 processFlow에 있으면 subFilter) const filteredRows = useMemo(() => { if (externalFilters.size === 0) return duplicateAcceptableCards(rows); const allFilters = [...externalFilters.values()]; - const mainFilters = allFilters.filter((f) => !f.filterConfig?.isSubTable); - const subFilters = allFilters.filter((f) => f.filterConfig?.isSubTable); + const mainFilters = allFilters.filter((f) => !isSubTableColumn(f)); + const subFilters = allFilters.filter((f) => isSubTableColumn(f)); const afterDuplicate = applySubFilterAndDuplicate(rows, subFilters); return applyMainFilters(afterDuplicate, mainFilters, subFilters.length > 0); - }, [rows, externalFilters, duplicateAcceptableCards, applySubFilterAndDuplicate, applyMainFilters]); + }, [rows, externalFilters, duplicateAcceptableCards, applySubFilterAndDuplicate, applyMainFilters, isSubTableColumn]); // 하위 필터 활성 여부 const hasActiveSubFilter = useMemo(() => { if (externalFilters.size === 0) return false; - return [...externalFilters.values()].some((f) => f.filterConfig?.isSubTable); - }, [externalFilters]); + return [...externalFilters.values()].some((f) => isSubTableColumn(f)); + }, [externalFilters, isSubTableColumn]); // 선택 모드 일괄 처리 const handleSelectModeAction = useCallback(async (btnConfig: SelectModeButtonConfig) => { @@ -675,12 +691,12 @@ export function PopCardListV2Component({ if (nonStatusFilters.size === 0) return duplicateAcceptableCards(rows); const allFilters = [...nonStatusFilters.values()]; - const mainFilters = allFilters.filter((f) => !f.filterConfig?.isSubTable); - const subFilters = allFilters.filter((f) => f.filterConfig?.isSubTable); + const mainFilters = allFilters.filter((f) => !isSubTableColumn(f)); + const subFilters = allFilters.filter((f) => isSubTableColumn(f)); const afterDuplicate = applySubFilterAndDuplicate(rows, subFilters); return applyMainFilters(afterDuplicate, mainFilters, subFilters.length > 0); - }, [rows, filteredRows, externalFilters, duplicateAcceptableCards, applySubFilterAndDuplicate, applyMainFilters]); + }, [rows, filteredRows, externalFilters, duplicateAcceptableCards, applySubFilterAndDuplicate, applyMainFilters, isSubTableColumn]); // 카운트 집계용 rows 발행 (status-bar 필터 제외) // originalCount: 복제 카드를 제외한 원본 카드 수 diff --git a/frontend/lib/registry/pop-components/pop-search/PopSearchComponent.tsx b/frontend/lib/registry/pop-components/pop-search/PopSearchComponent.tsx index 01ecc173..f4457e39 100644 --- a/frontend/lib/registry/pop-components/pop-search/PopSearchComponent.tsx +++ b/frontend/lib/registry/pop-components/pop-search/PopSearchComponent.tsx @@ -28,6 +28,7 @@ import { import { format, startOfWeek, endOfWeek, startOfMonth, endOfMonth } from "date-fns"; import { ko } from "date-fns/locale"; import { usePopEvent } from "@/hooks/pop"; +import { useAuth } from "@/hooks/useAuth"; import { dataApi } from "@/lib/api/data"; import type { PopSearchConfig, @@ -67,9 +68,11 @@ export function PopSearchComponent({ }: PopSearchComponentProps) { const config = { ...DEFAULT_CONFIG, ...(rawConfig || {}) }; const { publish, subscribe, setSharedData } = usePopEvent(screenId || ""); + const { user } = useAuth(); const [value, setValue] = useState(config.defaultValue ?? ""); const [modalDisplayText, setModalDisplayText] = useState(""); const [simpleModalOpen, setSimpleModalOpen] = useState(false); + const initialValueAppliedRef = useRef(false); const normalizedType = normalizeInputType(config.inputType as string); const isModalType = normalizedType === "modal"; @@ -107,6 +110,21 @@ export function PopSearchComponent({ [fieldKey, publish, setSharedData, componentId, resolveFilterMode, config.filterColumns] ); + // 초기값 고정 세팅: 사용자 프로필에서 자동으로 값 설정 + useEffect(() => { + if (initialValueAppliedRef.current) return; + if (!config.initialValueSource || config.initialValueSource.type !== "user_profile") return; + if (!user) return; + + const col = config.initialValueSource.column; + const profileValue = (user as Record)[col]; + if (profileValue != null && profileValue !== "") { + initialValueAppliedRef.current = true; + const timer = setTimeout(() => emitFilterChanged(profileValue), 100); + return () => clearTimeout(timer); + } + }, [user, config.initialValueSource, emitFilterChanged]); + useEffect(() => { if (!componentId) return; const unsub = subscribe( @@ -238,12 +256,6 @@ function SearchInputRenderer({ config, value, onChange, modalDisplayText, onModa return ; case "modal": return ; - case "status-chip": - return ( -
- pop-status-bar 컴포넌트를 사용하세요 -
- ); default: return ; } diff --git a/frontend/lib/registry/pop-components/pop-search/PopSearchConfig.tsx b/frontend/lib/registry/pop-components/pop-search/PopSearchConfig.tsx index b0752146..e8fb977a 100644 --- a/frontend/lib/registry/pop-components/pop-search/PopSearchConfig.tsx +++ b/frontend/lib/registry/pop-components/pop-search/PopSearchConfig.tsx @@ -209,6 +209,39 @@ function StepBasicSettings({ cfg, update }: StepProps) {
)} + {/* 초기값 고정 세팅 */} +
+ + + {cfg.initialValueSource && ( +

+ 화면 진입 시 로그인 사용자의 {cfg.initialValueSource.column} 값으로 자동 필터링됩니다 +

+ )} +
+ ); } @@ -231,15 +264,6 @@ function StepDetailSettings({ cfg, update, allComponents, connections, component return ; case "modal": return ; - case "status-chip": - return ( -
-

- 상태 칩은 pop-status-bar 컴포넌트로 분리되었습니다. - 새로운 "상태 바" 컴포넌트를 사용해주세요. -

-
- ); case "toggle": return (
diff --git a/frontend/lib/registry/pop-components/pop-search/types.ts b/frontend/lib/registry/pop-components/pop-search/types.ts index 6b284b60..decaff69 100644 --- a/frontend/lib/registry/pop-components/pop-search/types.ts +++ b/frontend/lib/registry/pop-components/pop-search/types.ts @@ -1,25 +1,20 @@ // ===== pop-search 전용 타입 ===== // 단일 필드 검색 컴포넌트. 그리드 한 칸 = 검색 필드 하나. -/** 검색 필드 입력 타입 (10종) */ +/** 검색 필드 입력 타입 */ export type SearchInputType = | "text" | "number" | "date" | "date-preset" | "select" - | "multi-select" - | "combo" | "modal" - | "toggle" - | "status-chip"; + | "toggle"; -/** 레거시 입력 타입 (DB에 저장된 기존 값 호환용) */ -export type LegacySearchInputType = "modal-table" | "modal-card" | "modal-icon-grid"; - -/** 레거시 타입 -> modal로 정규화 */ +/** 레거시 입력 타입 정규화 (DB 호환) */ export function normalizeInputType(t: string): SearchInputType { if (t === "modal-table" || t === "modal-card" || t === "modal-icon-grid") return "modal"; + if (t === "status-chip" || t === "multi-select" || t === "combo") return "text"; return t as SearchInputType; } @@ -38,15 +33,6 @@ export interface SelectOption { label: string; } -/** 셀렉트 옵션 데이터 소스 (DB에서 동적 로딩) */ -export interface SelectDataSource { - tableName: string; - valueColumn: string; - labelColumn: string; - sortColumn?: string; - sortDirection?: "asc" | "desc"; -} - /** 모달 보여주기 방식: 테이블 or 아이콘 */ export type ModalDisplayStyle = "table" | "icon"; @@ -79,22 +65,9 @@ export interface ModalSelectConfig { distinct?: boolean; } -/** @deprecated status-chip은 pop-status-bar로 분리됨. 레거시 호환용. */ -export type StatusChipStyle = "tab" | "pill"; - -/** @deprecated status-chip은 pop-status-bar로 분리됨. 레거시 호환용. */ -export interface StatusChipConfig { - showCount?: boolean; - countColumn?: string; - allowAll?: boolean; - allLabel?: string; - chipStyle?: StatusChipStyle; - useSubCount?: boolean; -} - /** pop-search 전체 설정 */ export interface PopSearchConfig { - inputType: SearchInputType | LegacySearchInputType; + inputType: SearchInputType | string; fieldName: string; placeholder?: string; defaultValue?: unknown; @@ -103,9 +76,8 @@ export interface PopSearchConfig { debounceMs?: number; triggerOnEnter?: boolean; - // select/multi-select 전용 + // select 전용 options?: SelectOption[]; - optionsDataSource?: SelectDataSource; // date 전용 dateSelectionMode?: DateSelectionMode; @@ -117,9 +89,6 @@ export interface PopSearchConfig { // modal 전용 modalConfig?: ModalSelectConfig; - // status-chip 전용 - statusChipConfig?: StatusChipConfig; - // 라벨 labelText?: string; labelVisible?: boolean; @@ -129,6 +98,12 @@ export interface PopSearchConfig { // 필터 대상 컬럼 복수 선택 (fieldName은 대표 컬럼, filterColumns는 전체 대상) filterColumns?: string[]; + + // 초기값 고정 세팅 (사용자 프로필에서 자동으로 값 설정) + initialValueSource?: { + type: "user_profile"; + column: string; + }; } /** 기본 설정값 (레지스트리 + 컴포넌트 공유) */ @@ -157,17 +132,8 @@ export const SEARCH_INPUT_TYPE_LABELS: Record = { date: "날짜", "date-preset": "날짜 프리셋", select: "단일 선택", - "multi-select": "다중 선택", - combo: "자동완성", modal: "모달", toggle: "토글", - "status-chip": "상태 칩 (대시보드)", -}; - -/** 상태 칩 스타일 라벨 (설정 패널용) */ -export const STATUS_CHIP_STYLE_LABELS: Record = { - tab: "탭 (큰 숫자)", - pill: "알약 (작은 뱃지)", }; /** 모달 보여주기 방식 라벨 */