Files
kjh2064 3f293d8aa8
deploy / deploy (push) Successful in 1m52s
deploy / notify (push) Successful in 1s
V13-FE-006: consolidate approved UI and contract hardening
2026-08-13 02:41:00 +09:00

100 lines
2.4 KiB
TypeScript

import type { KbxLookupDefinition } from './lookup'
import type { KbxStatusDefinition } from './status'
export type KbxGridType =
| 'text' | 'code' | 'integer' | 'decimal' | 'quantity' | 'money'
| 'percent' | 'date' | 'datetime' | 'boolean' | 'status' | 'lookup' | 'link'
export type KbxGridDensity = 'compact' | 'comfortable'
export interface KbxGridStatusMap {
definitions: readonly KbxStatusDefinition[]
unknownLabel?: string
}
export interface KbxGridColumn<T> {
field: keyof T & string
header: string
type?: KbxGridType
width?: number
minWidth?: number
maxWidth?: number
pinned?: 'left' | 'right'
editable?: boolean | ((row: T) => boolean)
sortable?: boolean
filterable?: boolean
permission?: string
lookup?: KbxLookupDefinition
/** type='status'일 때 Domain raw value를 사용자 Label/Semantic으로 변환한다. Row 원본은 변경하지 않는다. */
statusMap?: KbxGridStatusMap
drilldown?: boolean
}
export interface KbxGridColumnPreference {
field: string
order: number
width?: number
pinned?: 'left' | 'right' | null
hidden?: boolean
sort?: 'asc' | 'desc' | null
sortIndex?: number | null
}
export interface KbxGridCellRef<T = string> {
rowKey: T
field: string
}
export interface KbxGridSummary<T> {
key: string
label: string
field?: keyof T & string
kind: 'count' | 'sum' | 'custom'
value?: string | number
}
/** Browser에는 현재 선택 상태만 유지한다. all-filtered에서 전체 ID를 적재하지 않는다. */
export interface KbxSelectionState<TId = string> {
mode: 'explicit' | 'all-filtered'
selectedIds: TId[]
excludedIds?: TId[]
}
/** Server-side bulk command의 canonical selection envelope. */
export interface KbxBulkSelectionRequest<TFilter = Record<string, unknown>, TId = string> {
mode: 'ids' | 'filter'
ids?: TId[]
filter?: TFilter
excludedIds?: TId[]
}
export interface KbxGridEditingPolicy {
allowRowAdd?: boolean
allowRowDuplicate?: boolean
fillDown?: boolean
paste?: boolean
errorNavigation?: boolean
}
export interface KbxGridPasteIssue {
rowOffset: number
columnOffset: number
field?: string
code: 'INVALID_NUMBER' | 'INVALID_DATE' | 'INVALID_BOOLEAN'
value: unknown
}
export interface KbxGridPasteResult {
cellCount: number
normalizedCount: number
rejectedCount: number
issues: KbxGridPasteIssue[]
}
export interface KbxGridContextRequest<T> {
row: T
field: keyof T & string
clientX: number
clientY: number
}