Skip to content

Commit cbfc8ad

Browse files
refactor(frontend): refactor frontend for new linting rules
1 parent ba01d15 commit cbfc8ad

File tree

9 files changed

+146
-141
lines changed

9 files changed

+146
-141
lines changed

frontend/relay-workflows-lib/lib/components/TasksFlow.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ const TasksFlow: React.FC<TasksFlowProps> = ({
204204
panOnDrag={true}
205205
preventScrolling={false}
206206
defaultViewport={defaultViewport}
207-
fitView={false}
207+
fitView={true}
208208
style={{ width: "100%", height: "100%", overflow: "auto" }}
209209
/>
210210
)}

frontend/relay-workflows-lib/lib/components/WorkflowsContent.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ interface WorkflowsContentProps {
3838
onLimitChange: (limit: number) => void;
3939
updatePageInfo: (hasNextPage: boolean, endCursor: string | null) => void;
4040
isPaginated: boolean;
41-
setIsPaginated: (b: boolean) => void;
41+
setIsPaginated: (isPaginated: boolean) => void;
4242
}
4343

4444
export default function WorkflowsContent({
@@ -60,6 +60,7 @@ export default function WorkflowsContent({
6060
const pageInfo = data.pageInfo;
6161
const fetchedWorkflows = data.nodes;
6262
const prevFetchedRef = useRef<string[]>([]);
63+
const isPaginatedRef = useRef<boolean>(isPaginated);
6364

6465
const [expandedWorkflows, setExpandedWorkflows] = useState<Set<string>>(
6566
new Set(),
@@ -74,12 +75,13 @@ export default function WorkflowsContent({
7475
const prevNames = prevFetchedRef.current;
7576
const fetchedChanged =
7677
JSON.stringify(currentNames) !== JSON.stringify(prevNames);
77-
if (fetchedChanged && isPaginated) {
78+
if (fetchedChanged && isPaginatedRef.current) {
7879
setTimeout(() => {
80+
isPaginatedRef.current = false;
7981
setIsPaginated(false);
8082
}, 0);
8183
}
82-
}, [isPaginated, fetchedWorkflows, setIsPaginated]);
84+
}, [isPaginatedRef, fetchedWorkflows, setIsPaginated]);
8385

8486
const handleToggleExpanded = (name: string) => {
8587
setExpandedWorkflows((prev) => {

frontend/relay-workflows-lib/lib/utils/workflowRelayUtils.ts

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
import { useCallback, useEffect, useMemo, useState } from "react";
1+
import { useCallback, useMemo } from "react";
22
import { useSearchParams } from "react-router-dom";
33
import { Artifact, Task } from "workflows-lib";
44
import { isWorkflowWithTasks } from "../utils/coreUtils";
55
import { useFragment } from "react-relay";
66
import { WorkflowTasksFragment } from "../graphql/WorkflowTasksFragment";
7-
import { WorkflowTasksFragment$key } from "../graphql/__generated__/WorkflowTasksFragment.graphql";
7+
import {
8+
WorkflowTasksFragment$data,
9+
WorkflowTasksFragment$key,
10+
} from "../graphql/__generated__/WorkflowTasksFragment.graphql";
811
import { JSONObject } from "workflows-lib";
912
import { SubmissionFormParametersFragment$data } from "../components/__generated__/SubmissionFormParametersFragment.graphql";
1013

@@ -53,32 +56,37 @@ export function useSelectedTaskIds(): [string[], (tasks: string[]) => void] {
5356
return [selectedTaskIds, setSelectedTaskIds];
5457
}
5558

59+
function setFetchedTasks(data: WorkflowTasksFragment$data): Task[] {
60+
if (data.status && isWorkflowWithTasks(data.status)) {
61+
return data.status.tasks.map((task: Task) => ({
62+
id: task.id,
63+
name: task.name,
64+
status: task.status,
65+
depends: [...(task.depends ?? [])],
66+
artifacts: task.artifacts.map((artifact: Artifact) => ({
67+
...artifact,
68+
parentTask: task.name,
69+
parentTaskId: task.id,
70+
key: `${task.id}-${artifact.name}`,
71+
})),
72+
workflow: data.name,
73+
instrumentSession: data.visit,
74+
stepType: task.stepType,
75+
}));
76+
}
77+
return [];
78+
}
79+
5680
export function useFetchedTasks(
5781
fragmentRef: WorkflowTasksFragment$key | null,
5882
): Task[] {
59-
const [fetchedTasks, setFetchedTasks] = useState<Task[]>([]);
6083
const data = useFragment(WorkflowTasksFragment, fragmentRef);
6184

62-
useEffect(() => {
63-
if (data && data.status && isWorkflowWithTasks(data.status)) {
64-
setFetchedTasks(
65-
data.status.tasks.map((task: Task) => ({
66-
id: task.id,
67-
name: task.name,
68-
status: task.status,
69-
depends: [...(task.depends ?? [])],
70-
artifacts: task.artifacts.map((artifact: Artifact) => ({
71-
...artifact,
72-
parentTask: task.name,
73-
parentTaskId: task.id,
74-
key: `${task.id}-${artifact.name}`,
75-
})),
76-
workflow: data.name,
77-
instrumentSession: data.visit,
78-
stepType: task.stepType,
79-
})),
80-
);
85+
const fetchedTasks: Task[] = useMemo(() => {
86+
if (data == null) {
87+
return [];
8188
}
89+
return setFetchedTasks(data);
8290
}, [data]);
8391

8492
return fetchedTasks;

frontend/relay-workflows-lib/lib/views/BaseSingleWorkflowView.tsx

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,33 @@ export default function BaseSingleWorkflowView({
3434
taskIds,
3535
fragmentRef,
3636
}: BaseSingleWorkflowViewProps) {
37-
const [artifactList, setArtifactList] = useState<Artifact[]>([]);
38-
const [outputTaskIds, setOutputTaskIds] = useState<string[]>([]);
3937
const data = useFragment(BaseSingleWorkflowViewFragment, fragmentRef);
4038
const fetchedTasks = useFetchedTasks(data ?? null);
4139
const [selectedTaskIds, setSelectedTaskIds] = useSelectedTaskIds();
4240
const [filledTaskId, setFilledTaskId] = useState<string | null>(null);
4341

4442
const taskTree = useMemo(() => buildTaskTree(fetchedTasks), [fetchedTasks]);
4543

44+
const outputTaskIds: string[] = useMemo(() => {
45+
const newOutputTaskIds: string[] = [];
46+
const traverse = (tasks: TaskNode[]) => {
47+
const sortedTasks = [...tasks].sort((a, b) => a.id.localeCompare(b.id));
48+
sortedTasks.forEach((taskNode) => {
49+
if (
50+
taskNode.children &&
51+
taskNode.children.length === 0 &&
52+
!newOutputTaskIds.includes(taskNode.id)
53+
) {
54+
newOutputTaskIds.push(taskNode.id);
55+
} else if (taskNode.children && taskNode.children.length > 0) {
56+
traverse(taskNode.children);
57+
}
58+
});
59+
};
60+
traverse(taskTree);
61+
return newOutputTaskIds;
62+
}, [taskTree]);
63+
4664
const handleSelectOutput = () => {
4765
setSelectedTaskIds(outputTaskIds);
4866
};
@@ -62,35 +80,15 @@ export default function BaseSingleWorkflowView({
6280
setSelectedTaskIds(taskIds ?? []);
6381
}, [taskIds, setSelectedTaskIds]);
6482

65-
useEffect(() => {
83+
const artifactList: Artifact[] = useMemo(() => {
6684
const filteredTasks = selectedTaskIds.length
6785
? selectedTaskIds
6886
.map((id) => fetchedTasks.find((task) => task.id === id))
6987
.filter((task): task is Task => !!task)
7088
: fetchedTasks;
71-
setArtifactList(filteredTasks.flatMap((task) => task.artifacts));
89+
return filteredTasks.flatMap((task) => task.artifacts);
7290
}, [selectedTaskIds, fetchedTasks]);
7391

74-
useEffect(() => {
75-
const newOutputTaskIds: string[] = [];
76-
const traverse = (tasks: TaskNode[]) => {
77-
const sortedTasks = [...tasks].sort((a, b) => a.id.localeCompare(b.id));
78-
sortedTasks.forEach((taskNode) => {
79-
if (
80-
taskNode.children &&
81-
taskNode.children.length === 0 &&
82-
!newOutputTaskIds.includes(taskNode.id)
83-
) {
84-
newOutputTaskIds.push(taskNode.id);
85-
} else if (taskNode.children && taskNode.children.length > 0) {
86-
traverse(taskNode.children);
87-
}
88-
});
89-
};
90-
traverse(taskTree);
91-
setOutputTaskIds(newOutputTaskIds);
92-
}, [taskTree]);
93-
9492
if (!data || !data.status) {
9593
return null;
9694
}

frontend/relay-workflows-lib/lib/views/WorkflowsListView.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,14 @@ const WorkflowsListView: React.FC<WorkflowsListViewProps> = ({
7272
{ fetchPolicy: "store-and-network" },
7373
);
7474

75-
const [isPaginated, setIsPaginated] = useState(false);
75+
const isPaginated = useRef(false);
7676
const lastPage = useRef(currentPage);
7777
const lastLimit = useRef(selectedLimit);
7878

79+
const setIsPaginated = useCallback((value: boolean) => {
80+
isPaginated.current = value;
81+
}, []);
82+
7983
const load = useCallback(() => {
8084
if (visit) {
8185
loadQuery(
@@ -98,7 +102,7 @@ const WorkflowsListView: React.FC<WorkflowsListViewProps> = ({
98102
currentPage !== lastPage.current ||
99103
selectedLimit !== lastLimit.current
100104
) {
101-
setIsPaginated(true);
105+
isPaginated.current = true;
102106
lastPage.current = currentPage;
103107
lastLimit.current = selectedLimit;
104108
}
@@ -154,7 +158,7 @@ const WorkflowsListView: React.FC<WorkflowsListViewProps> = ({
154158
onPageChange={goToPage}
155159
onLimitChange={changeLimit}
156160
updatePageInfo={updatePageInfo}
157-
isPaginated={isPaginated}
161+
isPaginated={isPaginated.current}
158162
setIsPaginated={setIsPaginated}
159163
/>
160164
</Suspense>

0 commit comments

Comments
 (0)