1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React, { useState } from 'react';
17 } from '@material-ui/core';
18 import { ArvadosTheme } from 'common/custom-theme';
25 } from 'components/icon/icon';
26 import { Process } from 'store/processes/process';
27 import { MPVPanelProps } from 'components/multi-panel-view/multi-panel-view';
31 } from 'views/process-panel/process-log-form';
32 import { ProcessLogCodeSnippet } from 'views/process-panel/process-log-code-snippet';
33 import { DefaultView } from 'components/default-view/default-view';
34 import { CodeSnippetDataProps } from 'components/code-snippet/code-snippet';
36 type CssRules = 'card' | 'content' | 'title' | 'iconHeader' | 'header' | 'root' | 'logViewer' | 'logViewerContainer';
38 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
43 paddingTop: theme.spacing.unit,
44 paddingBottom: theme.spacing.unit,
47 padding: theme.spacing.unit * 0,
58 paddingTop: theme.spacing.unit * 0.5
62 color: theme.customs.colors.green700
69 export interface ProcessLogsCardDataProps {
71 selectedFilter: FilterOption;
72 filters: FilterOption[];
75 export interface ProcessLogsCardActionProps {
76 onLogFilterChange: (filter: FilterOption) => void;
77 navigateToLog: (uuid: string) => void;
80 type ProcessLogsCardProps = ProcessLogsCardDataProps
81 & ProcessLogsCardActionProps
82 & CodeSnippetDataProps
83 & WithStyles<CssRules>
86 export const ProcessLogsCard = withStyles(styles)(
87 ({ classes, process, filters, selectedFilter, lines, onLogFilterChange, navigateToLog,
88 doHidePanel, doMaximizePanel, panelMaximized, panelName }: ProcessLogsCardProps) => {
89 const [wordWrapToggle, setWordWrapToggle] = useState<boolean>(true);
90 return <Grid item className={classes.root} xs={12}>
91 <Card className={classes.card}>
92 <CardHeader className={classes.header}
93 avatar={<LogIcon className={classes.iconHeader} />}
94 action={<Grid container direction='row' alignItems='center'>
96 <ProcessLogForm selectedFilter={selectedFilter}
97 filters={filters} onChange={onLogFilterChange} />
100 <Tooltip title="Toggle word wrapping" disableFocusListener>
101 <IconButton onClick={() => setWordWrapToggle(!wordWrapToggle)}>
107 <Tooltip title="Go to Log collection" disableFocusListener>
108 <IconButton onClick={() => navigateToLog(process.containerRequest.logUuid!)}>
113 { doMaximizePanel && !panelMaximized &&
114 <Tooltip title={`Maximize ${panelName || 'panel'}`} disableFocusListener>
115 <IconButton onClick={doMaximizePanel}><MaximizeIcon /></IconButton>
117 { doHidePanel && <Grid item>
118 <Tooltip title={`Close ${panelName || 'panel'}`} disableFocusListener>
119 <IconButton onClick={doHidePanel}><CloseIcon /></IconButton>
124 <Typography noWrap variant='h6' className={classes.title}>
128 <CardContent className={classes.content}>
131 className={classes.logViewerContainer}
135 <Grid className={classes.logViewer} item xs>
136 <ProcessLogCodeSnippet wordWrap={wordWrapToggle} lines={lines} />
141 messages={['No logs yet']} />