import {
CloseIcon,
CollectionIcon,
+ CopyIcon,
LogIcon,
MaximizeIcon,
TextDecreaseIcon,
import { ProcessLogCodeSnippet } from 'views/process-panel/process-log-code-snippet';
import { DefaultView } from 'components/default-view/default-view';
import { CodeSnippetDataProps } from 'components/code-snippet/code-snippet';
+import CopyToClipboard from 'react-copy-to-clipboard';
type CssRules = 'card' | 'content' | 'title' | 'iconHeader' | 'header' | 'root' | 'logViewer' | 'logViewerContainer';
export interface ProcessLogsCardActionProps {
onLogFilterChange: (filter: FilterOption) => void;
navigateToLog: (uuid: string) => void;
+ onCopy: (text: string) => void;
}
type ProcessLogsCardProps = ProcessLogsCardDataProps
& MPVPanelProps;
export const ProcessLogsCard = withStyles(styles)(
- ({ classes, process, filters, selectedFilter, lines, onLogFilterChange, navigateToLog,
+ ({ classes, process, filters, selectedFilter, lines,
+ onLogFilterChange, navigateToLog, onCopy,
doHidePanel, doMaximizePanel, panelMaximized, panelName }: ProcessLogsCardProps) => {
const [wordWrapToggle, setWordWrapToggle] = useState<boolean>(true);
const [fontSize, setFontSize] = useState<number>(3);
</IconButton>
</Tooltip>
</Grid>
+ <Grid item>
+ <Tooltip title="Copy to clipboard" disableFocusListener>
+ <IconButton>
+ <CopyToClipboard text={lines.join()} onCopy={() => onCopy("Log copied to clipboard")}>
+ <CopyIcon />
+ </CopyToClipboard>
+ </IconButton>
+ </Tooltip>
+ </Grid>
<Grid item>
<Tooltip title="Toggle word wrapping" disableFocusListener>
<IconButton onClick={() => setWordWrapToggle(!wordWrapToggle)}>
cancelProcess: (uuid: string) => void;
onLogFilterChange: (filter: FilterOption) => void;
navigateToLog: (uuid: string) => void;
+ onLogCopyToClipboard: (uuid: string) => void;
}
export type ProcessPanelRootProps = ProcessPanelRootDataProps & ProcessPanelRootActionProps & WithStyles<CssRules>;
</MPVPanelContent>
<MPVPanelContent forwardProps xs maxHeight='50%'>
<ProcessLogsCard
+ onCopy={props.onLogCopyToClipboard}
process={process}
lines={getProcessPanelLogs(processLogsPanel)}
selectedFilter={{
import { openProcessInputDialog } from 'store/processes/process-input-actions';
import { cancelRunningWorkflow } from 'store/processes/processes-actions';
import { navigateToLogCollection, setProcessLogsPanelFilter } from 'store/process-logs-panel/process-logs-panel-actions';
+import { snackbarActions, SnackbarKind } from 'store/snackbar/snackbar-actions';
const mapStateToProps = ({ router, resources, processPanel, processLogsPanel }: RootState): ProcessPanelRootDataProps => {
const uuid = getProcessPanelCurrentUuid(router) || '';
};
const mapDispatchToProps = (dispatch: Dispatch): ProcessPanelRootActionProps => ({
+ onLogCopyToClipboard: (message: string) => {
+ dispatch<any>(snackbarActions.OPEN_SNACKBAR({
+ message,
+ hideDuration: 2000,
+ kind: SnackbarKind.SUCCESS,
+ }));
+ },
onContextMenu: (event, process) => {
dispatch<any>(openProcessContextMenu(event, process));
},