repeat and undo task steps

main
alex 2023-07-02 19:09:58 +02:00
parent 5d61ec5c87
commit cc59493b04
5 changed files with 119 additions and 31 deletions

View File

@ -32,6 +32,8 @@
"groupTasks.groupTasksViewModal.notification.inputsCannotBeEmpty.description": "Bitte füllen Sie alle Felder aus",
"groupTasks.groupTasksViewModal.button.tryAgain": "Erneut versuchen",
"groupTasks.groupTasksViewModal.button.continue": "Weiter",
"groupTasks.groupTasksViewModal.button.repeat": "Wiederholen",
"groupTasks.groupTasksViewModal.button.undo": "Rückgängig machen",
"groupTasks.groupTasksViewModal.button.resume": "Fortführen",
"groupTasks.groupTasksViewModal.popover.specifiedTaskInputs": "Spezifizierte Aufgaben-Eingaben",
"groupTasks.groupTasksViewModal.startedAt": "Gestartet am",
@ -47,6 +49,8 @@
"groupTasks.groupTasksViewModal.alertMessage.taskCanceled": "Aufgabe abgebrochen",
"groupTasks.groupTasksViewModal.alertMessage.taskFailed": "Aufgabe fehlgeschlagen",
"groupTasks.groupTasksViewModal.alertMessage.taskInputRequired": "Eingabe erforderlich",
"groupTasks.groupTasksViewModal.alertMessage.paused": "Pausiert",
"groupTasks.groupTasksViewModal.alertMessage.undoEnded": "Rückgängig machen beendet",
"groupTasks.groupTasksTableList.column.creator": "Ersteller",
"groupTasks.groupTasksTableList.column.groupName": "Gruppenname",
"groupTasks.groupTasksTableList.column.description": "Beschreibung",
@ -63,6 +67,7 @@
"groupTasks.groupTasksTableList.statusBadge.failed": "Fehlgeschlagen",
"groupTasks.groupTasksTableList.statusBadge.inputRequired": "Eingabe erforderlich",
"groupTasks.groupTasksTableList.statusBadge.paused": "Pausiert",
"groupTasks.groupTasksTableList.statusBadge.undoEnded": "Rückgängig gemacht",
"groupTasks.groupTasksTableList.button.newTask": "Neue Aufgabe",
"groupTasks.groupTasksTableList.button.reload": "Neu laden",
"groupTasks.groupTasksTableList.popover.title": "Sind Sie sicher, dass Sie die Gruppenkonfigurationen neu laden wollen?",

View File

@ -32,6 +32,8 @@
"groupTasks.groupTasksViewModal.notification.inputsCannotBeEmpty.description": "Please fill in all inputs",
"groupTasks.groupTasksViewModal.button.tryAgain": "Try again",
"groupTasks.groupTasksViewModal.button.continue": "Continue",
"groupTasks.groupTasksViewModal.button.repeat": "Repeat",
"groupTasks.groupTasksViewModal.button.undo": "Undo",
"groupTasks.groupTasksViewModal.button.resume": "Resume",
"groupTasks.groupTasksViewModal.popover.specifiedTaskInputs": "Specified Task Inputs",
"groupTasks.groupTasksViewModal.startedAt": "Started at",
@ -47,6 +49,8 @@
"groupTasks.groupTasksViewModal.alertMessage.taskCanceled": "Task canceled",
"groupTasks.groupTasksViewModal.alertMessage.taskFailed": "Task failed",
"groupTasks.groupTasksViewModal.alertMessage.taskInputRequired": "Input required",
"groupTasks.groupTasksViewModal.alertMessage.paused": "Paused",
"groupTasks.groupTasksViewModal.alertMessage.undoEnded": "Undo ended",
"groupTasks.groupTasksTableList.column.creator": "Creator",
"groupTasks.groupTasksTableList.column.groupName": "Group Name",
"groupTasks.groupTasksTableList.column.description": "Description",
@ -63,6 +67,7 @@
"groupTasks.groupTasksTableList.statusBadge.failed": "Failed",
"groupTasks.groupTasksTableList.statusBadge.inputRequired": "Input required",
"groupTasks.groupTasksTableList.statusBadge.paused": "Paused",
"groupTasks.groupTasksTableList.statusBadge.undoEnded": "Undo ended",
"groupTasks.groupTasksTableList.button.newTask": "New task",
"groupTasks.groupTasksTableList.button.reload": "Reload",
"groupTasks.groupTasksTableList.popover.title": "Are you sure you want to reload the group configs?",

View File

@ -140,6 +140,13 @@ export default function GroupTaskTableList({
text={t("groupTasks.groupTasksTableList.statusBadge.paused")}
/>
);
case Constants.GROUP_TASKS_STATUS.UNDO_ENDED:
return (
<Badge
status="warning"
text={t("groupTasks.groupTasksTableList.statusBadge.undoEnded")}
/>
);
default:
return <Badge status="error" text="Status not found" />;
}

View File

@ -10,6 +10,7 @@ import {
Popover,
Result,
Row,
Space,
Steps,
Tag,
notification,
@ -27,9 +28,12 @@ import {
GroupTasksStepsLockedAndUserUpdateInputValueRememberId,
} from "../../../utils";
import {
CheckOutlined,
FileImageOutlined,
InfoCircleOutlined,
LockOutlined,
RetweetOutlined,
UndoOutlined,
} from "@ant-design/icons";
import { StlViewer } from "react-stl-viewer";
import TextArea from "antd/es/input/TextArea";
@ -78,6 +82,7 @@ export default function GroupTasksViewModal({ isOpen }) {
return "error";
case Constants.GROUP_TASKS_STATUS.CANCELED:
case Constants.GROUP_TASKS_STATUS.PAUSED:
case Constants.GROUP_TASKS_STATUS.UNDO_ENDED:
return "warning";
case Constants.GROUP_TASKS_STATUS.INPUT_REQUIRED:
case Constants.GROUP_TASKS_STATUS.RUNNING:
@ -101,7 +106,9 @@ export default function GroupTasksViewModal({ isOpen }) {
"groupTasks.groupTasksViewModal.alertMessage.taskInputRequired"
);
case Constants.GROUP_TASKS_STATUS.PAUSED:
return "Paused";
return t("groupTasks.groupTasksViewModal.alertMessage.paused");
case Constants.GROUP_TASKS_STATUS.UNDO_ENDED:
return t("groupTasks.groupTasksViewModal.alertMessage.undoEnded");
default:
return "Alert message not found";
}
@ -118,6 +125,7 @@ export default function GroupTasksViewModal({ isOpen }) {
return "error";
case Constants.GROUP_TASKS_STATUS.INPUT_REQUIRED:
case Constants.GROUP_TASKS_STATUS.PAUSED:
case Constants.GROUP_TASKS_STATUS.UNDO_ENDED:
default:
return "wait";
}
@ -211,10 +219,11 @@ export default function GroupTasksViewModal({ isOpen }) {
);
};
const handleTaskResumeFromPauseTaskStep = (taskStepId, step) => {
const handleUserActionTaskStep = (action, taskStepId, step) => {
webSocketContext.SendSocketMessage(
SentMessagesCommands.TaskResumeFromPauseTaskStep,
SentMessagesCommands.HandleUserActionTaskStep,
{
action: action,
groupTaskId: currentGroupTask.Id,
category: currentGroupTask.Category,
groupId: currentGroupTask.GroupId,
@ -224,7 +233,13 @@ export default function GroupTasksViewModal({ isOpen }) {
);
};
const alertActionHandler = (status, taskStepId, index, taskLocked) => {
const ActionHandler = ({ status, taskStepId, index, taskLocked }) => {
const currentStepTask = webSocketContext.CategoryGroups.find(
(category) => category.category === currentGroupTask.Category
).groups.find((group) => group.id === currentGroupTask.GroupId).tasks[
index
];
switch (status) {
case Constants.GROUP_TASKS_STATUS.FAILED:
return (
@ -250,13 +265,55 @@ export default function GroupTasksViewModal({ isOpen }) {
</Button>
);
case Constants.GROUP_TASKS_STATUS.PAUSED:
return (
<Space>
{currentStepTask.repeatPossible && (
<Button
icon={<RetweetOutlined />}
size="small"
disabled={taskLocked}
onClick={() =>
handleUserActionTaskStep(2, taskStepId, index + 1)
}
>
{t("groupTasks.groupTasksViewModal.button.repeat")}
</Button>
)}
{currentStepTask.undoPossible && (
<Button
icon={<UndoOutlined />}
size="small"
disabled={taskLocked}
onClick={() =>
handleUserActionTaskStep(1, taskStepId, index + 1)
}
>
{t("groupTasks.groupTasksViewModal.button.undo")}
</Button>
)}
<Button
icon={<CheckOutlined />}
size="small"
type={
currentStepTask.repeatPossible && currentStepTask.undoPossible
? "primary"
: "default"
}
disabled={taskLocked}
onClick={() => handleUserActionTaskStep(0, taskStepId, index + 1)}
>
{t("groupTasks.groupTasksViewModal.button.resume")}
</Button>
</Space>
);
case Constants.GROUP_TASKS_STATUS.UNDO_ENDED:
return (
<Button
size="small"
disabled={taskLocked}
onClick={() =>
handleTaskResumeFromPauseTaskStep(taskStepId, index + 1)
}
onClick={() => handleUserActionTaskStep(2, taskStepId, index + 1)}
>
{t("groupTasks.groupTasksViewModal.button.resume")}
</Button>
@ -296,7 +353,9 @@ export default function GroupTasksViewModal({ isOpen }) {
groupTaskSteps[index] !== undefined &&
groupTaskSteps[index].Inputs !== "" &&
groupTaskSteps[index].Status !==
Constants.GROUP_TASKS_STATUS.INPUT_REQUIRED ? (
Constants.GROUP_TASKS_STATUS.INPUT_REQUIRED &&
groupTaskSteps[index].Status !==
Constants.GROUP_TASKS_STATUS.UNDO_ENDED ? (
<>
{groupTask.name}{" "}
<Popover
@ -394,21 +453,35 @@ export default function GroupTasksViewModal({ isOpen }) {
</p>
<Alert
style={{ width: "100%" }}
message={
<b>
{getAlertMessage(groupTaskSteps[index].Status)}{" "}
{groupTaskSteps[index].LockedByUserId !== "" && (
<>
<LockOutlined />{" "}
<MyAvatar
tooltip
allUsers={webSocketContext.AllUsers}
userId={groupTaskSteps[index].LockedByUserId}
avatarWidth={24}
/>
</>
)}
</b>
<div
style={{
display: "flex",
justifyContent: "space-between",
}}
>
<b>
{getAlertMessage(groupTaskSteps[index].Status)}{" "}
{groupTaskSteps[index].LockedByUserId !== "" && (
<>
<LockOutlined />{" "}
<MyAvatar
tooltip
allUsers={webSocketContext.AllUsers}
userId={groupTaskSteps[index].LockedByUserId}
avatarWidth={24}
/>
</>
)}
</b>
<ActionHandler
status={groupTaskSteps[index].Status}
index={index}
taskLocked={groupTaskSteps[index].LockedByUserId}
taskStepId={groupTaskSteps[index].Id}
/>
</div>
}
description={
groupTaskSteps[index].Status ===
@ -432,7 +505,10 @@ export default function GroupTasksViewModal({ isOpen }) {
</div>
) : (
groupTaskSteps[index].Log.length > 0 && (
<div id={`${currentGroupTask.Id}-scroll-${index}`}>
<div
id={`${currentGroupTask.Id}-scroll-${index}`}
style={{ width: "100%" }}
>
<GroupTaskStepLogHandler
currentGroupTaskId={currentGroupTask.Id}
log={groupTaskSteps[index].Log}
@ -444,12 +520,6 @@ export default function GroupTasksViewModal({ isOpen }) {
}
type={getAlertType(groupTaskSteps[index].Status)}
showIcon
action={alertActionHandler(
groupTaskSteps[index].Status,
groupTaskSteps[index].Id,
index,
groupTaskSteps[index].LockedByUserId
)}
/>
</>
) : (
@ -964,7 +1034,7 @@ function GroupTaskStepLogHandler({ currentGroupTaskId, log, files }) {
<span style={{ whiteSpace: "pre-line" }}>
{log}
{files !== "" && fileContent(JSON.parse(files))}
{files !== "" && files !== " " && fileContent(JSON.parse(files))}
</span>
);
}

View File

@ -29,6 +29,7 @@ export const Constants = {
FAILED: 4,
INPUT_REQUIRED: 5,
PAUSED: 6,
UNDO_ENDED: 7,
},
GLOBALS: {
MIN_USERNAME_LENGTH: 2,
@ -211,7 +212,7 @@ export const SentMessagesCommands = {
ScannersUseScanners: 15,
ScannersDisconnectScanner: 16,
GroupTasksCheckingForCategoryGroupChanges: 17,
TaskResumeFromPauseTaskStep: 18,
HandleUserActionTaskStep: 18,
};
export function WebSocketProvider({