1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import * as React from 'react';
6 import { connect } from 'react-redux';
7 import { Grid, Typography, Button, Card, CardContent, TableBody, TableCell, TableHead, TableRow, Table, Tooltip, IconButton } from '@material-ui/core';
8 import { StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core/styles';
9 import { ArvadosTheme } from '~/common/custom-theme';
10 import { Link } from 'react-router-dom';
11 import { Dispatch, compose } from 'redux';
12 import { RootState } from '~/store/store';
13 import { HelpIcon, AddIcon, MoreOptionsIcon } from '~/components/icon/icon';
14 import { loadRepositoriesData } from '~/store/repositories/repositories-actions';
15 import { RepositoriesResource } from '~/models/repositories';
16 import { openRepositoryContextMenu } from '~/store/context-menu/context-menu-actions';
19 type CssRules = 'link' | 'button' | 'icon' | 'iconRow' | 'moreOptionsButton' | 'moreOptions' | 'cloneUrls';
21 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
23 textDecoration: 'none',
24 color: theme.palette.primary.main,
26 color: theme.palette.primary.dark,
27 transition: 'all 0.5s ease'
36 color: theme.palette.grey["500"],
38 color: theme.palette.common.black,
39 transition: 'all 0.5s ease'
43 paddingTop: theme.spacing.unit * 2,
56 whiteSpace: 'pre-wrap'
60 const mapStateToProps = (state: RootState) => {
62 repositories: state.repositories.items
66 const mapDispatchToProps = (dispatch: Dispatch): Pick<RepositoriesActionProps, 'onOptionsMenuOpen' | 'loadRepositories'> => ({
67 loadRepositories: () => dispatch<any>(loadRepositoriesData()),
68 onOptionsMenuOpen: (event) => {
69 dispatch<any>(openRepositoryContextMenu(event));
73 interface RepositoriesActionProps {
74 loadRepositories: () => void;
75 onOptionsMenuOpen: (event: React.MouseEvent<HTMLElement>) => void;
78 interface RepositoriesDataProps {
79 repositories: RepositoriesResource[];
83 type RepositoriesProps = RepositoriesDataProps & RepositoriesActionProps & WithStyles<CssRules>;
85 export const RepositoriesPanel = compose(
87 connect(mapStateToProps, mapDispatchToProps))(
88 class extends React.Component<RepositoriesProps> {
90 this.props.loadRepositories();
93 const { classes, repositories, onOptionsMenuOpen } = this.props;
94 console.log(repositories);
98 <Grid container direction="row">
100 <Typography variant="body2">
101 When you are using an Arvados virtual machine, you should clone the https:// URLs. This will authenticate automatically using your API token. <br />
102 In order to clone git repositories using SSH, <Link to='' className={classes.link}>add an SSH key to your account</Link> and clone the git@ URLs.
105 <Grid item xs={4} className={classes.button}>
106 <Button variant="contained" color="primary">
107 <AddIcon /> NEW REPOSITORY
112 <div className={classes.iconRow}>
113 <Tooltip title="Sample git quick start">
114 <IconButton className={classes.moreOptionsButton}>
115 <HelpIcon className={classes.icon} />
121 {repositories && <Table>
124 <TableCell>Name</TableCell>
125 <TableCell>URL</TableCell>
130 {repositories.map((repository, index) =>
131 <TableRow key={index}>
132 <TableCell>{repository.name}</TableCell>
133 <TableCell className={classes.cloneUrls}>{repository.cloneUrls.join("\n")}</TableCell>
134 <TableCell className={classes.moreOptions}>
135 <Tooltip title="More options" disableFocusListener>
136 <IconButton onClick={onOptionsMenuOpen} className={classes.moreOptionsButton}>