react-tab-widgets v0.1.5
React Tab Widgets
If you are dealing with application that consists of widgets that might be switched on/off depending on user's preference, you'd probably try react-tab-widgets which provides Layout with draggable tabs and resizable areas.
Installing
$ npm install react-tab-widgetsor
$ yarn add react-tab-widgetsUsage
Provider
react-widget-tabs library uses react-dnd under the hood, so all draggable objects and dropzones must be inside one drag-n-drop context which is provided by Provider:
import { Provider } from 'react-tab-widgets';
...
export default () => (
<Provider>
{/* nest draggable widgets and Container here */}
</Provider>
);Container
Container is a Layout which contains all widgets. Container as a set of multiple dropzones and draggable tabs should be nested within Provider. Container has no children property.
Container properties:
getWidgetName-(widgetId: string) => string. Function that returns widget name by givenwidgetIdthat would be displayed on a tab.getWidgetRenderedComponent-(widgetId: string) => React.Node. Function that returns React.Node by givenwidgetIdonWidgetCreated-(widgetId: string, registeredWidgetId: string) => void. Event handler for new widget being created.widgetIdis a newuuid/v4identifier that's generated under the hood (identifier creation would be extracted from hardcode in next minor version),registeredWidgetId- consider it as a widget type which was provided by draggable widget from outside (here and below, "registered" means registered as a type).
import { Container } from 'react-tab-widgets';
...
<Container
getWidgetName={getWidgetName}
getWidgetRenderedComponent={getWidgetRenderedComponent}
onWidgetCreated={registerNewWidget}
/>connectToReactTabWidget
HOC which provides registeredWidgetId prop handling. This registeredWidgetId would be passed to Container's onWidgetCreated callback.
Let's imagine we have a pallete of registered widgets to add. So, we need draggable link that our Container is able to handle. To create draggable link component we use connectToReactTabWidget:
import { connectToReactTabWidget } from 'react-tab-widgets';
...
const WidgetLink = connectToReactTabWidget(({ children }: any) => <Link>{children}</Link>);
// rendering somewhere inside `Provider`
<WidgetLink registeredWidgetId="xxx-xxxx-xxxxx">Drag me to `Container`</WidgetLink>Concepts
react-tab-widgets is just a dashboard that provides all the drag-n-drop magic. To use it you should be able to identify a widget type by registeredWidgetId and render a component by widgetId.
Future version will be able to handle initialStructure as well.