From 1108c3aafc08d84cdd1ad95f23ccb46789dc38ab Mon Sep 17 00:00:00 2001 From: Gage Krumbach Date: Thu, 3 Oct 2024 10:13:40 -0500 Subject: [PATCH 1/7] Remove duplication in pipeline import modal --- .../content/import/PipelineImportBase.tsx | 191 +++++++++++++ .../content/import/PipelineImportModal.tsx | 250 ++++-------------- .../import/PipelineVersionImportModal.tsx | 236 ++++------------- .../content/import/useImportModalData.ts | 21 +- 4 files changed, 302 insertions(+), 396 deletions(-) create mode 100644 frontend/src/concepts/pipelines/content/import/PipelineImportBase.tsx diff --git a/frontend/src/concepts/pipelines/content/import/PipelineImportBase.tsx b/frontend/src/concepts/pipelines/content/import/PipelineImportBase.tsx new file mode 100644 index 0000000000..fcde8b3528 --- /dev/null +++ b/frontend/src/concepts/pipelines/content/import/PipelineImportBase.tsx @@ -0,0 +1,191 @@ +import * as React from 'react'; +import { + Alert, + Button, + Form, + FormGroup, + Modal, + Stack, + StackItem, + TextArea, + TextInput, +} from '@patternfly/react-core'; +import { DebouncedFunc } from 'lodash-es'; +import { usePipelinesAPI } from '~/concepts/pipelines/context'; +import { PipelineKFv2, PipelineVersionKFv2 } from '~/concepts/pipelines/kfTypes'; +import { getDisplayNameFromK8sResource } from '~/concepts/k8s/utils'; +import { DuplicateNameHelperText } from '~/concepts/pipelines/content/DuplicateNameHelperText'; +import { + PIPELINE_IMPORT_ARGO_ERROR_TEXT, + PIPELINE_ARGO_ERROR, +} from '~/concepts/pipelines/content/const'; +import { UpdateObjectAtPropAndValue } from '~/pages/projects/types'; +import { PipelineUploadOption, extractKindFromPipelineYAML } from './utils'; +import PipelineUploadRadio from './PipelineUploadRadio'; +import { PipelineImportData } from './useImportModalData'; + +export type PipelineImportBaseProps = { + title: string; + submitButtonText: string; + onClose: ( + result?: PipelineKFv2 | PipelineVersionKFv2, + currentPipeline?: PipelineKFv2 | null, + ) => void; + data: PipelineImportData; + setData: UpdateObjectAtPropAndValue; + resetData: () => void; + submitAction: () => Promise; + checkForDuplicateName: DebouncedFunc<(value: string) => Promise>; + children?: React.ReactNode; +}; + +const PipelineImportBase: React.FC = ({ + title, + submitButtonText, + onClose, + data, + setData, + resetData, + submitAction, + checkForDuplicateName, + children, +}) => { + const { project, apiAvailable } = usePipelinesAPI(); + const [importing, setImporting] = React.useState(false); + const [error, setError] = React.useState(); + const { name, description, fileContents, pipelineUrl, uploadOption } = data; + const [hasDuplicateName, setHasDuplicateName] = React.useState(false); + const isArgoWorkflow = extractKindFromPipelineYAML(fileContents) === 'Workflow'; + + const isImportButtonDisabled = + !apiAvailable || + importing || + !name || + (uploadOption === PipelineUploadOption.URL_IMPORT ? !pipelineUrl : !fileContents); + + const onBeforeClose = React.useCallback( + (result?: PipelineKFv2 | PipelineVersionKFv2) => { + onClose(result, data.pipeline); + setImporting(false); + setError(undefined); + resetData(); + setHasDuplicateName(false); + }, + [onClose, resetData, data.pipeline], + ); + + const handleNameChange = React.useCallback( + async (value: string) => { + setHasDuplicateName(false); + setData('name', value); + const isDuplicate = await checkForDuplicateName(value); + setHasDuplicateName(!!isDuplicate); + }, + [checkForDuplicateName, setData], + ); + + const onSubmit = () => { + setImporting(true); + setError(undefined); + + if (uploadOption === PipelineUploadOption.FILE_UPLOAD && isArgoWorkflow) { + setImporting(false); + setError(new Error(PIPELINE_IMPORT_ARGO_ERROR_TEXT)); + } else { + submitAction() + .then((result) => { + onBeforeClose(result); + }) + .catch((e) => { + setImporting(false); + setError(e); + }); + } + }; + + return ( + onBeforeClose()} + actions={[ + , + , + ]} + variant="medium" + data-testid="import-pipeline-modal" + > +
+ + + + {getDisplayNameFromK8sResource(project)} + + + {children} + + + handleNameChange(value)} + /> + {hasDuplicateName && } + + + + +