[ARVADOS-WORKBENCH2] updated: 1.3.0-72-gcda1081

Git user git at public.curoverse.com
Fri Dec 7 05:05:30 EST 2018


Summary of changes:
 src/index.tsx                                      |   2 +
 src/models/api-client-authorization.ts             |  19 ++++
 src/models/resource.ts                             |   4 +
 src/routes/route-change-handlers.ts                |   3 +
 src/routes/routes.ts                               |   6 +-
 .../api-client-authorization-service.ts            |  14 +++
 .../common-service/common-resource-service.ts      | 126 +--------------------
 ...ommon-resource-service.ts => common-service.ts} |  88 +++++---------
 src/services/favorite-service/favorite-service.ts  |   2 +-
 src/services/groups-service/groups-service.ts      |   3 +-
 .../permission-service/permission-service.ts       |   3 +-
 src/services/project-service/project-service.ts    |   2 +-
 src/services/services.ts                           |   3 +
 src/store/advanced-tab/advanced-tab.ts             |  52 ++++++++-
 .../api-client-authorizations-actions.ts           |  82 ++++++++++++++
 .../api-client-authorizations-reducer.ts           |  22 ++++
 src/store/context-menu/context-menu-actions.ts     |  13 +++
 .../data-explorer-middleware-service.ts            |   2 +-
 src/store/navigation/navigation-action.ts          |   2 +
 .../project-panel-middleware-service.ts            |   2 +-
 .../search-results-middleware-service.ts           |   2 +-
 .../shared-with-me-middleware-service.ts           |   2 +-
 src/store/store.ts                                 |   4 +-
 src/store/users/user-panel-middleware-service.ts   |   2 +-
 .../virtual-machines/virtual-machines-actions.ts   |   2 +-
 .../virtual-machines/virtual-machines-reducer.ts   |   2 +-
 src/store/workbench/workbench-actions.ts           |   6 +
 .../workflow-panel/workflow-middleware-service.ts  |   2 +-
 .../attributes-dialog.tsx                          |  78 +++++++++++++
 .../help-dialog.tsx                                |  66 +++++++++++
 .../remove-dialog.tsx                              |   8 +-
 ...t.ts => api-client-authorization-action-set.ts} |  11 +-
 src/views-components/context-menu/context-menu.tsx |   1 +
 src/views-components/main-app-bar/account-menu.tsx |   6 +-
 .../main-content-bar/main-content-bar.tsx          |   4 +-
 .../api-client-authorization-panel-root.tsx        | 104 +++++++++++++++++
 .../api-client-authorization-panel.tsx             |  32 ++++++
 .../compute-node-panel/compute-node-panel-root.tsx |   4 +-
 .../virtual-machine-panel.tsx                      |   2 +-
 src/views/workbench/workbench.tsx                  |   8 ++
 40 files changed, 583 insertions(+), 213 deletions(-)
 create mode 100644 src/models/api-client-authorization.ts
 create mode 100644 src/services/api-client-authorization-service/api-client-authorization-service.ts
 copy src/services/common-service/{common-resource-service.ts => common-service.ts} (58%)
 create mode 100644 src/store/api-client-authorizations/api-client-authorizations-actions.ts
 create mode 100644 src/store/api-client-authorizations/api-client-authorizations-reducer.ts
 create mode 100644 src/views-components/api-client-authorizations-dialog/attributes-dialog.tsx
 create mode 100644 src/views-components/api-client-authorizations-dialog/help-dialog.tsx
 copy src/views-components/{ssh-keys-dialog => api-client-authorizations-dialog}/remove-dialog.tsx (59%)
 copy src/views-components/context-menu/action-sets/{compute-node-action-set.ts => api-client-authorization-action-set.ts} (63%)
 create mode 100644 src/views/api-client-authorization-panel/api-client-authorization-panel-root.tsx
 create mode 100644 src/views/api-client-authorization-panel/api-client-authorization-panel.tsx

       via  cda10815df30e3bceec728535f426754ef8ff2e8 (commit)
       via  282b04b762cf6366209074333bfd623e3cba58c5 (commit)
       via  3865bd152892a1ad5f85f23d085268837db8c9ee (commit)
       via  eb8fb03156072ae7d9c289d8d7156fc2d94e40be (commit)
       via  4e1ff9a1613f897f24bc59a981e94d8bf227fd10 (commit)
       via  d19d853e83383a6b75f638be99472aa626a05524 (commit)
      from  7a6743eacc2ef5ce99ceca5acbaff8b00fb7e7d1 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit cda10815df30e3bceec728535f426754ef8ff2e8
Merge: 7a6743e 282b04b
Author: Pawel Kowalczyk <pawel.kowalczyk at contractors.roche.com>
Date:   Fri Dec 7 11:05:13 2018 +0100

    next conflicts
    
    Feature #14504
    
    Arvados-DCO-1.1-Signed-off-by: Pawel Kowalczyk <pawel.kowalczyk at contractors.roche.com>

diff --cc src/index.tsx
index 87af8f1,c33ef7c..8f702af
--- a/src/index.tsx
+++ b/src/index.tsx
@@@ -53,8 -53,8 +53,9 @@@ import { sshKeyActionSet } from '~/view
  import { keepServiceActionSet } from '~/views-components/context-menu/action-sets/keep-service-action-set';
  import { loadVocabulary } from '~/store/vocabulary/vocabulary-actions';
  import { virtualMachineActionSet } from '~/views-components/context-menu/action-sets/virtual-machine-action-set';
 +import { userActionSet } from '~/views-components/context-menu/action-sets/user-action-set';
  import { computeNodeActionSet } from '~/views-components/context-menu/action-sets/compute-node-action-set';
+ import { apiClientAuthorizationActionSet } from '~/views-components/context-menu/action-sets/api-client-authorization-action-set';
  
  console.log(`Starting arvados [${getBuildInfo()}]`);
  
@@@ -75,8 -75,8 +76,9 @@@ addMenuActionSet(ContextMenuKind.REPOSI
  addMenuActionSet(ContextMenuKind.SSH_KEY, sshKeyActionSet);
  addMenuActionSet(ContextMenuKind.VIRTUAL_MACHINE, virtualMachineActionSet);
  addMenuActionSet(ContextMenuKind.KEEP_SERVICE, keepServiceActionSet);
 +addMenuActionSet(ContextMenuKind.USER, userActionSet);
  addMenuActionSet(ContextMenuKind.NODE, computeNodeActionSet);
+ addMenuActionSet(ContextMenuKind.API_CLIENT_AUTHORIZATION, apiClientAuthorizationActionSet);
  
  fetchConfig()
      .then(({ config, apiHost }) => {
diff --cc src/routes/route-change-handlers.ts
index 5b281b8,a733e42..e2454d6
--- a/src/routes/route-change-handlers.ts
+++ b/src/routes/route-change-handlers.ts
@@@ -31,8 -31,8 +31,9 @@@ const handleLocationChange = (store: Ro
      const sshKeysMatch = Routes.matchSshKeysRoute(pathname);
      const keepServicesMatch = Routes.matchKeepServicesRoute(pathname);
      const computeNodesMatch = Routes.matchComputeNodesRoute(pathname);
+     const apiClientAuthorizationsMatch = Routes.matchApiClientAuthorizationsRoute(pathname);
      const myAccountMatch = Routes.matchMyAccountRoute(pathname);
 +    const userMatch = Routes.matchUsersRoute(pathname);
  
      if (projectMatch) {
          store.dispatch(WorkbenchActions.loadProject(projectMatch.params.id));
@@@ -66,9 -66,9 +67,11 @@@
          store.dispatch(WorkbenchActions.loadKeepServices);
      } else if (computeNodesMatch) {
          store.dispatch(WorkbenchActions.loadComputeNodes);
+     } else if (apiClientAuthorizationsMatch) {
+         store.dispatch(WorkbenchActions.loadApiClientAuthorizations);
      } else if (myAccountMatch) {
          store.dispatch(WorkbenchActions.loadMyAccount);
 +    }else if (userMatch) {
 +        store.dispatch(WorkbenchActions.loadUsers);
      }
  };
diff --cc src/routes/routes.ts
index dabb9bf,7f15a8d..88dfd46
--- a/src/routes/routes.ts
+++ b/src/routes/routes.ts
@@@ -26,7 -26,7 +26,8 @@@ export const Routes = 
      MY_ACCOUNT: '/my-account',
      KEEP_SERVICES: `/keep-services`,
      COMPUTE_NODES: `/nodes`,
-     USERS: '/users'
++    USERS: '/users',
+     API_CLIENT_AUTHORIZATIONS: `/api_client_authorizations`
  };
  
  export const getResourceUrl = (uuid: string) => {
@@@ -99,8 -99,8 +100,11 @@@ export const matchMyAccountRoute = (rou
  export const matchKeepServicesRoute = (route: string) =>
      matchPath(route, { path: Routes.KEEP_SERVICES });
  
 +export const matchUsersRoute = (route: string) =>
 +    matchPath(route, { path: Routes.USERS });
 +
  export const matchComputeNodesRoute = (route: string) =>
      matchPath(route, { path: Routes.COMPUTE_NODES });
+ 
+ export const matchApiClientAuthorizationsRoute = (route: string) =>
 -    matchPath(route, { path: Routes.API_CLIENT_AUTHORIZATIONS });
++    matchPath(route, { path: Routes.API_CLIENT_AUTHORIZATIONS });
diff --cc src/store/advanced-tab/advanced-tab.ts
index 4da4d7e,a77ffcc..851eb94
--- a/src/store/advanced-tab/advanced-tab.ts
+++ b/src/store/advanced-tab/advanced-tab.ts
@@@ -74,8 -75,8 +75,9 @@@ enum ResourcePrefix 
      AUTORIZED_KEYS = 'authorized_keys',
      VIRTUAL_MACHINES = 'virtual_machines',
      KEEP_SERVICES = 'keep_services',
+     COMPUTE_NODES = 'nodes',
 +    USERS = 'users',
-     COMPUTE_NODES = 'nodes'
+     API_CLIENT_AUTHORIZATIONS = 'api_client_authorizations'
  }
  
  enum KeepServiceData {
@@@ -93,9 -89,14 +95,14 @@@ enum ComputeNodeData 
      PROPERTIES = 'properties'
  }
  
- type AdvanceResourceKind = CollectionData | ProcessData | ProjectData | RepositoryData | SshKeyData | VirtualMachineData | KeepServiceData | ComputeNodeData | UserData;
+ enum ApiClientAuthorizationsData {
+     API_CLIENT_AUTHORIZATION = 'api_client_authorization',
+     DEFAULT_OWNER_UUID = 'default_owner_uuid'
+ }
+ 
 -type AdvanceResourceKind = CollectionData | ProcessData | ProjectData | RepositoryData | SshKeyData | VirtualMachineData | KeepServiceData | ComputeNodeData | ApiClientAuthorizationsData;
++type AdvanceResourceKind = CollectionData | ProcessData | ProjectData | RepositoryData | SshKeyData | VirtualMachineData | KeepServiceData | ComputeNodeData | ApiClientAuthorizationsData | UserData;
  type AdvanceResourcePrefix = GroupContentsResourcePrefix | ResourcePrefix;
- type AdvanceResponseData = ContainerRequestResource | ProjectResource | CollectionResource | RepositoryResource | SshKeyResource | VirtualMachinesResource | KeepServiceResource | NodeResource | UserResource | undefined;
 -type AdvanceResponseData = ContainerRequestResource | ProjectResource | CollectionResource | RepositoryResource | SshKeyResource | VirtualMachinesResource | KeepServiceResource | NodeResource | ApiClientAuthorization | undefined;
++type AdvanceResponseData = ContainerRequestResource | ProjectResource | CollectionResource | RepositoryResource | SshKeyResource | VirtualMachinesResource | KeepServiceResource | NodeResource | ApiClientAuthorization | UserResource | undefined;
  
  export const openAdvancedTabDialog = (uuid: string) =>
      async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
@@@ -539,4 -510,26 +561,26 @@@ const computeNodeApiResponse = (apiResp
  "info": "${JSON.stringify(info, null, 4)}"`;
  
      return response;
+ };
+ 
+ const apiClientAuthorizationApiResponse = (apiResponse: ApiClientAuthorization) => {
+     const {
 -        uuid, ownerUuid, apiToken, apiClientId, userId, createdByIpAddress, lastUsedByIpAddress, 
++        uuid, ownerUuid, apiToken, apiClientId, userId, createdByIpAddress, lastUsedByIpAddress,
+         lastUsedAt, expiresAt, defaultOwnerUuid, scopes, updatedAt, createdAt
+     } = apiResponse;
+     const response = `"uuid": "${uuid}",
+ "owner_uuid": "${ownerUuid}",
+ "api_token": "${stringify(apiToken)}",
+ "api_client_id": "${stringify(apiClientId)}",
+ "user_id": "${stringify(userId)}",
+ "created_by_ip_address": "${stringify(createdByIpAddress)}",
+ "last_used_by_ip_address": "${stringify(lastUsedByIpAddress)}",
+ "last_used_at": "${stringify(lastUsedAt)}",
+ "expires_at": "${stringify(expiresAt)}",
+ "created_at": "${stringify(createdAt)}",
+ "updated_at": "${stringify(updatedAt)}",
+ "default_owner_uuid": "${stringify(defaultOwnerUuid)}",
+ "scopes": "${JSON.stringify(scopes, null, 4)}"`;
+ 
+     return response;
  };
diff --cc src/store/navigation/navigation-action.ts
index bae1689,067a9ac..8d68a4b
--- a/src/store/navigation/navigation-action.ts
+++ b/src/store/navigation/navigation-action.ts
@@@ -74,4 -74,4 +74,6 @@@ export const navigateToKeepServices = p
  
  export const navigateToComputeNodes = push(Routes.COMPUTE_NODES);
  
 -export const navigateToApiClientAuthorizations = push(Routes.API_CLIENT_AUTHORIZATIONS);
 +export const navigateToUsers = push(Routes.USERS);
++
++export const navigateToApiClientAuthorizations = push(Routes.API_CLIENT_AUTHORIZATIONS);
diff --cc src/store/project-panel/project-panel-middleware-service.ts
index 257fc04,f2cc8a9..58f1587
--- a/src/store/project-panel/project-panel-middleware-service.ts
+++ b/src/store/project-panel/project-panel-middleware-service.ts
@@@ -22,11 -22,11 +22,11 @@@ import { Dispatch, MiddlewareAPI } fro
  import { ProjectResource } from "~/models/project";
  import { updateResources } from "~/store/resources/resources-actions";
  import { getProperty } from "~/store/properties/properties";
 -import { snackbarActions, SnackbarKind } from '../snackbar/snackbar-actions';
 +import { snackbarActions, SnackbarKind } from '~/store/snackbar/snackbar-actions';
  import { progressIndicatorActions } from '~/store/progress-indicator/progress-indicator-actions.ts';
 -import { DataExplorer, getDataExplorer } from '../data-explorer/data-explorer-reducer';
 +import { DataExplorer, getDataExplorer } from '~/store/data-explorer/data-explorer-reducer';
- import { ListResults } from '~/services/common-service/common-resource-service';
+ import { ListResults } from '~/services/common-service/common-service';
 -import { loadContainers } from '../processes/processes-actions';
 +import { loadContainers } from '~/store/processes/processes-actions';
  import { ResourceKind } from '~/models/resource';
  import { getResource } from "~/store/resources/resources";
  import { CollectionResource } from "~/models/collection";
diff --cc src/store/store.ts
index 1862d6f,eef0475..2b0ada8
--- a/src/store/store.ts
+++ b/src/store/store.ts
@@@ -46,9 -46,8 +46,10 @@@ import { resourcesDataReducer } from "~
  import { virtualMachinesReducer } from "~/store/virtual-machines/virtual-machines-reducer";
  import { repositoriesReducer } from '~/store/repositories/repositories-reducer';
  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';
  
  const composeEnhancers =
      (process.env.NODE_ENV === 'development' &&
diff --cc src/store/users/user-panel-middleware-service.ts
index 2f60209,2cd910b..bc4bb13
--- a/src/store/users/user-panel-middleware-service.ts
+++ b/src/store/users/user-panel-middleware-service.ts
@@@ -11,14 -11,14 +11,14 @@@ import { DataExplorer, getDataExplorer 
  import { updateResources } from '~/store/resources/resources-actions';
  import { FilterBuilder } from '~/services/api/filter-builder';
  import { SortDirection } from '~/components/data-table/data-column';
 -import { WorkflowPanelColumnNames } from '~/views/workflow-panel/workflow-panel-view';
  import { OrderDirection, OrderBuilder } from '~/services/api/order-builder';
- import { ListResults } from '~/services/common-service/common-resource-service';
 -import { WorkflowResource } from '~/models/workflow';
+ import { ListResults } from '~/services/common-service/common-service';
 -import { workflowPanelActions } from './workflow-panel-actions';
 +import { userBindedActions } from '~/store/users/users-actions';
  import { getSortColumn } from "~/store/data-explorer/data-explorer-reducer";
 +import { UserResource } from '~/models/user';
 +import { UserPanelColumnNames } from '~/views/user-panel/user-panel';
  
 -export class WorkflowMiddlewareService extends DataExplorerMiddlewareService {
 +export class UserMiddlewareService extends DataExplorerMiddlewareService {
      constructor(private services: ServiceRepository, id: string) {
          super(id);
      }
diff --cc src/store/workbench/workbench-actions.ts
index d33bdaf,fdc91f4..bc5eac6
--- a/src/store/workbench/workbench-actions.ts
+++ b/src/store/workbench/workbench-actions.ts
@@@ -58,9 -58,8 +58,10 @@@ import { searchResultsPanelColumns } fr
  import { loadVirtualMachinesPanel } from '~/store/virtual-machines/virtual-machines-actions';
  import { loadRepositoriesPanel } from '~/store/repositories/repositories-actions';
  import { loadKeepServicesPanel } from '~/store/keep-services/keep-services-actions';
 +import { loadUsersPanel, userBindedActions } from '~/store/users/users-actions';
 +import { userPanelColumns } from '~/views/user-panel/user-panel';
  import { loadComputeNodesPanel } from '~/store/compute-nodes/compute-nodes-actions';
+ import { loadApiClientAuthorizationsPanel } from '~/store/api-client-authorizations/api-client-authorizations-actions';
  
  export const WORKBENCH_LOADING_SCREEN = 'workbenchLoadingScreen';
  
diff --cc src/store/workflow-panel/workflow-middleware-service.ts
index 000e9f5,2cd910b..6dbcf6a
--- a/src/store/workflow-panel/workflow-middleware-service.ts
+++ b/src/store/workflow-panel/workflow-middleware-service.ts
@@@ -14,8 -14,8 +14,8 @@@ import { SortDirection } from '~/compon
  import { WorkflowPanelColumnNames } from '~/views/workflow-panel/workflow-panel-view';
  import { OrderDirection, OrderBuilder } from '~/services/api/order-builder';
  import { WorkflowResource } from '~/models/workflow';
- import { ListResults } from '~/services/common-service/common-resource-service';
+ import { ListResults } from '~/services/common-service/common-service';
 -import { workflowPanelActions } from './workflow-panel-actions';
 +import { workflowPanelActions } from '~/store/workflow-panel/workflow-panel-actions';
  import { getSortColumn } from "~/store/data-explorer/data-explorer-reducer";
  
  export class WorkflowMiddlewareService extends DataExplorerMiddlewareService {
diff --cc src/views-components/main-app-bar/account-menu.tsx
index 412f849,415cba3..44b113d
--- a/src/views-components/main-app-bar/account-menu.tsx
+++ b/src/views-components/main-app-bar/account-menu.tsx
@@@ -12,9 -12,11 +12,12 @@@ import { logout } from '~/store/auth/au
  import { RootState } from "~/store/store";
  import { openCurrentTokenDialog } from '~/store/current-token-dialog/current-token-dialog-actions';
  import { openRepositoriesPanel } from "~/store/repositories/repositories-actions";
- import { navigateToSshKeys, navigateToKeepServices, navigateToComputeNodes, navigateToMyAccount } from '~/store/navigation/navigation-action';
+ import { 
+     navigateToSshKeys, navigateToKeepServices, navigateToComputeNodes,
+     navigateToApiClientAuthorizations, navigateToMyAccount
+ } from '~/store/navigation/navigation-action';
  import { openVirtualMachines } from "~/store/virtual-machines/virtual-machines-actions";
 +import { navigateToUsers } from '~/store/navigation/navigation-action';
  
  interface AccountMenuProps {
      user?: User;
@@@ -38,7 -40,7 +41,8 @@@ export const AccountMenu = connect(mapS
                  <MenuItem onClick={() => dispatch(openRepositoriesPanel())}>Repositories</MenuItem>
                  <MenuItem onClick={() => dispatch(openCurrentTokenDialog)}>Current token</MenuItem>
                  <MenuItem onClick={() => dispatch(navigateToSshKeys)}>Ssh Keys</MenuItem>
 +                <MenuItem onClick={() => dispatch(navigateToUsers)}>Users</MenuItem>
+                 { user.isAdmin && <MenuItem onClick={() => dispatch(navigateToApiClientAuthorizations)}>Api Tokens</MenuItem> }
                  { user.isAdmin && <MenuItem onClick={() => dispatch(navigateToKeepServices)}>Keep Services</MenuItem> }
                  { user.isAdmin && <MenuItem onClick={() => dispatch(navigateToComputeNodes)}>Compute Nodes</MenuItem> }
                  <MenuItem onClick={() => dispatch(navigateToMyAccount)}>My account</MenuItem>
diff --cc src/views-components/main-content-bar/main-content-bar.tsx
index 7022fc5,a3279e3..8c2e4ce
--- a/src/views-components/main-content-bar/main-content-bar.tsx
+++ b/src/views-components/main-content-bar/main-content-bar.tsx
@@@ -20,8 -20,8 +20,8 @@@ const isButtonVisible = ({ router }: Ro
      const pathname = router.location ? router.location.pathname : '';
      return !Routes.matchWorkflowRoute(pathname) && !Routes.matchVirtualMachineRoute(pathname) &&
          !Routes.matchRepositoriesRoute(pathname) && !Routes.matchSshKeysRoute(pathname) &&
-         !Routes.matchKeepServicesRoute(pathname) && !Routes.matchComputeNodesRoute(pathname) && 
-         !Routes.matchUsersRoute(pathname);
+         !Routes.matchKeepServicesRoute(pathname) && !Routes.matchComputeNodesRoute(pathname) &&
 -        !Routes.matchApiClientAuthorizationsRoute(pathname);
++        !Routes.matchApiClientAuthorizationsRoute(pathname) && !Routes.matchUsersRoute(pathname);
  };
  
  export const MainContentBar = connect((state: RootState) => ({
diff --cc src/views/workbench/workbench.tsx
index e0ec14f,3cd040f..70f2a2d
--- a/src/views/workbench/workbench.tsx
+++ b/src/views/workbench/workbench.tsx
@@@ -68,9 -71,7 +71,10 @@@ import { AttributesComputeNodeDialog } 
  import { AttributesKeepServiceDialog } from '~/views-components/keep-services-dialog/attributes-dialog';
  import { AttributesSshKeyDialog } from '~/views-components/ssh-keys-dialog/attributes-dialog';
  import { VirtualMachineAttributesDialog } from '~/views-components/virtual-machines-dialog/attributes-dialog';
 +import { UserPanel } from '~/views/user-panel/user-panel';
 +import { UserAttributesDialog } from '~/views-components/user-dialog/attributes-dialog';
 +import { CreateUserDialog } from '~/views-components/dialog-forms/create-user-dialog';
+ import { HelpApiClientAuthorizationDialog } from '~/views-components/api-client-authorizations-dialog/help-dialog';
  
  type CssRules = 'root' | 'container' | 'splitter' | 'asidePanel' | 'contentWrapper' | 'content';
  
@@@ -144,8 -145,8 +148,9 @@@ export const WorkbenchPanel 
                                  <Route path={Routes.REPOSITORIES} component={RepositoriesPanel} />
                                  <Route path={Routes.SSH_KEYS} component={SshKeyPanel} />
                                  <Route path={Routes.KEEP_SERVICES} component={KeepServicePanel} />
 +                                <Route path={Routes.USERS} component={UserPanel} />
                                  <Route path={Routes.COMPUTE_NODES} component={ComputeNodePanel} />
+                                 <Route path={Routes.API_CLIENT_AUTHORIZATIONS} component={ApiClientAuthorizationPanel} />
                                  <Route path={Routes.MY_ACCOUNT} component={MyAccountPanel} />
                              </Switch>
                          </Grid>

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list