import { IStyleSet } from '@uifabric/styling/lib'; import { IBaseProps } from '@uifabric/utilities/lib'; import * as React from 'react'; import { Preference } from '../themes/themes.types'; export type TreeNodeType = 'leaf' | 'container'; //tslint:disable:no-reserved-keywords export interface BaseTreeNode { type: string; name: string; data: T; readonly level: number; readonly parent: Container; } export interface Container extends BaseTreeNode { type: 'container'; children: TreeNode[]; } export interface Leaf extends BaseTreeNode { type: 'leaf'; } export type TreeNode = Leaf | Container; export interface TreeDataProvider { loadContainer(container: Container): Promise[]>; insertAt(container: Container, node: TreeNode); remove(node: TreeNode): Promise>; selectNode(node: TreeNode); } //tslint:enable:no-reserved-keywords export interface TreeNodeStyleProvider { getStyle(node: ITreeNodeView): IStyleSet; } export interface ITreeNodeView { readonly elementRef: HTMLElement; readonly node: TreeNode; readonly parent: ITreeNodeView; readonly children: Iterator; readonly expanded: boolean; readonly editing: boolean; readonly theme: 'dark' | 'light'; select(selected: boolean); edit(); expand(); collapse(); forceUpdate(); } export interface TreeNodeAttributes extends Preference { data: TreeNode; selected: boolean; parent: ITreeNodeView; } export interface TreeNodeActions extends TreeNodeStyleProvider { select(node: ITreeNodeView); toggleContextMenu(node: ITreeNodeView, e: React.MouseEvent); blur(); mounted(node: ITreeNodeView); } export interface TreeState { root: TreeNode; selected: TreeNode; } export type TreeNodeViewProps = TreeNodeAttributes & TreeViewConfig & TreeNodeActions & TreeDataProvider & IBaseProps; export interface TreeViewConfig { readonly?: boolean; hideRoot?: boolean; } export type TreeViewAttributes = TreeNodeAttributes & { selectedData: TreeNode } & TreeViewConfig & Preference; export type TreeViewProps = TreeViewAttributes & TreeDataProvider & TreeNodeStyleProvider & IBaseProps; export interface ITreeView { select(node: ITreeNodeView); focus(); }