import { KeyProvider, LabelProvider } from '../../model/CommonTypes'; import { MenuItem } from '../../contextmenu/contextMenuPlugin'; import { UnwrapNestedRefs } from 'vue'; export type TreeChildrenProvider = (item: T) => (T[] | undefined); export type DragAndDropPolicy = { isDraggableRow?: (srcRow: unknown) => boolean; isDroppableRow?: (destRow: unknown) => boolean; isDroppable?: (srcRow: unknown, srcParentRow: unknown, destRow: unknown, destParentRow: unknown) => boolean; dropStep?: () => 2 | 3; }; export type RowMovedEvent = { row: T; siblings: T[]; destParent?: T; destSiblings?: T[]; destIndex: number; }; export type ChangeSelectionEvent = { prev: T | undefined; next: T | undefined; veto?: boolean; }; export type SortOrderChangedItem = { parent?: T; children: T[]; }; export type TreeControlAddButtonDisabled = { addBelowDisabled?: boolean; addSiblingDisabled?: boolean; addRootDisabled?: boolean; }; export interface TreeHandler { tree: UnwrapNestedRefs>; treeEventListener: TreeEventListener; control: UnwrapNestedRefs>; controlEventListener: TreeControlEventListener; /** * Tree 에 data 를 넣는다. * @param data * @param keepSelection true 이면 현재 선택된 항목이 유지된다. * @param keepExpanded true 이면 현재 expanded 인 항목이 유지된다. * @param waitTime 이 값이 0보다 크면 이 시간동안 tree 를 비웠다가 다시 채운다. refresh 효과를 위해 사용한다. millisecond 단위. */ setTreeData(data: T[], keepSelection?: boolean, keepExpanded?: boolean, waitTime?: number): Promise; /** * 항목을 선택한다. * @param item */ selectItem(item: T | T[] | undefined): void; /** * `item` 의 parent 를 리턴한다. * @param item */ getParent(item: T | undefined): T | undefined; /** * `item` 을 교체한다. item 이 변경된 경우, 변경된 객체를 tree 에 다시 표시할 때 사용한다. * @param newItem */ replaceCurrentItem(newItem: T): void; /** * Tree 이 모든 항목을 순회하며 visitor 함수를 호출한다. visitor 함수가 * @param visitor */ acceptTreeData(visitor: (item: T) => (boolean | undefined)): void; /** * `setTreeData()` 호출 이후에 항목의 정렬 순서가 변경되었는지 여부를 확인한다. */ isSortOrderChanged(): boolean; /** * 순서가 변경된 item 정보를 리턴한다. */ getSortOrderChangedItems(): SortOrderChangedItem[]; /** * 최상위에 신규 항목을 추가한다. item 객체는 TreeHandlerOption 의 addNewItem() 함수로 생성된다. * @param index 추가할 위치. 0 보다 작으면 제일 마지막에 추가한다. 디폴트는 -1. */ addRootItem(index: number): void; /** * `parent` 자식으로 신규 항목을 추가한다. * @param parent 신규 항목을 추가할 parent item * @param index 추가할 위치. 0 보다 작으면 제일 마지막에 추가한다. 디폴트는 -1. */ addChildItem(parent: T, index: number): void; /** * `items` 를 삭제한다. * @param items */ removeItems(items: T[]): void; /** * Tree 전체를 펼치거나 접는다. * @param expandOrDepth true 이면 전체를 펼치고, false 이면 접는다. 숫자이면 해당 depth 까지 표시되도록 펼친다. */ expandAll(expandOrDepth: boolean | number): void; } export type TreeBinding = { data: T[]; keyProvider?: KeyProvider; childrenProvider?: TreeChildrenProvider; labelProvider?: LabelProvider; enableDragAndDrop?: boolean | DragAndDropPolicy; expandedRows: Set; selectedRows: Set; contextMenuProvider?: (items: T[]) => MenuItem[]; 'update:expandedRows'?: (value: Set) => void; 'update:selectedRows'?: (value: Set) => void; }; export type TreeEventListener = { 'update:expandedRows'?: (rows: Set) => void; 'before:selectedRows'?: (event: ChangeSelectionEvent) => void; 'update:selectedRows'?: (value: Set) => void; rowMoved?: (event: RowMovedEvent) => void; }; export type TreeControlBinding = { allExpanded: boolean; selectedRows?: Set; depthProvider?: (item: T) => number; }; export type TreeControlEventListener = { clickAddBelowButton?: () => void; clickAddSiblingButton?: () => void; clickAddRootButton?: () => void; clickRemoveButton?: () => void; expandAll?: () => void; }; export type TreeHandlerOption = { /** * 항목의 key 를 리턴한다. */ getItemKey: KeyProvider; /** * 항목의 자식 노드 목록을 리턴한다. */ getChildren: TreeChildrenProvider; /** * 항목의 표시명을 리턴한다. */ getItemLabel: LabelProvider; /** * 항목의 부모를 리턴한다. 최상위 항목이면 undefined 를 리턴한다. * @param item */ getParent?: (item: T) => T | undefined; /** * 선택을 변경할 수 있는지 확인한다. 변경이 가능하면 true 를, 불가능하면 false 를 리턴한다. * @param prev 현재 선택된 항목 * @param next 이후에 선택할 항목 */ canChangeSelection?: (prev: T | undefined, next: T | undefined) => boolean; /** * 현재 선택된 항목이 변경되었는지 여부를 리턴한다. */ currentItemModified?: () => boolean; /** * 현재 선택된 항목의 변경사항을 되돌린다. */ rollbackCurrentItem?: () => void; /** * 선택 항목이 변경될 때 호출된다. * @param selected */ onSelectionChanged?: (selected: Set) => void; /** * `item` 이 신규 항목인지 확인한다. * @param item */ isNewItem?: (item: T) => boolean; /** * TreeHandler 에서 신규 항목 추가가 필요할 때 호출된다. * 이 함수가 리턴한 신규 항목이 Tree 에 추가된다. * undefined 를 리턴하면 항목이 추가되지 않는다. * * 새로 생성된 항목의 parent 를 설정하는 것과 parent 에 이 항목을 추가하는 등의 작업이 * 이 함수 안에서 모두 이루어져야 한다. TreeHandler 가 이 작업을 대신해주지 않는다. * * @param parent 생성할 항목의 부모. 최상위 항목이면 undefined 이다. * @param index 생성 위치. */ onCreateNewItem?: (parent: T | undefined, index: number) => T | undefined; /** * TreeHandler 에서 항목 삭제가 필요할 때 호출된다. * 이 함수가 없거나 false 를 리턴하면, TreeHandler 에서 강제로 항목을 삭제한다. * 이 함수가 true 를 리턴하면, 커스텀 로직으로 항목이 삭제되었다고 판단해서, TreeHandler 는 아무런 작업도 하지 않는다. * @param item */ onRemoveItems?: (items: T[]) => boolean; /** * Drag&Drop 으로 순서변경/항목이동이 가능하게 한다. */ enableDragAndDrop?: boolean | DragAndDropPolicy; }; export declare const createTreeHandler: (option: TreeHandlerOption) => TreeHandler;