cr chagnes
authorPawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>
Thu, 27 Sep 2018 14:05:40 +0000 (16:05 +0200)
committerPawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>
Thu, 27 Sep 2018 14:05:40 +0000 (16:05 +0200)
Feature #13857

Arvados-DCO-1.1-Signed-off-by: Pawel Kowalczyk <pawel.kowalczyk@contractors.roche.com>

src/components/data-explorer/data-explorer.tsx
src/index.tsx
src/store/workbench/workbench-actions.ts
src/store/workflow-panel/workflow-middleware-service.ts
src/store/workflow-panel/workflow-panel-actions.ts
src/views-components/current-token-dialog/current-token-dialog.tsx
src/views-components/data-explorer/renderers.tsx
src/views/workflow-panel/workflow-panel-view.tsx [new file with mode: 0644]
src/views/workflow-panel/workflow-panel.tsx

index 59f4dbebb47832ff4ec5a827c44eb1a434db61ac..d7abde7bddd2f81d3a668f4587f5063bab010d60 100644 (file)
@@ -12,7 +12,7 @@ import { DataTableFilterItem } from '../data-table-filters/data-table-filters';
 import { SearchInput } from '../search-input/search-input';
 import { ArvadosTheme } from "~/common/custom-theme";
 
-type CssRules = 'searchBox' | "toolbar";
+type CssRules = 'searchBox' | "toolbar" | "root";
 
 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
     searchBox: {
@@ -21,6 +21,9 @@ const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
     toolbar: {
         paddingTop: theme.spacing.unit * 2
     },
+    root: {
+        height: '100%'
+    }
 });
 
 interface DataExplorerDataProps<T> {
@@ -66,7 +69,7 @@ export const DataExplorer = withStyles(styles)(
                 items, itemsAvailable, onRowClick, onRowDoubleClick, classes,
                 dataTableDefaultView
             } = this.props;
-            return <Paper>
+            return <Paper className={classes.root}>
                 <Toolbar className={classes.toolbar}>
                     <Grid container justify="space-between" wrap="nowrap" alignItems="center">
                         <div className={classes.searchBox}>
index f456c995d1b34698decde9953479f4ffdde1250f..f81e9da9b832dff89cabb4b5f9fbae74ab776c77 100644 (file)
@@ -38,6 +38,7 @@ import { addRouteChangeHandlers } from './routes/route-change-handlers';
 import { setCurrentTokenDialogApiHost } from '~/store/current-token-dialog/current-token-dialog-actions';
 import { processResourceActionSet } from './views-components/context-menu/action-sets/process-resource-action-set';
 import { progressIndicatorActions } from '~/store/progress-indicator/progress-indicator-actions';
+import { setUuidPrefix } from '~/store/workflow-panel/workflow-panel-actions';
 
 const getBuildNumber = () => "BN-" + (process.env.REACT_APP_BUILD_NUMBER || "dev");
 const getGitCommit = () => "GIT-" + (process.env.REACT_APP_GIT_COMMIT || "latest").substr(0, 7);
@@ -76,6 +77,7 @@ fetchConfig()
         store.subscribe(initListener(history, store, services, config));
         store.dispatch(initAuth());
         store.dispatch(setCurrentTokenDialogApiHost(apiHost));
+        store.dispatch(setUuidPrefix(config.uuidPrefix));
 
         const TokenComponent = (props: any) => <ApiToken authService={services.authService} {...props} />;
         const MainPanelComponent = (props: any) => <MainPanel buildInfo={buildInfo} {...props} />;
index 5440fc902561868ac7a72f0ddc0b9636e166ebd6..01b5b92c7b365515e70d276dddc1d307efebd25b 100644 (file)
@@ -40,7 +40,7 @@ import { sharedWithMePanelActions } from '~/store/shared-with-me-panel/shared-wi
 import { loadSharedWithMePanel } from '../shared-with-me-panel/shared-with-me-panel-actions';
 import { CopyFormDialogData } from '~/store/copy-dialog/copy-dialog';
 import { loadWorkflowPanel, workflowPanelActions } from '~/store/workflow-panel/workflow-panel-actions';
-import { workflowPanelColumns } from '~/views/workflow-panel/workflow-panel';
+import { workflowPanelColumns } from '~/views/workflow-panel/workflow-panel-view';
 import { progressIndicatorActions } from '~/store/progress-indicator/progress-indicator-actions';
 import { getProgressIndicator } from '../progress-indicator/progress-indicator-reducer';
 
index 7fa2dd4f819422b96e9acc9489c8e62e5635ca7e..d9ff6add8bfdba9a997f2e7d5313b267be1e4582 100644 (file)
@@ -11,7 +11,7 @@ import { DataExplorer, getDataExplorer } from '~/store/data-explorer/data-explor
 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';
+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';
index 733fab16d4999eed63fd46897fa002b031ac77a5..aa79347cc67b0aca3ecbc80384f6533eac44188d 100644 (file)
@@ -6,11 +6,21 @@ import { Dispatch } from 'redux';
 import { RootState } from '~/store/store';
 import { ServiceRepository } from '~/services/services';
 import { bindDataExplorerActions } from '~/store/data-explorer/data-explorer-action';
+import { propertiesActions } from '~/store/properties/properties-actions';
 
 export const WORKFLOW_PANEL_ID = "workflowPanel";
+const UUID_PREFIX_PROPERTY_NAME = 'uuidPrefix';
+
 export const workflowPanelActions = bindDataExplorerActions(WORKFLOW_PANEL_ID);
 
 export const loadWorkflowPanel = () =>
     (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
         dispatch(workflowPanelActions.REQUEST_ITEMS());
-    };
\ No newline at end of file
+    };
+
+export const setUuidPrefix = (uuidPrefix: string) =>
+    propertiesActions.SET_PROPERTY({ key: UUID_PREFIX_PROPERTY_NAME, value: uuidPrefix });
+
+export const getUuidPrefix = (state: RootState) =>{
+    return state.properties.uuidPrefix;
+};
\ No newline at end of file
index ba6c3258f428a3fe882fa47463b623e798f25451..d2acccb78d42be530ed5a86d8a9dd2d07123a280 100644 (file)
@@ -10,7 +10,6 @@ import { WithDialogProps } from '~/store/dialog/with-dialog';
 import { compose } from 'redux';
 import { connect } from 'react-redux';
 import { CurrentTokenDialogData, getCurrentTokenDialogData } from '~/store/current-token-dialog/current-token-dialog-actions';
-import { RootState } from '~/store/store';
 import { DefaultCodeSnippet } from '~/components/default-code-snippet/default-code-snippet';
 
 type CssRules = 'link' | 'paper' | 'button';
index 39fc536b09dee2d570811c99cbefe236d3e5d2a4..12e1be7805c61c6f6674e282af0456cd78ce6670 100644 (file)
@@ -17,7 +17,8 @@ import { getProcess, Process, getProcessStatus, getProcessStatusColor } from '~/
 import { ArvadosTheme } from '~/common/custom-theme';
 import { compose } from 'redux';
 import { WorkflowResource } from '~/models/workflow';
-import { ResourceStatus } from '~/views/workflow-panel/workflow-panel';
+import { ResourceStatus } from '~/views/workflow-panel/workflow-panel-view';
+import { getUuidPrefix } from '~/store/workflow-panel/workflow-panel-actions';
 
 export const renderName = (item: { name: string; uuid: string, kind: string }) =>
     <Grid container alignItems="center" wrap="nowrap" spacing={16}>
@@ -61,8 +62,6 @@ export const renderDate = (date?: string) => {
     return <Typography noWrap style={{ minWidth: '100px' }}>{formatDate(date)}</Typography>;
 };
 
-export const PublicUuid = 'qr1hi-tpzed-anonymouspublic';
-
 export const renderWorkflowName = (item: { name: string; uuid: string, kind: string, ownerUuid: string }) =>
     <Grid container alignItems="center" wrap="nowrap" spacing={16}>
         <Grid item>
@@ -81,11 +80,15 @@ export const RosurceWorkflowName = connect(
         return resource || { name: '', uuid: '', kind: '', ownerUuid: '' };
     })(renderWorkflowName);
 
+const getPublicUuid = (uuidPrefix: string) => {
+    return `${uuidPrefix}-tpzed-anonymouspublic`;
+};
+
 // do share onClick
-export const resourceShare = (props: { ownerUuid: string }) => {
+export const resourceShare = (uuidPrefix: string, ownerUuid?: string) => {
     return <Tooltip title="Share">
         <IconButton onClick={() => undefined}>
-            {props.ownerUuid === PublicUuid ? <ShareIcon /> : null}
+            {ownerUuid === getPublicUuid(uuidPrefix) ? <ShareIcon /> : null}
         </IconButton>
     </Tooltip>;
 };
@@ -93,11 +96,15 @@ export const resourceShare = (props: { ownerUuid: string }) => {
 export const ResourceShare = connect(
     (state: RootState, props: { uuid: string }) => {
         const resource = getResource<WorkflowResource>(props.uuid)(state.resources);
-        return resource || { ownerUuid: '' };
-    })(resourceShare);
-
-export const renderWorkflowStatus = (ownerUuid?: string) => {
-    if (ownerUuid === PublicUuid) {
+        const uuidPrefix = getUuidPrefix(state);
+        return {
+            ownerUuid: resource ? resource.ownerUuid : '',
+            uuidPrefix
+        };
+    })((props: { ownerUuid?: string, uuidPrefix: string }) => resourceShare(props.uuidPrefix, props.ownerUuid));
+
+export const renderWorkflowStatus = (uuidPrefix: string, ownerUuid?: string) => {
+    if (ownerUuid === getPublicUuid(uuidPrefix)) {
         return renderStatus(ResourceStatus.PUBLIC);
     } else {
         return renderStatus(ResourceStatus.PRIVATE);
@@ -110,8 +117,12 @@ const renderStatus = (status: string) =>
 export const ResourceWorkflowStatus = connect(
     (state: RootState, props: { uuid: string }) => {
         const resource = getResource<WorkflowResource>(props.uuid)(state.resources);
-        return { ownerUuid: resource ? resource.ownerUuid : '' };
-    })((props: { ownerUuid?: string }) => renderWorkflowStatus(props.ownerUuid));
+        const uuidPrefix = getUuidPrefix(state);
+        return {
+            ownerUuid: resource ? resource.ownerUuid : '',
+            uuidPrefix
+        };
+    })((props: { ownerUuid?: string, uuidPrefix: string }) => renderWorkflowStatus(props.uuidPrefix, props.ownerUuid));
 
 export const ResourceLastModifiedDate = connect(
     (state: RootState, props: { uuid: string }) => {
diff --git a/src/views/workflow-panel/workflow-panel-view.tsx b/src/views/workflow-panel/workflow-panel-view.tsx
new file mode 100644 (file)
index 0000000..8a29cb7
--- /dev/null
@@ -0,0 +1,120 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import * as React from 'react';
+import { DataExplorer } from "~/views-components/data-explorer/data-explorer";
+import { WorkflowIcon } from '~/components/icon/icon';
+import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view';
+import { WORKFLOW_PANEL_ID } from '~/store/workflow-panel/workflow-panel-actions';
+import {
+    ResourceLastModifiedDate,
+    RosurceWorkflowName,
+    ResourceWorkflowStatus,
+    ResourceShare
+} from "~/views-components/data-explorer/renderers";
+import { SortDirection } from '~/components/data-table/data-column';
+import { DataColumns } from '~/components/data-table/data-table';
+import { DataTableFilterItem } from '~/components/data-table-filters/data-table-filters';
+import { Grid } from '@material-ui/core';
+import { WorkflowDetailsCard } from './workflow-description-card';
+
+export enum WorkflowPanelColumnNames {
+    NAME = "Name",
+    AUTHORISATION = "Authorisation",
+    LAST_MODIFIED = "Last modified",
+    SHARE = 'Share'
+}
+
+export interface WorkflowPanelFilter extends DataTableFilterItem {
+    type: ResourceStatus;
+}
+
+interface WorkflowPanelDataProps {
+    handleRowDoubleClick: any;
+    handleRowClick: any;
+}
+
+export enum ResourceStatus {
+    PUBLIC = "Public",
+    PRIVATE = "Private",
+    SHARED = "Shared"
+}
+
+const resourceStatus = (type: string) => {
+    switch (type) {
+        case ResourceStatus.PUBLIC:
+            return "Public";
+        case ResourceStatus.PRIVATE:
+            return "Private";
+        case ResourceStatus.SHARED:
+            return "Shared";
+        default:
+            return "Unknown";
+    }
+};
+
+export const workflowPanelColumns: DataColumns<string, WorkflowPanelFilter> = [
+    {
+        name: WorkflowPanelColumnNames.NAME,
+        selected: true,
+        configurable: true,
+        sortDirection: SortDirection.ASC,
+        filters: [],
+        render: (uuid: string) => <RosurceWorkflowName uuid={uuid} />
+    },
+    {
+        name: WorkflowPanelColumnNames.AUTHORISATION,
+        selected: true,
+        configurable: true,
+        filters: [
+            {
+                name: resourceStatus(ResourceStatus.PUBLIC),
+                selected: true,
+                type: ResourceStatus.PUBLIC
+            },
+            {
+                name: resourceStatus(ResourceStatus.PRIVATE),
+                selected: true,
+                type: ResourceStatus.PRIVATE
+            },
+            {
+                name: resourceStatus(ResourceStatus.SHARED),
+                selected: true,
+                type: ResourceStatus.SHARED
+            }
+        ],
+        render: (uuid: string) => <ResourceWorkflowStatus uuid={uuid} />,
+    },
+    {
+        name: WorkflowPanelColumnNames.LAST_MODIFIED,
+        selected: true,
+        configurable: true,
+        sortDirection: SortDirection.NONE,
+        filters: [],
+        render: (uuid: string) => <ResourceLastModifiedDate uuid={uuid} />
+    },
+    {
+        name: '',
+        selected: true,
+        configurable: false,
+        filters: [],
+        render: (uuid: string) => <ResourceShare uuid={uuid} />
+    }
+];
+
+export const WorkflowPanelView = ({...props}) => {
+    return <Grid container spacing={16}>
+        <Grid item xs={6}>
+            <DataExplorer
+                id={WORKFLOW_PANEL_ID}
+                onRowClick={props.handleRowClick}
+                onRowDoubleClick={props.handleRowDoubleClick}
+                contextMenuColumn={false}
+                dataTableDefaultView={<DataTableDefaultView icon={WorkflowIcon} />} />
+        </Grid>
+        <Grid item xs={6}>
+            <WorkflowDetailsCard />
+        </Grid>
+    </Grid>;
+};
\ No newline at end of file
index 3d15d4f11d7cfe1a874e06f856a17e551ea45dca..279097d8e215cc14a9573596afb67056e0b5c686 100644 (file)
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import * as React from 'react';
-import { DataExplorer } from "~/views-components/data-explorer/data-explorer";
-import { connect, DispatchProp } from 'react-redux';
-import { RootState } from '~/store/store';
-import { WorkflowIcon } from '~/components/icon/icon';
-import { ResourcesState } from '~/store/resources/resources';
-import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view';
-import { WORKFLOW_PANEL_ID } from '~/store/workflow-panel/workflow-panel-actions';
-import {
-    ResourceLastModifiedDate,
-    RosurceWorkflowName,
-    ResourceWorkflowStatus,
-    ResourceShare
-} from "~/views-components/data-explorer/renderers";
-import { SortDirection } from '~/components/data-table/data-column';
-import { DataColumns } from '~/components/data-table/data-table';
-import { DataTableFilterItem } from '~/components/data-table-filters/data-table-filters';
-import { Grid } from '@material-ui/core';
-import { WorkflowDetailsCard } from './workflow-description-card';
-import { loadDetailsPanel } from '~/store/details-panel/details-panel-action';
+import * as React from "react";
+import { Dispatch } from "redux";
+import { connect } from "react-redux";
 import { navigateTo } from '~/store/navigation/navigation-action';
+import { loadDetailsPanel } from '~/store/details-panel/details-panel-action';
+import { WorkflowPanelView } from '~/views/workflow-panel/workflow-panel-view';
 
-export enum WorkflowPanelColumnNames {
-    NAME = "Name",
-    AUTHORISATION = "Authorisation",
-    LAST_MODIFIED = "Last modified",
-    SHARE = 'Share'
-}
-
-export interface WorkflowPanelFilter extends DataTableFilterItem {
-    type: ResourceStatus;
-}
-
-interface WorkflowPanelDataProps {
-    resources: ResourcesState;
-}
-
-export enum ResourceStatus {
-    PUBLIC = "Public",
-    PRIVATE = "Private",
-    SHARED = "Shared"
-}
-
-const resourceStatus = (type: string) => {
-    switch (type) {
-        case ResourceStatus.PUBLIC:
-            return "Public";
-        case ResourceStatus.PRIVATE:
-            return "Private";
-        case ResourceStatus.SHARED:
-            return "Shared";
-        default:
-            return "Unknown";
-    }
-};
+const mapDispatchToProps = (dispatch: Dispatch) => ({
 
-export const workflowPanelColumns: DataColumns<string, WorkflowPanelFilter> = [
-    {
-        name: WorkflowPanelColumnNames.NAME,
-        selected: true,
-        configurable: true,
-        sortDirection: SortDirection.ASC,
-        filters: [],
-        render: (uuid: string) => <RosurceWorkflowName uuid={uuid} />
+    handleRowDoubleClick: (uuid: string) => {
+        dispatch<any>(navigateTo(uuid));
     },
-    {
-        name: WorkflowPanelColumnNames.AUTHORISATION,
-        selected: true,
-        configurable: true,
-        filters: [
-            {
-                name: resourceStatus(ResourceStatus.PUBLIC),
-                selected: true,
-                type: ResourceStatus.PUBLIC
-            },
-            {
-                name: resourceStatus(ResourceStatus.PRIVATE),
-                selected: true,
-                type: ResourceStatus.PRIVATE
-            },
-            {
-                name: resourceStatus(ResourceStatus.SHARED),
-                selected: true,
-                type: ResourceStatus.SHARED
-            }
-        ],
-        render: (uuid: string) => <ResourceWorkflowStatus uuid={uuid} />,
-    },
-    {
-        name: WorkflowPanelColumnNames.LAST_MODIFIED,
-        selected: true,
-        configurable: true,
-        sortDirection: SortDirection.NONE,
-        filters: [],
-        render: (uuid: string) => <ResourceLastModifiedDate uuid={uuid} />
-    },
-    {
-        name: '',
-        selected: true,
-        configurable: false,
-        filters: [],
-        render: (uuid: string) => <ResourceShare uuid={uuid} />
+    
+    handleRowClick: (uuid: string) => {
+        dispatch(loadDetailsPanel(uuid));
     }
-];
-
-type WorkflowPanelProps = WorkflowPanelDataProps & DispatchProp;
-
-export const WorkflowPanel = connect((state: RootState) => ({
-    resources: state.resources
-}))(
-    class extends React.Component<WorkflowPanelProps> {
-        render() {
-            return <Grid container spacing={16}>
-                <Grid item xs={6}>
-                    <DataExplorer
-                        id={WORKFLOW_PANEL_ID}
-                        onRowClick={this.handleRowClick}
-                        onRowDoubleClick={this.handleRowDoubleClick}
-                        contextMenuColumn={false}
-                        dataTableDefaultView={<DataTableDefaultView icon={WorkflowIcon} />} />
-                </Grid>
-                <Grid item xs={6}>
-                    <WorkflowDetailsCard />
-                </Grid>
-            </Grid>;
-        }
+});
 
-
-        handleRowDoubleClick = (uuid: string) => {
-            this.props.dispatch<any>(navigateTo(uuid));
-        }
-
-        handleRowClick = (uuid: string) => {
-            this.props.dispatch(loadDetailsPanel(uuid));
-        }
-    }
-);
\ No newline at end of file
+export const WorkflowPanel= connect(undefined, mapDispatchToProps)(
+    (props) => <WorkflowPanelView {...props}/>);
\ No newline at end of file