import { SavePoint } from '../../savepoint/SavePoint'; import { DisplayDateResolution, KeyProvider, MultiLangText, TimeZone } from '../../model/CommonTypes'; import { SearchParam, Sort } from '../../model/SearchModel'; import { PaginatedList } from '../../model/PaginatedList'; import { Raw, UnwrapNestedRefs } from 'vue'; import { AndFilter, EqualFilter, Filter, InFilter, LikeFilter, OrFilter } from '../../model/FilterModel'; import { RawData } from '../../util/typeUtil.ts'; export declare const DEFAULT_GRID_COLUMN_WIDTH = 100; export type GridCellType = 'TEXT' | 'NUMBER' | 'DATE' | 'PERCENTAGE' | 'BOOL' | 'MULTI_LANG_STRING' | 'NAME' | 'TEL' | 'ADDRESS' | 'MONEY'; export type GridRowData = Record; export type Column = { propertyId: string; templateId?: string; caption: MultiLangText; cellType?: GridCellType; dateFormat?: string | DisplayDateResolution; width?: number; cellStyleClass?: string; cellStyleCss?: string; headerCellStyleClass?: string; headerCellStyleCss?: string; sortable?: boolean; sortPropertyId?: string; tooltipProvider?: (row: T) => MultiLangText | undefined; }; export type PageInfo = { offset?: number; limit?: number; totalCount?: number; }; export type FilterValueType = 'STRING' | 'NUMBER'; export type FilterItem = { propertyId: string; caption: MultiLangText; allowMultiLineFilter?: boolean; filterType?: FilterValueType; }; export type TextFilterCreator = (propertyId: string, keyword: string) => (InFilter | LikeFilter | EqualFilter | OrFilter)[] | Promise<(InFilter | LikeFilter | EqualFilter | OrFilter)[]>; export type TextFilterItem = FilterItem & { filterCreator?: TextFilterCreator; prefix?: boolean; suffix?: boolean; }; export type GridLookupConfigTextFilter = { filterItems: TextFilterItem[]; }; export type DateFilterItem = FilterItem & { timeZone?: TimeZone; dateFormat?: string; popupDateFormat?: string; filterWidth?: string; }; export type GridLookupConfigDateFilter = { filterItems: DateFilterItem[]; }; export type GridLookupConfig = { textFilter?: GridLookupConfigTextFilter; dateFilter?: GridLookupConfigDateFilter; }; /** * BSGridLookup 에서 EmbeddableName property 에 사용할 수 있는 TextFilterCreator * * ```ts * export const gridLookupConfig: GridLookupConfig = reactive({ * textFilter: { * filterItems: [ * {propertyId: 'memberName', caption: '회원명', filterCreator: nameFilterCreator()} * ] * }, * ``` * @param maxIndex 예를 들어 이 값이 4 이면, name1, name2, name3, name4 에 대해 like 검색을 한다. */ export declare const nameFilterCreator: (maxIndex?: number) => TextFilterCreator; export type EditingRow = { row: T; savePoint?: SavePoint; }; export declare class EditingRows { keyProvider?: KeyProvider | undefined; rows: EditingRow[]; constructor(keyProvider?: KeyProvider | undefined); addEditingRow(row: EditingRow): void; addRow(row: T): void; rowEquals(a: T, b: T): boolean; removeRow(row: T): void; clear(): void; getEditingRow(row: T): EditingRow | undefined; isEditingRow(row: T): boolean; getRows(): EditingRow[]; getModifiedRows(): EditingRow[]; } export type SelectedRowsChangedEvent = { allRows: boolean; targetRows?: T[]; selected: boolean; }; export interface PageGridHandler { searchParam: SearchParam; grid: UnwrapNestedRefs>; gridEventListener: GridEventListener; control?: UnwrapNestedRefs>; controlEventListener?: GridControlEventListener; lookup?: UnwrapNestedRefs; lookupEventListener?: GridLookupEventListener; loadGridData: (offset?: number) => Promise; getSelectedRows: () => Set; getEditingRows: () => EditingRows; getAddedRows: () => T[]; getModifiedRows: () => T[]; getDeletedRows: () => T[]; isAddedRow: (row: T) => boolean; addNewRow: (newRow: T) => number; /** * Grid 에 add, modified, delete 된 row 가 있으면 true 를 리턴한다. */ isGridModified: () => boolean; preferenceLoaded: boolean; } export type GridBinding = { gridId?: string; pageInfo?: PageInfo; sorts?: Sort[]; data: T[] | Raw; loading?: boolean; keyProvider: KeyProvider; editable?: boolean; rowEditPolicy?: (row: T, editingRows: EditingRows) => boolean; selectedRows?: Set; editingRows?: EditingRows; rowDisplayPolicy?: (row: T) => boolean; rowSelectPolicy?: (row: T) => boolean; columnSettings?: GridColumnSetting[]; fixedColumnCount?: number; }; export type GridEventListener = { 'update:selectedRows'?: (rows: Set) => void; 'update:editingRows'?: (editingRows: EditingRows) => void; offsetChanged?: (offset: number, pageInfo: PageInfo) => void; changeEditingRow?: (row: T, editing: boolean) => void; 'update:sorts'?: (sorts: Sort[]) => void; settingChanged?: (columnSettings?: GridColumnSetting[], fixedColumnCount?: number) => void; }; export type GridControlBinding = { gridId?: string; limit?: number; selectedRows?: Set; totalCount: number; columnSettings?: GridColumnSetting[]; fixedColumnCount?: number; }; export type GridControlEventListener = { 'update:limit'?: (limit: number) => void; refresh?: () => void; clearFilter?: () => void; clickAdd?: () => void; clickRemove?: () => void; settingChanged?: (columnSettings?: GridColumnSetting[], fixedColumnCount?: number) => void; }; export type GridLookupBinding = { gridId?: string; modelValue: Filter[]; gridPreferenceDateFilterValues?: RawData; }; export type GridLookupEventListener = { 'update:modelValue': (value: Filter[]) => void; search: (filters: Filter[]) => void; }; export type GridHandlerOption = { /** * Grid 설정 정보를 저장할 때 사용된다. */ gridId?: string; /** * 편집가능 여부 */ editable?: boolean; /** * Grid 에서 각 Row 를 구분할 수 있는 key 를 리턴한다. 주로 일련번호, 코드 등의 값이다. * @param row */ getRowKey: (row: T) => string; /** * 새로운 Row 를 생성한다. '행 추가' 기능으로 행이 추가될 때 호출된다. */ newRowCreator?: () => T | undefined; /** * 이 값이 true 이면 행 추가 시 Grid data 마지막에 추가된다. 디폴트는 false 이다. */ addRowToLast?: boolean; /** * 행이 삭제될 때 호출되는 함수. * 이 함수를 지정하지 않거나 false 를 리턴하면, grid data 목록에서 해당 행이 삭제된다. * 이 함수가 true 를 리턴하면 GridHandler 는 아무런 작업도 하지 않는다. * @param rows 선택된 행 * @return 이 handler 에서 행 삭제를 처리했으면 true 를 리턴. 그렇지 않으면 false 를 리턴. */ removeRowHandler?: (rows: Set) => boolean; /** * Row 가 편집가능한지 여부를 리턴한다. * Row 별로 편집가능여부를 제어할 때 사용. * @param row 편집이 가능한지 확인하려는 Row * @param editingRows 현재 편집중인 Row */ isRowEditable?: (row: T, editingRows: EditingRows) => boolean; /** * Row 가 선택 가능한지 여부를 리턴한다. * Row 별로 선택가능여부를 제어할 때 사용. * @param row */ isRowSelectable?: (row: T) => boolean; }; export type PageGridHandlerOption = GridHandlerOption & { getGridData: (param: SearchParam) => PaginatedList | Promise>; /** * 초기 Limit 개수. 디폴트: 100 */ limit?: number; /** * Limit 목록. 디폴트: [100, 300, 500] */ limitItems?: number[]; defaultFilter?: Filter[]; defaultSorts?: Sort[]; }; export declare const createPageGridHandler: (option: PageGridHandlerOption) => PageGridHandler; export declare class PageGridHandlerImpl implements PageGridHandler { option: PageGridHandlerOption; searchParam: SearchParam; selectDeleteSupport: GridHandlerSelectDeleteSupport; grid: UnwrapNestedRefs>; gridEventListener: GridEventListener; control: UnwrapNestedRefs>; controlEventListener: GridControlEventListener; lookup: GridLookupBinding; lookupEventListener: GridLookupEventListener; preferenceLoader?: GridPreferenceLoader; constructor(option: PageGridHandlerOption); get preferenceLoaded(): boolean; getSelectedRows(): Set; getEditingRows(): EditingRows; getAddedRows(): T[]; getModifiedRows(): T[]; getDeletedRows(): T[]; isAddedRow(_row: T): boolean; addNewRow(_newRow: T): number; isGridModified(): boolean; /** * * @param offset */ loadGridData(offset?: number): Promise; loadPreference(): void; protected doSetSearchResult(result: PaginatedList): void; protected updateCounts(): void; } export declare class EditablePageGridHandlerImpl extends PageGridHandlerImpl { editableSupport: GridHandlerEditableSupport; constructor(option: PageGridHandlerOption); getModifiedRows(): T[]; getAddedRows(): T[]; isAddedRow(row: T): boolean; addNewRow(newRow: T): number; protected doSetSearchResult(result: PaginatedList): void; } export interface InputGridHandler { grid: UnwrapNestedRefs>; gridEventListener: GridEventListener; control: UnwrapNestedRefs>; controlEventListener: GridControlEventListener; gridFilter: Record; setGridData: (data?: T[]) => void; getSelectedRows: () => Set; getEditingRows: () => EditingRows; getAddedRows: () => T[]; getModifiedRows: () => T[]; getDeletedRows: () => T[]; isAddedRow: (row: T) => boolean; addNewRow: (newRow: T) => number; /** * Grid 에 add, modified, delete 된 row 가 있으면 true 를 리턴한다. */ isGridModified: () => boolean; preferenceLoaded: boolean; } export type InputGridHandlerOption = GridHandlerOption & {}; export declare const createInputGridHandler: (option: InputGridHandlerOption) => InputGridHandler; export declare class InputGridHandlerImpl implements InputGridHandler { option: InputGridHandlerOption; selectDeleteSupport: GridHandlerSelectDeleteSupport; grid: UnwrapNestedRefs>; gridEventListener: GridEventListener; control: UnwrapNestedRefs>; controlEventListener: GridControlEventListener; gridFilter: Record; preferenceLoader?: GridPreferenceLoader; constructor(option: InputGridHandlerOption); get preferenceLoaded(): boolean; setGridData(data?: T[]): void; getSelectedRows(): Set; getEditingRows(): EditingRows; getDeletedRows(): T[]; getAddedRows(): T[]; getModifiedRows(): T[]; isAddedRow(_row: T): boolean; addNewRow(_newRow: T): number; isGridModified(): boolean; loadPreference(): void; protected updateCounts(): void; protected applyGridFilter(row: T): boolean; } export declare class EditableInputGridHandlerImpl extends InputGridHandlerImpl { editableSupport: GridHandlerEditableSupport; constructor(option: InputGridHandlerOption); setGridData(data: T[]): void; getModifiedRows(): T[]; getAddedRows(): T[]; isAddedRow(row: T): boolean; addNewRow(newRow: T): number; } export declare class GridHandlerSelectDeleteSupport { grid: UnwrapNestedRefs>; control: UnwrapNestedRefs>; controlEventListener: GridControlEventListener; removeRowHandler?: ((rows: Set) => boolean) | undefined; private listener?; selectedRows: import('vue').Reactive>; deletedRows: T[]; isAddedRow?: (row: T) => boolean; removeIfAddedRow?: (row: T) => void; constructor(grid: UnwrapNestedRefs>, control: UnwrapNestedRefs>, controlEventListener: GridControlEventListener, removeRowHandler?: ((rows: Set) => boolean) | undefined, listener?: ((eventType: 'selectedRowsChanged') => void) | undefined); removeSelectedRows(): void; clear(): void; } export declare class GridHandlerEditableSupport { grid: UnwrapNestedRefs>; gridEventListener: GridEventListener; controlEventListener: GridControlEventListener; newRowCreator?: (() => T | undefined) | undefined; addRowToLast?: boolean | undefined; private listener?; addedRows: T[]; constructor(grid: UnwrapNestedRefs>, gridEventListener: GridEventListener, controlEventListener: GridControlEventListener, getRowKey: KeyProvider, newRowCreator?: (() => T | undefined) | undefined, addRowToLast?: boolean | undefined, listener?: ((eventType: 'rowAdded' | 'rowRemoved') => void) | undefined); static cleanUpData(data: T[]): void; getModifiedRows(): T[]; getAddedRows(): T[]; clearAddedRows(): void; isAddedRow(row: T): boolean; getNewRowKey(row: T): string | undefined; setNewRowKey(row: T): void; removeIfAddedRow(row: T): boolean; addNewRow(newRow: T): number; protected appendAddedRow(row: T): void; protected createAndAddNewRow(): void; } declare class GridPreferenceLoader { private gridId; private handler; preferenceLoaded: import('vue').Ref; private loadPromise; constructor(gridId: string, handler: PageGridHandler | InputGridHandler); loadGridPreference(): Promise; waitForLoaded(): Promise; } export type GridColumnSetting = { propertyId: string; hidden?: boolean; width?: number; }; export type GridPreference = { columnSettings?: GridColumnSetting[]; fixedColumnCount?: number; dateFilterValues?: RawData; }; export interface GridPreferenceStore { storePreference: (gridId: string, preference: GridPreference) => Promise; loadPreference: (gridId: string) => Promise; removePreference: (gridId: string) => Promise; } export declare class LocalStorageGridPreferenceStore implements GridPreferenceStore { storePreference(gridId: string, preference: GridPreference): Promise; loadPreference(gridId: string): Promise; removePreference(gridId: string): Promise; } /** * BSGrid 에서 값이 같은 cell 을 세로로 머지한다. * * @table-changed 이벤트 핸들러에서 이 함수를 호출하는 방식으로 사용함. * * ``` * * ``` * * @param propertyIds * @param table */ export declare const mergeSameValueVertical: (propertyIds: string[], table?: HTMLTableElement) => void; /** * default cell formatter for BSGridCell * @param column * @param value */ export declare const defaultCellFormatter: (column: Column, value: T) => string | T | null | undefined; export {};