/** * 반복 필드 그룹(Repeater) 타입 정의 */ /** * 테이블 타입 관리(table_type_columns)에서 사용하는 input_type 값들 */ export type RepeaterFieldType = | "text" // 텍스트 | "number" // 숫자 | "textarea" // 텍스트영역 | "date" // 날짜 | "select" // 선택박스 | "checkbox" // 체크박스 | "radio" // 라디오 | "category" // 카테고리 | "entity" // 엔티티 참조 | "code" // 공통코드 | "image" // 이미지 | "direct" // 직접입력 | "calculated" // 계산식 필드 | string; // 기타 커스텀 타입 허용 /** * 계산식 연산자 */ export type CalculationOperator = "+" | "-" | "*" | "/" | "%" | "round" | "floor" | "ceil" | "abs"; /** * 계산식 정의 * 예: { field1: "order_qty", operator: "*", field2: "unit_price" } → order_qty * unit_price * 예: { field1: "amount", operator: "round", decimalPlaces: 2 } → round(amount, 2) */ export interface CalculationFormula { field1: string; // 첫 번째 필드명 operator: CalculationOperator; // 연산자 field2?: string; // 두 번째 필드명 (단항 연산자의 경우 불필요) constantValue?: number; // 상수값 (field2 대신 사용 가능) decimalPlaces?: number; // 소수점 자릿수 (round, floor, ceil에서 사용) } /** * 필드 표시 모드 * - input: 입력 필드로 표시 (편집 가능) * - readonly: 읽기 전용 텍스트로 표시 * - (카테고리 타입은 자동으로 배지로 표시됨) */ export type RepeaterFieldDisplayMode = "input" | "readonly"; /** * 반복 그룹 내 개별 필드 정의 */ export interface RepeaterFieldDefinition { name: string; // 필드 이름 (키) label: string; // 필드 라벨 type: RepeaterFieldType; // 입력 타입 placeholder?: string; required?: boolean; readonly?: boolean; // 읽기 전용 여부 options?: Array<{ label: string; value: string }>; // select용 width?: string; // 필드 너비 (예: "200px", "50%") displayMode?: RepeaterFieldDisplayMode; // 표시 모드: input(입력), readonly(읽기전용) categoryCode?: string; // category 타입일 때 사용할 카테고리 코드 formula?: CalculationFormula; // 계산식 (type이 "calculated"일 때 사용) numberFormat?: { useThousandSeparator?: boolean; // 천 단위 구분자 사용 prefix?: string; // 접두사 (예: "₩") suffix?: string; // 접미사 (예: "원") decimalPlaces?: number; // 소수점 자릿수 }; validation?: { minLength?: number; maxLength?: number; min?: number; max?: number; pattern?: string; }; } /** * 반복 필드 그룹 설정 */ export interface RepeaterFieldGroupConfig { fields: RepeaterFieldDefinition[]; // 반복될 필드 정의 targetTable?: string; // 저장할 대상 테이블 (미지정 시 메인 화면 테이블) groupByColumn?: string; // 수정 모드에서 그룹화할 컬럼 (예: "inbound_number") fkColumn?: string; // 분할 패널에서 좌측 선택 데이터와 연결할 FK 컬럼 (예: "serial_no") minItems?: number; // 최소 항목 수 maxItems?: number; // 최대 항목 수 addButtonText?: string; // 추가 버튼 텍스트 removeButtonText?: string; // 제거 버튼 텍스트 (보통 아이콘) allowReorder?: boolean; // 순서 변경 가능 여부 showIndex?: boolean; // 인덱스 번호 표시 여부 collapsible?: boolean; // 각 항목을 접을 수 있는지 (카드 모드일 때만) layout?: "grid" | "card"; // 레이아웃 타입: grid(테이블 행) 또는 card(카드 형식) showDivider?: boolean; // 항목 사이 구분선 표시 (카드 모드일 때만) emptyMessage?: string; // 항목이 없을 때 메시지 } /** * 반복 그룹 항목 데이터 */ export type RepeaterItemData = Record; /** * 반복 그룹 전체 데이터 (배열) */ export type RepeaterData = RepeaterItemData[];