X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/e4de9a43cee1a8859cb2a42ea01723d632621ce4..25216cc7acedc987c26a159f0b640210c0ef101e:/src/plugins/example/index.tsx diff --git a/src/plugins/example/index.tsx b/src/plugins/example/index.tsx index b8bfcb0f..c15036ca 100644 --- a/src/plugins/example/index.tsx +++ b/src/plugins/example/index.tsx @@ -2,65 +2,53 @@ // // SPDX-License-Identifier: AGPL-3.0 -// Example plugin. +// Example workbench plugin. The entry point is the "register" method. -import { PluginConfig } from '~/common/plugintypes'; +import { PluginConfig } from 'common/plugintypes'; import * as React from 'react'; import { Dispatch } from 'redux'; -import { RootState } from '~/store/store'; +import { RootState } from 'store/store'; import { push } from "react-router-redux"; -import { Typography } from "@material-ui/core"; import { Route, matchPath } from "react-router"; -import { RootStore } from '~/store/store'; -import { activateSidePanelTreeItem } from '~/store/side-panel-tree/side-panel-tree-actions'; -import { setSidePanelBreadcrumbs } from '~/store/breadcrumbs/breadcrumbs-actions'; -import { DispatchProp, connect } from 'react-redux'; -import { MenuItem } from "@material-ui/core"; -import { propertiesActions } from '~/store/properties/properties-actions'; +import { RootStore } from 'store/store'; +import { activateSidePanelTreeItem } from 'store/side-panel-tree/side-panel-tree-actions'; +import { setSidePanelBreadcrumbs } from 'store/breadcrumbs/breadcrumbs-actions'; import { Location } from 'history'; +import { handleFirstTimeLoad } from 'store/workbench/workbench-actions'; +import { + ExampleDialog, + ExamplePluginMainPanel, + ExampleMenuComponent, + ExampleDialogMenuComponent +} from './exampleComponents'; const categoryName = "Plugin Example"; export const routePath = "/examplePlugin"; -const propertyKey = "Example_menu_item_pressed_count"; - -interface ExampleProps { - pressedCount: number; -} - -const exampleMapStateToProps = (state: RootState) => ({ pressedCount: state.properties[propertyKey] || 0 }); - -const incrementPressedCount = (dispatch: Dispatch, pressedCount: number) => { - dispatch(propertiesActions.SET_PROPERTY({ key: propertyKey, value: pressedCount + 1 })); -}; - -const ExampleMenuComponent = connect(exampleMapStateToProps)( - ({ pressedCount, dispatch }: ExampleProps & DispatchProp) => - incrementPressedCount(dispatch, pressedCount)}>Example menu item -); - -const ExamplePluginMainPanel = connect(exampleMapStateToProps)( - ({ pressedCount }: ExampleProps) => - - This is a example main panel plugin. The example menu item has been pressed {pressedCount} times. - ); export const register = (pluginConfig: PluginConfig) => { + // Add this component to the main panel. When the app navigates + // to '/examplePlugin' it will render ExamplePluginMainPanel. pluginConfig.centerPanelList.push((elms) => { elms.push(); return elms; }); - pluginConfig.accountMenuList.push((elms) => { - elms.push(); + // Add ExampleDialogMenuComponent to the upper-right user account menu + pluginConfig.accountMenuList.push((elms, menuItemClass) => { + elms.push(); return elms; }); - pluginConfig.newButtonMenuList.push((elms) => { - elms.push(); + // Add ExampleMenuComponent to the "New" button dropdown. + pluginConfig.newButtonMenuList.push((elms, menuItemClass) => { + elms.push(); return elms; }); + // Add a hook so that when the 'Plugin Example' entry in the left + // hand tree view is clicked, which calls navigateTo('Plugin Example'), + // it will be implemented by navigating to '/examplePlugin' pluginConfig.navigateToHandlers.push((dispatch: Dispatch, getState: () => RootState, uuid: string) => { if (uuid === categoryName) { dispatch(push(routePath)); @@ -69,16 +57,29 @@ export const register = (pluginConfig: PluginConfig) => { return false; }); + // Adds 'Plugin Example' to the left hand tree view. pluginConfig.sidePanelCategories.push((cats: string[]): string[] => { cats.push(categoryName); return cats; }); + // When the location changes to '/examplePlugin', make sure + // 'Plugin Example' in the left hand tree view is selected, and + // make sure the breadcrumbs are updated. pluginConfig.locationChangeHandlers.push((store: RootStore, pathname: string): boolean => { if (matchPath(pathname, { path: routePath, exact: true })) { - store.dispatch(activateSidePanelTreeItem(categoryName)); - store.dispatch(setSidePanelBreadcrumbs(categoryName)); + store.dispatch(handleFirstTimeLoad( + (dispatch: Dispatch) => { + dispatch(activateSidePanelTreeItem(categoryName)); + dispatch(setSidePanelBreadcrumbs(categoryName)); + })); return true; } return false; }); + // The "New" button can enabled or disabled based on the current + // context or selection. This adds a new callback to that will + // enable the "New" button when the location is '/examplePlugin' pluginConfig.enableNewButtonMatchers.push((location: Location) => (!!matchPath(location.pathname, { path: routePath, exact: true }))); + + // Add the example dialog box to the list of dialog box controls. + pluginConfig.dialogs.push(); };