Ux Tools screens (#1261)

Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com>
This commit is contained in:
Prakash Senthil Vel
2021-11-28 07:22:06 +00:00
committed by GitHub
parent 400892565d
commit 347c6aba3b
10 changed files with 737 additions and 695 deletions

View File

@@ -95,6 +95,9 @@ const styles = (theme: Theme) =>
fontWeight: "bold", fontWeight: "bold",
color: "#081C42", color: "#081C42",
}, },
"@media (max-width: 900px)": {
width: 103,
},
}, },
dateSelectorFormOverride: { dateSelectorFormOverride: {
width: "100%", width: "100%",

View File

@@ -1166,3 +1166,39 @@ export const deleteDialogStyles = {
}, },
}, },
}; };
export const advancedFilterToggleStyles: any = {
advancedButton: {
flexGrow: 1,
alignItems: "flex-end",
display: "flex",
justifyContent: "flex-end",
},
advancedConfiguration: {
color: "#2781B0",
fontSize: 10,
textDecoration: "underline",
border: "none",
backgroundColor: "transparent",
cursor: "pointer",
alignItems: "center",
display: "flex",
float: "right",
"&:hover": {
color: "#07193E",
},
"& svg": {
width: 10,
alignSelf: "center",
marginLeft: 5,
},
},
advancedOpen: {
transform: "rotateZ(-90deg) translateX(-4px) translateY(2px)",
},
advancedClosed: {
transform: "rotateZ(90deg)",
},
};

View File

@@ -46,6 +46,7 @@ import CheckboxWrapper from "../Common/FormComponents/CheckboxWrapper/CheckboxWr
import PageHeader from "../Common/PageHeader/PageHeader"; import PageHeader from "../Common/PageHeader/PageHeader";
import api from "../../../common/api"; import api from "../../../common/api";
import BackLink from "../../../common/BackLink"; import BackLink from "../../../common/BackLink";
import PageLayout from "../Common/Layout/PageLayout";
const styles = (theme: Theme) => const styles = (theme: Theme) =>
createStyles({ createStyles({
@@ -69,6 +70,7 @@ const styles = (theme: Theme) =>
border: "#EAEDEE 1px solid", border: "#EAEDEE 1px solid",
borderRadius: 3, borderRadius: 3,
padding: "19px 38px", padding: "19px 38px",
marginTop: 15,
}, },
scanInfo: { scanInfo: {
marginTop: 20, marginTop: 20,
@@ -79,8 +81,31 @@ const styles = (theme: Theme) =>
scanData: { scanData: {
fontSize: 13, fontSize: 13,
}, },
noMinWidthLabel: {
fontWeight: 400,
},
formBox: {
padding: 15,
border: "1px solid #EAEAEA",
},
buttonBar: {
display: "flex",
alignItems: "center",
justifyContent: "flex-end",
},
bucketField: {
flex: 1,
},
prefixField: {
...searchField.searchField,
marginLeft: 10,
flex: 1,
},
actionsTray: {
...actionsTray.actionsTray,
marginBottom: 0,
},
...inlineCheckboxes, ...inlineCheckboxes,
...actionsTray,
...searchField, ...searchField,
...containerForHeader(theme.spacing(4)), ...containerForHeader(theme.spacing(4)),
}); });
@@ -93,7 +118,6 @@ interface IHeal {
const SelectStyled = withStyles((theme: Theme) => const SelectStyled = withStyles((theme: Theme) =>
createStyles({ createStyles({
root: { root: {
width: 450,
lineHeight: "50px", lineHeight: "50px",
marginRight: 15, marginRight: 15,
"label + &": { "label + &": {
@@ -107,7 +131,6 @@ const SelectStyled = withStyles((theme: Theme) =>
height: 50, height: 50,
fontSize: 13, fontSize: 13,
lineHeight: "50px", lineHeight: "50px",
width: 450,
}, },
}) })
)(InputBase); )(InputBase);
@@ -248,97 +271,99 @@ const Heal = ({ classes, distributedSetup }: IHeal) => {
return ( return (
<React.Fragment> <React.Fragment>
<PageHeader label="Heal" /> <PageHeader label="Heal" />
<Grid container className={classes.container}> <BackLink to="/tools" label="Return to Tools" />
<Grid item xs={12}> <PageLayout>
<BackLink to="/tools" label="Return to Tools" /> <Grid xs={12} className={classes.formBox}>
</Grid> <Grid item xs={12} className={classes.actionsTray}>
<Grid item xs={12} className={classes.actionsTray}> <FormControl variant="outlined" className={classes.bucketField}>
<FormControl variant="outlined"> <Select
<Select label="Bucket"
id="bucket-name" id="bucket-name"
name="bucket-name" name="bucket-name"
value={bucketName} value={bucketName}
onChange={(e) => { onChange={(e) => {
setBucketName(e.target.value as string); setBucketName(e.target.value as string);
}} }}
className={classes.searchField} className={classes.searchField}
input={<SelectStyled />} input={<SelectStyled />}
displayEmpty displayEmpty
> >
<MenuItem value="" key={`select-bucket-name-default`}> <MenuItem value="" key={`select-bucket-name-default`}>
Select Bucket Select Bucket
</MenuItem>
{bucketNames.map((option) => (
<MenuItem
value={option.value}
key={`select-bucket-name-${option.label}`}
>
{option.label}
</MenuItem> </MenuItem>
))} {bucketNames.map((option) => (
</Select> <MenuItem
</FormControl> value={option.value}
<TextField key={`select-bucket-name-${option.label}`}
placeholder="Prefix" >
className={classes.searchField} {option.label}
id="prefix-resource" </MenuItem>
label="" ))}
disabled={false} </Select>
InputProps={{ </FormControl>
disableUnderline: true, <TextField
}} label="Prefix"
onChange={(e) => { className={classes.prefixField}
setPrefix(e.target.value); id="prefix-resource"
}} disabled={false}
variant="standard" InputProps={{
/> disableUnderline: true,
<Button }}
type="submit" onChange={(e) => {
variant="contained" setPrefix(e.target.value);
color="primary" }}
disabled={start} variant="standard"
onClick={() => setStart(true)} />
> </Grid>
Start <Grid item xs={12} className={classes.inlineCheckboxes}>
</Button> <CheckboxWrapper
</Grid> name="recursive"
<Grid item xs={12} className={classes.inlineCheckboxes}> id="recursive"
<CheckboxWrapper classes={classes}
name="recursive" value="recursive"
id="recursive" checked={recursive}
value="recursive" onChange={(e) => {
checked={recursive} setRecursive(e.target.checked);
onChange={(e) => { }}
setRecursive(e.target.checked); disabled={false}
}} label="Recursive"
disabled={false} />
label="Recursive" <CheckboxWrapper
/> name="forceStart"
<CheckboxWrapper id="forceStart"
name="forceStart" classes={classes}
id="forceStart" value="forceStart"
value="forceStart" checked={forceStart}
checked={forceStart} onChange={(e) => {
onChange={(e) => { setForceStart(e.target.checked);
setForceStart(e.target.checked); }}
}} disabled={false}
disabled={false} label="Force Start"
label="Force Start" />
/> <CheckboxWrapper
<CheckboxWrapper name="forceStop"
name="forceStop" id="forceStop"
id="forceStop" classes={classes}
value="forceStop" value="forceStop"
checked={forceStop} checked={forceStop}
onChange={(e) => { onChange={(e) => {
setForceStop(e.target.checked); setForceStop(e.target.checked);
}} }}
disabled={false} disabled={false}
label="Force Stop" label="Force Stop"
/> />
</Grid> </Grid>
<Grid item xs={12}> <Grid item xs={12} className={classes.buttonBar}>
<br /> <Button
type="submit"
variant="contained"
color="primary"
disabled={start}
onClick={() => setStart(true)}
>
Start
</Button>
</Grid>
</Grid> </Grid>
<Grid item xs={12} className={classes.graphContainer}> <Grid item xs={12} className={classes.graphContainer}>
<HorizontalBar <HorizontalBar
@@ -370,7 +395,7 @@ const Heal = ({ classes, distributedSetup }: IHeal) => {
</div> </div>
</Grid> </Grid>
</Grid> </Grid>
</Grid> </PageLayout>
</React.Fragment> </React.Fragment>
); );
}; };

View File

@@ -47,6 +47,7 @@ import { setServerDiagStat, setSnackBarMessage } from "../../../actions";
import CircularProgress from "@mui/material/CircularProgress"; import CircularProgress from "@mui/material/CircularProgress";
import BackLink from "../../../common/BackLink"; import BackLink from "../../../common/BackLink";
import TestWrapper from "../Common/TestWrapper/TestWrapper"; import TestWrapper from "../Common/TestWrapper/TestWrapper";
import PageLayout from "../Common/Layout/PageLayout";
const styles = (theme: Theme) => const styles = (theme: Theme) =>
createStyles({ createStyles({
@@ -133,7 +134,7 @@ const HealthInfo = ({
const [diagStarted, setDiagStarted] = useState<boolean>(false); const [diagStarted, setDiagStarted] = useState<boolean>(false);
const [downloadDisabled, setDownloadDisabled] = useState(true); const [downloadDisabled, setDownloadDisabled] = useState(true);
const [localMessage, setMessage] = useState<string>(""); const [localMessage, setMessage] = useState<string>("");
const [title, setTitle] = useState<string>("Start new Diagnostic"); const [title, setTitle] = useState<string>("New Diagnostic");
useEffect(() => { useEffect(() => {
if (serverDiagnosticStatus === DiagStatInProgress) { if (serverDiagnosticStatus === DiagStatInProgress) {
@@ -242,11 +243,9 @@ const HealthInfo = ({
return ( return (
<Fragment> <Fragment>
<PageHeader label="Diagnostic" /> <PageHeader label="Diagnostic" />
<BackLink to="/tools" label="Return to Tools" />
<Grid container className={classes.container}> <PageLayout>
<Grid item xs={12}>
<BackLink to="/tools" label="Return to Tools" />
</Grid>
<Grid item xs={12} className={classes.boxy}> <Grid item xs={12} className={classes.boxy}>
<TestWrapper title={title} advancedVisible={false}> <TestWrapper title={title} advancedVisible={false}>
<Grid container className={classes.buttons}> <Grid container className={classes.buttons}>
@@ -306,7 +305,7 @@ const HealthInfo = ({
disabled={startDiagnostic} disabled={startDiagnostic}
onClick={() => setStartDiagnostic(true)} onClick={() => setStartDiagnostic(true)}
> >
Start new Diagnostic Start New Diagnostic
</Button> </Button>
</Grid> </Grid>
</Fragment> </Fragment>
@@ -316,7 +315,7 @@ const HealthInfo = ({
</Grid> </Grid>
</TestWrapper> </TestWrapper>
</Grid> </Grid>
</Grid> </PageLayout>
</Fragment> </Fragment>
); );
}; };

View File

@@ -20,8 +20,6 @@ import createStyles from "@mui/styles/createStyles";
import withStyles from "@mui/styles/withStyles"; import withStyles from "@mui/styles/withStyles";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { Grid } from "@mui/material"; import { Grid } from "@mui/material";
import TextField from "@mui/material/TextField";
import InputAdornment from "@mui/material/InputAdornment";
import moment from "moment/moment"; import moment from "moment/moment";
import { AppState } from "../../../../store"; import { AppState } from "../../../../store";
import { logMessageReceived, logResetMessages } from "../actions"; import { logMessageReceived, logResetMessages } from "../actions";
@@ -34,19 +32,20 @@ import {
logsCommon, logsCommon,
searchField, searchField,
} from "../../Common/FormComponents/common/styleLibrary"; } from "../../Common/FormComponents/common/styleLibrary";
import SearchIcon from "../../../../icons/SearchIcon";
import PageHeader from "../../Common/PageHeader/PageHeader"; import PageHeader from "../../Common/PageHeader/PageHeader";
import BackLink from "../../../../common/BackLink"; import BackLink from "../../../../common/BackLink";
import PageLayout from "../../Common/Layout/PageLayout";
import SearchBox from "../../Common/SearchBox";
const styles = (theme: Theme) => const styles = (theme: Theme) =>
createStyles({ createStyles({
logList: { logList: {
background: "#fff", background: "#fff",
minHeight: 400, minHeight: 400,
height: "calc(100vh - 304px)", height: "calc(100vh - 280px)",
overflow: "auto", overflow: "auto",
fontSize: 13, fontSize: 13,
padding: "25px 45px 0", padding: "15px 15px 0",
border: "1px solid #EAEDEE", border: "1px solid #EAEDEE",
borderRadius: 4, borderRadius: 4,
}, },
@@ -330,41 +329,17 @@ const ErrorLogs = ({
return ( return (
<Fragment> <Fragment>
<PageHeader label="Logs" /> <PageHeader label="Logs" />
<Grid container className={classes.container}> <BackLink to="/tools" label="Return to Tools" />
<Grid item xs={12}> <PageLayout>
<BackLink to="/tools" label="Return to Tools" /> <Grid xs={12}>
</Grid> <Grid item xs={12} className={classes.actionsTray}>
<Grid item xs={12}> <SearchBox placeholder="Highlight Line" onChange={setHighlight} />
<Grid container className={classes.logsSubContainer}> </Grid>
<Grid item xs={12} className={classes.actionsTray}> <Grid item xs={12}>
<TextField <div className={classes.logList}>{renderLines}</div>
placeholder="Highlight Line"
className={classes.searchField}
id="search-resource"
label=""
onChange={(val) => {
setHighlight(val.target.value);
}}
InputProps={{
disableUnderline: true,
startAdornment: (
<InputAdornment position="start">
<SearchIcon />
</InputAdornment>
),
}}
variant="standard"
/>
</Grid>
<Grid item xs={12}>
<br />
</Grid>
<Grid item xs={12}>
<div className={classes.logList}>{renderLines}</div>
</Grid>
</Grid> </Grid>
</Grid> </Grid>
</Grid> </PageLayout>
</Fragment> </Fragment>
); );
}; };

View File

@@ -21,13 +21,11 @@ import { Theme } from "@mui/material/styles";
import createStyles from "@mui/styles/createStyles"; import createStyles from "@mui/styles/createStyles";
import withStyles from "@mui/styles/withStyles"; import withStyles from "@mui/styles/withStyles";
import { Button, Grid } from "@mui/material"; import { Button, Grid } from "@mui/material";
import { ArrowDropUp } from "@mui/icons-material";
import ArrowDropDownIcon from "@mui/icons-material/ArrowDropDown";
import { import {
actionsTray, advancedFilterToggleStyles,
containerForHeader, containerForHeader,
logsCommon, logsCommon,
searchField, tableStyles,
} from "../../Common/FormComponents/common/styleLibrary"; } from "../../Common/FormComponents/common/styleLibrary";
import { IReqInfoSearchResults, ISearchResponse } from "./types"; import { IReqInfoSearchResults, ISearchResponse } from "./types";
import { niceBytes, nsToSeconds } from "../../../../common/utils"; import { niceBytes, nsToSeconds } from "../../../../common/utils";
@@ -42,6 +40,8 @@ import { LogSearchColumnLabels } from "./utils";
import DateRangeSelector from "../../Common/FormComponents/DateRangeSelector/DateRangeSelector"; import DateRangeSelector from "../../Common/FormComponents/DateRangeSelector/DateRangeSelector";
import PageHeader from "../../Common/PageHeader/PageHeader"; import PageHeader from "../../Common/PageHeader/PageHeader";
import BackLink from "../../../../common/BackLink"; import BackLink from "../../../../common/BackLink";
import PageLayout from "../../Common/Layout/PageLayout";
import ArrowForwardIosIcon from "@mui/icons-material/ArrowForwardIos";
interface ILogSearchProps { interface ILogSearchProps {
classes: any; classes: any;
@@ -51,45 +51,20 @@ interface ILogSearchProps {
const styles = (theme: Theme) => const styles = (theme: Theme) =>
createStyles({ createStyles({
inputBar: {
flexGrow: 1,
marginLeft: 15,
},
advancedLabel: {
display: "flex",
alignItems: "center",
color: "#091C42",
border: 0,
backgroundColor: "transparent",
cursor: "pointer",
"&:focus, &:active": {
outline: "none",
},
},
advancedLabelContainer: {
marginTop: 10,
},
getInformationContainer: {
textAlign: "right",
},
orderButton: {
width: 93,
},
recordsLabel: {
alignSelf: "center",
marginLeft: 15,
},
blockCollapsed: { blockCollapsed: {
height: 0, display: "none",
overflowY: "hidden", overflowY: "hidden",
transitionDuration: "0.3s",
}, },
filterOpen: { filterOpen: {
height: 200, display: "block",
marginBottom: 12, marginBottom: 12,
}, },
endLineAction: { endLineAction: {
marginBottom: 15, marginBottom: 15,
padding: "0 15px 0 15px",
display: "flex",
alignItems: "center",
justifyContent: "flex-end",
}, },
filtersContainer: { filtersContainer: {
display: "flex", display: "flex",
@@ -98,10 +73,6 @@ const styles = (theme: Theme) =>
}, },
innerContainer: { innerContainer: {
backgroundColor: "#fff", backgroundColor: "#fff",
border: "#EAEDEE 1px solid",
borderRadius: 3,
padding: 10,
marginBottom: 15,
}, },
noticeLabel: { noticeLabel: {
marginLeft: 15, marginLeft: 15,
@@ -111,18 +82,56 @@ const styles = (theme: Theme) =>
}, },
tableFOpen: { tableFOpen: {
height: "calc(100vh - 561px)", height: "calc(100vh - 520px)",
}, },
tableFClosed: { tableFClosed: {
height: "calc(100vh - 349px)", height: "calc(100vh - 320px)",
}, },
"@global": { ...tableStyles,
".overrideMargin": { ...advancedFilterToggleStyles,
marginLeft: 0,
buttonKit: {
"& div": {
height: 35,
},
"& .MuiOutlinedInput-notchedOutline": {
border: 0,
height: 28,
color: "#000000",
}, },
}, },
...searchField, searchOptions: {
...actionsTray, display: "flex",
padding: 15,
"@media (max-width: 900px)": {
flexFlow: "column",
},
},
selectorLabel: {
"& + div": {
"@media (max-width: 900px)": {
width: 110,
},
},
"@media (max-width: 900px)": {
marginLeft: 5,
},
},
formBox: {
border: "1px solid #EAEAEA",
marginBottom: 15,
},
dateRangePicker: {
"& div": {
marginBottom: 0,
},
},
advancedButton: {
display: "flex",
alignItems: "center",
justifyContent: "flex-start",
},
advancedFilterOptions: {},
...logsCommon, ...logsCommon,
...containerForHeader(theme.spacing(4)), ...containerForHeader(theme.spacing(4)),
}); });
@@ -289,103 +298,107 @@ const LogsSearchMain = ({
)} )}
<PageHeader label="Audit Logs" /> <PageHeader label="Audit Logs" />
<Grid container className={classes.container}> <BackLink to="/tools" label="Return to Tools" />
<Grid item xs={12}> <PageLayout>
<BackLink to="/tools" label="Return to Tools" /> <Grid xs={12} className={classes.formBox}>
</Grid> <Grid item xs={12} className={`${classes.searchOptions}`}>
<Grid container className={classes.logsSubContainer}> <div className={classes.dateRangePicker}>
<Grid <DateRangeSelector
item classes={classes}
xs={12} setTimeEnd={setTimeEnd}
className={`${classes.actionsTray} ${classes.timeContainers}`} setTimeStart={setTimeStart}
> timeEnd={timeEnd}
<DateRangeSelector timeStart={timeStart}
setTimeEnd={setTimeEnd} />
setTimeStart={setTimeStart}
timeEnd={timeEnd}
timeStart={timeStart}
/>
</Grid>
<Grid item xs={12} className={`${classes.advancedLabelContainer}`}>
<div
className={`${classes.blockCollapsed} ${
filterOpen ? classes.filterOpen : ""
}`}
>
<div className={classes.innerContainer}>
<div className={classes.noticeLabel}>
Enable your preferred options to get filtered records.
<br />
You can use '*' to match any character, '.' to signify a
single character or '\' to scape an special character (E.g.
mybucket-*)
</div>
<div className={classes.filtersContainer}>
<FilterInputWrapper
onChange={setBucket}
value={bucket}
label={"Bucket"}
id="bucket"
name="bucket"
/>
<FilterInputWrapper
onChange={setApiName}
value={apiName}
label={"API Name"}
id="api_name"
name="api_name"
/>
<FilterInputWrapper
onChange={setUserAgent}
value={userAgent}
label={"User Agent"}
id="user_agent"
name="user_agent"
/>
</div>
<div className={classes.filtersContainer}>
<FilterInputWrapper
onChange={setObject}
value={object}
label={"Object"}
id="object"
name="object"
/>
<FilterInputWrapper
onChange={setRequestID}
value={requestID}
label={"Request ID"}
id="request_id"
name="request_id"
/>
<FilterInputWrapper
onChange={setResponseStatus}
value={responseStatus}
label={"Response Status"}
id="response_status"
name="response_status"
/>
</div>
</div>
</div> </div>
</Grid>
<Grid <Grid item className={classes.advancedButton}>
item
xs={12}
className={`${classes.actionsTray} ${classes.endLineAction}`}
>
<div>
<button <button
type="button"
className={`${classes.advancedLabel} overrideMargin`}
onClick={() => { onClick={() => {
setFilterOpen(!filterOpen); setFilterOpen(!filterOpen);
}} }}
className={classes.advancedConfiguration}
> >
Advanced Filters{" "} {filterOpen ? "Hide" : "Show"} advanced Filters{" "}
{filterOpen ? <ArrowDropUp /> : <ArrowDropDownIcon />} <span
className={
filterOpen ? classes.advancedOpen : classes.advancedClosed
}
>
<ArrowForwardIosIcon />
</span>
</button> </button>
</Grid>
</Grid>
<Grid
item
xs={12}
className={`${classes.blockCollapsed} ${
filterOpen ? classes.filterOpen : ""
}`}
>
<div className={classes.innerContainer}>
<div className={classes.noticeLabel}>
Enable your preferred options to get filtered records.
<br />
You can use '*' to match any character, '.' to signify a single
character or '\' to scape an special character (E.g. mybucket-*)
</div>
<div className={classes.filtersContainer}>
<FilterInputWrapper
classes={classes}
onChange={setBucket}
value={bucket}
label={"Bucket"}
id="bucket"
name="bucket"
/>
<FilterInputWrapper
classes={classes}
onChange={setApiName}
value={apiName}
label={"API Name"}
id="api_name"
name="api_name"
/>
<FilterInputWrapper
classes={classes}
onChange={setUserAgent}
value={userAgent}
label={"User Agent"}
id="user_agent"
name="user_agent"
/>
</div>
<div className={classes.filtersContainer}>
<FilterInputWrapper
classes={classes}
onChange={setObject}
value={object}
label={"Object"}
id="object"
name="object"
/>
<FilterInputWrapper
classes={classes}
onChange={setRequestID}
value={requestID}
label={"Request ID"}
id="request_id"
name="request_id"
/>
<FilterInputWrapper
classes={classes}
onChange={setResponseStatus}
value={responseStatus}
label={"Response Status"}
id="response_status"
name="response_status"
/>
</div>
</div> </div>
</Grid>
<Grid item xs={12} className={classes.endLineAction}>
<Button <Button
type="button" type="button"
variant="contained" variant="contained"
@@ -395,93 +408,92 @@ const LogsSearchMain = ({
Get Information Get Information
</Button> </Button>
</Grid> </Grid>
<Grid item xs={12}>
<TableWrapper
columns={[
{
label: LogSearchColumnLabels.time,
elementKey: "time",
enableSort: true,
},
{
label: LogSearchColumnLabels.api_name,
elementKey: "api_name",
},
{ label: LogSearchColumnLabels.bucket, elementKey: "bucket" },
{ label: LogSearchColumnLabels.object, elementKey: "object" },
{
label: LogSearchColumnLabels.remote_host,
elementKey: "remote_host",
},
{
label: LogSearchColumnLabels.request_id,
elementKey: "request_id",
},
{
label: LogSearchColumnLabels.user_agent,
elementKey: "user_agent",
},
{
label: LogSearchColumnLabels.response_status,
elementKey: "response_status",
renderFunction: (element) => (
<Fragment>
<span>
{element.response_status_code} (
{element.response_status})
</span>
</Fragment>
),
renderFullObject: true,
},
{
label: LogSearchColumnLabels.request_content_length,
elementKey: "request_content_length",
renderFunction: niceBytes,
},
{
label: LogSearchColumnLabels.response_content_length,
elementKey: "response_content_length",
renderFunction: niceBytes,
},
{
label: LogSearchColumnLabels.time_to_response_ns,
elementKey: "time_to_response_ns",
renderFunction: nsToSeconds,
contentTextAlign: "right",
},
]}
isLoading={loading}
records={records}
entityName="Logs"
customEmptyMessage={"There is no information with this criteria"}
idField="request_id"
columnsSelector
columnsShown={columnsShown}
onColumnChange={selectColumn}
customPaperHeight={
filterOpen ? classes.tableFOpen : classes.tableFClosed
}
sortConfig={{
currentSort: "time",
currentDirection: sortOrder,
triggerSort: sortChange,
}}
infiniteScrollConfig={{
recordsCount: 1000000,
loadMoreRecords: loadMoreRecords,
}}
itemActions={[
{
type: "view",
onClick: openExtraInformation,
},
]}
textSelectable
/>
</Grid>
</Grid> </Grid>
</Grid> <Grid item xs={12} className={classes.tableBlock}>
<TableWrapper
columns={[
{
label: LogSearchColumnLabels.time,
elementKey: "time",
enableSort: true,
},
{
label: LogSearchColumnLabels.api_name,
elementKey: "api_name",
},
{ label: LogSearchColumnLabels.bucket, elementKey: "bucket" },
{ label: LogSearchColumnLabels.object, elementKey: "object" },
{
label: LogSearchColumnLabels.remote_host,
elementKey: "remote_host",
},
{
label: LogSearchColumnLabels.request_id,
elementKey: "request_id",
},
{
label: LogSearchColumnLabels.user_agent,
elementKey: "user_agent",
},
{
label: LogSearchColumnLabels.response_status,
elementKey: "response_status",
renderFunction: (element) => (
<Fragment>
<span>
{element.response_status_code} ({element.response_status})
</span>
</Fragment>
),
renderFullObject: true,
},
{
label: LogSearchColumnLabels.request_content_length,
elementKey: "request_content_length",
renderFunction: niceBytes,
},
{
label: LogSearchColumnLabels.response_content_length,
elementKey: "response_content_length",
renderFunction: niceBytes,
},
{
label: LogSearchColumnLabels.time_to_response_ns,
elementKey: "time_to_response_ns",
renderFunction: nsToSeconds,
contentTextAlign: "right",
},
]}
isLoading={loading}
records={records}
entityName="Logs"
customEmptyMessage={"There is no information with this criteria"}
idField="request_id"
columnsSelector
columnsShown={columnsShown}
onColumnChange={selectColumn}
customPaperHeight={
filterOpen ? classes.tableFOpen : classes.tableFClosed
}
sortConfig={{
currentSort: "time",
currentDirection: sortOrder,
triggerSort: sortChange,
}}
infiniteScrollConfig={{
recordsCount: 1000000,
loadMoreRecords: loadMoreRecords,
}}
itemActions={[
{
type: "view",
onClick: openExtraInformation,
},
]}
textSelectable
/>
</Grid>
</PageLayout>
</Fragment> </Fragment>
); );
}; };

View File

@@ -25,6 +25,7 @@ import moment from "moment/moment";
import PageHeader from "../Common/PageHeader/PageHeader"; import PageHeader from "../Common/PageHeader/PageHeader";
import { import {
actionsTray, actionsTray,
advancedFilterToggleStyles,
containerForHeader, containerForHeader,
searchField, searchField,
} from "../Common/FormComponents/common/styleLibrary"; } from "../Common/FormComponents/common/styleLibrary";
@@ -36,6 +37,7 @@ import BackLink from "../../../common/BackLink";
import ProgressBarWrapper from "../Common/ProgressBarWrapper/ProgressBarWrapper"; import ProgressBarWrapper from "../Common/ProgressBarWrapper/ProgressBarWrapper";
import InputUnitMenu from "../Common/FormComponents/InputUnitMenu/InputUnitMenu"; import InputUnitMenu from "../Common/FormComponents/InputUnitMenu/InputUnitMenu";
import CheckboxWrapper from "../Common/FormComponents/CheckboxWrapper/CheckboxWrapper"; import CheckboxWrapper from "../Common/FormComponents/CheckboxWrapper/CheckboxWrapper";
import PageLayout from "../Common/Layout/PageLayout";
interface ISpeedtest { interface ISpeedtest {
classes: any; classes: any;
@@ -43,33 +45,6 @@ interface ISpeedtest {
const styles = (theme: Theme) => const styles = (theme: Theme) =>
createStyles({ createStyles({
advancedConfiguration: {
color: "#2781B0",
fontSize: 10,
textDecoration: "underline",
border: "none",
backgroundColor: "transparent",
cursor: "pointer",
alignItems: "center",
display: "flex",
float: "right",
"&:hover": {
color: "#07193E",
},
"& svg": {
width: 10,
alignSelf: "center",
marginLeft: 5,
},
},
advancedOpen: {
transform: "rotateZ(-90deg) translateX(-4px) translateY(2px)",
},
advancedClosed: {
transform: "rotateZ(90deg)",
},
advancedContent: { advancedContent: {
backgroundColor: "#FBFAFA", backgroundColor: "#FBFAFA",
maxHeight: 0, maxHeight: 0,
@@ -83,12 +58,6 @@ const styles = (theme: Theme) =>
paddingBottom: 15, paddingBottom: 15,
}, },
}, },
advancedButton: {
flexGrow: 1,
alignItems: "flex-end",
display: "flex",
justifyContent: "flex-end",
},
progressContainer: { progressContainer: {
padding: "0 15px", padding: "0 15px",
}, },
@@ -99,6 +68,7 @@ const styles = (theme: Theme) =>
advancedOption: { advancedOption: {
marginTop: 20, marginTop: 20,
}, },
...advancedFilterToggleStyles,
...actionsTray, ...actionsTray,
...searchField, ...searchField,
...containerForHeader(theme.spacing(4)), ...containerForHeader(theme.spacing(4)),
@@ -215,11 +185,9 @@ const Speedtest = ({ classes }: ISpeedtest) => {
return ( return (
<Fragment> <Fragment>
<PageHeader label="Speedtest" /> <PageHeader label="Speedtest" />
<BackLink to="/tools" label="Return to Tools" />
<Grid container className={classes.container}> <PageLayout>
<Grid item xs={12}>
<BackLink to="/tools" label="Return to Tools" />
</Grid>
<Grid item xs={12} className={classes.boxy}> <Grid item xs={12} className={classes.boxy}>
<Grid container> <Grid container>
<Grid item> <Grid item>
@@ -384,7 +352,7 @@ const Speedtest = ({ classes }: ISpeedtest) => {
</Grid> </Grid>
</Grid> </Grid>
</Grid> </Grid>
</Grid> </PageLayout>
</Fragment> </Fragment>
); );
}; };

View File

@@ -28,6 +28,7 @@ import {
} from "../../Common/FormComponents/common/styleLibrary"; } from "../../Common/FormComponents/common/styleLibrary";
import PageHeader from "../../Common/PageHeader/PageHeader"; import PageHeader from "../../Common/PageHeader/PageHeader";
import SettingsCard from "../../Common/SettingsCard/SettingsCard"; import SettingsCard from "../../Common/SettingsCard/SettingsCard";
import PageLayout from "../../Common/Layout/PageLayout";
interface IConfigurationOptions { interface IConfigurationOptions {
classes: any; classes: any;
@@ -78,7 +79,7 @@ const ToolsList = ({ classes }: IConfigurationOptions) => {
return ( return (
<Fragment> <Fragment>
<PageHeader label={"Tools"} /> <PageHeader label={"Tools"} />
<Grid container className={classes.container}> <PageLayout>
<Grid item xs={12}> <Grid item xs={12}>
<Grid item xs={12}> <Grid item xs={12}>
<div className={classes.settingsOptionsContainer}> <div className={classes.settingsOptionsContainer}>
@@ -92,7 +93,7 @@ const ToolsList = ({ classes }: IConfigurationOptions) => {
</div> </div>
</Grid> </Grid>
</Grid> </Grid>
</Grid> </PageLayout>
</Fragment> </Fragment>
); );
}; };

View File

@@ -36,12 +36,14 @@ import {
hrClass, hrClass,
inlineCheckboxes, inlineCheckboxes,
searchField, searchField,
tableStyles,
} from "../Common/FormComponents/common/styleLibrary"; } from "../Common/FormComponents/common/styleLibrary";
import TableWrapper from "../Common/TableWrapper/TableWrapper"; import TableWrapper from "../Common/TableWrapper/TableWrapper";
import PageHeader from "../Common/PageHeader/PageHeader"; import PageHeader from "../Common/PageHeader/PageHeader";
import CheckboxWrapper from "../Common/FormComponents/CheckboxWrapper/CheckboxWrapper"; import CheckboxWrapper from "../Common/FormComponents/CheckboxWrapper/CheckboxWrapper";
import moment from "moment/moment"; import moment from "moment/moment";
import BackLink from "../../../common/BackLink"; import BackLink from "../../../common/BackLink";
import PageLayout from "../Common/Layout/PageLayout";
const styles = (theme: Theme) => const styles = (theme: Theme) =>
createStyles({ createStyles({
@@ -71,18 +73,14 @@ const styles = (theme: Theme) =>
timeItem: { timeItem: {
width: 100, width: 100,
}, },
labelCheckboxes: {
fontSize: 16,
fontWeight: 700,
paddingTop: 19,
},
startButton: { startButton: {
textAlign: "right", textAlign: "right",
}, },
...actionsTray, ...actionsTray,
...searchField, ...searchField,
...hrClass, ...hrClass,
...inlineCheckboxes,
...tableStyles,
searchField: { searchField: {
...searchField.searchField, ...searchField.searchField,
margin: "0 5px", margin: "0 5px",
@@ -96,6 +94,39 @@ const styles = (theme: Theme) =>
tableWrapper: { tableWrapper: {
height: "calc(100vh - 292px)", height: "calc(100vh - 292px)",
}, },
inlineCheckboxes: {
...inlineCheckboxes.inlineCheckboxes,
alignItems: "center",
"@media (max-width: 900px)": {
flexFlow: "column",
alignItems: "flex-start",
},
},
checkBoxLabel: {
marginTop: 10,
fontSize: 16,
fontWeight: 500,
},
formBox: {
border: "1px solid #EAEAEA",
padding: 15,
marginBottom: 15,
},
midColumnCheckboxes: {
display: "flex",
},
separatorBar: {
fontSize: 16,
fontWeight: 700,
paddingTop: 19,
"@media (max-width: 900px)": {
display: "none",
},
},
noMinWidthLabel: {
fontWeight: 400,
},
...containerForHeader(theme.spacing(4)), ...containerForHeader(theme.spacing(4)),
}); });
@@ -193,248 +224,250 @@ const Trace = ({
return ( return (
<Fragment> <Fragment>
<PageHeader label={"Trace"} /> <PageHeader label={"Trace"} />
<Grid container className={classes.container}> <BackLink to="/tools" label="Return to Tools" />
<Grid item xs={12}> <PageLayout>
<BackLink to="/tools" label="Return to Tools" /> <Grid xs={12} className={classes.formBox}>
</Grid> <Grid item xs={12} className={classes.actionsTray}>
<Grid item xs={12} className={classes.actionsTray}> <TextField
<TextField className={classes.searchField}
placeholder="Status Code" id="status-code"
className={classes.searchField} label="Status Code"
id="status-code" InputProps={{
label="" disableUnderline: true,
InputProps={{ }}
disableUnderline: true, value={statusCode}
}} onChange={(e) => {
value={statusCode} setStatusCode(e.target.value);
onChange={(e) => { }}
setStatusCode(e.target.value);
}}
disabled={traceStarted}
variant="standard"
/>
<TextField
placeholder="Method"
className={classes.searchField}
id="method"
label=""
InputProps={{
disableUnderline: true,
}}
value={method}
onChange={(e) => {
setMethod(e.target.value);
}}
disabled={traceStarted}
variant="standard"
/>
<TextField
placeholder="Function Name"
className={classes.searchField}
id="func-name"
label=""
disabled={traceStarted}
InputProps={{
disableUnderline: true,
}}
value={func}
onChange={(e) => {
setFunc(e.target.value);
}}
variant="standard"
/>
<TextField
placeholder="Path"
className={classes.searchField}
id="path"
label=""
disabled={traceStarted}
InputProps={{
disableUnderline: true,
}}
value={path}
onChange={(e) => {
setPath(e.target.value);
}}
variant="standard"
/>
<TextField
type="number"
className={classes.searchField}
id="fthreshold"
label="Response Threshold"
disabled={traceStarted}
InputProps={{
disableUnderline: true,
}}
inputProps={{
min: 0,
}}
value={threshold}
onChange={(e) => {
setThreshold(parseInt(e.target.value));
}}
variant="standard"
/>
</Grid>
<Grid item xs={12} className={classes.inlineCheckboxes}>
<span className={classes.labelCheckboxes}>Calls to trace:</span>
<CheckboxWrapper
checked={all}
id={"all_calls"}
name={"all_calls"}
label={"All"}
onChange={(item) => {
setAll(item.target.checked);
}}
value={"all"}
disabled={traceStarted}
/>
<CheckboxWrapper
checked={s3 || all}
id={"s3_calls"}
name={"s3_calls"}
label={"S3"}
onChange={(item) => {
setS3(item.target.checked);
}}
value={"s3"}
disabled={all || traceStarted}
/>
<CheckboxWrapper
checked={internal || all}
id={"internal_calls"}
name={"internal_calls"}
label={"Internal"}
onChange={(item) => {
setInternal(item.target.checked);
}}
value={"internal"}
disabled={all || traceStarted}
/>
<CheckboxWrapper
checked={storage || all}
id={"storage_calls"}
name={"storage_calls"}
label={"Storage"}
onChange={(item) => {
setStorage(item.target.checked);
}}
value={"storage"}
disabled={all || traceStarted}
/>
<CheckboxWrapper
checked={os || all}
id={"os_calls"}
name={"os_calls"}
label={"OS"}
onChange={(item) => {
setOS(item.target.checked);
}}
value={"os"}
disabled={all || traceStarted}
/>
<span className={classes.labelCheckboxes}>
&nbsp; &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;
</span>
<CheckboxWrapper
checked={errors}
id={"only_errors"}
name={"only_errors"}
label={"Display only Errors"}
onChange={(item) => {
setErrors(item.target.checked);
}}
value={"only_errors"}
disabled={traceStarted}
/>
</Grid>
<Grid item xs={12} className={classes.startButton}>
{!traceStarted && (
<Button
type="submit"
variant="contained"
color="primary"
disabled={traceStarted} disabled={traceStarted}
onClick={startTrace} variant="standard"
> />
Start <TextField
</Button> className={classes.searchField}
)} id="method"
{traceStarted && ( label="Method"
<Button InputProps={{
type="button" disableUnderline: true,
variant="contained" }}
color="primary" value={method}
onClick={stopTrace} onChange={(e) => {
> setMethod(e.target.value);
Stop }}
</Button> disabled={traceStarted}
)} variant="standard"
/>
<TextField
label="Function Name"
className={classes.searchField}
id="func-name"
disabled={traceStarted}
InputProps={{
disableUnderline: true,
}}
value={func}
onChange={(e) => {
setFunc(e.target.value);
}}
variant="standard"
/>
<TextField
className={classes.searchField}
id="path"
label="Path"
disabled={traceStarted}
InputProps={{
disableUnderline: true,
}}
value={path}
onChange={(e) => {
setPath(e.target.value);
}}
variant="standard"
/>
<TextField
type="number"
className={classes.searchField}
id="fthreshold"
label="Response Threshold"
disabled={traceStarted}
InputProps={{
disableUnderline: true,
}}
inputProps={{
min: 0,
}}
value={threshold}
onChange={(e) => {
setThreshold(parseInt(e.target.value));
}}
variant="standard"
/>
</Grid>
<Grid item xs={12} className={classes.inlineCheckboxes}>
<div className={classes.checkBoxLabel}>Calls to trace:</div>
<div className={classes.midColumnCheckboxes}>
<CheckboxWrapper
checked={all}
classes={classes}
id={"all_calls"}
name={"all_calls"}
label={"All"}
onChange={(item) => {
setAll(item.target.checked);
}}
value={"all"}
disabled={traceStarted}
/>
<CheckboxWrapper
checked={s3 || all}
id={"s3_calls"}
classes={classes}
name={"s3_calls"}
label={"S3"}
onChange={(item) => {
setS3(item.target.checked);
}}
value={"s3"}
disabled={all || traceStarted}
/>
<CheckboxWrapper
checked={internal || all}
id={"internal_calls"}
classes={classes}
name={"internal_calls"}
label={"Internal"}
onChange={(item) => {
setInternal(item.target.checked);
}}
value={"internal"}
disabled={all || traceStarted}
/>
<CheckboxWrapper
checked={storage || all}
id={"storage_calls"}
classes={classes}
name={"storage_calls"}
label={"Storage"}
onChange={(item) => {
setStorage(item.target.checked);
}}
value={"storage"}
disabled={all || traceStarted}
/>
<CheckboxWrapper
checked={os || all}
id={"os_calls"}
classes={classes}
name={"os_calls"}
label={"OS"}
onChange={(item) => {
setOS(item.target.checked);
}}
value={"os"}
disabled={all || traceStarted}
/>
<span className={classes.separatorBar}>
&nbsp; &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp;
</span>
</div>
<CheckboxWrapper
checked={errors}
id={"only_errors"}
classes={classes}
name={"only_errors"}
label={"Display only Errors"}
onChange={(item) => {
setErrors(item.target.checked);
}}
value={"only_errors"}
disabled={traceStarted}
/>
</Grid>
<Grid item xs={12} className={classes.startButton}>
{!traceStarted && (
<Button
type="submit"
variant="contained"
color="primary"
disabled={traceStarted}
onClick={startTrace}
>
Start
</Button>
)}
{traceStarted && (
<Button
type="button"
variant="contained"
color="primary"
onClick={stopTrace}
>
Stop
</Button>
)}
</Grid>
</Grid> </Grid>
<Grid item xs={12}> <Grid item xs={12} className={classes.tableBlock}>
<br /> <TableWrapper
</Grid> itemActions={[]}
columns={[
<TableWrapper {
itemActions={[]} label: "Time",
columns={[ elementKey: "ptime",
{ renderFunction: (time: Date) => {
label: "Time", const timeParse = new Date(time);
elementKey: "ptime", return timeFromDate(timeParse);
renderFunction: (time: Date) => { },
const timeParse = new Date(time); globalClass: classes.timeItem,
return timeFromDate(timeParse);
}, },
globalClass: classes.timeItem, { label: "Name", elementKey: "api" },
}, {
{ label: "Name", elementKey: "api" }, label: "Status",
{ elementKey: "",
label: "Status", renderFunction: (fullElement: TraceMessage) =>
elementKey: "", `${fullElement.statusCode} ${fullElement.statusMsg}`,
renderFunction: (fullElement: TraceMessage) => renderFullObject: true,
`${fullElement.statusCode} ${fullElement.statusMsg}`, },
renderFullObject: true, {
}, label: "Location",
{ elementKey: "configuration_id",
label: "Location", renderFunction: (fullElement: TraceMessage) =>
elementKey: "configuration_id", `${fullElement.host} ${fullElement.client}`,
renderFunction: (fullElement: TraceMessage) => renderFullObject: true,
`${fullElement.host} ${fullElement.client}`, },
renderFullObject: true, {
}, label: "Load Time",
{ elementKey: "callStats.duration",
label: "Load Time", globalClass: classes.timeItem,
elementKey: "callStats.duration", },
globalClass: classes.timeItem, {
}, label: "Upload",
{ elementKey: "callStats.rx",
label: "Upload", renderFunction: niceBytes,
elementKey: "callStats.rx", globalClass: classes.sizeItem,
renderFunction: niceBytes, },
globalClass: classes.sizeItem, {
}, label: "Download",
{ elementKey: "callStats.tx",
label: "Download", renderFunction: niceBytes,
elementKey: "callStats.tx", globalClass: classes.sizeItem,
renderFunction: niceBytes, },
globalClass: classes.sizeItem, ]}
}, isLoading={false}
]} records={messages}
isLoading={false} entityName="Traces"
records={messages} idField="api"
entityName="Traces" customEmptyMessage={
idField="api" traceStarted
customEmptyMessage={ ? "No Traced elements received yet"
traceStarted : "Trace is not started yet"
? "No Traced elements received yet" }
: "Trace is not started yet" customPaperHeight={classes.tableWrapper}
} autoScrollToBottom
customPaperHeight={classes.tableWrapper} />
autoScrollToBottom </Grid>
/> </PageLayout>
</Grid>
</Fragment> </Fragment>
); );
}; };

View File

@@ -37,34 +37,29 @@ import {
actionsTray, actionsTray,
containerForHeader, containerForHeader,
searchField, searchField,
tableStyles,
} from "../Common/FormComponents/common/styleLibrary"; } from "../Common/FormComponents/common/styleLibrary";
import { ErrorResponseHandler } from "../../../common/types"; import { ErrorResponseHandler } from "../../../common/types";
import TableWrapper from "../Common/TableWrapper/TableWrapper"; import TableWrapper from "../Common/TableWrapper/TableWrapper";
import PageHeader from "../Common/PageHeader/PageHeader"; import PageHeader from "../Common/PageHeader/PageHeader";
import api from "../../../common/api"; import api from "../../../common/api";
import BackLink from "../../../common/BackLink"; import BackLink from "../../../common/BackLink";
import PageLayout from "../Common/Layout/PageLayout";
const styles = (theme: Theme) => const styles = (theme: Theme) =>
createStyles({ createStyles({
watchList: {
background: "white",
height: "400px",
overflow: "auto",
"& ul": {
margin: "4px",
padding: "0px",
},
"& ul li": {
listStyle: "none",
margin: "0px",
padding: "0px",
borderBottom: "1px solid #dedede",
},
},
searchPrefix: { searchPrefix: {
flexGrow: 1, flexGrow: 1,
marginLeft: 15, marginLeft: 15,
}, },
watchTableHeight: {
height: "calc(100vh - 270px)",
},
bucketField: {
flexGrow: 2,
minWidth: 200,
},
...tableStyles,
...actionsTray, ...actionsTray,
...searchField, ...searchField,
...containerForHeader(theme.spacing(4)), ...containerForHeader(theme.spacing(4)),
@@ -73,7 +68,6 @@ const styles = (theme: Theme) =>
const SelectStyled = withStyles((theme: Theme) => const SelectStyled = withStyles((theme: Theme) =>
createStyles({ createStyles({
root: { root: {
width: 450,
lineHeight: "50px", lineHeight: "50px",
"label + &": { "label + &": {
marginTop: theme.spacing(3), marginTop: theme.spacing(3),
@@ -86,7 +80,6 @@ const SelectStyled = withStyles((theme: Theme) =>
height: 50, height: 50,
fontSize: 13, fontSize: 13,
lineHeight: "50px", lineHeight: "50px",
width: 450,
}, },
}) })
)(InputBase); )(InputBase);
@@ -191,13 +184,11 @@ const Watch = ({
return ( return (
<React.Fragment> <React.Fragment>
<PageHeader label="Watch" /> <PageHeader label="Watch" />
<Grid container className={classes.container}> <BackLink to="/tools" label="Return to Tools" />
<Grid item xs={12}> <PageLayout>
<BackLink to="/tools" label="Return to Tools" />
</Grid>
<Grid item xs={12}> <Grid item xs={12}>
<Grid item xs={12} className={classes.actionsTray}> <Grid item xs={12} className={classes.actionsTray}>
<FormControl variant="outlined"> <FormControl variant="outlined" className={classes.bucketField}>
<Select <Select
id="bucket-name" id="bucket-name"
name="bucket-name" name="bucket-name"
@@ -227,10 +218,9 @@ const Watch = ({
</Select> </Select>
</FormControl> </FormControl>
<TextField <TextField
placeholder="Prefix"
className={`${classes.searchField} ${classes.searchPrefix}`} className={`${classes.searchField} ${classes.searchPrefix}`}
id="prefix-resource" id="prefix-resource"
label="" label="Prefix"
disabled={start} disabled={start}
InputProps={{ InputProps={{
disableUnderline: true, disableUnderline: true,
@@ -241,10 +231,9 @@ const Watch = ({
variant="standard" variant="standard"
/> />
<TextField <TextField
placeholder="Suffix"
className={`${classes.searchField} ${classes.searchPrefix}`} className={`${classes.searchField} ${classes.searchPrefix}`}
id="suffix-resource" id="suffix-resource"
label="" label="Suffix"
disabled={start} disabled={start}
InputProps={{ InputProps={{
disableUnderline: true, disableUnderline: true,
@@ -264,32 +253,33 @@ const Watch = ({
Start Start
</Button> </Button>
</Grid> </Grid>
<Grid item xs={12}>
<br /> <div className={classes.tableBlock}>
</Grid> <TableWrapper
<TableWrapper columns={[
columns={[ {
{ label: "Time",
label: "Time", elementKey: "Time",
elementKey: "Time", renderFunction: timeFromDate,
renderFunction: timeFromDate, },
}, {
{ label: "Size",
label: "Size", elementKey: "Size",
elementKey: "Size", renderFunction: niceBytes,
renderFunction: niceBytes, },
}, { label: "Type", elementKey: "Type" },
{ label: "Type", elementKey: "Type" }, { label: "Path", elementKey: "Path" },
{ label: "Path", elementKey: "Path" }, ]}
]} records={messages}
records={messages} entityName={"Watch"}
entityName={"Watch"} customEmptyMessage={"No Changes at this time"}
customEmptyMessage={"No Changes at this time"} idField={"watch_table"}
idField={"watch_table"} isLoading={false}
isLoading={false} customPaperHeight={classes.watchTableHeight}
/> />
</div>
</Grid> </Grid>
</Grid> </PageLayout>
</React.Fragment> </React.Fragment>
); );
}; };