Merge branch 'master' into 13853-collection-view-info-card
authorJanicki Artur <artur.janicki@contractors.roche.com>
Mon, 30 Jul 2018 11:28:09 +0000 (13:28 +0200)
committerJanicki Artur <artur.janicki@contractors.roche.com>
Mon, 30 Jul 2018 11:28:09 +0000 (13:28 +0200)
refs #13853

Arvados-DCO-1.1-Signed-off-by: Janicki Artur <artur.janicki@contractors.roche.com>

39 files changed:
.env
src/common/api/server-api.ts
src/common/config.ts
src/common/labels.ts
src/components/data-table/data-column.ts
src/components/data-table/data-table.test.tsx
src/components/data-table/data-table.tsx
src/components/tree/tree.tsx
src/models/collection.ts
src/models/container-request.ts
src/models/group.ts
src/models/project.ts
src/models/resource.ts
src/models/test-utils.ts
src/models/workflow.ts
src/services/auth-service/auth-service.ts
src/services/favorite-service/favorite-order-builder.ts
src/services/groups-service/groups-service.ts
src/services/project-service/project-service.ts
src/services/services.ts
src/store/auth/auth-reducer.test.ts
src/store/collection-panel/collection-panel-action.ts
src/store/data-explorer/data-explorer-reducer.test.tsx
src/store/details-panel/details-panel-action.ts
src/store/favorite-panel/favorite-panel-middleware.ts
src/store/navigation/navigation-action.ts
src/store/project-panel/project-panel-middleware.ts
src/store/project/project-reducer.test.ts
src/store/project/project-reducer.ts
src/store/side-panel/side-panel-reducer.ts
src/views-components/details-panel/collection-details.tsx
src/views-components/details-panel/details-panel.tsx
src/views-components/details-panel/process-details.tsx
src/views-components/details-panel/project-details.tsx
src/views/favorite-panel/favorite-panel-item.ts
src/views/favorite-panel/favorite-panel.tsx
src/views/project-panel/project-panel-item.ts
src/views/project-panel/project-panel.tsx
src/views/workbench/workbench.tsx

diff --git a/.env b/.env
index a523865a6ae43a5b4e8bc670cd28029bfee3870e..ed397c5cc0952badd931be8ccfdd7ec60d95a6d1 100644 (file)
--- a/.env
+++ b/.env
@@ -3,4 +3,5 @@
 # SPDX-License-Identifier: AGPL-3.0
 
 REACT_APP_ARVADOS_CONFIG_URL=/config.json
-REACT_APP_ARVADOS_API_HOST=https://qr1hi.arvadosapi.com
\ No newline at end of file
+REACT_APP_ARVADOS_API_HOST=qr1hi.arvadosapi.com
+HTTPS=true
\ No newline at end of file
index 5beecd48ee7dafabfb34b5e2c1984af964f08498..bcd2f65985a6bee294e4079b33142818f7f51414 100644 (file)
@@ -6,19 +6,24 @@ import Axios, { AxiosInstance } from "axios";
 
 export const API_HOST = process.env.REACT_APP_ARVADOS_API_HOST;
 
-export const serverApi: AxiosInstance = Axios.create({
-    baseURL: API_HOST + '/arvados/v1'
-});
+export const authClient: AxiosInstance = Axios.create();
+export const apiClient: AxiosInstance = Axios.create();
 
 export function setServerApiAuthorizationHeader(token: string) {
-    serverApi.defaults.headers.common = {
-        'Authorization': `OAuth2 ${token}`
-    };}
+    [authClient, apiClient].forEach(client => {
+        client.defaults.headers.common = {
+            Authorization: `OAuth2 ${token}`
+        };
+    });
+}
 
 export function removeServerApiAuthorizationHeader() {
-    delete serverApi.defaults.headers.common.Authorization;
+    [authClient, apiClient].forEach(client => {
+        delete client.defaults.headers.common.Authorization;
+    });
 }
 
 export const setBaseUrl = (url: string) => {
-    serverApi.defaults.baseURL = url + "/arvados/v1";
+    authClient.defaults.baseURL = url;
+    apiClient.defaults.baseURL = url + "/arvados/v1";
 };
index 4b4a52a3ea4169db5bebbca79e578c8c6230b01b..775b11452ac370450c89976c5cb88f2fd0883afd 100644 (file)
@@ -10,14 +10,21 @@ export interface Config {
     API_HOST: string;
 }
 
-const defaultConfig: Config = {
-    API_HOST: process.env.REACT_APP_ARVADOS_API_HOST || ""
-};
-
 export const fetchConfig = () => {
     return Axios
         .get<Config>(CONFIG_URL + "?nocache=" + (new Date()).getTime())
         .then(response => response.data)
-        .catch(() => Promise.resolve(defaultConfig));
+        .catch(() => Promise.resolve(getDefaultConfig()))
+        .then(mapConfig);
 };
 
+const mapConfig = (config: Config): Config => ({
+    ...config,
+    API_HOST: addProtocol(config.API_HOST)
+});
+
+const getDefaultConfig = (): Config => ({
+    API_HOST: process.env.REACT_APP_ARVADOS_API_HOST || ""
+});
+
+const addProtocol = (url: string) => `${window.location.protocol}//${url}`;
index 9567ce14936b7d880ea06a42069feb85b9ab16d3..ed3a43d1427e6622e55c9059cddc7bfbf77eff46 100644 (file)
@@ -6,11 +6,11 @@ import { ResourceKind } from "../models/resource";
 
 export const resourceLabel = (type: string) => {
     switch (type) {
-        case ResourceKind.Collection:
+        case ResourceKind.COLLECTION:
             return "Data collection";
-        case ResourceKind.Project:
+        case ResourceKind.PROJECT:
             return "Project";
-        case ResourceKind.Process:
+        case ResourceKind.PROCESS:
             return "Process";
         default:
             return "Unknown";
index 06744c3a21bce90b9246ed74c06c984f9020cdf7..96ef952493aa895e24b778b22716b024c9ade851 100644 (file)
@@ -17,9 +17,9 @@ export interface DataColumn<T, F extends DataTableFilterItem = DataTableFilterIt
 }
 
 export enum SortDirection {
-    Asc = "asc",
-    Desc = "desc",
-    None = "none"
+    ASC = "asc",
+    DESC = "desc",
+    NONE = "none"
 }
 
 export const isColumnConfigurable = <T>(column: DataColumn<T>) => {
@@ -28,12 +28,12 @@ export const isColumnConfigurable = <T>(column: DataColumn<T>) => {
 
 export const toggleSortDirection = <T>(column: DataColumn<T>): DataColumn<T> => {
     return column.sortDirection
-        ? column.sortDirection === SortDirection.Asc
-            ? { ...column, sortDirection: SortDirection.Desc }
-            : { ...column, sortDirection: SortDirection.Asc }
+        ? column.sortDirection === SortDirection.ASC
+            ? { ...column, sortDirection: SortDirection.DESC }
+            : { ...column, sortDirection: SortDirection.ASC }
         : column;
 };
 
 export const resetSortDirection = <T>(column: DataColumn<T>): DataColumn<T> => {
-    return column.sortDirection ? { ...column, sortDirection: SortDirection.None } : column;
+    return column.sortDirection ? { ...column, sortDirection: SortDirection.NONE } : column;
 };
index 7e460c892f1c76f60f6afae0fe5be7c792f1d2f8..99ed2daffb52ab5c1c0cf051205eb5ac28e96806 100644 (file)
@@ -130,7 +130,7 @@ describe("<DataTable />", () => {
     it("passes sorting props to <TableSortLabel />", () => {
         const columns: DataColumns<string> = [{
             name: "Column 1",
-            sortDirection: SortDirection.Asc,
+            sortDirection: SortDirection.ASC,
             selected: true,
             render: (item) => <Typography>{item}</Typography>
         }];
@@ -151,7 +151,7 @@ describe("<DataTable />", () => {
     it("passes filter props to <DataTableFilter />", () => {
         const columns: DataColumns<string> = [{
             name: "Column 1",
-            sortDirection: SortDirection.Asc,
+            sortDirection: SortDirection.ASC,
             selected: true,
             filters: [{ name: "Filter 1", selected: true }],
             render: (item) => <Typography>{item}</Typography>
index 829bc84ebe86aa348c00f8a8f0c4abd2508403eb..f92f97b72f94b74d7da7dc23ff175ceeec225829 100644 (file)
@@ -74,8 +74,8 @@ export const DataTable = withStyles(styles)(
                         </DataTableFilters>
                         : sortDirection
                             ? <TableSortLabel
-                                active={sortDirection !== SortDirection.None}
-                                direction={sortDirection !== SortDirection.None ? sortDirection : undefined}
+                                active={sortDirection !== SortDirection.NONE}
+                                direction={sortDirection !== SortDirection.NONE ? sortDirection : undefined}
                                 onClick={() =>
                                     onSortToggle &&
                                     onSortToggle(column)}>
index 799e821704d4288bc24d972f0c95d5490fdbe153..20526005a1830491a5e844bdf64d3cf8d6148d68 100644 (file)
@@ -44,9 +44,9 @@ const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
 });
 
 export enum TreeItemStatus {
-    Initial,
-    Pending,
-    Loaded
+    INITIAL,
+    PENDING,
+    LOADED
 }
 
 export interface TreeItem<T> {
@@ -55,7 +55,6 @@ export interface TreeItem<T> {
     open: boolean;
     active: boolean;
     status: TreeItemStatus;
-    toggled?: boolean;
     items?: Array<TreeItem<T>>;
 }
 
@@ -80,12 +79,12 @@ export const Tree = withStyles(styles)(
                         <ListItem button className={list} style={{ paddingLeft: (level + 1) * 20 }}
                             onClick={() => toggleItemActive(it.id, it.status)}
                             onContextMenu={this.handleRowContextMenu(it)}>
-                            {it.status === TreeItemStatus.Pending ?
+                            {it.status === TreeItemStatus.PENDING ?
                                 <CircularProgress size={10} className={loader} /> : null}
                             <i onClick={() => this.props.toggleItemOpen(it.id, it.status)}
                                 className={toggableIconContainer}>
                                 <ListItemIcon className={this.getToggableIconClassNames(it.open, it.active)}>
-                                    {it.toggled && it.items && it.items.length === 0 ? <span /> : <SidePanelRightArrowIcon />}
+                                    {it.status !== TreeItemStatus.INITIAL && it.items && it.items.length === 0 ? <span /> : <SidePanelRightArrowIcon />}
                                 </ListItemIcon>
                             </i>
                             {render(it, level)}
index 8ab319991cc91a0f130576f1d4f72f4292be48c0..0e96f7fd3dd6f1473f62d8c2a2e3226aa42f6507 100644 (file)
@@ -5,7 +5,7 @@
 import { Resource, ResourceKind } from "./resource";
 
 export interface CollectionResource extends Resource {
-    kind: ResourceKind.Collection;
+    kind: ResourceKind.COLLECTION;
     name: string;
     description: string;
     properties: any;
index 4e5481570e6844100791c8b27b712a9498622963..d1bcc36c81e9a548e34006c9696e47340a422002 100644 (file)
@@ -5,13 +5,13 @@
 import { Resource, ResourceKind } from "./resource";
 
 export enum ContainerRequestState {
-    Uncommitted = "Uncommitted",
-    Committed = "Committed",
-    Final = "Final"
+    UNCOMMITTED = "Uncommitted",
+    COMMITTED = "Committed",
+    FINAL = "Final"
 }
 
 export interface ContainerRequestResource extends Resource {
-    kind: ResourceKind.ContainerRequest;
+    kind: ResourceKind.CONTAINER_REQUEST;
     name: string;
     description: string;
     properties: any;
index d8efae267118b9274754fd9b92155e6a87ec3066..5e8d7a1e0b4a2e76ceaf9c80d035f55417aa55d6 100644 (file)
@@ -5,7 +5,7 @@
 import { Resource, ResourceKind } from "./resource";
 
 export interface GroupResource extends Resource {
-    kind: ResourceKind.Group;
+    kind: ResourceKind.GROUP;
     name: string;
     groupClass: GroupClass | null;
     description: string;
@@ -17,5 +17,5 @@ export interface GroupResource extends Resource {
 }
 
 export enum GroupClass {
-    Project = "project"
+    PROJECT = "project"
 }
\ No newline at end of file
index d3626d3be9dd6f0f776b69a9a80f5748877de10c..b919450774f687084a700d8b4d041772aa142669 100644 (file)
@@ -5,7 +5,7 @@
 import { GroupResource, GroupClass } from "./group";
 
 export interface ProjectResource extends GroupResource {
-    groupClass: GroupClass.Project;
+    groupClass: GroupClass.PROJECT;
 }
 
 export const getProjectUrl = (uuid: string) => {
index 2d72fbcd82631482e524110da02f723875c6d1f8..6a76b070452146734b2a9f64a36bf3d4eac6ff4f 100644 (file)
@@ -15,10 +15,10 @@ export interface Resource {
 }
 
 export enum ResourceKind {
-    Collection = "arvados#collection",
-    ContainerRequest = "arvados#containerRequest",
-    Group = "arvados#group",
-    Process = "arvados#containerRequest",
-    Project = "arvados#group",
-    Workflow = "arvados#workflow"
+    COLLECTION = "arvados#collection",
+    CONTAINER_REQUEST = "arvados#containerRequest",
+    GROUP = "arvados#group",
+    PROCESS = "arvados#containerRequest",
+    PROJECT = "arvados#group",
+    WORKFLOW = "arvados#workflow"
 }
index 3f49dba6a3b27990a1161f0918393abf087f4392..6723430c34872848c26a6b9fa8be172b780f5603 100644 (file)
@@ -14,7 +14,7 @@ export const mockGroupResource = (data: Partial<GroupResource> = {}): GroupResou
     groupClass: null,
     href: "",
     isTrashed: false,
-    kind: ResourceKind.Group,
+    kind: ResourceKind.GROUP,
     modifiedAt: "",
     modifiedByClientUuid: "",
     modifiedByUserUuid: "",
@@ -28,7 +28,7 @@ export const mockGroupResource = (data: Partial<GroupResource> = {}): GroupResou
 });
 
 export const mockProjectResource = (data: Partial<ProjectResource> = {}): ProjectResource =>
-    mockGroupResource({ ...data, groupClass: GroupClass.Project }) as ProjectResource;
+    mockGroupResource({ ...data, groupClass: GroupClass.PROJECT }) as ProjectResource;
 
 export const mockCommonResource = (data: Partial<Resource>): Resource => ({
     createdAt: "",
index e0a5df4381c2dd8c4ed9c04fddd8b083559ffec3..d644b7909047b0c28db876f3dc1dbe9a96cd0c43 100644 (file)
@@ -5,7 +5,7 @@
 import { Resource, ResourceKind } from "./resource";
 
 export interface WorkflowResource extends Resource {
-    kind: ResourceKind.Workflow;
+    kind: ResourceKind.WORKFLOW;
     name: string;
     description: string;
     definition: string;
index 1879e6a0abd1b5e2fedb75e3690329407aea4280..551d435f25d208d07a835270b4602a97b228460a 100644 (file)
@@ -24,7 +24,9 @@ export interface UserDetailsResponse {
 
 export class AuthService {
 
-    constructor(protected serverApi: AxiosInstance) { }
+    constructor(
+        protected authClient: AxiosInstance,
+        protected apiClient: AxiosInstance) { }
 
     public saveApiToken(token: string) {
         localStorage.setItem(API_TOKEN_KEY, token);
@@ -76,16 +78,16 @@ export class AuthService {
 
     public login() {
         const currentUrl = `${window.location.protocol}//${window.location.host}/token`;
-        window.location.assign(`${API_HOST}/login?return_to=${currentUrl}`);
+        window.location.assign(`${this.authClient.defaults.baseURL || ""}/login?return_to=${currentUrl}`);
     }
 
     public logout() {
         const currentUrl = `${window.location.protocol}//${window.location.host}`;
-        window.location.assign(`${API_HOST}/logout?return_to=${currentUrl}`);
+        window.location.assign(`${this.authClient.defaults.baseURL || ""}/logout?return_to=${currentUrl}`);
     }
 
     public getUserDetails = (): Promise<User> => {
-        return this.serverApi
+        return this.apiClient
             .get<UserDetailsResponse>('/users/current')
             .then(resp => ({
                 email: resp.data.email,
index 33214a0dc8c55ac3fbaa56c0248e9d79f32a6885..0d9a75eb483053ddfc2858124302f958577a9de5 100644 (file)
@@ -22,18 +22,18 @@ export class FavoriteOrderBuilder {
     addAsc(attribute: "name") {
         const linkOrder = this.linkOrder.addAsc(attribute);
         const contentOrder = this.contentOrder
-            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Collection).addAsc(attribute))
-            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Process).addAsc(attribute))
-            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Project).addAsc(attribute));
+            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.COLLECTION).addAsc(attribute))
+            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROCESS).addAsc(attribute))
+            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROJECT).addAsc(attribute));
         return FavoriteOrderBuilder.create(linkOrder, contentOrder);
     }
 
     addDesc(attribute: "name") {
         const linkOrder = this.linkOrder.addDesc(attribute);
         const contentOrder = this.contentOrder
-            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Collection).addDesc(attribute))
-            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Process).addDesc(attribute))
-            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Project).addDesc(attribute));
+            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.COLLECTION).addDesc(attribute))
+            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROCESS).addDesc(attribute))
+            .concat(OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROJECT).addDesc(attribute));
         return FavoriteOrderBuilder.create(linkOrder, contentOrder);
     }
 
index dfaf11d6e82ccfbc77ad4ba484e7577fa66b4bdf..a0f27a4abbe27f26939e4d5be7c368f580eb9b32 100644 (file)
@@ -47,7 +47,7 @@ export class GroupsService<T extends GroupResource = GroupResource> extends Comm
 }
 
 export enum GroupContentsResourcePrefix {
-    Collection = "collections",
-    Project = "groups",
-    Process = "container_requests"
+    COLLECTION = "collections",
+    PROJECT = "groups",
+    PROCESS = "container_requests"
 }
index 7b1640ee021dfc1352816851149bf88a6938e72e..31a2ddd29cef813ea7f991d30db440c66934d506 100644 (file)
@@ -11,7 +11,7 @@ import { FilterBuilder } from "../../common/api/filter-builder";
 export class ProjectService extends GroupsService<ProjectResource> {
 
     create(data: Partial<ProjectResource>) {
-        const projectData = { ...data, groupClass: GroupClass.Project };
+        const projectData = { ...data, groupClass: GroupClass.PROJECT };
         return super.create(projectData);
     }
 
@@ -30,6 +30,6 @@ export class ProjectService extends GroupsService<ProjectResource> {
                 : FilterBuilder.create())
             .concat(FilterBuilder
                 .create<ProjectResource>()
-                .addEqual("groupClass", GroupClass.Project));
+                .addEqual("groupClass", GroupClass.PROJECT));
     }
 }
index f0afd76fc82f7158f3e85aa9ddcb95b0d1c2df65..e0d15cc40a40b855e599a76d151c70c4ef5a17cb 100644 (file)
@@ -4,13 +4,13 @@
 
 import { AuthService } from "./auth-service/auth-service";
 import { GroupsService } from "./groups-service/groups-service";
-import { serverApi } from "../common/api/server-api";
+import { authClient, apiClient } from "../common/api/server-api";
 import { ProjectService } from "./project-service/project-service";
 import { LinkService } from "./link-service/link-service";
 import { FavoriteService } from "./favorite-service/favorite-service";
 
-export const authService = new AuthService(serverApi);
-export const groupsService = new GroupsService(serverApi);
-export const projectService = new ProjectService(serverApi);
-export const linkService = new LinkService(serverApi);
-export const favoriteService = new FavoriteService(linkService, groupsService);
+export const authService = new AuthService(authClient, apiClient);
+export const groupsService = new GroupsService(apiClient);
+export const projectService = new ProjectService(apiClient);
+export const linkService = new LinkService(apiClient);
+export const favoriteService = new FavoriteService(linkService, groupsService);
\ No newline at end of file
index ea08e589838414d6bb1b876a21ce45422041ac35..778b500d364b87fe5478b939833af69ff24ca628 100644 (file)
@@ -12,7 +12,6 @@ import {
     USER_OWNER_UUID_KEY,
     USER_UUID_KEY
 } from "../../services/auth-service/auth-service";
-import { API_HOST } from "../../common/api/server-api";
 
 import 'jest-localstorage-mock';
 
@@ -96,7 +95,7 @@ describe('auth-reducer', () => {
         window.location.assign = jest.fn();
         authReducer(initialState, authActions.LOGIN());
         expect(window.location.assign).toBeCalledWith(
-            `${API_HOST}/login?return_to=${window.location.protocol}//${window.location.host}/token`
+            `/login?return_to=${window.location.protocol}//${window.location.host}/token`
         );
     });
 
@@ -105,7 +104,7 @@ describe('auth-reducer', () => {
         window.location.assign = jest.fn();
         authReducer(initialState, authActions.LOGOUT());
         expect(window.location.assign).toBeCalledWith(
-            `${API_HOST}/logout?return_to=${location.protocol}//${location.host}`
+            `/logout?return_to=${location.protocol}//${location.host}`
         );
     });
 });
index c2684e055b7b1e7a13831310969e2a113a4718da..3c6601657083296a056f40f711ad331f579a516c 100644 (file)
@@ -4,8 +4,8 @@
 
 import { unionize, ofType, UnionOf } from "unionize";
 import { CommonResourceService } from "../../common/api/common-resource-service";
+import { apiClient } from "../../common/api/server-api";
 import { Dispatch } from "redux";
-import { serverApi } from "../../common/api/server-api";
 import { ResourceKind } from "../../models/resource";
 import { CollectionResource } from "../../models/collection";
 
@@ -19,7 +19,7 @@ export type CollectionPanelAction = UnionOf<typeof collectionPanelActions>;
 export const loadCollection = (uuid: string, kind: ResourceKind) =>
     (dispatch: Dispatch) => {
         dispatch(collectionPanelActions.LOAD_COLLECTION({ uuid, kind }));
-        return new CommonResourceService(serverApi, "collections")
+        return new CommonResourceService(apiClient, "collections")
             .get(uuid)
             .then(item => {
                 dispatch(collectionPanelActions.LOAD_COLLECTION_SUCCESS({ item: item as CollectionResource }));
index 5b9f68ffbef75bdaa610cd8836668b326fd45660..c54a86af4aa6a44559d5b7f41624ac483ea6cd2b 100644 (file)
@@ -25,12 +25,12 @@ describe('data-explorer-reducer', () => {
             name: "Column 1",
             render: jest.fn(),
             selected: true,
-            sortDirection: SortDirection.Asc
+            sortDirection: SortDirection.ASC
         }, {
             name: "Column 2",
             render: jest.fn(),
             selected: true,
-            sortDirection: SortDirection.None,
+            sortDirection: SortDirection.NONE,
         }];
         const state = dataExplorerReducer({ "Data explorer": { ...initialDataExplorer, columns } },
             dataExplorerActions.TOGGLE_SORT({ id: "Data explorer", columnName: "Column 2" }));
index ba330f2e417dde4b07bd64914591258e255f084d..03212b9fc915bacfbc08f22d367d393b1f26b14b 100644 (file)
@@ -5,7 +5,7 @@
 import { unionize, ofType, UnionOf } from "unionize";
 import { CommonResourceService } from "../../common/api/common-resource-service";
 import { Dispatch } from "redux";
-import { serverApi } from "../../common/api/server-api";
+import { apiClient } from "../../common/api/server-api";
 import { Resource, ResourceKind } from "../../models/resource";
 
 export const detailsPanelActions = unionize({
@@ -28,12 +28,12 @@ export const loadDetails = (uuid: string, kind: ResourceKind) =>
 
 const getService = (kind: ResourceKind) => {
     switch (kind) {
-        case ResourceKind.Project:
-            return new CommonResourceService(serverApi, "groups");
-        case ResourceKind.Collection:
-            return new CommonResourceService(serverApi, "collections");
+        case ResourceKind.PROJECT:
+            return new CommonResourceService(apiClient, "groups");
+        case ResourceKind.COLLECTION:
+            return new CommonResourceService(apiClient, "collections");
         default:
-            return new CommonResourceService(serverApi, "");
+            return new CommonResourceService(apiClient, "");
     }
 };
 
index 0ce13b461c36ed8aaabdec8cf568c5c54473301b..548a117814996519f76c6ee5c9ba83c725df1deb 100644 (file)
@@ -67,7 +67,7 @@ export const favoritePanelMiddleware: Middleware = store => next => {
                             limit: dataExplorer.rowsPerPage,
                             offset: dataExplorer.page * dataExplorer.rowsPerPage,
                             order: sortColumn!.name === FavoritePanelColumnNames.NAME
-                                ? sortColumn!.sortDirection === SortDirection.Asc
+                                ? sortColumn!.sortDirection === SortDirection.ASC
                                     ? order.addDesc("name")
                                     : order.addAsc("name")
                                 : order,
@@ -104,14 +104,14 @@ export const favoritePanelMiddleware: Middleware = store => next => {
 const getOrder = (direction: SortDirection) => {
     const order = OrderBuilder.create<LinkResource>();
     const addRule = (builder: OrderBuilder<GroupContentsResource | LinkResource>, direction: SortDirection) =>
-        direction === SortDirection.Asc
+        direction === SortDirection.ASC
             ? builder.addAsc("name")
             : builder.addDesc("name");
 
     return [
-        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Collection),
-        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Process),
-        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Project)
+        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.COLLECTION),
+        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROCESS),
+        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROJECT)
     ].reduce((acc, b) =>
         acc.concat(addRule(b, direction)), addRule(OrderBuilder.create(), direction));
 };
index d65685d296becd4bad5d9d6ed7c3ef8c30ce0e9b..f8687ed754ad51f4604b4541361c5e3aff318fb5 100644 (file)
@@ -16,8 +16,8 @@ import { getProjectUrl } from "../../models/project";
 
 export const getResourceUrl = <T extends Resource>(resource: T): string => {
     switch (resource.kind) {
-        case ResourceKind.Project: return getProjectUrl(resource.uuid);
-        case ResourceKind.Collection: return getCollectionUrl(resource.uuid);
+        case ResourceKind.PROJECT: return getProjectUrl(resource.uuid);
+        case ResourceKind.COLLECTION: return getCollectionUrl(resource.uuid);
         default: return resource.href;
     }
 };
@@ -35,10 +35,6 @@ export const setProjectItem = (itemId: string, itemMode: ItemMode) =>
 
         if (treeItem) {
 
-            if (itemMode === ItemMode.OPEN || itemMode === ItemMode.BOTH) {
-                dispatch(projectActions.TOGGLE_PROJECT_TREE_ITEM_OPEN(treeItem.data.uuid));
-            }
-
             const resourceUrl = getResourceUrl(treeItem.data);
 
             if (itemMode === ItemMode.ACTIVE || itemMode === ItemMode.BOTH) {
@@ -48,12 +44,15 @@ export const setProjectItem = (itemId: string, itemMode: ItemMode) =>
                 dispatch(projectActions.TOGGLE_PROJECT_TREE_ITEM_ACTIVE(treeItem.data.uuid));
             }
 
-            const promise = treeItem.status === TreeItemStatus.Loaded
+            const promise = treeItem.status === TreeItemStatus.LOADED
                 ? Promise.resolve()
                 : dispatch<any>(getProjectList(itemId));
 
             promise
                 .then(() => dispatch<any>(() => {
+                    if (itemMode === ItemMode.OPEN || itemMode === ItemMode.BOTH) {
+                        dispatch(projectActions.TOGGLE_PROJECT_TREE_ITEM_OPEN(treeItem.data.uuid));
+                    }
                     dispatch(dataExplorerActions.RESET_PAGINATION({id: PROJECT_PANEL_ID}));
                     dispatch(dataExplorerActions.REQUEST_ITEMS({id: PROJECT_PANEL_ID}));
                 }));
index faa22f0b85a9115165f860159e16f692b5dea508..b7ab03cecab3e74e14f912b45e3eb63b4aacf11d 100644 (file)
@@ -55,7 +55,7 @@ export const projectPanelMiddleware: Middleware = store => next => {
                 const typeFilters = getColumnFilters(columns, ProjectPanelColumnNames.TYPE);
                 const statusFilters = getColumnFilters(columns, ProjectPanelColumnNames.STATUS);
                 const sortColumn = dataExplorer.columns.find(({ sortDirection }) => Boolean(sortDirection && sortDirection !== "none"));
-                const sortDirection = sortColumn && sortColumn.sortDirection === SortDirection.Asc ? SortDirection.Asc : SortDirection.Desc;
+                const sortDirection = sortColumn && sortColumn.sortDirection === SortDirection.ASC ? SortDirection.ASC : SortDirection.DESC;
                 if (typeFilters.length > 0) {
                     groupsService
                         .contents(state.projects.currentItemId, {
@@ -72,7 +72,7 @@ export const projectPanelMiddleware: Middleware = store => next => {
                                     .create()
                                     .addIsA("uuid", typeFilters.map(f => f.type)))
                                 .concat(FilterBuilder
-                                    .create<ProcessResource>(GroupContentsResourcePrefix.Process)
+                                    .create<ProcessResource>(GroupContentsResourcePrefix.PROCESS)
                                     .addIn("state", statusFilters.map(f => f.type)))
                                 .concat(getSearchFilter(dataExplorer.searchValue))
                         })
@@ -108,20 +108,20 @@ const getColumnFilters = (columns: DataColumns<ProjectPanelItem, ProjectPanelFil
 
 const getOrder = (attribute: "name" | "createdAt", direction: SortDirection) =>
     [
-        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Collection),
-        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Process),
-        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Project)
+        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.COLLECTION),
+        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROCESS),
+        OrderBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROJECT)
     ].reduce((acc, b) =>
-        acc.concat(direction === SortDirection.Asc
+        acc.concat(direction === SortDirection.ASC
             ? b.addAsc(attribute)
             : b.addDesc(attribute)), OrderBuilder.create());
 
 const getSearchFilter = (searchValue: string) =>
     searchValue
         ? [
-            FilterBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Collection),
-            FilterBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Process),
-            FilterBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.Project)]
+            FilterBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.COLLECTION),
+            FilterBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROCESS),
+            FilterBuilder.create<GroupContentsResource>(GroupContentsResourcePrefix.PROJECT)]
             .reduce((acc, b) =>
                 acc.concat(b.addILike("name", searchValue)), FilterBuilder.create())
         : FilterBuilder.create();
index c8eed87c71a70bec3bdbcd7157b569d7fc660552..0fc28960b6652a154bc3ffccc552be3cc9de18f8 100644 (file)
@@ -28,7 +28,7 @@ describe('project-reducer', () => {
                 id: "2",
                 items: [],
                 data: mockProjectResource({ uuid: "2" }),
-                status: 0
+                status: TreeItemStatus.INITIAL
             }
             ],
             currentItemId: "",
@@ -47,7 +47,7 @@ describe('project-reducer', () => {
                 id: "1",
                 open: true,
                 active: true,
-                status: 1
+                status: TreeItemStatus.PENDING
             }],
             currentItemId: "1",
             creator: { opened: false, pending: false, ownerUuid: "" },
@@ -58,7 +58,7 @@ describe('project-reducer', () => {
                 id: "1",
                 open: true,
                 active: false,
-                status: 1
+                status: TreeItemStatus.PENDING
             }],
             currentItemId: "",
             creator: { opened: false, pending: false, ownerUuid: "" },
@@ -75,7 +75,7 @@ describe('project-reducer', () => {
                 id: "1",
                 open: true,
                 active: false,
-                status: 1
+                status: TreeItemStatus.PENDING
             }],
             currentItemId: "1",
             creator: { opened: false, pending: false, ownerUuid: "" }
@@ -86,8 +86,7 @@ describe('project-reducer', () => {
                 id: "1",
                 open: true,
                 active: true,
-                status: 1,
-                toggled: true
+                status: TreeItemStatus.PENDING,
             }],
             currentItemId: "1",
             creator: { opened: false, pending: false, ownerUuid: "" },
@@ -105,8 +104,7 @@ describe('project-reducer', () => {
                 id: "1",
                 open: true,
                 active: false,
-                status: 1,
-                toggled: false,
+                status: TreeItemStatus.PENDING,
             }],
             currentItemId: "1",
             creator: { opened: false, pending: false, ownerUuid: "" }
@@ -117,8 +115,7 @@ describe('project-reducer', () => {
                 id: "1",
                 open: false,
                 active: false,
-                status: 1,
-                toggled: true
+                status: TreeItemStatus.PENDING,
             }],
             currentItemId: "1",
             creator: { opened: false, pending: false, ownerUuid: "" },
@@ -136,7 +133,7 @@ describe("findTreeBranch", () => {
         active: false,
         data: "",
         open: false,
-        status: TreeItemStatus.Initial
+        status: TreeItemStatus.INITIAL
     });
 
     it("should return an array that matches path to the given item", () => {
index 94a451a86574e70de24f6d143ede7217ce25cf9c..45e0e19527253ea03e39603a673e8e477232c484 100644 (file)
@@ -73,14 +73,14 @@ function updateProjectTree(tree: Array<TreeItem<ProjectResource>>, projects: Pro
     if (parentItemId) {
         treeItem = findTreeItem(tree, parentItemId);
         if (treeItem) {
-            treeItem.status = TreeItemStatus.Loaded;
+            treeItem.status = TreeItemStatus.LOADED;
         }
     }
     const items = projects.map(p => ({
         id: p.uuid,
         open: false,
         active: false,
-        status: TreeItemStatus.Initial,
+        status: TreeItemStatus.INITIAL,
         data: p,
         items: []
     } as TreeItem<ProjectResource>));
@@ -123,7 +123,7 @@ export const projectsReducer = (state: ProjectState = initialState, action: Proj
             const items = _.cloneDeep(state.items);
             const item = findTreeItem(items, itemId);
             if (item) {
-                item.status = TreeItemStatus.Pending;
+                item.status = TreeItemStatus.PENDING;
                 state.items = items;
             }
             return { ...state, items };
@@ -139,7 +139,6 @@ export const projectsReducer = (state: ProjectState = initialState, action: Proj
             const items = _.cloneDeep(state.items);
             const item = findTreeItem(items, itemId);
             if (item) {
-                item.toggled = true;
                 item.open = !item.open;
             }
             return {
@@ -153,7 +152,6 @@ export const projectsReducer = (state: ProjectState = initialState, action: Proj
             resetTreeActivity(items);
             const item = findTreeItem(items, itemId);
             if (item) {
-                item.toggled = true;
                 item.active = true;
             }
             return {
index 263ecbdad0c6fbdcbe39b5b16a2d8cdccebeb67d..9d56102b149719e74454a69b7d3bf1d917ab7d8c 100644 (file)
@@ -41,17 +41,17 @@ export const sidePanelReducer = (state: SidePanelState = sidePanelData, action:
 };
 
 export enum SidePanelIdentifiers {
-    Projects = "Projects",
-    SharedWithMe = "SharedWithMe",
-    Workflows = "Workflows",
-    RecentOpen = "RecentOpen",
-    Favourites = "Favourites",
-    Trash = "Trash"
+    PROJECTS = "Projects",
+    SHARED_WITH_ME = "SharedWithMe",
+    WORKFLOWS = "Workflows",
+    RECENT_OPEN = "RecentOpen",
+    FAVORITES = "Favourites",
+    TRASH = "Trash"
 }
 
 export const sidePanelData = [
     {
-        id: SidePanelIdentifiers.Projects,
+        id: SidePanelIdentifiers.PROJECTS,
         name: "Projects",
         icon: ProjectsIcon,
         open: false,
@@ -60,25 +60,25 @@ export const sidePanelData = [
         openAble: true
     },
     {
-        id: SidePanelIdentifiers.SharedWithMe,
+        id: SidePanelIdentifiers.SHARED_WITH_ME,
         name: "Shared with me",
         icon: ShareMeIcon,
         active: false,
     },
     {
-        id: SidePanelIdentifiers.Workflows,
+        id: SidePanelIdentifiers.WORKFLOWS,
         name: "Workflows",
         icon: WorkflowIcon,
         active: false,
     },
     {
-        id: SidePanelIdentifiers.RecentOpen,
+        id: SidePanelIdentifiers.RECENT_OPEN,
         name: "Recent open",
         icon: RecentIcon,
         active: false,
     },
     {
-        id: SidePanelIdentifiers.Favourites,
+        id: SidePanelIdentifiers.FAVORITES,
         name: "Favorites",
         icon: FavoriteIcon,
         active: false,
@@ -89,7 +89,7 @@ export const sidePanelData = [
         }
     },
     {
-        id: SidePanelIdentifiers.Trash,
+        id: SidePanelIdentifiers.TRASH,
         name: "Trash",
         icon: TrashIcon,
         active: false,
index 288177663fd2d350ff9867313de450983b564855..f0be4497ec6a2075b150c55657f59fca90da713a 100644 (file)
@@ -19,7 +19,7 @@ export class CollectionDetails extends DetailsData<CollectionResource> {
 
     getDetails() {
         return <div>
-            <DetailsAttribute label='Type' value={resourceLabel(ResourceKind.Collection)} />
+            <DetailsAttribute label='Type' value={resourceLabel(ResourceKind.COLLECTION)} />
             <DetailsAttribute label='Size' value='---' />
             <DetailsAttribute label='Owner' value={this.item.ownerUuid} />
             <DetailsAttribute label='Last modified' value={formatDate(this.item.modifiedAt)} />
index ea8f2e40f6288fc27e56275dad668180bbda9484..20d3843f7787a8fbd4aa23bbe91b1abfaacd6b81 100644 (file)
@@ -55,11 +55,11 @@ const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
 const getItem = (resource: DetailsResource): DetailsData => {
     const res = resource || { kind: undefined, name: 'Projects' };
     switch (res.kind) {
-        case ResourceKind.Project:
+        case ResourceKind.PROJECT:
             return new ProjectDetails(res);
-        case ResourceKind.Collection:
+        case ResourceKind.COLLECTION:
             return new CollectionDetails(res);
-        case ResourceKind.Process:
+        case ResourceKind.PROCESS:
             return new ProcessDetails(res);
         default:
             return new EmptyDetails(res as EmptyResource);
index 931ff7ed92962d75028d898484ff49ac844d7f6b..e195d05f34d96fb2af1dad415c6852b604436830 100644 (file)
@@ -19,7 +19,7 @@ export class ProcessDetails extends DetailsData<ProcessResource> {
 
     getDetails() {
         return <div>
-            <DetailsAttribute label='Type' value={resourceLabel(ResourceKind.Process)} />
+            <DetailsAttribute label='Type' value={resourceLabel(ResourceKind.PROCESS)} />
             <DetailsAttribute label='Size' value='---' />
             <DetailsAttribute label='Owner' value={this.item.ownerUuid} />
 
index 84b3706633c9f6a0a2e78013748cb2c1f06a2e10..b46bdcdbe85f312579169e816a172ea7a121f5de 100644 (file)
@@ -19,7 +19,7 @@ export class ProjectDetails extends DetailsData<ProjectResource> {
 
     getDetails() {
         return <div>
-            <DetailsAttribute label='Type' value={resourceLabel(ResourceKind.Project)} />
+            <DetailsAttribute label='Type' value={resourceLabel(ResourceKind.PROJECT)} />
             {/* Missing attr */}
             <DetailsAttribute label='Size' value='---' />
             <DetailsAttribute label='Owner' value={this.item.ownerUuid} />
index 28f7f882f345aed753b5798fa8277ae2c51e20a5..da48298aa7ec6d2dd14fd6d44b3d0209e25ba4d7 100644 (file)
@@ -25,7 +25,7 @@ export function resourceToDataItem(r: GroupContentsResource): FavoritePanelItem
         url: "",
         owner: r.ownerUuid,
         lastModified: r.modifiedAt,
-        status:  r.kind === ResourceKind.Process ? r.state : undefined
+        status:  r.kind === ResourceKind.PROCESS ? r.state : undefined
     };
 }
 
index 8f4945051735bc2e5141852de8fc56439f64a3e2..36a3410763129b043c95c2d55af45a39814f0a15 100644 (file)
@@ -52,11 +52,11 @@ const renderName = (item: FavoritePanelItem) =>
 
 const renderIcon = (item: FavoritePanelItem) => {
     switch (item.kind) {
-        case ResourceKind.Project:
+        case ResourceKind.PROJECT:
             return <ProjectIcon />;
-        case ResourceKind.Collection:
+        case ResourceKind.COLLECTION:
             return <CollectionIcon />;
-        case ResourceKind.Process:
+        case ResourceKind.PROCESS:
             return <ProcessIcon />;
         default:
             return <DefaultIcon />;
@@ -104,7 +104,7 @@ export const columns: DataColumns<FavoritePanelItem, FavoritePanelFilter> = [
     {
         name: FavoritePanelColumnNames.NAME,
         selected: true,
-        sortDirection: SortDirection.Asc,
+        sortDirection: SortDirection.ASC,
         render: renderName,
         width: "450px"
     },
@@ -113,19 +113,19 @@ export const columns: DataColumns<FavoritePanelItem, FavoritePanelFilter> = [
         selected: true,
         filters: [
             {
-                name: ContainerRequestState.Committed,
+                name: ContainerRequestState.COMMITTED,
                 selected: true,
-                type: ContainerRequestState.Committed
+                type: ContainerRequestState.COMMITTED
             },
             {
-                name: ContainerRequestState.Final,
+                name: ContainerRequestState.FINAL,
                 selected: true,
-                type: ContainerRequestState.Final
+                type: ContainerRequestState.FINAL
             },
             {
-                name: ContainerRequestState.Uncommitted,
+                name: ContainerRequestState.UNCOMMITTED,
                 selected: true,
-                type: ContainerRequestState.Uncommitted
+                type: ContainerRequestState.UNCOMMITTED
             }
         ],
         render: renderStatus,
@@ -136,19 +136,19 @@ export const columns: DataColumns<FavoritePanelItem, FavoritePanelFilter> = [
         selected: true,
         filters: [
             {
-                name: resourceLabel(ResourceKind.Collection),
+                name: resourceLabel(ResourceKind.COLLECTION),
                 selected: true,
-                type: ResourceKind.Collection
+                type: ResourceKind.COLLECTION
             },
             {
-                name: resourceLabel(ResourceKind.Process),
+                name: resourceLabel(ResourceKind.PROCESS),
                 selected: true,
-                type: ResourceKind.Process
+                type: ResourceKind.PROCESS
             },
             {
-                name: resourceLabel(ResourceKind.Project),
+                name: resourceLabel(ResourceKind.PROJECT),
                 selected: true,
-                type: ResourceKind.Project
+                type: ResourceKind.PROJECT
             }
         ],
         render: item => renderType(item.kind),
@@ -169,7 +169,7 @@ export const columns: DataColumns<FavoritePanelItem, FavoritePanelFilter> = [
     {
         name: FavoritePanelColumnNames.LAST_MODIFIED,
         selected: true,
-        sortDirection: SortDirection.None,
+        sortDirection: SortDirection.NONE,
         render: item => renderDate(item.lastModified),
         width: "150px"
     }
index 1d665a66012d86f5e11a0c0e6dbac5361c289f66..d0609d6df73139bbf55ebf5e404cafe7664632d5 100644 (file)
@@ -25,7 +25,7 @@ export function resourceToDataItem(r: GroupContentsResource): ProjectPanelItem {
         url: "",
         owner: r.ownerUuid,
         lastModified: r.modifiedAt,
-        status:  r.kind === ResourceKind.Process ? r.state : undefined
+        status:  r.kind === ResourceKind.PROCESS ? r.state : undefined
     };
 }
 
index 2ddc1b05f714b57af76aaa3caff9fd07f8a6b02b..81d84990a41b7ba1b9c54a4aefb2aba9b4df3353 100644 (file)
@@ -52,11 +52,11 @@ const renderName = (item: ProjectPanelItem) =>
 
 const renderIcon = (item: ProjectPanelItem) => {
     switch (item.kind) {
-        case ResourceKind.Project:
+        case ResourceKind.PROJECT:
             return <ProjectIcon />;
-        case ResourceKind.Collection:
+        case ResourceKind.COLLECTION:
             return <CollectionIcon />;
-        case ResourceKind.Process:
+        case ResourceKind.PROCESS:
             return <ProcessIcon />;
         default:
             return <DefaultIcon />;
@@ -104,7 +104,7 @@ export const columns: DataColumns<ProjectPanelItem, ProjectPanelFilter> = [
     {
         name: ProjectPanelColumnNames.NAME,
         selected: true,
-        sortDirection: SortDirection.Asc,
+        sortDirection: SortDirection.ASC,
         render: renderName,
         width: "450px"
     },
@@ -113,19 +113,19 @@ export const columns: DataColumns<ProjectPanelItem, ProjectPanelFilter> = [
         selected: true,
         filters: [
             {
-                name: ContainerRequestState.Committed,
+                name: ContainerRequestState.COMMITTED,
                 selected: true,
-                type: ContainerRequestState.Committed
+                type: ContainerRequestState.COMMITTED
             },
             {
-                name: ContainerRequestState.Final,
+                name: ContainerRequestState.FINAL,
                 selected: true,
-                type: ContainerRequestState.Final
+                type: ContainerRequestState.FINAL
             },
             {
-                name: ContainerRequestState.Uncommitted,
+                name: ContainerRequestState.UNCOMMITTED,
                 selected: true,
-                type: ContainerRequestState.Uncommitted
+                type: ContainerRequestState.UNCOMMITTED
             }
         ],
         render: renderStatus,
@@ -136,19 +136,19 @@ export const columns: DataColumns<ProjectPanelItem, ProjectPanelFilter> = [
         selected: true,
         filters: [
             {
-                name: resourceLabel(ResourceKind.Collection),
+                name: resourceLabel(ResourceKind.COLLECTION),
                 selected: true,
-                type: ResourceKind.Collection
+                type: ResourceKind.COLLECTION
             },
             {
-                name: resourceLabel(ResourceKind.Process),
+                name: resourceLabel(ResourceKind.PROCESS),
                 selected: true,
-                type: ResourceKind.Process
+                type: ResourceKind.PROCESS
             },
             {
-                name: resourceLabel(ResourceKind.Project),
+                name: resourceLabel(ResourceKind.PROJECT),
                 selected: true,
-                type: ResourceKind.Project
+                type: ResourceKind.PROJECT
             }
         ],
         render: item => renderType(item.kind),
@@ -169,7 +169,7 @@ export const columns: DataColumns<ProjectPanelItem, ProjectPanelFilter> = [
     {
         name: ProjectPanelColumnNames.LAST_MODIFIED,
         selected: true,
-        sortDirection: SortDirection.None,
+        sortDirection: SortDirection.NONE,
         render: item => renderDate(item.lastModified),
         width: "150px"
     }
index 6c7f85d87faf4ed74b8a2ed4804dba51f508be85..e25244018c8801f31f913c0af5aed526fdc6f49b 100644 (file)
@@ -205,8 +205,8 @@ export const Workbench = withStyles(styles)(
                                         })}
                                         toggleActive={itemId => {
                                             this.props.dispatch<any>(setProjectItem(itemId, ItemMode.ACTIVE));
-                                            this.props.dispatch<any>(loadDetails(itemId, ResourceKind.Project));
-                                            this.props.dispatch<any>(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_ACTIVE(SidePanelIdentifiers.Projects));
+                                            this.props.dispatch<any>(loadDetails(itemId, ResourceKind.PROJECT));
+                                            this.props.dispatch<any>(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_ACTIVE(SidePanelIdentifiers.PROJECTS));
                                         }} />
                                 </SidePanel>
                             </Drawer>}
@@ -232,7 +232,7 @@ export const Workbench = withStyles(styles)(
             }
 
             renderCollectionPanel = (props: RouteComponentProps<{ id: string }>) => <CollectionPanel 
-                onItemRouteChange={(collectionId) => this.props.dispatch<any>(loadCollection(collectionId, ResourceKind.Collection))}
+                onItemRouteChange={(collectionId) => this.props.dispatch<any>(loadCollection(collectionId, ResourceKind.COLLECTION))}
                 onContextMenu={(event, item) => {
                     this.openContextMenu(event, {
                         uuid: item.uuid,
@@ -245,7 +245,8 @@ export const Workbench = withStyles(styles)(
             renderProjectPanel = (props: RouteComponentProps<{ id: string }>) => <ProjectPanel
                 onItemRouteChange={itemId => this.props.dispatch<any>(setProjectItem(itemId, ItemMode.ACTIVE))}
                 onContextMenu={(event, item) => {
-                    const kind = item.kind === ResourceKind.Project ? ContextMenuKind.PROJECT : ContextMenuKind.RESOURCE;
+
+                    const kind = item.kind === ResourceKind.PROJECT ? ContextMenuKind.PROJECT : ContextMenuKind.RESOURCE;
                     this.openContextMenu(event, {
                         uuid: item.uuid,
                         name: item.name,
@@ -258,20 +259,21 @@ export const Workbench = withStyles(styles)(
                 }}
                 onItemDoubleClick={item => {
                     switch (item.kind) {
-                        case ResourceKind.Collection:
+                        case ResourceKind.COLLECTION:
                             this.props.dispatch<any>(loadCollection(item.uuid, item.kind as ResourceKind));
                             this.props.dispatch(push(getCollectionUrl(item.uuid)));
                         default: 
                             this.props.dispatch<any>(setProjectItem(item.uuid, ItemMode.ACTIVE));
                             this.props.dispatch<any>(loadDetails(item.uuid, item.kind as ResourceKind));
                     }
+
                 }}
                 {...props} />
 
             renderFavoritePanel = (props: RouteComponentProps<{ id: string }>) => <FavoritePanel
                 onItemRouteChange={() => this.props.dispatch<any>(dataExplorerActions.REQUEST_ITEMS({ id: FAVORITE_PANEL_ID }))}
                 onContextMenu={(event, item) => {
-                    const kind = item.kind === ResourceKind.Project ? ContextMenuKind.PROJECT : ContextMenuKind.RESOURCE;
+                    const kind = item.kind === ResourceKind.PROJECT ? ContextMenuKind.PROJECT : ContextMenuKind.RESOURCE;
                     this.openContextMenu(event, {
                         uuid: item.uuid,
                         name: item.name,
@@ -284,21 +286,22 @@ export const Workbench = withStyles(styles)(
                 }}
                 onItemDoubleClick={item => {
                     switch (item.kind) {
-                        case ResourceKind.Collection:
+                        case ResourceKind.COLLECTION:
                             this.props.dispatch<any>(loadCollection(item.uuid, item.kind as ResourceKind));
                             this.props.dispatch(push(getCollectionUrl(item.uuid)));
                         default:
-                            this.props.dispatch<any>(loadDetails(item.uuid, ResourceKind.Project));
+                            this.props.dispatch<any>(loadDetails(item.uuid, ResourceKind.PROJECT));
                             this.props.dispatch<any>(setProjectItem(item.uuid, ItemMode.ACTIVE));
-                            this.props.dispatch<any>(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_ACTIVE(SidePanelIdentifiers.Projects));
+                            this.props.dispatch<any>(sidePanelActions.TOGGLE_SIDE_PANEL_ITEM_ACTIVE(SidePanelIdentifiers.PROJECTS));
                     }
+
                 }}
                 {...props} />
 
             mainAppBarActions: MainAppBarActionProps = {
                 onBreadcrumbClick: ({ itemId }: NavBreadcrumb) => {
                     this.props.dispatch<any>(setProjectItem(itemId, ItemMode.BOTH));
-                    this.props.dispatch<any>(loadDetails(itemId, ResourceKind.Project));
+                    this.props.dispatch<any>(loadDetails(itemId, ResourceKind.PROJECT));
                 },
                 onSearch: searchText => {
                     this.setState({ searchText });