Upgraded the Tasks tab, so that the item selected can be loaded into the editor

This commit is contained in:
Colin Dawson 2026-02-13 00:42:01 +00:00
parent 745473759d
commit 2f300faf90
4 changed files with 61 additions and 15 deletions

View File

@ -2,7 +2,7 @@ import React from "react";
export interface SelectableListProps<T> {
items: T[];
selectedValue?: t | null;
selectedValue?: T | null;
renderLabel: (item: T) => React.ReactNode;
onSelect: (item: T) => void;
}

View File

@ -59,6 +59,7 @@ const WorkflowTemplateDetails: React.FC<{ editMode: boolean }> = ({
.label(t("ActivityNameTemplate")),
description: Joi.string().required().allow("").label(t("Description")),
domainId: Joi.required(),
tasks: Joi.array().required(),
};
// -----------------------------

View File

@ -1,4 +1,4 @@
import React, { useState } from "react";
import React from "react";
import {
TaskDefinition,
TaskMetadata,
@ -12,13 +12,19 @@ interface TaskListProps {
tasks: TaskDefinition[];
taskType: string;
onChange: (tasks: TaskDefinition[]) => void;
selectedTask: TaskDefinition | null;
onSelectTask: (task: TaskDefinition | null) => void;
}
const TaskList: React.FC<TaskListProps> = ({ tasks, taskType, onChange }) => {
const TaskList: React.FC<TaskListProps> = ({
tasks,
taskType,
onChange,
selectedTask,
onSelectTask,
}) => {
const { t: tTaskType } = useTranslation(Namespaces.TaskTypes);
const [currentTask, setCurrentTask] = useState<TaskDefinition | null>(null);
const formatNewTaskName = (
displayName: string,
tasks: TaskDefinition<Record<string, unknown>>[],
@ -39,7 +45,7 @@ const TaskList: React.FC<TaskListProps> = ({ tasks, taskType, onChange }) => {
};
if (tasks.length === 0) {
setCurrentTask(newTask);
onSelectTask(newTask);
}
onChange([...tasks, newTask]);
};
@ -50,9 +56,9 @@ const TaskList: React.FC<TaskListProps> = ({ tasks, taskType, onChange }) => {
<SelectableList
items={tasks}
selectedValue={currentTask}
selectedValue={selectedTask}
renderLabel={(x) => x.config.name as string}
onSelect={(item) => setCurrentTask(item)}
onSelect={(item) => onSelectTask(item)}
/>
</div>
);

View File

@ -1,3 +1,4 @@
import React, { useEffect, useState } from "react";
import {
CreateWorkflowTemplateVersion,
TaskDefinition,
@ -17,7 +18,40 @@ const TasksTab: React.FC<TasksTabProps> = ({
isEditMode,
onTasksChange,
}) => {
const tasks = data.tasks ?? [];
const tasks = data.tasks;
const [selectedTask, setSelectedTask] = useState<TaskDefinition | null>(null);
useEffect(() => {
if (tasks.length === 0) {
if (selectedTask !== null) {
setSelectedTask(null);
}
return;
}
if (!selectedTask) {
setSelectedTask(tasks[0]);
return;
}
const selectedGuid = (selectedTask.config as any)?.guid;
if (selectedGuid) {
const match = tasks.find(
(task) => (task.config as any)?.guid === selectedGuid,
);
if (match && match !== selectedTask) {
setSelectedTask(match);
} else if (!match) {
setSelectedTask(tasks[0]);
}
return;
}
if (!tasks.includes(selectedTask)) {
setSelectedTask(tasks[0]);
}
}, [tasks, selectedTask]);
const handleTasksChange = (newTasks: TaskDefinition[]) => {
// Update the parent form state
@ -25,12 +59,17 @@ const TasksTab: React.FC<TasksTabProps> = ({
};
return (
<div>
<TaskList
tasks={tasks}
taskType="GeneralTask"
onChange={handleTasksChange}
/>
<div className="two-column-grid">
<div className="fit-content-width">
<TaskList
tasks={tasks}
taskType="GeneralTask"
onChange={handleTasksChange}
selectedTask={selectedTask}
onSelectTask={setSelectedTask}
/>
</div>
<div>{selectedTask?.config.name as string}</div>
</div>
);
};