flexlayout-react
Version:
A multi-tab docking layout manager
143 lines (142 loc) • 8.08 kB
TypeScript
import * as React from "react";
import { I18nLabel } from "../I18nLabel";
import { Action } from "../model/Action";
import { BorderNode } from "../model/BorderNode";
import { IJsonTabNode } from "../model/IJsonModel";
import { Model } from "../model/Model";
import { Node } from "../model/Node";
import { TabNode } from "../model/TabNode";
import { TabSetNode } from "../model/TabSetNode";
export interface ILayoutProps {
/** the model for this layout */
model: Model;
/** factory function for creating the tab components */
factory: (node: TabNode) => React.ReactNode;
/** sets a top level class name on popout windows */
popoutClassName?: string;
/** object mapping keys among close, maximize, restore, more, popout to React nodes to use in place of the default icons, can alternatively return functions for creating the React nodes */
icons?: IIcons;
/** function called whenever the layout generates an action to update the model (allows for intercepting actions before they are dispatched to the model, for example, asking the user to confirm a tab close.) Returning undefined from the function will halt the action, otherwise return the action to continue */
onAction?: (action: Action) => Action | undefined;
/** function called when rendering a tab, allows leading (icon), content section, buttons and name used in overflow menu to be customized */
onRenderTab?: (node: TabNode, renderValues: ITabRenderValues) => void;
/** function called when rendering a tabset, allows header and buttons to be customized */
onRenderTabSet?: (tabSetNode: TabSetNode | BorderNode, renderValues: ITabSetRenderValues) => void;
/** function called when model has changed */
onModelChange?: (model: Model, action: Action) => void;
/** function called when an external object (not a tab) gets dragged onto the layout, with a single dragenter argument. Should return either undefined to reject the drag/drop or an object with keys dragText, jsonDrop, to create a tab via drag (similar to a call to addTabToTabSet). Function onDropis passed the added tabNodeand thedrop DragEvent`, unless the drag was canceled. */
onExternalDrag?: (event: React.DragEvent<HTMLElement>) => undefined | {
json: any;
onDrop?: (node?: Node, event?: React.DragEvent<HTMLElement>) => void;
};
/** function called with default css class name, return value is class name that will be used. Mainly for use with css modules. */
classNameMapper?: (defaultClassName: string) => string;
/** function called for each I18nLabel to allow user translation, currently used for tab and tabset move messages, return undefined to use default values */
i18nMapper?: (id: I18nLabel, param?: string) => string | undefined;
/** if left undefined will do simple check based on userAgent */
supportsPopout?: boolean | undefined;
/** URL of popout window relative to origin, defaults to popout.html */
popoutURL?: string | undefined;
/** boolean value, defaults to false, resize tabs as splitters are dragged. Warning: this can cause resizing to become choppy when tabs are slow to draw */
realtimeResize?: boolean | undefined;
/** callback for rendering the drag rectangles */
onRenderDragRect?: DragRectRenderCallback;
/** callback for handling context actions on tabs and tabsets */
onContextMenu?: NodeMouseEvent;
/** callback for handling mouse clicks on tabs and tabsets with alt, meta, shift keys, also handles center mouse clicks */
onAuxMouseClick?: NodeMouseEvent;
/** callback for handling the display of the tab overflow menu */
onShowOverflowMenu?: ShowOverflowMenuCallback;
/** callback for rendering a placeholder when a tabset is empty */
onTabSetPlaceHolder?: TabSetPlaceHolderCallback;
/** Name given to popout windows, defaults to 'Popout Window' */
popoutWindowName?: string;
}
/**
* A React component that hosts a multi-tabbed layout
*/
export declare class Layout extends React.Component<ILayoutProps> {
/** re-render the layout */
redraw(): void;
/**
* Adds a new tab to the given tabset
* @param tabsetId the id of the tabset where the new tab will be added
* @param json the json for the new tab node
* @returns the added tab node or undefined
*/
addTabToTabSet(tabsetId: string, json: IJsonTabNode): TabNode | undefined;
/**
* Adds a new tab by dragging an item to the drop location, must be called from within an HTML
* drag start handler. You can use the setDragComponent() method to set the drag image before calling this
* method.
* @param event the drag start event
* @param json the json for the new tab node
* @param onDrop a callback to call when the drag is complete
*/
addTabWithDragAndDrop(event: DragEvent, json: IJsonTabNode, onDrop?: (node?: Node, event?: React.DragEvent<HTMLElement>) => void): void;
/**
* Move a tab/tabset using drag and drop, must be called from within an HTML
* drag start handler
* @param event the drag start event
* @param node the tab or tabset to drag
*/
moveTabWithDragAndDrop(event: DragEvent, node: (TabNode | TabSetNode)): void;
/**
* Adds a new tab to the active tabset (if there is one)
* @param json the json for the new tab node
* @returns the added tab node or undefined
*/
addTabToActiveTabSet(json: IJsonTabNode): TabNode | undefined;
/**
* Sets the drag image from a react component for a drag event
* @param event the drag event
* @param component the react component to be used for the drag image
* @param x the x position of the drag cursor on the image
* @param y the x position of the drag cursor on the image
*/
setDragComponent(event: DragEvent, component: React.ReactNode, x: number, y: number): void;
/** Get the root div element of the layout */
getRootDiv(): HTMLDivElement | null;
}
export declare const FlexLayoutVersion = "0.8.9";
export type DragRectRenderCallback = (content: React.ReactNode | undefined, node?: Node, json?: IJsonTabNode) => React.ReactNode | undefined;
export type NodeMouseEvent = (node: TabNode | TabSetNode | BorderNode, event: React.MouseEvent<HTMLElement, MouseEvent>) => void;
export type ShowOverflowMenuCallback = (node: TabSetNode | BorderNode, mouseEvent: React.MouseEvent<HTMLElement, MouseEvent>, items: {
index: number;
node: TabNode;
}[], onSelect: (item: {
index: number;
node: TabNode;
}) => void) => void;
export type TabSetPlaceHolderCallback = (node: TabSetNode) => React.ReactNode;
export interface ITabSetRenderValues {
/** components that will be added after the tabs */
stickyButtons: React.ReactNode[];
/** components that will be added at the end of the tabset */
buttons: React.ReactNode[];
/** position to insert overflow button within [...stickyButtons, ...buttons]
* if left undefined position will be after the sticky buttons (if any)
*/
overflowPosition: number | undefined;
}
export interface ITabRenderValues {
/** the icon or other leading component */
leading: React.ReactNode;
/** the main tab text/component */
content: React.ReactNode;
/** a set of react components to add to the tab after the content */
buttons: React.ReactNode[];
}
export interface IIcons {
close?: (React.ReactNode | ((tabNode: TabNode) => React.ReactNode));
closeTabset?: (React.ReactNode | ((tabSetNode: TabSetNode) => React.ReactNode));
popout?: (React.ReactNode | ((tabNode: TabNode) => React.ReactNode));
maximize?: (React.ReactNode | ((tabSetNode: TabSetNode) => React.ReactNode));
restore?: (React.ReactNode | ((tabSetNode: TabSetNode) => React.ReactNode));
more?: (React.ReactNode | ((tabSetNode: (TabSetNode | BorderNode), hiddenTabs: {
node: TabNode;
index: number;
}[]) => React.ReactNode));
edgeArrow?: React.ReactNode;
activeTabset?: (React.ReactNode | ((tabSetNode: TabSetNode) => React.ReactNode));
}