import type { CSSProperties, ExtractPropTypes, PropType } from 'vue'; import type { BasicDataNode } from '.'; import type { EventHandler } from '../_util/EventInterface'; import PropTypes from '../_util/vue-types'; import type { NodeDragEventParams, NodeMouseEventHandler, NodeMouseEventParams, } from './contextTypes'; import type { DataNode, Key, FlattenNode, EventDataNode, Direction, FieldNames } from './interface'; export interface CheckInfo { event: 'check'; node: EventDataNode; checked: boolean; nativeEvent: MouseEvent; checkedNodes: DataNode[]; checkedNodesPositions?: { node: DataNode; pos: string }[]; halfCheckedKeys?: Key[]; } export const treeNodeProps = { eventKey: [String, Number], // Pass by parent `cloneElement` prefixCls: String, // By parent // expanded: { type: Boolean, default: undefined }, // selected: { type: Boolean, default: undefined }, // checked: { type: Boolean, default: undefined }, // loaded: { type: Boolean, default: undefined }, // loading: { type: Boolean, default: undefined }, // halfChecked: { type: Boolean, default: undefined }, // dragOver: { type: Boolean, default: undefined }, // dragOverGapTop: { type: Boolean, default: undefined }, // dragOverGapBottom: { type: Boolean, default: undefined }, // pos: String, title: PropTypes.any, /** New added in Tree for easy data access */ data: { type: Object as PropType, default: undefined as DataNode }, parent: { type: Object as PropType, default: undefined as DataNode }, isStart: { type: Array as PropType }, isEnd: { type: Array as PropType }, active: { type: Boolean, default: undefined }, onMousemove: { type: Function as PropType }, // By user isLeaf: { type: Boolean, default: undefined }, checkable: { type: Boolean, default: undefined }, selectable: { type: Boolean, default: undefined }, disabled: { type: Boolean, default: undefined }, disableCheckbox: { type: Boolean, default: undefined }, icon: PropTypes.any, switcherIcon: PropTypes.any, domRef: { type: Function as PropType<(arg: any) => void> }, }; export type TreeNodeProps = Partial>; export const nodeListProps = { prefixCls: { type: String as PropType }, // data: { type: Array as PropType }, motion: { type: Object as PropType }, focusable: { type: Boolean as PropType }, activeItem: { type: Object as PropType }, focused: { type: Boolean as PropType }, tabindex: { type: Number as PropType }, checkable: { type: Boolean as PropType }, selectable: { type: Boolean as PropType }, disabled: { type: Boolean as PropType }, // expandedKeys: { type: Array as PropType }, // selectedKeys: { type: Array as PropType }, // checkedKeys: { type: Array as PropType }, // loadedKeys: { type: Array as PropType }, // loadingKeys: { type: Array as PropType }, // halfCheckedKeys: { type: Array as PropType }, // keyEntities: { type: Object as PropType>> }, // dragging: { type: Boolean as PropType }, // dragOverNodeKey: { type: [String, Number] as PropType }, // dropPosition: { type: Number as PropType }, // Virtual list height: { type: Number as PropType }, itemHeight: { type: Number as PropType }, virtual: { type: Boolean as PropType }, onScroll: { type: Function as PropType }, onKeydown: { type: Function as PropType }, onFocus: { type: Function as PropType<(e: FocusEvent) => void> }, onBlur: { type: Function as PropType<(e: FocusEvent) => void> }, onActiveChange: { type: Function as PropType<(key: Key) => void> }, onContextmenu: { type: Function as PropType }, onListChangeStart: { type: Function as PropType<() => void> }, onListChangeEnd: { type: Function as PropType<() => void> }, }; export type NodeListProps = Partial>; export interface AllowDropOptions { dragNode: EventDataNode; dropNode: TreeDataType; dropPosition: -1 | 0 | 1; } export type AllowDrop = ( options: AllowDropOptions, ) => boolean; export type DraggableFn = (node: DataNode) => boolean; export type ExpandAction = false | 'click' | 'doubleclick' | 'dblclick'; export const treeProps = () => ({ prefixCls: String, focusable: { type: Boolean, default: undefined }, activeKey: [Number, String] as PropType, tabindex: Number, children: PropTypes.any, treeData: { type: Array as PropType }, // Generate treeNode by children fieldNames: { type: Object as PropType }, showLine: { type: [Boolean, Object] as PropType, default: undefined, }, showIcon: { type: Boolean, default: undefined }, icon: PropTypes.any, selectable: { type: Boolean, default: undefined }, expandAction: [String, Boolean] as PropType, disabled: { type: Boolean, default: undefined }, multiple: { type: Boolean, default: undefined }, checkable: { type: Boolean, default: undefined }, checkStrictly: { type: Boolean, default: undefined }, draggable: { type: [Function, Boolean] as PropType }, defaultExpandParent: { type: Boolean, default: undefined }, autoExpandParent: { type: Boolean, default: undefined }, defaultExpandAll: { type: Boolean, default: undefined }, defaultExpandedKeys: { type: Array as PropType }, expandedKeys: { type: Array as PropType }, defaultCheckedKeys: { type: Array as PropType }, checkedKeys: { type: [Object, Array] as PropType, }, defaultSelectedKeys: { type: Array as PropType }, selectedKeys: { type: Array as PropType }, allowDrop: { type: Function as PropType }, dropIndicatorRender: { type: Function as PropType< (props: { dropPosition: -1 | 0 | 1; dropLevelOffset: number; indent: number; prefixCls: string; direction: Direction; }) => any >, }, onFocus: { type: Function as PropType<(e: FocusEvent) => void> }, onBlur: { type: Function as PropType<(e: FocusEvent) => void> }, onKeydown: { type: Function as PropType }, onContextmenu: { type: Function as PropType }, onClick: { type: Function as PropType }, onDblclick: { type: Function as PropType }, onScroll: { type: Function as PropType }, onExpand: { type: Function as PropType< ( expandedKeys: Key[], info: { node: EventDataNode; expanded: boolean; nativeEvent: MouseEvent; }, ) => void >, }, onCheck: { type: Function as PropType< (checked: { checked: Key[]; halfChecked: Key[] } | Key[], info: CheckInfo) => void >, }, onSelect: { type: Function as PropType< ( selectedKeys: Key[], info: { event: 'select'; selected: boolean; node: EventDataNode; selectedNodes: DataNode[]; nativeEvent: MouseEvent; }, ) => void >, }, onLoad: { type: Function as PropType< ( loadedKeys: Key[], info: { event: 'load'; node: EventDataNode; }, ) => void >, }, loadData: { type: Function as PropType<(treeNode: EventDataNode) => Promise> }, loadedKeys: { type: Array as PropType }, onMouseenter: { type: Function as PropType<(info: NodeMouseEventParams) => void> }, onMouseleave: { type: Function as PropType<(info: NodeMouseEventParams) => void> }, onRightClick: { type: Function as PropType<(info: { event: MouseEvent; node: EventDataNode }) => void>, }, onDragstart: { type: Function as PropType<(info: NodeDragEventParams) => void> }, onDragenter: { type: Function as PropType<(info: NodeDragEventParams & { expandedKeys: Key[] }) => void>, }, onDragover: { type: Function as PropType<(info: NodeDragEventParams) => void> }, onDragleave: { type: Function as PropType<(info: NodeDragEventParams) => void> }, onDragend: { type: Function as PropType<(info: NodeDragEventParams) => void> }, onDrop: { type: Function as PropType< ( info: NodeDragEventParams & { dragNode: EventDataNode; dragNodesKeys: Key[]; dropPosition: number; dropToGap: boolean; }, ) => void >, }, /** * Used for `rc-tree-select` only. * Do not use in your production code directly since this will be refactor. */ onActiveChange: { type: Function as PropType<(key: Key) => void> }, filterTreeNode: { type: Function as PropType<(treeNode: EventDataNode) => boolean> }, motion: PropTypes.any, switcherIcon: PropTypes.any, // Virtual List height: Number, itemHeight: Number, virtual: { type: Boolean, default: undefined }, // direction for drag logic direction: { type: String as PropType }, rootClassName: String, rootStyle: Object as PropType, }); export type TreeProps = Partial>>;