Merge branch 'master'
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Mon, 17 Dec 2018 14:51:40 +0000 (15:51 +0100)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Mon, 17 Dec 2018 14:51:40 +0000 (15:51 +0100)
Feature #14505

Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski@contractors.roche.com>

1  2 
src/routes/route-change-handlers.ts
src/store/store.ts
src/store/workbench/workbench-actions.ts
src/views-components/main-app-bar/account-menu.tsx
src/views-components/main-app-bar/admin-menu.tsx

index 7b37509f90b94be0cd053e3052e52ef438bac8fc,bc5cbb6a9f41040834ac30c8d683dda97eda3f17..03e2a38aee5deb3de1a0e0663bae503d2bfe64aa
@@@ -8,6 -8,8 +8,8 @@@ import * as Routes from '~/routes/route
  import * as WorkbenchActions from '~/store/workbench/workbench-actions';
  import { navigateToRootProject } from '~/store/navigation/navigation-action';
  import { dialogActions } from '~/store/dialog/dialog-actions';
+ import { contextMenuActions } from '~/store/context-menu/context-menu-actions';
+ import { searchBarActions } from '~/store/search-bar/search-bar-actions';
  
  export const addRouteChangeHandlers = (history: History, store: RootStore) => {
      const handler = handleLocationChange(store);
@@@ -37,11 -39,11 +39,13 @@@ const handleLocationChange = (store: Ro
      const apiClientAuthorizationsMatch = Routes.matchApiClientAuthorizationsRoute(pathname);
      const myAccountMatch = Routes.matchMyAccountRoute(pathname);
      const userMatch = Routes.matchUsersRoute(pathname);
 +    const groupsMatch = Routes.matchGroupsRoute(pathname);
 +    const groupDetailsMatch = Routes.matchGroupDetailsRoute(pathname);
      const linksMatch = Routes.matchLinksRoute(pathname);
  
      store.dispatch(dialogActions.CLOSE_ALL_DIALOGS());
+     store.dispatch(contextMenuActions.CLOSE_CONTEXT_MENU());
+     store.dispatch(searchBarActions.CLOSE_SEARCH_VIEW());
  
      if (projectMatch) {
          store.dispatch(WorkbenchActions.loadProject(projectMatch.params.id));
          store.dispatch(WorkbenchActions.loadMyAccount);
      } else if (userMatch) {
          store.dispatch(WorkbenchActions.loadUsers);
 +    } else if (groupsMatch) {
 +        store.dispatch(WorkbenchActions.loadGroupsPanel);
 +    } else if (groupDetailsMatch) {
 +        store.dispatch(WorkbenchActions.loadGroupDetailsPanel(groupDetailsMatch.params.id));
      } else if (linksMatch) {
          store.dispatch(WorkbenchActions.loadLinks);
      }
diff --combined src/store/store.ts
index 3aef8f500013fb301d6e6089296b9a05909a561e,d196e632d24f8fe3a7f8bc3062d8a7c2bd8cb01f..14a6ba11d7651930b878919fa3f3f5d2bb54205a
@@@ -48,14 -48,11 +48,15 @@@ import { repositoriesReducer } from '~/
  import { keepServicesReducer } from '~/store/keep-services/keep-services-reducer';
  import { UserMiddlewareService } from '~/store/users/user-panel-middleware-service';
  import { USERS_PANEL_ID } from '~/store/users/users-actions';
- import { computeNodesReducer } from '~/store/compute-nodes/compute-nodes-reducer';
  import { apiClientAuthorizationsReducer } from '~/store/api-client-authorizations/api-client-authorizations-reducer';
 +import { GroupsPanelMiddlewareService } from '~/store/groups-panel/groups-panel-middleware-service';
 +import { GROUPS_PANEL_ID } from '~/store/groups-panel/groups-panel-actions';
 +import { GroupDetailsPanelMiddlewareService } from '~/store/group-details-panel/group-details-panel-middleware-service';
 +import { GROUP_DETAILS_PANEL_ID } from '~/store/group-details-panel/group-details-panel-actions';
  import { LINK_PANEL_ID } from '~/store/link-panel/link-panel-actions';
  import { LinkMiddlewareService } from '~/store/link-panel/link-panel-middleware-service';
+ import { COMPUTE_NODE_PANEL_ID } from '~/store/compute-nodes/compute-nodes-actions';
+ import { ComputeNodeMiddlewareService } from '~/store/compute-nodes/compute-nodes-middleware-service';
  
  const composeEnhancers =
      (process.env.NODE_ENV === 'development' &&
@@@ -90,16 -87,12 +91,19 @@@ export function configureStore(history
      const userPanelMiddleware = dataExplorerMiddleware(
          new UserMiddlewareService(services, USERS_PANEL_ID)
      );
 +    const groupsPanelMiddleware = dataExplorerMiddleware(
 +        new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
 +    );
 +    const groupDetailsPanelMiddleware = dataExplorerMiddleware(
 +        new GroupDetailsPanelMiddlewareService(services, GROUP_DETAILS_PANEL_ID)
 +    );
 +
      const linkPanelMiddleware = dataExplorerMiddleware(
          new LinkMiddlewareService(services, LINK_PANEL_ID)
      );
+     const computeNodeMiddleware = dataExplorerMiddleware(
+         new ComputeNodeMiddlewareService(services, COMPUTE_NODE_PANEL_ID)
+     );
      const middlewares: Middleware[] = [
          routerMiddleware(history),
          thunkMiddleware.withExtraArgument(services),
          sharedWithMePanelMiddleware,
          workflowPanelMiddleware,
          userPanelMiddleware,
-         linkPanelMiddleware
 +        groupsPanelMiddleware,
 +        groupDetailsPanelMiddleware,
 -        computeNodeMiddleware
+         linkPanelMiddleware,
++        computeNodeMiddleware,
      ];
      const enhancer = composeEnhancers(applyMiddleware(...middlewares));
      return createStore(rootReducer, enhancer);
@@@ -144,6 -136,5 +149,5 @@@ const createRootReducer = (services: Se
      virtualMachines: virtualMachinesReducer,
      repositories: repositoriesReducer,
      keepServices: keepServicesReducer,
-     computeNodes: computeNodesReducer,
      apiClientAuthorizations: apiClientAuthorizationsReducer
  });
index af2afab29f53ba33b2a06bed69e6174ddf085e9b,e42e6c3ea1a8520f1961e0d5751bf83bb6e22e44..5e9dc285ef2050f98794b4b5cfc632070ce32d4b
@@@ -14,7 -14,7 +14,7 @@@ import { favoritePanelActions } from '~
  import { projectPanelColumns } from '~/views/project-panel/project-panel';
  import { favoritePanelColumns } from '~/views/favorite-panel/favorite-panel';
  import { matchRootRoute } from '~/routes/routes';
 -import { setSidePanelBreadcrumbs, setProcessBreadcrumbs, setSharedWithMeBreadcrumbs, setTrashBreadcrumbs, setBreadcrumbs } from '~/store/breadcrumbs/breadcrumbs-actions';
 +import { setSidePanelBreadcrumbs, setProcessBreadcrumbs, setSharedWithMeBreadcrumbs, setTrashBreadcrumbs, setBreadcrumbs, setGroupDetailsBreadcrumbs, setGroupsBreadcrumbs } from '~/store/breadcrumbs/breadcrumbs-actions';
  import { navigateToProject } from '~/store/navigation/navigation-action';
  import { MoveToFormDialogData } from '~/store/move-to-dialog/move-to-dialog';
  import { ServiceRepository } from '~/services/services';
@@@ -60,14 -60,11 +60,15 @@@ import { loadRepositoriesPanel } from '
  import { loadKeepServicesPanel } from '~/store/keep-services/keep-services-actions';
  import { loadUsersPanel, userBindedActions } from '~/store/users/users-actions';
  import { loadLinkPanel, linkPanelActions } from '~/store/link-panel/link-panel-actions';
+ import { loadComputeNodesPanel, computeNodesActions } from '~/store/compute-nodes/compute-nodes-actions';
  import { linkPanelColumns } from '~/views/link-panel/link-panel-root';
  import { userPanelColumns } from '~/views/user-panel/user-panel';
- import { loadComputeNodesPanel } from '~/store/compute-nodes/compute-nodes-actions';
+ import { computeNodePanelColumns } from '~/views/compute-node-panel/compute-node-panel-root';
  import { loadApiClientAuthorizationsPanel } from '~/store/api-client-authorizations/api-client-authorizations-actions';
 +import * as groupPanelActions from '~/store/groups-panel/groups-panel-actions';
 +import { groupsPanelColumns } from '~/views/groups-panel/groups-panel';
 +import * as groupDetailsPanelActions from '~/store/group-details-panel/group-details-panel-actions';
 +import { groupDetailsPanelColumns } from '~/views/group-details-panel/group-details-panel';
  
  export const WORKBENCH_LOADING_SCREEN = 'workbenchLoadingScreen';
  
@@@ -102,9 -99,8 +103,10 @@@ export const loadWorkbench = () =
                  dispatch(workflowPanelActions.SET_COLUMNS({ columns: workflowPanelColumns }));
                  dispatch(searchResultsPanelActions.SET_COLUMNS({ columns: searchResultsPanelColumns }));
                  dispatch(userBindedActions.SET_COLUMNS({ columns: userPanelColumns }));
 +                dispatch(groupPanelActions.GroupsPanelActions.SET_COLUMNS({ columns: groupsPanelColumns }));
 +                dispatch(groupDetailsPanelActions.GroupDetailsPanelActions.SET_COLUMNS({columns: groupDetailsPanelColumns}));
                  dispatch(linkPanelActions.SET_COLUMNS({ columns: linkPanelColumns }));
+                 dispatch(computeNodesActions.SET_COLUMNS({ columns: computeNodePanelColumns }));
                  dispatch<any>(initSidePanelTree());
                  if (router.location) {
                      const match = matchRootRoute(router.location.pathname);
@@@ -459,20 -455,6 +461,20 @@@ export const loadApiClientAuthorization
          await dispatch(loadApiClientAuthorizationsPanel());
      });
  
 +export const loadGroupsPanel = handleFirstTimeLoad(
 +    (dispatch: Dispatch<any>) => {
 +        dispatch(setGroupsBreadcrumbs());
 +        dispatch(groupPanelActions.loadGroupsPanel());
 +    });
 +
 +
 +export const loadGroupDetailsPanel = (groupUuid: string) =>
 +    handleFirstTimeLoad(
 +        (dispatch: Dispatch<any>) => {
 +            dispatch(setGroupDetailsBreadcrumbs(groupUuid));
 +            dispatch(groupDetailsPanelActions.loadGroupDetailsPanel(groupUuid));
 +        });
 +
  const finishLoadingProject = (project: GroupContentsResource | string) =>
      async (dispatch: Dispatch<any>) => {
          const uuid = typeof project === 'string' ? project : project.uuid;
index ec95e38a33cfbba5f5eb9a7d292457307f02511a,b9df186f957171386530c26a4a4643457fc8e17a..53a5753d0c2130380ce900efa2c1f6f73b33698d
@@@ -11,25 -11,28 +11,28 @@@ import { DispatchProp, connect } from '
  import { logout } from '~/store/auth/auth-action';
  import { RootState } from "~/store/store";
  import { openCurrentTokenDialog } from '~/store/current-token-dialog/current-token-dialog-actions';
 -import { openRepositoriesPanel } from "~/store/repositories/repositories-actions";
  import { navigateToSshKeysUser, navigateToMyAccount } from '~/store/navigation/navigation-action';
  import { openUserVirtualMachines } from "~/store/virtual-machines/virtual-machines-actions";
 +import { openRepositoriesPanel } from '~/store/repositories/repositories-actions';
  
  interface AccountMenuProps {
      user?: User;
+     currentRoute: string;
  }
  
  const mapStateToProps = (state: RootState): AccountMenuProps => ({
-     user: state.auth.user
+     user: state.auth.user,
+     currentRoute: state.router.location ? state.router.location.pathname : ''
  });
  
  export const AccountMenu = connect(mapStateToProps)(
-     ({ user, dispatch }: AccountMenuProps & DispatchProp<any>) =>
+     ({ user, dispatch, currentRoute }: AccountMenuProps & DispatchProp<any>) =>
          user
              ? <DropdownMenu
                  icon={<UserPanelIcon />}
                  id="account-menu"
-                 title="Account Management">
+                 title="Account Management"
+                 key={currentRoute}>
                  <MenuItem>
                      {getUserFullname(user)}
                  </MenuItem>
index 8f9527e03f984fce52d38645cf7f07754a7a4753,b47bbd5211ab20905cdd1698377c6d6ce5fc9151..9b94c064ed919dc3ed28755456ca729fb4508a27
@@@ -17,27 -17,30 +17,30 @@@ import { openUserPanel } from "~/store/
  
  interface AdminMenuProps {
      user?: User;
+     currentRoute: string;
  }
  
  const mapStateToProps = (state: RootState): AdminMenuProps => ({
-     user: state.auth.user
+     user: state.auth.user,
+     currentRoute: state.router.location ? state.router.location.pathname : ''
  });
  
  export const AdminMenu = connect(mapStateToProps)(
-     ({ user, dispatch }: AdminMenuProps & DispatchProp<any>) =>
+     ({ user, dispatch, currentRoute }: AdminMenuProps & DispatchProp<any>) =>
          user
              ? <DropdownMenu
                  icon={<AdminMenuIcon />}
                  id="admin-menu"
-                 title="Admin Panel">
+                 title="Admin Panel"
+                 key={currentRoute}>
                  <MenuItem onClick={() => dispatch(openRepositoriesPanel())}>Repositories</MenuItem>
                  <MenuItem onClick={() => dispatch(openAdminVirtualMachines())}>Virtual Machines</MenuItem>
                  <MenuItem onClick={() => dispatch(NavigationAction.navigateToSshKeysAdmin)}>Ssh Keys</MenuItem>
                  <MenuItem onClick={() => dispatch(NavigationAction.navigateToApiClientAuthorizations)}>Api Tokens</MenuItem>
                  <MenuItem onClick={() => dispatch(openUserPanel())}>Users</MenuItem>
 +                <MenuItem onClick={() => dispatch(NavigationAction.navigateToGroups)}>Groups</MenuItem>}
                  <MenuItem onClick={() => dispatch(NavigationAction.navigateToComputeNodes)}>Compute Nodes</MenuItem>
                  <MenuItem onClick={() => dispatch(NavigationAction.navigateToKeepServices)}>Keep Services</MenuItem>
                  <MenuItem onClick={() => dispatch(NavigationAction.navigateToLinks)}>Links</MenuItem>
 -                <MenuItem onClick={() => dispatch(logout())}>Logout</MenuItem>
              </DropdownMenu>
              : null);