merge changes
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Tue, 10 Jul 2018 09:09:08 +0000 (11:09 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Tue, 10 Jul 2018 09:09:08 +0000 (11:09 +0200)
Feature #13765

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

1  2 
src/views-components/details-panel/details-panel.tsx

index 13498f331776a43bf99d8b290f14255b5684fd05,6bf04c4f3263681050bc91defdbcbeda2216642c..b29e19027fb7a6bcaff3fe517f092a98683d426f
@@@ -13,20 -13,13 +13,20 @@@ import Tab from '@material-ui/core/Tab'
  import Typography from '@material-ui/core/Typography';
  import Grid from '@material-ui/core/Grid';
  import * as classnames from "classnames";
 +import { connect, Dispatch } from 'react-redux';
  import EmptyState from '../../components/empty-state/empty-state';
- import IconBase from '../../components/icon/icon';
 +import { RootState } from '../../store/store';
 +import actions from "../../store/details-panel/details-panel-action";
 +import { Resource } from '../../common/api/common-resource-service';
 +import { ResourceKind } from '../../models/kinds';
 +import { ProjectResource } from '../../models/project';
 +import { CollectionResource } from '../../models/collection';
+ import IconBase, { IconTypes } from '../../components/icon/icon';
  
  export interface DetailsPanelDataProps {
      onCloseDrawer: () => void;
      isOpened: boolean;
 -    renderHeader?: React.ComponentType<{}>;
 +    header: React.ReactElement<any>;
      renderDetails?: React.ComponentType<{}>;
      renderActivity?: React.ComponentType<{}>;
  }
  type DetailsPanelProps = DetailsPanelDataProps & WithStyles<CssRules>;
  
  class DetailsPanel extends React.Component<DetailsPanelProps, {}> {
 -      state = {
 +    state = {
          tabsValue: 0
 -      };
 +    };
  
 -      handleChange = (event: any, value: boolean) => {
 -              this.setState({ tabsValue: value });
 -      }
 -    
 -    renderTabContainer = (children: React.ReactElement<any>) => 
 +    handleChange = (event: any, value: boolean) => {
 +        this.setState({ tabsValue: value });
 +    }
 +
 +    renderTabContainer = (children: React.ReactElement<any>) =>
          <Typography className={this.props.classes.tabContainer} component="div">
              {children}
          </Typography>
 -    
 -      render() {
 -        const { classes, onCloseDrawer, isOpened, renderHeader, renderDetails, renderActivity } = this.props;
 +
 +    render() {
 +        const { classes, onCloseDrawer, isOpened, header, renderDetails, renderActivity } = this.props;
          const { tabsValue } = this.state;
          return (
              <Typography component="div" className={classnames([classes.container, { [classes.opened]: isOpened }])}>
                  <Drawer variant="permanent" anchor="right" classes={{ paper: classes.drawerPaper }}>
 -                                      <Typography component="div" className={classes.headerContainer}>
 -                                              <Grid container alignItems='center' justify='space-around'>
 -                            {renderHeader}
 -                            {/* TODO: renderHeader */}
 -                            <IconBase icon={IconTypes.PROCESS} />
 -                                                      <Typography variant="title">
 -                                                              Tutorial pipeline
 -                                                      </Typography>
 -                            {/* End */}
 +                    <Typography component="div" className={classes.headerContainer}>
 +                        <Grid container alignItems='center' justify='space-around'>
 +                            {header}
                              <IconButton color="inherit" onClick={onCloseDrawer}>
-                                 <IconBase icon='close' />
+                                 <IconBase icon={IconTypes.CLOSE} />
 -                                                      </IconButton>
 -                                              </Grid>
 -                                      </Typography>
 -                                      <Tabs value={tabsValue} onChange={this.handleChange}>
 -                                              <Tab disableRipple label="Details" />
 -                                              <Tab disableRipple label="Activity" />
 -                                      </Tabs>
 +                            </IconButton>
 +                        </Grid>
 +                    </Typography>
 +                    <Tabs value={tabsValue} onChange={this.handleChange}>
 +                        <Tab disableRipple label="Details" />
 +                        <Tab disableRipple label="Activity" />
 +                    </Tabs>
                      {tabsValue === 0 && this.renderTabContainer(
                          <Grid container direction="column">
                              {renderDetails}
-                             <EmptyState icon='announcement'
+                             <EmptyState icon={IconTypes.ANNOUNCEMENT}
                                  message='Select a file or folder to view its details.' />
                              <Attribute label='Type' value='Process' />
                              <Attribute label='Size' value='---' />
                              <Attribute label="Location">
-                                 <IconBase icon='folder' />
+                                 <IconBase icon={IconTypes.FOLDER} />
                                  Projects
                              </Attribute>
                              <Attribute label='Outputs' link='http://www.google.pl' value='New output as link' />
                              <Attribute label='Owner' value='me' />
 -                                              </Grid>
 -                                      )}
 +                        </Grid>
 +                    )}
                      {tabsValue === 1 && this.renderTabContainer(
                          <Grid container direction="column">
                              {renderActivity}
-                             <EmptyState icon='announcement' message='Select a file or folder to view its details.' />
+                             <EmptyState icon={IconTypes.ANNOUNCEMENT} message='Select a file or folder to view its details.' />
                          </Grid>
 -                                      )}
 +                    )}
                  </Drawer>
              </Typography>
          );
@@@ -97,9 -96,9 +97,9 @@@ type CssRules = 'drawerPaper' | 'contai
  
  const drawerWidth = 320;
  const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
 -      container: {
 +    container: {
          width: 0,
 -              position: 'relative',
 +        position: 'relative',
          height: 'auto',
          transition: 'width 0.5s ease',
          '&$opened': {
      drawerPaper: {
          position: 'relative',
          width: drawerWidth
 -      },
 -      headerContainer: {
 +    },
 +    headerContainer: {
          color: theme.palette.grey["600"],
          margin: `${theme.spacing.unit}px 0`,
          '& .fa-cogs': {
              fontSize: "24px",
              color: theme.customs.colors.green700
          }
 -      },
 -      tabContainer: {
 -              padding: theme.spacing.unit * 3
 -      }
 +    },
 +    tabContainer: {
 +        padding: theme.spacing.unit * 3
 +    }
  });
  
 -export default withStyles(styles)(DetailsPanel);
 +const renderCollectionHeader = (collection: CollectionResource) =>
 +    <>
-         <IconBase icon="collection" />
++        <IconBase icon={IconTypes.COLLECTION} />
 +        <Typography variant="title">
 +            {collection.name}
 +        </Typography>
 +    </>;
 +
 +const renderProjectHeader = (project: ProjectResource) =>
 +    <>
-         <IconBase icon="project" />
++        <IconBase icon={IconTypes.FOLDER} />
 +        <Typography variant="title">
 +            {project.name}
 +        </Typography>
 +    </>;
 +
 +const renderHeader = (resource: Resource) => {
 +    switch(resource.kind) {
 +        case ResourceKind.Project:
 +            return renderProjectHeader(resource as ProjectResource);
 +        case ResourceKind.Collection:
 +            return renderCollectionHeader(resource as CollectionResource);
 +        default: 
 +            return null;
 +    }
 +};
 +
 +const mapStateToProps = ({detailsPanel}: RootState) => ({
 +    isOpened: detailsPanel.isOpened,
 +    header: detailsPanel.item ? renderHeader(detailsPanel.item) : null
 +});
 +
 +const mapDispatchToProps = (dispatch: Dispatch) => ({
 +    onCloseDrawer: () => {
 +        dispatch(actions.TOGGLE_DETAILS_PANEL());
 +    }
 +});
 +
 +const DetailsPanelContainer = connect(mapStateToProps, mapDispatchToProps)(DetailsPanel);
 +
 +export default withStyles(styles)(DetailsPanelContainer);