Skip to content
25 changes: 22 additions & 3 deletions frontend/src/components/logging/log-modal/LogModal.css
Original file line number Diff line number Diff line change
@@ -1,4 +1,23 @@
.clear-button{
margin-left: 50px;
margin-top: 10px;
.clear-button {
margin-left: 50px;
margin-top: 10px;
}

.log-modal-title {
display: inline-flex;
align-items: center;
}

.log-modal-title .copy-btn-outlined {
border: 1px solid #d9d9d9;
background: #fff;
color: rgba(0, 0, 0, 0.65);
margin-left: 8px;
height: auto;
min-width: auto;
}

.log-modal-title .copy-btn-outlined:hover {
border-color: #1677ff;
color: #1677ff;
}
45 changes: 43 additions & 2 deletions frontend/src/components/logging/log-modal/LogModal.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Modal, Table, Tooltip } from "antd";
import { Button, Modal, Table, Tooltip } from "antd";
import { useEffect, useState } from "react";
import PropTypes from "prop-types";
import { CopyOutlined } from "@ant-design/icons";

import "./LogModal.css";
import { useExceptionHandler } from "../../../hooks/useExceptionHandler";
Expand Down Expand Up @@ -29,6 +30,32 @@ function LogModal({
const [loading, setLoading] = useState(false);
const [selectedLogLevel, setSelectedLogLevel] = useState(null);
const [ordering, setOrdering] = useState(null);
const displayId = fileId || executionId;

const handleCopyToClipboard = (text, label = "Text") => {
if (!navigator.clipboard) {
setAlertDetails({
type: "error",
content: "Clipboard not available in this browser",
});
return;
}
navigator.clipboard.writeText(text).then(
() => {
setAlertDetails({
type: "success",
content: `${label} copied to clipboard`,
});
},
(err) => {
setAlertDetails({
type: "error",
content: `Failed to copy: ${err.message || "Unknown error"}`,
});
},
);
};

const [pagination, setPagination] = useState({
current: 1,
pageSize: 10,
Expand Down Expand Up @@ -150,7 +177,21 @@ function LogModal({
}, [logDescModalOpen, pagination.current, selectedLogLevel, ordering]);
return (
<Modal
title={`Execution Log Details - ${fileId || executionId}`}
title={
<span className="log-modal-title">
Execution Log Details - {displayId}
<Button
className="copy-btn-outlined"
icon={<CopyOutlined />}
onClick={() =>
handleCopyToClipboard(
displayId,
fileId ? "File Execution ID" : "Execution ID",
)
}
/>
</span>
}
centered
open={logDescModalOpen}
onCancel={handleClose}
Expand Down
Loading