Added sorting to the task list.
This commit is contained in:
parent
69bb924510
commit
f45f9f0b25
@ -7,6 +7,7 @@ import AddTaskButton from "./AddTaskButton";
|
|||||||
import { SelectableList } from "../../../../components/common/SelectableList";
|
import { SelectableList } from "../../../../components/common/SelectableList";
|
||||||
import { faExclamationCircle } from "@fortawesome/free-solid-svg-icons";
|
import { faExclamationCircle } from "@fortawesome/free-solid-svg-icons";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
|
import { sortTasksTopologically } from "./workflowGraphUtils";
|
||||||
|
|
||||||
interface TaskListProps {
|
interface TaskListProps {
|
||||||
tasks: TaskDefinition[];
|
tasks: TaskDefinition[];
|
||||||
@ -34,18 +35,18 @@ const TaskList: React.FC<TaskListProps> = ({
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
//if (tasks.length === 0) {
|
|
||||||
onSelectTask(newTask);
|
onSelectTask(newTask);
|
||||||
//}
|
|
||||||
onChange([...tasks, newTask]);
|
onChange([...tasks, newTask]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const sortedTasks = sortTasksTopologically(tasks);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<AddTaskButton allowedTasks={allowedTasks} onAdd={handleAddTask} />
|
<AddTaskButton allowedTasks={allowedTasks} onAdd={handleAddTask} />
|
||||||
|
|
||||||
<SelectableList
|
<SelectableList
|
||||||
items={tasks}
|
items={sortedTasks}
|
||||||
selectedValue={selectedTask}
|
selectedValue={selectedTask}
|
||||||
renderLabel={(x) => (
|
renderLabel={(x) => (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@ -25,3 +25,41 @@ export const getAllDescendants = (
|
|||||||
visit(guid);
|
visit(guid);
|
||||||
return descendants;
|
return descendants;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const sortTasksTopologically = (
|
||||||
|
tasks: TaskDefinition[],
|
||||||
|
): TaskDefinition[] => {
|
||||||
|
// Build adjacency list: task -> its predecessors
|
||||||
|
const preds = new Map<string, string[]>();
|
||||||
|
const byId = new Map<string, TaskDefinition>();
|
||||||
|
|
||||||
|
tasks.forEach((t) => {
|
||||||
|
const guid = t.config.guid as string;
|
||||||
|
byId.set(guid, t);
|
||||||
|
preds.set(guid, (t.config.predecessors as string[]) ?? []);
|
||||||
|
});
|
||||||
|
|
||||||
|
const result: TaskDefinition[] = [];
|
||||||
|
const visited = new Set<string>();
|
||||||
|
const temp = new Set<string>(); // for cycle detection (should never trigger now)
|
||||||
|
|
||||||
|
const visit = (guid: string) => {
|
||||||
|
if (visited.has(guid)) return;
|
||||||
|
if (temp.has(guid)) throw new Error("Cycle detected unexpectedly");
|
||||||
|
|
||||||
|
temp.add(guid);
|
||||||
|
|
||||||
|
for (const p of preds.get(guid) ?? []) {
|
||||||
|
visit(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
temp.delete(guid);
|
||||||
|
visited.add(guid);
|
||||||
|
result.push(byId.get(guid)!);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Visit all tasks
|
||||||
|
tasks.forEach((t) => visit(t.config.guid as string));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user