import { type CSSProperties, type ReactNode } from 'react';
import { type SInputProps } from '../SInput';
import { type STextareaProps } from '../STextarea';
import { type SNumberInputProps } from '../SNumberInput';
import { type SSelectProps } from '../SSelect';
import { type SRadioGroupProps } from '../SRadio';
import { type SCheckboxProps } from '../SCheckbox';
import { type SDatePickerProps } from '../SDatePicker';
import { type SDateRangePickerProps } from '../SDateRangePicker';
import { type SFilePickerProps } from '../SFilePicker';
export type SKeyValueFieldType = 'text' | 'input' | 'textarea' | 'number-input' | 'select' | 'radio' | 'checkbox' | 'date-picker' | 'date-range-picker' | 'file-picker';
/** field type과 무관한 공통 속성 (레이아웃·레이블·스팬 등) */
export interface SKeyValueFieldBase {
name: string;
label?: string;
required?: boolean;
helpText?: string[];
hideTh?: boolean;
thRowSpan?: number;
thColSpan?: number;
tdRowSpan?: number;
tdColSpan?: number;
thWidth?: number | string;
thClass?: string;
tdClass?: string;
/** 셀 커스텀 렌더 (React 확장). 지정 시 type/options는 무시되고 이 노드가 그대로 렌더됩니다. */
render?: ReactNode;
}
/**
* `options`에서 제외되는 키.
* - `onValueChange`: 테이블이 `onChange`로 승격시키므로 field 단위로 지정할 수 없습니다.
* - `value`: 지정은 가능하나 `values` prop이 같은 name을 가지면 그쪽이 우선합니다. (타입은 유지)
*/
type FieldOptions
= Omit
;
/**
* `type`에 따라 `options`가 해당 컴포넌트의 props로 좁혀지는 discriminated union.
* `type` 생략 시 `text`로 동작합니다.
*/
export type SKeyValueFieldByType = {
type?: 'text';
options?: {
value?: ReactNode;
};
} | {
type: 'input';
options?: FieldOptions;
} | {
type: 'textarea';
options?: FieldOptions;
} | {
type: 'number-input';
options?: FieldOptions;
} | {
type: 'select';
options?: FieldOptions;
} | {
type: 'radio';
options?: FieldOptions;
} | {
type: 'checkbox';
options?: FieldOptions;
} | {
type: 'date-picker';
options?: FieldOptions;
} | {
type: 'date-range-picker';
options?: FieldOptions;
} | {
type: 'file-picker';
options?: FieldOptions;
};
export type SKeyValueField = SKeyValueFieldBase & SKeyValueFieldByType;
/**
* field type별 `onChange`로 올라오는 값 타입.
* - `string`: input · textarea · select · radio · date-picker
* - `number`: number-input
* - `boolean`: checkbox
* - `string[]`: date-range-picker
*/
export type SKeyValueFieldValue = string | number | boolean | string[];
/**
* `onChange` 콜백 detail.
* 제네릭 `V`에 폼 값 형태(`{ [name]: value }`)를 넘기면 `name`/`value`/`values`가 정밀하게 타이핑됩니다.
* 미지정 시 `value`는 {@link SKeyValueFieldValue} 유니온으로 잡힙니다.
*/
export interface SKeyValueChangeDetail = Record> {
/** 변경된 field의 name */
name: Extract;
/** 변경된 field의 새 값 */
value: V[Extract];
/** 변경이 반영된 전체 값 객체 (`{ [name]: value }`). controlled 패턴에서 그대로 상태에 반영하면 됩니다. */
values: V;
}
export interface SKeyValueTableProps {
/** 2차원 배열. row → [th|td] 필드들 */
fields?: SKeyValueField[][];
/**
* field name을 key로 하는 값 객체 (`{ [name]: value }`).
* 지정 시 해당 field의 값으로 사용되며, field별 `options.value`보다 우선합니다.
* `onChange`의 `detail.values`와 함께 controlled 패턴으로 사용합니다.
*/
values?: Record;
/** 우측 검색 패널 */
search?: boolean;
/** border-radius 제어 */
radius?: 'default' | 'useTop' | 'full';
/** 값 변경 (sdChange) */
onChange?: (detail: SKeyValueChangeDetail) => void;
/** 검색 클릭 (sdSearch) */
onSearch?: () => void;
className?: string;
style?: CSSProperties;
}
/** SKeyValueTable — sd-key-value-table 포팅. th/td 폼 레이아웃 + 필드 렌더러. */
export declare function SKeyValueTable({ fields, values, search, radius, onChange, onSearch, className, style, }: SKeyValueTableProps): import("react").JSX.Element | null;
export {};