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> { export interface SelectableListProps<T> {
items: T[]; items: T[];
selectedValue?: t | null; selectedValue?: T | null;
renderLabel: (item: T) => React.ReactNode; renderLabel: (item: T) => React.ReactNode;
onSelect: (item: T) => void; onSelect: (item: T) => void;
} }

View File

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

View File

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

View File

@ -1,3 +1,4 @@
import React, { useEffect, useState } from "react";
import { import {
CreateWorkflowTemplateVersion, CreateWorkflowTemplateVersion,
TaskDefinition, TaskDefinition,
@ -17,7 +18,40 @@ const TasksTab: React.FC<TasksTabProps> = ({
isEditMode, isEditMode,
onTasksChange, 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[]) => { const handleTasksChange = (newTasks: TaskDefinition[]) => {
// Update the parent form state // Update the parent form state
@ -25,13 +59,18 @@ const TasksTab: React.FC<TasksTabProps> = ({
}; };
return ( return (
<div> <div className="two-column-grid">
<div className="fit-content-width">
<TaskList <TaskList
tasks={tasks} tasks={tasks}
taskType="GeneralTask" taskType="GeneralTask"
onChange={handleTasksChange} onChange={handleTasksChange}
selectedTask={selectedTask}
onSelectTask={setSelectedTask}
/> />
</div> </div>
<div>{selectedTask?.config.name as string}</div>
</div>
); );
}; };