Skip to content

Commit

Permalink
🐛 Add taskgroup when uploading binary
Browse files Browse the repository at this point in the history
Signed-off-by: ibolton336 <ibolton@redhat.com>
  • Loading branch information
ibolton336 committed Aug 10, 2023
1 parent 5e9a715 commit 4f33367
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 81 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import { useTranslation } from "react-i18next";

import {
Application,
IReadFile,
TaskData,
Taskgroup,
TaskgroupTask,
Expand All @@ -36,9 +35,8 @@ import {
} from "./schema";
import { useAsyncYupValidation } from "@app/hooks/useAsyncYupValidation";
import { CustomRules } from "./custom-rules";
import { useSetting } from "@app/queries/settings";
import defaultSources from "./sources";
import { useFetchIdentities } from "@app/queries/identities";
import { TaskGroupProvider, useTaskGroup } from "./components/TaskGroupContext";

interface IAnalysisWizard {
applications: Application[];
Expand Down Expand Up @@ -67,7 +65,7 @@ const defaultTaskData: TaskData = {
},
};

const defaultTaskgroup: Taskgroup = {
export const defaultTaskgroup: Taskgroup = {
name: `taskgroup.analyzer`,
addon: "analyzer",
data: {
Expand Down Expand Up @@ -96,14 +94,13 @@ export const AnalysisWizard: React.FC<IAnalysisWizard> = ({

const { pushNotification } = React.useContext(NotificationsContext);

const [currentTaskgroup, setCurrentTaskgroup] =
React.useState<Taskgroup | null>();
const { taskGroup, updateTaskGroup } = useTaskGroup();

const [stepIdReached, setStepIdReached] = React.useState(1);
const isMutating = useIsMutating();

const onCreateTaskgroupSuccess = (data: Taskgroup) => {
setCurrentTaskgroup(data);
updateTaskGroup(data);

Check warning on line 103 in client/src/app/pages/applications/analysis-wizard/analysis-wizard.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/analysis-wizard.tsx#L103

Added line #L103 was not covered by tests
};

const onCreateTaskgroupError = (error: Error | unknown) => {
Expand Down Expand Up @@ -139,7 +136,7 @@ export const AnalysisWizard: React.FC<IAnalysisWizard> = ({
);

const onDeleteTaskgroupSuccess = () => {
setCurrentTaskgroup(null);
updateTaskGroup(null);

Check warning on line 139 in client/src/app/pages/applications/analysis-wizard/analysis-wizard.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/analysis-wizard.tsx#L139

Added line #L139 was not covered by tests
};

const onDeleteTaskgroupError = (error: Error | unknown) => {
Expand Down Expand Up @@ -282,20 +279,20 @@ export const AnalysisWizard: React.FC<IAnalysisWizard> = ({
const isModeValid = applications.every((app) => isModeSupported(app, mode));

const handleCancel = () => {
if (currentTaskgroup && currentTaskgroup.id) {
deleteTaskgroup(currentTaskgroup.id);
if (taskGroup && taskGroup.id) {
deleteTaskgroup(taskGroup.id);

Check warning on line 283 in client/src/app/pages/applications/analysis-wizard/analysis-wizard.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/analysis-wizard.tsx#L283

Added line #L283 was not covered by tests
}
setCurrentTaskgroup(null);
updateTaskGroup(null);

Check warning on line 285 in client/src/app/pages/applications/analysis-wizard/analysis-wizard.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/analysis-wizard.tsx#L285

Added line #L285 was not covered by tests
reset();
onClose();
};

const onSubmit = (fieldValues: AnalysisWizardFormValues) => {
if (currentTaskgroup) {
const taskgroup = setupTaskgroup(currentTaskgroup, fieldValues);
if (taskGroup) {
const taskgroup = setupTaskgroup(taskGroup, fieldValues);

Check warning on line 292 in client/src/app/pages/applications/analysis-wizard/analysis-wizard.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/analysis-wizard.tsx#L292

Added line #L292 was not covered by tests
submitTaskgroup(taskgroup);
}
setCurrentTaskgroup(null);
updateTaskGroup(null);

Check warning on line 295 in client/src/app/pages/applications/analysis-wizard/analysis-wizard.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/analysis-wizard.tsx#L295

Added line #L295 was not covered by tests
reset();
onClose();
};
Expand All @@ -306,7 +303,7 @@ export const AnalysisWizard: React.FC<IAnalysisWizard> = ({
) => {
if (id && stepIdReached < (id as number)) setStepIdReached(id as number);
if (id === StepId.SetTargets) {
if (!currentTaskgroup) {
if (!taskGroup) {
createTaskgroup(defaultTaskgroup);
}
}
Expand Down Expand Up @@ -335,11 +332,6 @@ export const AnalysisWizard: React.FC<IAnalysisWizard> = ({
component: (
<SetMode
isSingleApp={applications.length === 1 ? true : false}
taskgroupID={
currentTaskgroup && currentTaskgroup?.id
? currentTaskgroup.id
: null
}
isModeValid={isModeValid}
/>
),
Expand All @@ -365,15 +357,7 @@ export const AnalysisWizard: React.FC<IAnalysisWizard> = ({
{
id: StepId.CustomRules,
name: t("wizard.terms.customRules"),
component: (
<CustomRules
taskgroupID={
currentTaskgroup && currentTaskgroup?.id
? currentTaskgroup.id
: null
}
/>
),
component: <CustomRules />,
...getStepNavProps(StepId.CustomRules),
},
{
Expand All @@ -395,28 +379,30 @@ export const AnalysisWizard: React.FC<IAnalysisWizard> = ({

return (
<>
{isOpen && (
<FormProvider {...methods}>
<Wizard
isOpen={isOpen}
title="Application analysis"
description={
<Truncate
content={applications.map((app) => app.name).join(", ")}
/>
}
navAriaLabel={`${title} steps`}
mainAriaLabel={`${title} content`}
steps={steps}
onNext={onMove}
onBack={onMove}
onSave={handleSubmit(onSubmit)}
onClose={() => {
handleCancel();
}}
/>
</FormProvider>
)}
<TaskGroupProvider>
{isOpen && (
<FormProvider {...methods}>
<Wizard
isOpen={isOpen}
title="Application analysis"
description={
<Truncate
content={applications.map((app) => app.name).join(", ")}
/>
}
navAriaLabel={`${title} steps`}
mainAriaLabel={`${title} content`}
steps={steps}
onNext={onMove}
onBack={onMove}
onSave={handleSubmit(onSubmit)}
onClose={() => {
handleCancel();

Check warning on line 400 in client/src/app/pages/applications/analysis-wizard/analysis-wizard.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/analysis-wizard.tsx#L399-L400

Added lines #L399 - L400 were not covered by tests
}}
/>
</FormProvider>
)}
</TaskGroupProvider>
</>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { Taskgroup } from "@app/api/models";
import React, { createContext, useContext, useState } from "react";

interface TaskGroupContext {
updateTaskGroup: (taskGroup: Taskgroup | null) => void;
taskGroup: Taskgroup | null;
}

const TaskGroupContext = createContext<TaskGroupContext>({
updateTaskGroup: () => {},

Check warning on line 10 in client/src/app/pages/applications/analysis-wizard/components/TaskGroupContext.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/components/TaskGroupContext.tsx#L10

Added line #L10 was not covered by tests
taskGroup: null,
});

export const useTaskGroup = () => useContext(TaskGroupContext);

interface TaskGroupProvider {
children: React.ReactNode;
}

export const TaskGroupProvider: React.FunctionComponent<TaskGroupProvider> = ({
children,
}) => {
const [taskGroup, setTaskGroup] = useState<Taskgroup | null>(null);

const updateTaskGroup = (newTaskGroup: Taskgroup | null) => {
setTaskGroup(newTaskGroup);

Check warning on line 26 in client/src/app/pages/applications/analysis-wizard/components/TaskGroupContext.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/components/TaskGroupContext.tsx#L26

Added line #L26 was not covered by tests
};

return (
<TaskGroupContext.Provider value={{ taskGroup, updateTaskGroup }}>
{children}
</TaskGroupContext.Provider>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import UploadIcon from "@patternfly/react-icons/dist/esm/icons/upload-icon";
import { useFormContext } from "react-hook-form";

import {
useCreateTaskgroupMutation,
useRemoveUploadedFileMutation,
useUploadFileTaskgroupMutation,
} from "@app/queries/taskgroups";
Expand All @@ -19,12 +20,12 @@ import spacing from "@patternfly/react-styles/css/utilities/Spacing/spacing";
import { uploadLimit } from "@app/Constants";
import { NotificationsContext } from "@app/components/NotificationsContext";
import { AnalysisWizardFormValues } from "../schema";
import { useTaskGroup } from "./TaskGroupContext";
import { Taskgroup } from "@app/api/models";
import { defaultTaskgroup } from "../analysis-wizard";

interface IUploadBinary {
taskgroupID: number;
}

export const UploadBinary: React.FC<IUploadBinary> = ({ taskgroupID }) => {
export const UploadBinary: React.FC = () => {
const { taskGroup, updateTaskGroup } = useTaskGroup();

Check warning on line 28 in client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx#L28

Added line #L28 was not covered by tests
const { setValue, watch } = useFormContext<AnalysisWizardFormValues>();
const artifact = watch("artifact");

Expand Down Expand Up @@ -90,6 +91,22 @@ export const UploadBinary: React.FC<IUploadBinary> = ({ taskgroupID }) => {
completedRemove,
failedRemove
);
const onCreateTaskgroupSuccess = (data: Taskgroup) => {
updateTaskGroup(data);

Check warning on line 95 in client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx#L94-L95

Added lines #L94 - L95 were not covered by tests
};

const onCreateTaskgroupError = (error: Error | unknown) => {
console.log("Taskgroup creation failed: ", error);
pushNotification({

Check warning on line 100 in client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx#L98-L100

Added lines #L98 - L100 were not covered by tests
title: "Taskgroup creation failed",
variant: "danger",
});
};

const { mutateAsync: createTaskgroup } = useCreateTaskgroupMutation(

Check warning on line 106 in client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx#L106

Added line #L106 was not covered by tests
onCreateTaskgroupSuccess,
onCreateTaskgroupError
);

const handleFileDrop = (_: DropEvent, droppedFiles: File[]) => {
if (droppedFiles[0]) {
Expand All @@ -98,13 +115,19 @@ export const UploadBinary: React.FC<IUploadBinary> = ({ taskgroupID }) => {
setFileUploadStatus(undefined);
const form = new FormData();
form.append("file", droppedFiles[0]);
uploadFile({
id: taskgroupID,
path: `binary/${droppedFiles[0].name}`,
formData: form,
file: droppedFiles[0],
});
setValue("artifact", droppedFiles[0]);
if (!taskGroup) {
createTaskgroup(defaultTaskgroup).then((data) => {
updateTaskGroup(data);

Check warning on line 120 in client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx#L119-L120

Added lines #L119 - L120 were not covered by tests
data.id &&
uploadFile({

Check warning on line 122 in client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx#L122

Added line #L122 was not covered by tests
id: data?.id,
path: `binary/${droppedFiles[0].name}`,
formData: form,
file: droppedFiles[0],
});
setValue("artifact", droppedFiles[0]);

Check warning on line 128 in client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx#L128

Added line #L128 was not covered by tests
});
}
}
};

Expand Down Expand Up @@ -175,10 +198,11 @@ export const UploadBinary: React.FC<IUploadBinary> = ({ taskgroupID }) => {
key={artifact.name}
customFileHandler={handleFile}
onClearClick={() => {
removeFile({
id: taskgroupID,
path: `binary/${artifact}`,
});
taskGroup?.id &&
removeFile({

Check warning on line 202 in client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/components/upload-binary.tsx#L202

Added line #L202 was not covered by tests
id: taskGroup?.id,
path: `binary/${artifact}`,
});
setValue("artifact", null);
}}
progressAriaLabel={"text"}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@ import { OptionWithValue, SimpleSelect } from "@app/components/SimpleSelect";
import { toOptionLike } from "@app/utils/model-utils";
import { useFetchIdentities } from "@app/queries/identities";
import useRuleFiles from "@app/hooks/useRuleFiles";
interface CustomRulesProps {
taskgroupID: number | null;
}
export const CustomRules: React.FC<CustomRulesProps> = (props) => {
import { useTaskGroup } from "./components/TaskGroupContext";

export const CustomRules: React.FC = () => {
const { t } = useTranslation();
const { taskGroup, updateTaskGroup } = useTaskGroup();

Check warning on line 61 in client/src/app/pages/applications/analysis-wizard/custom-rules.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/custom-rules.tsx#L61

Added line #L61 was not covered by tests

const { watch, setValue, control, getValues } =
useFormContext<AnalysisWizardFormValues>();
Expand Down Expand Up @@ -92,7 +92,7 @@ export const CustomRules: React.FC<CustomRulesProps> = (props) => {
successfullyReadFileCount,
handleFile,
removeFiles,
} = useRuleFiles(props?.taskgroupID, values.customRulesFiles);
} = useRuleFiles(taskGroup?.id, values.customRulesFiles);

Check warning on line 95 in client/src/app/pages/applications/analysis-wizard/custom-rules.tsx

View check run for this annotation

Codecov / codecov/patch

client/src/app/pages/applications/analysis-wizard/custom-rules.tsx#L95

Added line #L95 was not covered by tests

const repositoryTypeOptions: OptionWithValue<string>[] = [
{
Expand Down
11 changes: 2 additions & 9 deletions client/src/app/pages/applications/analysis-wizard/set-mode.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,10 @@ import { HookFormPFGroupController } from "@app/components/HookFormPFFields";

interface ISetMode {
isSingleApp: boolean;
taskgroupID: number | null;
isModeValid: boolean;
}

export const SetMode: React.FC<ISetMode> = ({
isSingleApp,
taskgroupID,
isModeValid,
}) => {
export const SetMode: React.FC<ISetMode> = ({ isSingleApp, isModeValid }) => {
const { t } = useTranslation();

const { watch, control, setValue } =
Expand Down Expand Up @@ -89,9 +84,7 @@ export const SetMode: React.FC<ISetMode> = ({
<p>{t("wizard.label.notAllAnalyzableDetails")}</p>
</Alert>
)}
{mode === "binary-upload" && taskgroupID && (
<UploadBinary taskgroupID={taskgroupID} />
)}
{mode === "binary-upload" && <UploadBinary />}
</Form>
);
};

0 comments on commit 4f33367

Please sign in to comment.