Updated console to use React 17 (#469)

This commit is contained in:
Alex
2020-12-04 20:05:32 -06:00
committed by GitHub
parent 41418bcf45
commit cb35dcf971
26 changed files with 791 additions and 18701 deletions

File diff suppressed because one or more lines are too long

17878
portal-ui/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -12,7 +12,7 @@
"@types/jest": "24.0.23", "@types/jest": "24.0.23",
"@types/lodash": "^4.14.149", "@types/lodash": "^4.14.149",
"@types/node": "12.12.8", "@types/node": "12.12.8",
"@types/react": "16.9.11", "@types/react": "17.0.0",
"@types/react-copy-to-clipboard": "^4.3.0", "@types/react-copy-to-clipboard": "^4.3.0",
"@types/react-dom": "16.9.4", "@types/react-dom": "16.9.4",
"@types/react-redux": "^7.1.5", "@types/react-redux": "^7.1.5",
@@ -30,14 +30,14 @@
"local-storage-fallback": "^4.1.1", "local-storage-fallback": "^4.1.1",
"lodash": "^4.17.19", "lodash": "^4.17.19",
"moment": "^2.24.0", "moment": "^2.24.0",
"react": "^16.13.1", "react": "17.0.0",
"react-app-rewire-hot-loader": "^2.0.1", "react-app-rewire-hot-loader": "^2.0.1",
"react-app-rewired": "^2.1.6", "react-app-rewired": "^2.1.6",
"react-async-hook": "^3.6.1", "react-async-hook": "^3.6.1",
"react-chartjs-2": "^2.9.0", "react-chartjs-2": "^2.9.0",
"react-codemirror2": "^7.1.0", "react-codemirror2": "^7.1.0",
"react-copy-to-clipboard": "^5.0.2", "react-copy-to-clipboard": "^5.0.2",
"react-dom": "^16.12.0", "react-dom": "17.0.0",
"react-hot-loader": "^4.13.0", "react-hot-loader": "^4.13.0",
"react-moment": "^0.9.7", "react-moment": "^0.9.7",
"react-redux": "^7.1.3", "react-redux": "^7.1.3",
@@ -50,7 +50,6 @@
"redux-thunk": "^2.3.0", "redux-thunk": "^2.3.0",
"superagent": "^5.1.0", "superagent": "^5.1.0",
"typeface-roboto": "^0.0.75", "typeface-roboto": "^0.0.75",
"typescript": "3.6.4",
"use-debounce": "^5.0.1", "use-debounce": "^5.0.1",
"websocket": "^1.0.31" "websocket": "^1.0.31"
}, },
@@ -77,6 +76,7 @@
}, },
"proxy": "http://localhost:9090/", "proxy": "http://localhost:9090/",
"devDependencies": { "devDependencies": {
"prettier": "^1.19.1" "prettier": "^1.19.1",
"typescript": "^4.1.2"
} }
} }

View File

@@ -1,16 +1,16 @@
import React from 'react' import React from "react";
import Typography from "@material-ui/core/Typography"; import Typography from "@material-ui/core/Typography";
import Link from "@material-ui/core/Link"; import Link from "@material-ui/core/Link";
export default function Copyright() { export default function Copyright() {
return ( return (
<Typography variant="body2" color="textSecondary" align="center"> <Typography variant="body2" color="textSecondary" align="center">
{'Copyright © '} {"Copyright © "}
<Link color="inherit" href="https://material-ui.com/"> <Link color="inherit" href="https://material-ui.com/">
MinIO MinIO
</Link>{' '} </Link>{" "}
{new Date().getFullYear()} {new Date().getFullYear()}
{'.'} {"."}
</Typography> </Typography>
); );
} }

View File

@@ -19,7 +19,7 @@ import {
createStyles, createStyles,
makeStyles, makeStyles,
Theme, Theme,
useTheme useTheme,
} from "@material-ui/core/styles"; } from "@material-ui/core/styles";
import React from "react"; import React from "react";
import { IconButton } from "@material-ui/core"; import { IconButton } from "@material-ui/core";
@@ -31,8 +31,8 @@ const useStyles1 = makeStyles((theme: Theme) =>
createStyles({ createStyles({
root: { root: {
flexShrink: 0, flexShrink: 0,
marginLeft: theme.spacing(2.5) marginLeft: theme.spacing(2.5),
} },
}) })
); );

View File

@@ -1,6 +1,6 @@
import React from 'react'; import React from "react";
import PropTypes from 'prop-types'; import PropTypes from "prop-types";
import Typography from '@material-ui/core/Typography'; import Typography from "@material-ui/core/Typography";
export default function Title(props: React.Props<any>) { export default function Title(props: React.Props<any>) {
return ( return (

View File

@@ -15,20 +15,25 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import React from "react"; import React from "react";
import {SvgIcon} from "@material-ui/core"; import { SvgIcon } from "@material-ui/core";
class PermissionIcon extends React.Component { class PermissionIcon extends React.Component {
render() { render() {
return (<SvgIcon> return (
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14 16"> <SvgIcon>
<title>ic_permissions</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14 16">
<g id="Layer_2" data-name="Layer 2"> <title>ic_permissions</title>
<g id="Layer_1-2" data-name="Layer 1"> <g id="Layer_2" data-name="Layer 2">
<polygon className="cls-1" points="14 16 7.035 12.13 0 16 0 0 14 0 14 16"/> <g id="Layer_1-2" data-name="Layer 1">
</g> <polygon
</g> className="cls-1"
</svg> points="14 16 7.035 12.13 0 16 0 0 14 0 14 16"
</SvgIcon>) />
} </g>
</g>
</svg>
</SvgIcon>
);
}
} }
export default PermissionIcon; export default PermissionIcon;

View File

@@ -15,113 +15,33 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
import React from "react"; import React from "react";
import { import { createStyles, Theme } from "@material-ui/core/styles";
createStyles,
StyledProps,
Theme,
withStyles,
} from "@material-ui/core/styles";
import history from "../../../history"; import history from "../../../history";
import { import { Route, Router, Switch, withRouter } from "react-router-dom";
Route,
RouteComponentProps,
Router,
Switch,
withRouter,
} from "react-router-dom";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { AppState } from "../../../store"; import { AppState } from "../../../store";
import { setMenuOpen } from "../../../actions"; import { setMenuOpen } from "../../../actions";
import { ThemedComponentProps } from "@material-ui/core/styles/withTheme";
import NotFoundPage from "../../NotFoundPage"; import NotFoundPage from "../../NotFoundPage";
import ListBuckets from "./ListBuckets/ListBuckets"; import ListBuckets from "./ListBuckets/ListBuckets";
import ViewBucket from "./ViewBucket/ViewBucket"; import ViewBucket from "./ViewBucket/ViewBucket";
const styles = (theme: Theme) =>
createStyles({
root: {
display: "flex",
},
toolbar: {
background: theme.palette.background.default,
color: "black",
paddingRight: 24, // keep right padding when drawer closed
},
toolbarIcon: {
display: "flex",
alignItems: "center",
justifyContent: "flex-end",
padding: "0 8px",
...theme.mixins.toolbar,
},
appBar: {
zIndex: theme.zIndex.drawer + 1,
transition: theme.transitions.create(["width", "margin"], {
easing: theme.transitions.easing.sharp,
duration: theme.transitions.duration.leavingScreen,
}),
},
menuButton: {
marginRight: 36,
},
menuButtonHidden: {
display: "none",
},
title: {
flexGrow: 1,
},
appBarSpacer: {
height: "5px",
},
content: {
flexGrow: 1,
height: "100vh",
overflow: "auto",
},
container: {
paddingTop: theme.spacing(4),
paddingBottom: theme.spacing(4),
},
paper: {
padding: theme.spacing(2),
display: "flex",
overflow: "auto",
flexDirection: "column",
},
fixedHeight: {
minHeight: 240,
},
});
const mapState = (state: AppState) => ({ const mapState = (state: AppState) => ({
open: state.system.sidebarOpen, open: state.system.sidebarOpen,
}); });
const connector = connect(mapState, { setMenuOpen }); const connector = connect(mapState, { setMenuOpen });
interface BucketsProps { const Buckets = () => {
open: boolean; return (
title: string; <Router history={history}>
classes: any; <Switch>
setMenuOpen: typeof setMenuOpen; <Route path="/buckets/:bucketName" component={ViewBucket} />
} <Route path="/" component={ListBuckets} />
<Route component={NotFoundPage} />
</Switch>
</Router>
);
};
class Buckets extends React.Component< export default withRouter(connector(Buckets));
BucketsProps & RouteComponentProps & StyledProps & ThemedComponentProps
> {
render() {
return (
<Router history={history}>
<Switch>
<Route path="/buckets/:bucketName" component={ViewBucket} />
<Route path="/" component={ListBuckets} />
<Route component={NotFoundPage} />
</Switch>
</Router>
);
}
}
export default withRouter(connector(withStyles(styles)(Buckets)));

View File

@@ -256,7 +256,7 @@ const ListObjects = ({
xhr.open("POST", uploadUrl, true); xhr.open("POST", uploadUrl, true);
xhr.withCredentials = false; xhr.withCredentials = false;
xhr.onload = function(event) { xhr.onload = function (event) {
// TODO: handle status // TODO: handle status
if (xhr.status === 401 || xhr.status === 403) { if (xhr.status === 401 || xhr.status === 403) {
showSnackBarMessage("An error occurred while uploading the file."); showSnackBarMessage("An error occurred while uploading the file.");

View File

@@ -6,7 +6,6 @@ import {
DialogContent, DialogContent,
DialogContentText, DialogContentText,
DialogTitle, DialogTitle,
Grid,
LinearProgress, LinearProgress,
} from "@material-ui/core"; } from "@material-ui/core";
import { createStyles, Theme, withStyles } from "@material-ui/core/styles"; import { createStyles, Theme, withStyles } from "@material-ui/core/styles";
@@ -19,7 +18,7 @@ interface IDeleteTagModal {
currentTags: any; currentTags: any;
bucketName: string; bucketName: string;
versionId: string | null; versionId: string | null;
selectedTag: [string, string]; selectedTag: string[];
onCloseAndUpdate: (refresh: boolean) => void; onCloseAndUpdate: (refresh: boolean) => void;
selectedObject: string; selectedObject: string;
classes: any; classes: any;

View File

@@ -160,7 +160,7 @@ const ObjectDetails = ({
const [retentionModalOpen, setRetentionModalOpen] = useState<boolean>(false); const [retentionModalOpen, setRetentionModalOpen] = useState<boolean>(false);
const [tagModalOpen, setTagModalOpen] = useState<boolean>(false); const [tagModalOpen, setTagModalOpen] = useState<boolean>(false);
const [deleteTagModalOpen, setDeleteTagModalOpen] = useState<boolean>(false); const [deleteTagModalOpen, setDeleteTagModalOpen] = useState<boolean>(false);
const [selectedTag, setSelectedTag] = useState<[string, string]>(["", ""]); const [selectedTag, setSelectedTag] = useState<string[]>(["", ""]);
const [legalholdOpen, setLegalholdOpen] = useState<boolean>(false); const [legalholdOpen, setLegalholdOpen] = useState<boolean>(false);
const [actualInfo, setActualInfo] = useState<IFileInfo>(emptyFile); const [actualInfo, setActualInfo] = useState<IFileInfo>(emptyFile);
const [versions, setVersions] = useState<IFileInfo[]>([]); const [versions, setVersions] = useState<IFileInfo[]>([]);
@@ -447,25 +447,26 @@ const ObjectDetails = ({
</Grid> </Grid>
<Grid item xs={12} className={classes.tagsContainer}> <Grid item xs={12} className={classes.tagsContainer}>
<div className={classes.tagText}>Tags:</div> <div className={classes.tagText}>Tags:</div>
{tagKeys.map((tagKey, index) => { {tagKeys &&
const tag = get(actualInfo, `tags.${tagKey}`, ""); tagKeys.map((tagKey, index) => {
if (tag !== "") { const tag = get(actualInfo, `tags.${tagKey}`, "");
return ( if (tag !== "") {
<Chip return (
key={`chip-${index}`} <Chip
className={classes.tag} key={`chip-${index}`}
size="small" className={classes.tag}
label={`${tagKey} : ${tag}`} size="small"
color="primary" label={`${tagKey} : ${tag}`}
deleteIcon={<CloseIcon />} color="primary"
onDelete={() => { deleteIcon={<CloseIcon />}
deleteTag(tagKey, tag); onDelete={() => {
}} deleteTag(tagKey, tag);
/> }}
); />
} );
return null; }
})} return null;
})}
<Chip <Chip
className={classes.tag} className={classes.tag}
icon={<AddIcon />} icon={<AddIcon />}

View File

@@ -35,7 +35,7 @@ export const download = (
xhr.open("GET", path, true); xhr.open("GET", path, true);
xhr.responseType = "blob"; xhr.responseType = "blob";
xhr.onload = function(e) { xhr.onload = function (e) {
if (this.status === 200) { if (this.status === 200) {
const blob = new Blob([this.response], { const blob = new Blob([this.response], {
type: "octet/stream", type: "octet/stream",

View File

@@ -38,11 +38,7 @@ export const years = Array.from(
(_, numYear) => numYear + currentYear (_, numYear) => numYear + currentYear
); );
export const validDate = ( export const validDate = (year: string, month: string, day: string): any[] => {
year: string,
month: string,
day: string
): [boolean, string] => {
const currentDate = Date.parse(`${year}-${month}-${day}`); const currentDate = Date.parse(`${year}-${month}-${day}`);
if (isNaN(currentDate)) { if (isNaN(currentDate)) {

View File

@@ -350,4 +350,4 @@ const connector = connect(mapState, {
serverIsLoading, serverIsLoading,
}); });
export default connector(withStyles(styles)(Console)); export default withStyles(styles)(connector(Console));

View File

@@ -1,22 +1,29 @@
import React from 'react'; import React from "react";
import {useTheme} from '@material-ui/core/styles'; import { useTheme } from "@material-ui/core/styles";
import {LineChart, Line, XAxis, YAxis, Label, ResponsiveContainer} from 'recharts'; import {
LineChart,
Line,
XAxis,
YAxis,
Label,
ResponsiveContainer,
} from "recharts";
import Title from "../../../common/Title"; import Title from "../../../common/Title";
// Generate Sales Data // Generate Sales Data
function createData(time: string, amount: number) { function createData(time: string, amount: number) {
return {time, amount}; return { time, amount };
} }
const data = [ const data = [
createData('00:00', 0), createData("00:00", 0),
createData('03:00', 300), createData("03:00", 300),
createData('06:00', 600), createData("06:00", 600),
createData('09:00', 800), createData("09:00", 800),
createData('12:00', 1500), createData("12:00", 1500),
createData('15:00', 2000), createData("15:00", 2000),
createData('18:00', 2400), createData("18:00", 2400),
createData('21:00', 2400), createData("21:00", 2400),
]; ];
export default function Chart() { export default function Chart() {
@@ -35,17 +42,22 @@ export default function Chart() {
left: 24, left: 24,
}} }}
> >
<XAxis dataKey="time" stroke={theme.palette.text.secondary}/> <XAxis dataKey="time" stroke={theme.palette.text.secondary} />
<YAxis stroke={theme.palette.text.secondary}> <YAxis stroke={theme.palette.text.secondary}>
<Label <Label
angle={270} angle={270}
position="left" position="left"
style={{textAnchor: 'middle', fill: theme.palette.text.primary}} style={{ textAnchor: "middle", fill: theme.palette.text.primary }}
> >
Sales ($) Sales ($)
</Label> </Label>
</YAxis> </YAxis>
<Line type="monotone" dataKey="amount" stroke={theme.palette.primary.main} dot={false}/> <Line
type="monotone"
dataKey="amount"
stroke={theme.palette.primary.main}
dot={false}
/>
</LineChart> </LineChart>
</ResponsiveContainer> </ResponsiveContainer>
</React.Fragment> </React.Fragment>

View File

@@ -1,7 +1,7 @@
import React from 'react'; import React from "react";
import Link from '@material-ui/core/Link'; import Link from "@material-ui/core/Link";
import {makeStyles} from '@material-ui/core/styles'; import { makeStyles } from "@material-ui/core/styles";
import Typography from '@material-ui/core/Typography'; import Typography from "@material-ui/core/Typography";
import Title from "../../../common/Title"; import Title from "../../../common/Title";
function preventDefault(event: React.MouseEvent) { function preventDefault(event: React.MouseEvent) {

View File

@@ -60,17 +60,17 @@ const rows = [
"Long Branch, NJ", "Long Branch, NJ",
"VISA ⠀•••• 5919", "VISA ⠀•••• 5919",
212.79 212.79
) ),
]; ];
function preventDefault(event: React.MouseEvent) { function preventDefault(event: React.MouseEvent) {
event.preventDefault(); event.preventDefault();
} }
const useStyles = makeStyles(theme => ({ const useStyles = makeStyles((theme) => ({
seeMore: { seeMore: {
marginTop: theme.spacing(3) marginTop: theme.spacing(3),
} },
})); }));
export default function Orders() { export default function Orders() {
@@ -89,7 +89,7 @@ export default function Orders() {
</TableRow> </TableRow>
</TableHead> </TableHead>
<TableBody> <TableBody>
{rows.map(row => ( {rows.map((row) => (
<TableRow key={row.id}> <TableRow key={row.id}>
<TableCell>{row.date}</TableCell> <TableCell>{row.date}</TableCell>
<TableCell>{row.name}</TableCell> <TableCell>{row.name}</TableCell>

View File

@@ -23,7 +23,7 @@ import {
DialogContent, DialogContent,
DialogContentText, DialogContentText,
DialogTitle, DialogTitle,
LinearProgress LinearProgress,
} from "@material-ui/core"; } from "@material-ui/core";
import api from "../../../common/api"; import api from "../../../common/api";
import Typography from "@material-ui/core/Typography"; import Typography from "@material-ui/core/Typography";
@@ -39,15 +39,15 @@ interface IDeleteGroup {
const styles = (theme: Theme) => const styles = (theme: Theme) =>
createStyles({ createStyles({
errorBlock: { errorBlock: {
color: "red" color: "red",
} },
}); });
const DeleteGroup = ({ const DeleteGroup = ({
selectedGroup, selectedGroup,
deleteOpen, deleteOpen,
closeDeleteModalAndRefresh, closeDeleteModalAndRefresh,
classes classes,
}: IDeleteGroup) => { }: IDeleteGroup) => {
const [isDeleting, setDeleteLoading] = useState<boolean>(false); const [isDeleting, setDeleteLoading] = useState<boolean>(false);
const [deleteError, setError] = useState<string>(""); const [deleteError, setError] = useState<string>("");
@@ -67,7 +67,7 @@ const DeleteGroup = ({
closeDeleteModalAndRefresh(true); closeDeleteModalAndRefresh(true);
}) })
.catch(err => { .catch((err) => {
setDeleteLoading(false); setDeleteLoading(false);
setError(err); setError(err);
}); });

View File

@@ -23,7 +23,7 @@ import {
DialogContent, DialogContent,
DialogContentText, DialogContentText,
DialogTitle, DialogTitle,
LinearProgress LinearProgress,
} from "@material-ui/core"; } from "@material-ui/core";
import api from "../../../common/api"; import api from "../../../common/api";
import { Permission, PermissionList } from "./types"; import { Permission, PermissionList } from "./types";
@@ -32,8 +32,8 @@ import Typography from "@material-ui/core/Typography";
const styles = (theme: Theme) => const styles = (theme: Theme) =>
createStyles({ createStyles({
errorBlock: { errorBlock: {
color: "red" color: "red",
} },
}); });
interface IDeletePermissionProps { interface IDeletePermissionProps {
@@ -54,7 +54,7 @@ class DeletePermission extends React.Component<
> { > {
state: IDeletePermissionState = { state: IDeletePermissionState = {
deleteLoading: false, deleteLoading: false,
deleteError: "" deleteError: "",
}; };
removeRecord() { removeRecord() {
@@ -69,23 +69,23 @@ class DeletePermission extends React.Component<
this.setState({ deleteLoading: true }, () => { this.setState({ deleteLoading: true }, () => {
api api
.invoke("DELETE", `/api/v1/permissions/${selectedPermission.id}`, { .invoke("DELETE", `/api/v1/permissions/${selectedPermission.id}`, {
id: selectedPermission.id id: selectedPermission.id,
}) })
.then((res: PermissionList) => { .then((res: PermissionList) => {
this.setState( this.setState(
{ {
deleteLoading: false, deleteLoading: false,
deleteError: "" deleteError: "",
}, },
() => { () => {
this.props.closeDeleteModalAndRefresh(true); this.props.closeDeleteModalAndRefresh(true);
} }
); );
}) })
.catch(err => { .catch((err) => {
this.setState({ this.setState({
deleteLoading: false, deleteLoading: false,
deleteError: err deleteError: err,
}); });
}); });
}); });
@@ -114,7 +114,8 @@ class DeletePermission extends React.Component<
<DialogContent> <DialogContent>
{deleteLoading && <LinearProgress />} {deleteLoading && <LinearProgress />}
<DialogContentText id="alert-dialog-description"> <DialogContentText id="alert-dialog-description">
Are you sure you want to delete permission{" "}<b>{selectedPermission.name}</b>? Are you sure you want to delete permission{" "}
<b>{selectedPermission.name}</b>?
{deleteError !== "" && ( {deleteError !== "" && (
<React.Fragment> <React.Fragment>
<br /> <br />

View File

@@ -29,7 +29,7 @@ import {
IconButton, IconButton,
LinearProgress, LinearProgress,
TableFooter, TableFooter,
TablePagination TablePagination,
} from "@material-ui/core"; } from "@material-ui/core";
import Typography from "@material-ui/core/Typography"; import Typography from "@material-ui/core/Typography";
import DeleteIcon from "@material-ui/icons/Delete"; import DeleteIcon from "@material-ui/icons/Delete";
@@ -48,49 +48,49 @@ import PlayArrowRoundedIcon from "@material-ui/icons/PlayArrowRounded";
const styles = (theme: Theme) => const styles = (theme: Theme) =>
createStyles({ createStyles({
seeMore: { seeMore: {
marginTop: theme.spacing(3) marginTop: theme.spacing(3),
}, },
paper: { paper: {
display: "flex", display: "flex",
overflow: "auto", overflow: "auto",
flexDirection: "column" flexDirection: "column",
}, },
addSideBar: { addSideBar: {
width: "320px", width: "320px",
padding: "20px" padding: "20px",
}, },
errorBlock: { errorBlock: {
color: "red" color: "red",
}, },
tableToolbar: { tableToolbar: {
paddingLeft: theme.spacing(2), paddingLeft: theme.spacing(2),
paddingRight: theme.spacing(0) paddingRight: theme.spacing(0),
}, },
wrapCell: { wrapCell: {
maxWidth: "200px", maxWidth: "200px",
whiteSpace: "normal", whiteSpace: "normal",
wordWrap: "break-word" wordWrap: "break-word",
}, },
minTableHeader: { minTableHeader: {
color: "#393939", color: "#393939",
"& tr": { "& tr": {
"& th": { "& th": {
fontWeight: "bold" fontWeight: "bold",
} },
} },
}, },
actionsTray: { actionsTray: {
textAlign: "right", textAlign: "right",
"& button": { "& button": {
marginLeft: 10 marginLeft: 10,
} },
}, },
searchField: { searchField: {
background: "#FFFFFF", background: "#FFFFFF",
padding: 12, padding: 12,
borderRadius: 5, borderRadius: 5,
boxShadow: "0px 3px 6px #00000012" boxShadow: "0px 3px 6px #00000012",
} },
}); });
interface IPermissionsProps { interface IPermissionsProps {
@@ -124,7 +124,7 @@ class Permissions extends React.Component<
page: 0, page: 0,
rowsPerPage: 10, rowsPerPage: 10,
deleteOpen: false, deleteOpen: false,
selectedPermission: null selectedPermission: null,
}; };
fetchRecords() { fetchRecords() {
@@ -141,7 +141,7 @@ class Permissions extends React.Component<
loading: false, loading: false,
records: res.permissions, records: res.permissions,
totalRecords: res.total, totalRecords: res.total,
error: "" error: "",
}); });
// if we get 0 results, and page > 0 , go down 1 page // if we get 0 results, and page > 0 , go down 1 page
if ( if (
@@ -156,7 +156,7 @@ class Permissions extends React.Component<
}); });
} }
}) })
.catch(err => { .catch((err) => {
this.setState({ loading: false, error: err }); this.setState({ loading: false, error: err });
}); });
}); });
@@ -190,7 +190,7 @@ class Permissions extends React.Component<
page, page,
rowsPerPage, rowsPerPage,
deleteOpen, deleteOpen,
selectedPermission selectedPermission,
} = this.state; } = this.state;
const handleChangePage = (event: unknown, newPage: number) => { const handleChangePage = (event: unknown, newPage: number) => {
@@ -211,14 +211,14 @@ class Permissions extends React.Component<
const confirmDeletePermission = (selectedPermission: Permission) => { const confirmDeletePermission = (selectedPermission: Permission) => {
this.setState({ this.setState({
deleteOpen: true, deleteOpen: true,
selectedPermission: selectedPermission selectedPermission: selectedPermission,
}); });
}; };
const editPermission = (selectedPermission: Permission) => { const editPermission = (selectedPermission: Permission) => {
this.setState({ this.setState({
addScreenOpen: true, addScreenOpen: true,
selectedPermission: selectedPermission selectedPermission: selectedPermission,
}); });
}; };
@@ -266,7 +266,7 @@ class Permissions extends React.Component<
<InputAdornment position="start"> <InputAdornment position="start">
<SearchIcon /> <SearchIcon />
</InputAdornment> </InputAdornment>
) ),
}} }}
/> />
<Button <Button
@@ -276,7 +276,7 @@ class Permissions extends React.Component<
onClick={() => { onClick={() => {
this.setState({ this.setState({
addScreenOpen: true, addScreenOpen: true,
selectedPermission: null selectedPermission: null,
}); });
}} }}
> >
@@ -288,7 +288,7 @@ class Permissions extends React.Component<
startIcon={<PlayArrowRoundedIcon />} startIcon={<PlayArrowRoundedIcon />}
onClick={() => { onClick={() => {
this.setState({ this.setState({
addScreenOpen: true addScreenOpen: true,
}); });
}} }}
> >
@@ -315,7 +315,7 @@ class Permissions extends React.Component<
</TableRow> </TableRow>
</TableHead> </TableHead>
<TableBody> <TableBody>
{records.map(row => ( {records.map((row) => (
<TableRow key={row.name}> <TableRow key={row.name}>
<TableCell padding="checkbox"> <TableCell padding="checkbox">
<Checkbox <Checkbox
@@ -332,7 +332,7 @@ class Permissions extends React.Component<
</TableCell> </TableCell>
<TableCell>{row.effect}</TableCell> <TableCell>{row.effect}</TableCell>
<TableCell className={classes.wrapCell}> <TableCell className={classes.wrapCell}>
{row.resources.map(r => r.bucket_name).join(", ")} {row.resources.map((r) => r.bucket_name).join(", ")}
</TableCell> </TableCell>
<TableCell> <TableCell>
{actionLabel(row.actions[0].type)} {actionLabel(row.actions[0].type)}
@@ -368,7 +368,7 @@ class Permissions extends React.Component<
page={page} page={page}
SelectProps={{ SelectProps={{
inputProps: { "aria-label": "rows per page" }, inputProps: { "aria-label": "rows per page" },
native: true native: true,
}} }}
onChangePage={handleChangePage} onChangePage={handleChangePage}
onChangeRowsPerPage={handleChangeRowsPerPage} onChangeRowsPerPage={handleChangeRowsPerPage}

View File

@@ -15,16 +15,16 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
export interface Permission { export interface Permission {
id: string; id: string;
name: string; name: string;
slug: string; slug: string;
description: string; description: string;
effect: string; effect: string;
resources: any[]; resources: any[];
actions: any[]; actions: any[];
} }
export interface PermissionList { export interface PermissionList {
permissions: Permission[]; permissions: Permission[];
total:number; total: number;
} }

View File

@@ -23,7 +23,7 @@ import {
DialogContent, DialogContent,
DialogContentText, DialogContentText,
DialogTitle, DialogTitle,
LinearProgress LinearProgress,
} from "@material-ui/core"; } from "@material-ui/core";
import api from "../../../common/api"; import api from "../../../common/api";
import { User, UsersList } from "./types"; import { User, UsersList } from "./types";
@@ -32,8 +32,8 @@ import Typography from "@material-ui/core/Typography";
const styles = (theme: Theme) => const styles = (theme: Theme) =>
createStyles({ createStyles({
errorBlock: { errorBlock: {
color: "red" color: "red",
} },
}); });
interface IDeleteUserProps { interface IDeleteUserProps {
@@ -51,7 +51,7 @@ interface IDeleteUserState {
class DeleteUser extends React.Component<IDeleteUserProps, IDeleteUserState> { class DeleteUser extends React.Component<IDeleteUserProps, IDeleteUserState> {
state: IDeleteUserState = { state: IDeleteUserState = {
deleteLoading: false, deleteLoading: false,
deleteError: "" deleteError: "",
}; };
removeRecord() { removeRecord() {
@@ -66,23 +66,23 @@ class DeleteUser extends React.Component<IDeleteUserProps, IDeleteUserState> {
this.setState({ deleteLoading: true }, () => { this.setState({ deleteLoading: true }, () => {
api api
.invoke("DELETE", `/api/v1/users/${selectedUser.accessKey}`, { .invoke("DELETE", `/api/v1/users/${selectedUser.accessKey}`, {
id: selectedUser.id id: selectedUser.id,
}) })
.then((res: UsersList) => { .then((res: UsersList) => {
this.setState( this.setState(
{ {
deleteLoading: false, deleteLoading: false,
deleteError: "" deleteError: "",
}, },
() => { () => {
this.props.closeDeleteModalAndRefresh(true); this.props.closeDeleteModalAndRefresh(true);
} }
); );
}) })
.catch(err => { .catch((err) => {
this.setState({ this.setState({
deleteLoading: false, deleteLoading: false,
deleteError: err deleteError: err,
}); });
}); });
}); });

View File

@@ -0,0 +1,6 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"jsx": "react-jsxdev"
}
}

View File

@@ -1,6 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"target": "es5", "target": "es2015",
"lib": [ "lib": [
"dom", "dom",
"dom.iterable", "dom.iterable",
@@ -17,10 +17,10 @@
"resolveJsonModule": true, "resolveJsonModule": true,
"isolatedModules": true, "isolatedModules": true,
"noEmit": true, "noEmit": true,
"jsx": "react", "jsx": "react-jsx",
"downlevelIteration": true "downlevelIteration": true
}, },
"include": [ "include": [
"src" "src"
] ]
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +0,0 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1