azure-devops-ui
Version:
React components for building web UI in Azure DevOps
256 lines (254 loc) • 11.8 kB
TypeScript
import * as React from "react";
import { IObservable, IObservableArrayEventArgs, ObservableArray, ObservableArrayAction } from '../Core/Observable';
import { IItemProvider } from '../Utilities/Provider';
/**
* An ITreeItem<T> represents a single item within the tree. These are used as the
* input type to build a Tree components data structure.
*/
export interface ITreeItem<T> {
/**
* Optional set of children for this item. The caller can create the childItems
* array and leave it empty to note that this item should be rendered as if
* children exist even though the children are not currently available.
*/
childItems?: ITreeItem<T>[];
/**
* The data of type T that represents the object being rendered by this row.
*/
data: T;
/**
* The current expand/collapse state of this element. Expanded shouldnt be set
* to true if there are no children.
*/
expanded?: boolean;
/**
* Optional unique identifier for this tree item
*/
id?: string;
/**
* Optional text value for this tree items
*/
text?: string;
/**
* Need to highlight a string as a search result
*/
highlighted?: boolean;
}
/**
* When adding items to an ITreeItemProvider the ITreeItemAdd object allows the
* caller to define a specific location to add a set of items.
*/
export interface ITreeItemAdd<T> {
/**
* insertAfter is used to note the location within the parent to add the
* new items. If insertAfter is not supplied, the items will be added
* at the beginning of the children.
*/
insertAfter?: ITreeItem<T>;
/**
* The set of items that should be added.
*/
items: ITreeItem<T>[];
}
/**
* The tree uses the ITreeItem<T> objects supplied to build an internal data
* structure of ITreeItemEx<T> objects. These have computed details that help
* improve the rendering performance of the tree.
*
* NOTE: These are not the same objects as the ones supplied by the caller.
*/
export interface ITreeItemEx<T> {
/**
* ClassName to pass to the item's cell.
*/
className?: string;
/**
* This is the number of parents this tree item has. The depth represents how
* indented the tree item will be rendered.
*/
depth: number;
/**
* An optional toggle callback that should be used for this tree item. If no
* toggle method is supplied their wont be any default expand/collapse toggle
* rendered.
*/
onToggle?: (event: React.KeyboardEvent<HTMLElement> | React.MouseEvent<HTMLElement>, treeItem: ITreeItemEx<T>) => boolean | void;
/**
* The parent of this tree item. If the item is a root item the parent is
* undefined.
*/
parentItem?: ITreeItemEx<T>;
/**
* We track the underlying item on the extended item.
*/
underlyingItem: ITreeItem<T>;
}
/**
* An ITreeItemProvider is designed to store and manage the state of a tree.
* As items are added/removed, expanded/collapsed, the providers "value" will
* represent the current set of ordered items within the tree.
*
* NOTE: When making changes to the items in the Provider, DO NOT use the
* underlying Observable methods, use the TreeItem specific API's. The
* underlying objects are managed by the provider.
*/
export interface ITreeItemProvider<T> extends IItemProvider<ITreeItemEx<T>> {
readonly roots: Readonly<ITreeItem<T>[]>;
/**
* add can be used to add a single item to the tree at a given location. If the
* specified parentItem or insertAfter are not in the tree or the insertAfter is not
* a child of parentItem, the addition will be ignored.
*
* @param item The item to add to the tree.
* @param parentItem The direct parent of the item being added.
* If this is a rootItem leave the parentItem undefined.
* @param insertAfter The sibling item this item should be inserted after.
* If this is the first item within the parent leave insertAfter undefined.
*/
add: (item: ITreeItem<T>, parentItem?: ITreeItem<T>, insertAfter?: ITreeItem<T>) => void;
/**
* clear can be used to reset the provider. This is an optimized way to
* remove all items from the tree.
*/
clear: () => void;
/**
* Remove the specified item from the tree. If the item doesnt exist the
* remove will be ignored.
*
* @param treeItem The item that should be removed from the tree.
* @param parentItem The parentItem of the item being removed. If the caller
* doesnt have the parentItem readily available it will be computed, but this
* can be expensive. The caller should supply it if they can.
*/
remove: (treeItem: ITreeItem<T>, parentItem?: ITreeItem<T>) => void;
/**
* splice is used to update the direct children of a given item
* in the tree. If the parentItem is supplied and not in the tree the
* changes will be ignored.
*
* @NOTE: Adds are processed before removes, this allows the existing
* elements to be used as an insertAfter for placement. An item can't
* be in both the add and remove set. This will cause duplication.
*
* @param parentItem The item whos children are being updated. If undefined
* is supplied the updates will modify the root.
* @param itemsToRemove The set of items that should removed from the parent.
* @param itemsToAdd The set of items that should be added to the parent.
*/
splice: (parentItem: ITreeItem<T> | undefined, itemsToRemove?: ITreeItem<T>[], itemsToAdd?: ITreeItemAdd<T>[]) => void;
/**
* toggle is used to update the expand/collapse state of a given tree item.
*
* @param treeItem The item whose state should be toggled. If the treeItem is
* not in the tree the method will no-op.
*/
toggle: (treeItem: ITreeItem<T>) => void;
}
/**
* A TreeItemProvider is designed to store and manage the state of a tree.
* As items are added/removed, expanded/collapsed, the providers "value" will
* represent the current set of ordered items within the tree.
*/
export declare class TreeItemProvider<T> implements ITreeItemProvider<T>, IObservable<IObservableArrayEventArgs<ITreeItemEx<T>>, ObservableArrayAction> {
protected itemMap: Map<ITreeItem<T>, ITreeItemEx<T>>;
private rootItems;
protected tableItems: ObservableArray<ITreeItemEx<T>>;
constructor(rootItems?: ITreeItem<T>[]);
get length(): number;
get roots(): ITreeItem<T>[];
get value(): ITreeItemEx<T>[];
subscribe(observer: (value: IObservableArrayEventArgs<ITreeItemEx<T>>, action?: ObservableArrayAction) => void, action?: ObservableArrayAction): (value: IObservableArrayEventArgs<ITreeItemEx<T>>, action?: ObservableArrayAction) => void;
unsubscribe(observer: (value: IObservableArrayEventArgs<ITreeItemEx<T>>, action?: ObservableArrayAction) => void, action?: ObservableArrayAction): void;
/**
* add can be used to add a single item to the tree at a given location. If the
* specified parentItem or insertAfter are not in the tree or the insertAfter is not
* a child of parentItem, the addition will be ignored.
*
* @param item The item to add to the tree.
* @param parentItem The direct parent of the item being added.
* If this is a rootItem leave the parentItem undefined.
* @param insertAfter The sibling item this item should be inserted after.
* If this is the first item within the parent leave insertAfter undefined.
*/
add(item: ITreeItem<T>, parentItem?: ITreeItem<T>, insertAfter?: ITreeItem<T>): void;
/**
* clear can be used to reset the provider. This is an optimized way to
* remove all items from the tree.
*/
clear(): void;
/**
* Collapse the node.
*
* @param treeItem The item whose state should be collapsed. If the treeItem is
* not in the tree or if the item is already expanded the method will no-op.
*/
collapse(treeItem: ITreeItem<T>): void;
/**
* Expand the node. Optionally expand all parent nodes.
*
* @param treeItem The item whose state should be expanded. If the treeItem is
* not in the tree the method will no-op.
* @param expandParents If all parent nodes should be expanded. @default false
*/
expand(treeItem: ITreeItem<T>, expandParents?: boolean): void;
/**
* Remove the specified item from the tree. If the item doesnt exist the
* remove will be ignored.
*
* @param treeItem The item that should be removed from the tree.
* @param parentItem The parentItem of the item being removed. If the caller
* doesnt have the parentItem readily available it will be computed, but this
* can be expensive. The caller should supply it if they can.
*/
remove(treeItem: ITreeItem<T>, parentItem?: ITreeItem<T>): void;
/**
* spliceItems is used to update the direct children of a given item
* in the tree. If the parentItem is supplied and not in the tree the
* changes will be ignored.
*
* @NOTE: Adds are processed before removes, this allows the existing
* elements to be used as an insertAfter for placement. An item can't
* be in both the add and remove set. This will cause duplication.
*
* @param parentItem The item whos children are being updated. If undefined
* is supplied the updates will modify the root.
* @param itemsToRemove The set of items that should removed from the parent.
* @param itemsToAdd The set of items that should be added to the parent.
*/
splice(parentItem: ITreeItem<T> | undefined, itemsToRemove?: ITreeItem<T>[], itemsToAdd?: ITreeItemAdd<T>[]): void;
/**
* spliceBatch is used to update the direct children of a given item
* in the tree in batches. It has the same logic as splice, but it
* processes updates sequentially.
* @param batch The array of updates to be applied to the tree sequentially
* one by one.
*/
spliceBatch(batch: {
parentItem: ITreeItem<T> | undefined;
itemsToRemove?: ITreeItem<T>[];
itemsToAdd?: ITreeItemAdd<T>[];
ignoreDuplicatesOnAdding?: boolean;
}[]): void;
/**
* toggleItem is used to toggle the expand/collapse state of a given tree item.
*
* @param treeItem The item whose state should be toggled. If the treeItem is
* not in the tree the method will no-op.
*/
toggle(treeItem: ITreeItem<T>): void;
protected addItems(treeItems: ITreeItem<T>[], parentItem: ITreeItemEx<T> | undefined, tableItems?: ITreeItemEx<T>[]): void;
private getTableItems;
protected getTableChildCount(treeItem: ITreeItem<T>): number;
/**
* indexOfItem is used to find the index of a source treeItem. The underlying
* observable indexOf will find instances of ITreeItemEx. This returns the
* index from the set of items passed to the table.
*
* @param treeItem The item to find in the tree.
* @param fromIndex The index to start the search.
* @param tableItems TreeProvider to search at. this.tableItems will be used as default if not provided.
* @returns If the item is found an index >= 0 is returned, if it is not found -1 is returned.
*/
protected indexOf(treeItem: ITreeItem<T>, fromIndex?: number, tableItems?: ObservableArray<ITreeItemEx<T>>): number;
protected removeItem(treeItem: ITreeItem<T>, tableItems?: ITreeItem<T>[]): void;
}