From c2bf80161446bf36c93ddbc3dc9884e2ef597ab5 Mon Sep 17 00:00:00 2001 From: Vardan Bansal Date: Tue, 29 Aug 2023 13:37:23 +0530 Subject: [PATCH 01/38] init --- .../pages/NewPipeline/NewPipeline.module.scss | 6 +++ .../NewPipeline/NewPipeline.module.scss.d.ts | 1 + web/src/pages/NewPipeline/NewPipeline.tsx | 42 +++++++++++++++++-- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/web/src/pages/NewPipeline/NewPipeline.module.scss b/web/src/pages/NewPipeline/NewPipeline.module.scss index 2504f965d..4061d4c3b 100644 --- a/web/src/pages/NewPipeline/NewPipeline.module.scss +++ b/web/src/pages/NewPipeline/NewPipeline.module.scss @@ -1,4 +1,6 @@ .main { + --header-height: 96px; + --heading-height: 58px; min-height: var(--page-height); background-color: var(--primary-bg) !important; @@ -6,3 +8,7 @@ align-items: center; } } + +.editorContainer { + height: calc(100vh - var(--header-height) - var(--heading-height)) !important; +} \ No newline at end of file diff --git a/web/src/pages/NewPipeline/NewPipeline.module.scss.d.ts b/web/src/pages/NewPipeline/NewPipeline.module.scss.d.ts index 02a1a8a7a..7c6df5678 100644 --- a/web/src/pages/NewPipeline/NewPipeline.module.scss.d.ts +++ b/web/src/pages/NewPipeline/NewPipeline.module.scss.d.ts @@ -3,5 +3,6 @@ declare const styles: { readonly main: string readonly layout: string + readonly editorContainer: string } export default styles diff --git a/web/src/pages/NewPipeline/NewPipeline.tsx b/web/src/pages/NewPipeline/NewPipeline.tsx index ae7dd546c..071331ac6 100644 --- a/web/src/pages/NewPipeline/NewPipeline.tsx +++ b/web/src/pages/NewPipeline/NewPipeline.tsx @@ -1,13 +1,47 @@ -import React from 'react' -import { Container, PageHeader } from '@harnessio/uicore' +import React, { useCallback } from 'react' +import { useMutate } from 'restful-react' +import { Container, PageHeader, PageBody } from '@harnessio/uicore' +import { Button, Layout, ButtonVariation } from '@harnessio/uicore' +import type { TypesPipeline, OpenapiCreatePipelineRequest } from 'services/code' import { useStrings } from 'framework/strings' +import { SourceCodeEditor } from 'components/SourceCodeEditor/SourceCodeEditor' + import css from './NewPipeline.module.scss' -const NewPipeline = () => { +const NewPipeline = (): JSX.Element => { + const { mutate: savePipeline } = useMutate({ + verb: 'POST', + path: `/api/v1/pipelines` + }) + + const handleSavePipeline = useCallback(async (): Promise => { + const payload: OpenapiCreatePipelineRequest = { + config_path: 'config_path_4', + default_branch: 'main', + space_ref: 'test-space', + repo_ref: 'test-space/vb-repo', + repo_type: 'GITNESS', + uid: 'pipeline_uid_4' + } + const response = await savePipeline(payload) + console.log(response) + }, []) + const { getString } = useStrings() return ( - + + + openModal() + }} + /> ) const columns: Column[] = useMemo( From fb044789926ddcc22ba80718e6e550c512ca3ccf Mon Sep 17 00:00:00 2001 From: Vardan Bansal Date: Tue, 29 Aug 2023 17:33:08 +0530 Subject: [PATCH 03/38] form integration --- web/src/framework/strings/stringTypes.ts | 6 ++ web/src/i18n/strings.en.yaml | 6 ++ .../pages/NewPipeline/NewPipelineModal.tsx | 102 +++++++++++++----- 3 files changed, 89 insertions(+), 25 deletions(-) diff --git a/web/src/framework/strings/stringTypes.ts b/web/src/framework/strings/stringTypes.ts index 6cb1b4be7..20f22dc8a 100644 --- a/web/src/framework/strings/stringTypes.ts +++ b/web/src/framework/strings/stringTypes.ts @@ -206,6 +206,7 @@ export interface StringsMap { 'homepage.welcomeText': string in: string inactiveBranches: string + isRequired: string leaveAComment: string license: string lineBreaks: string @@ -312,10 +313,15 @@ export interface StringsMap { payloadUrl: string payloadUrlLabel: string pending: string + 'pipelines.basedOn': string 'pipelines.createNewPipeline': string + 'pipelines.enterPipelineName': string + 'pipelines.enterYAMLPath': string + 'pipelines.failedToCreatePipeline': string 'pipelines.name': string 'pipelines.newPipelineButton': string 'pipelines.noData': string + 'pipelines.yamlPath': string 'pr.ableToMerge': string 'pr.addDescription': string 'pr.authorCommentedPR': string diff --git a/web/src/i18n/strings.en.yaml b/web/src/i18n/strings.en.yaml index be6aa224f..83995abcb 100644 --- a/web/src/i18n/strings.en.yaml +++ b/web/src/i18n/strings.en.yaml @@ -416,6 +416,7 @@ makeRequired: Make Required makeOptional: Make Optional remove: Remove required: Required +isRequired: is required noneYet: None Yet noOptionalReviewers: No Optional Reviewers noRequiredReviewers: No Required Reviewers @@ -625,6 +626,11 @@ pipelines: newPipelineButton: New Pipeline name: Pipeline Name createNewPipeline: Create New Pipeline + enterPipelineName: Enter pipeline name + basedOn: Based On + yamlPath: YAML Path + enterYAMLPath: Enter YAML path + failedToCreatePipeline: Failed to create pipeline executions: noData: There are no executions :( newExecutionButton: New Execution diff --git a/web/src/pages/NewPipeline/NewPipelineModal.tsx b/web/src/pages/NewPipeline/NewPipelineModal.tsx index a97fd7721..03fa62205 100644 --- a/web/src/pages/NewPipeline/NewPipelineModal.tsx +++ b/web/src/pages/NewPipeline/NewPipelineModal.tsx @@ -1,42 +1,56 @@ -import React, { useCallback } from 'react' +import React from 'react' import { useHistory } from 'react-router-dom' import { useMutate } from 'restful-react' -import { Button, ButtonVariation, Dialog, Layout } from '@harnessio/uicore' +import * as yup from 'yup' +import { Button, ButtonVariation, Dialog, FormInput, Formik, FormikForm, Layout, useToaster } from '@harnessio/uicore' import { useModalHook } from 'hooks/useModalHook' import { useGetSpaceParam } from 'hooks/useGetSpaceParam' import type { OpenapiCreatePipelineRequest, TypesPipeline } from 'services/code' import { useStrings } from 'framework/strings' import { useAppContext } from 'AppContext' +import { getErrorMessage } from 'utils/Utils' + +interface FormData { + name: string + branch: string + yamlPath: string +} const useNewPipelineModal = () => { const { routes } = useAppContext() const { getString } = useStrings() const space = useGetSpaceParam() const history = useHistory() + const { showError } = useToaster() const { mutate: savePipeline } = useMutate({ verb: 'POST', path: `/api/v1/pipelines` }) - const handleSavePipeline = useCallback(async (): Promise => { - const randomToken = (Math.random() + 1).toString(36).substring(7) - - const payload: OpenapiCreatePipelineRequest = { - config_path: `config_path_${randomToken}`, - default_branch: 'main', - space_ref: 'test-space', - repo_ref: 'test-space/vb-repo', - repo_type: 'GITNESS', - uid: `pipeline_uid_${randomToken}` + const handleCreatePipeline = (formData: FormData): void => { + const { name, branch, yamlPath } = formData + try { + const payload: OpenapiCreatePipelineRequest = { + config_path: yamlPath, + default_branch: branch, + space_ref: space, + repo_ref: `${space}/vb-repo`, + repo_type: 'GITNESS', + uid: name + } + savePipeline(payload) + .then(() => { + history.push(routes.toCODEPipelinesNew({ space })) + hideModal() + }) + .catch(_error => { + showError(getErrorMessage(_error), 0, 'pipelines.failedToCreatePipeline') + }) + } catch (exception) { + showError(getErrorMessage(exception), 0, 'pipelines.failedToCreatePipeline') } - await savePipeline(payload) - .then(() => { - history.push(routes.toCODEPipelinesNew({ space })) - hideModal() - }) - .catch(() => hideModal()) - }, []) + } const [openModal, hideModal] = useModalHook(() => { const onClose = () => { @@ -44,12 +58,50 @@ const useNewPipelineModal = () => { } return ( - - - ) }, []) From 982a40a3b7d446aae8622af1d2f3e3b9b0034020 Mon Sep 17 00:00:00 2001 From: Vardan Bansal Date: Wed, 30 Aug 2023 13:14:35 +0530 Subject: [PATCH 04/38] Committing pipeline on Save --- web/src/RouteDefinitions.ts | 4 +- web/src/RouteDestinations.tsx | 2 +- web/src/framework/strings/stringTypes.ts | 2 + web/src/i18n/strings.en.yaml | 2 + web/src/pages/NewPipeline/NewPipeline.tsx | 48 +++++++++++++++++-- .../pages/NewPipeline/NewPipelineModal.tsx | 10 ++-- 6 files changed, 56 insertions(+), 12 deletions(-) diff --git a/web/src/RouteDefinitions.ts b/web/src/RouteDefinitions.ts index 3432b60f4..291de2f29 100644 --- a/web/src/RouteDefinitions.ts +++ b/web/src/RouteDefinitions.ts @@ -46,7 +46,7 @@ export interface CODERoutes { toCODESpaceAccessControl: (args: Required>) => string toCODESpaceSettings: (args: Required>) => string toCODEPipelines: (args: Required>) => string - toCODEPipelinesNew: (args: Required>) => string + toCODEPipelineEdit: (args: Required>) => string toCODESecrets: (args: Required>) => string toCODEGlobalSettings: () => string @@ -97,7 +97,7 @@ export const routes: CODERoutes = { toCODESpaceAccessControl: ({ space }) => `/access-control/${space}`, toCODESpaceSettings: ({ space }) => `/settings/${space}`, toCODEPipelines: ({ space }) => `/pipelines/${space}`, - toCODEPipelinesNew: ({ space }) => `/pipelines/${space}/new`, + toCODEPipelineEdit: ({ space, pipeline }) => `/pipelines/${space}/pipeline/${pipeline}/edit`, toCODESecrets: ({ space }) => `/secrets/${space}`, toCODEGlobalSettings: () => '/settings', diff --git a/web/src/RouteDestinations.tsx b/web/src/RouteDestinations.tsx index bbcdc33ab..98b5884ca 100644 --- a/web/src/RouteDestinations.tsx +++ b/web/src/RouteDestinations.tsx @@ -187,7 +187,7 @@ export const RouteDestinations: React.FC = React.memo(function RouteDestinations )} {OPEN_SOURCE_PIPELINES && ( - + diff --git a/web/src/framework/strings/stringTypes.ts b/web/src/framework/strings/stringTypes.ts index 20f22dc8a..6c470add8 100644 --- a/web/src/framework/strings/stringTypes.ts +++ b/web/src/framework/strings/stringTypes.ts @@ -315,12 +315,14 @@ export interface StringsMap { pending: string 'pipelines.basedOn': string 'pipelines.createNewPipeline': string + 'pipelines.editPipeline': string 'pipelines.enterPipelineName': string 'pipelines.enterYAMLPath': string 'pipelines.failedToCreatePipeline': string 'pipelines.name': string 'pipelines.newPipelineButton': string 'pipelines.noData': string + 'pipelines.saveAndRun': string 'pipelines.yamlPath': string 'pr.ableToMerge': string 'pr.addDescription': string diff --git a/web/src/i18n/strings.en.yaml b/web/src/i18n/strings.en.yaml index 83995abcb..94ff817da 100644 --- a/web/src/i18n/strings.en.yaml +++ b/web/src/i18n/strings.en.yaml @@ -631,6 +631,8 @@ pipelines: yamlPath: YAML Path enterYAMLPath: Enter YAML path failedToCreatePipeline: Failed to create pipeline + saveAndRun: Save and Run + editPipeline: Edit pipeline {{pipeline}} executions: noData: There are no executions :( newExecutionButton: New Execution diff --git a/web/src/pages/NewPipeline/NewPipeline.tsx b/web/src/pages/NewPipeline/NewPipeline.tsx index 3ed08b944..1db10d327 100644 --- a/web/src/pages/NewPipeline/NewPipeline.tsx +++ b/web/src/pages/NewPipeline/NewPipeline.tsx @@ -1,25 +1,63 @@ -import React from 'react' +import React, { useState } from 'react' +import { useMutate } from 'restful-react' +import { useParams } from 'react-router-dom' import { Container, PageHeader, PageBody } from '@harnessio/uicore' import { Button, Layout, ButtonVariation } from '@harnessio/uicore' +import type { OpenapiCommitFilesRequest, RepoCommitFilesResponse } from 'services/code' import { useStrings } from 'framework/strings' import { SourceCodeEditor } from 'components/SourceCodeEditor/SourceCodeEditor' +import type { CODEProps } from 'RouteDefinitions' import css from './NewPipeline.module.scss' const NewPipeline = (): JSX.Element => { const { getString } = useStrings() + const { pipeline } = useParams() + const { mutate, loading } = useMutate({ + verb: 'POST', + path: `/api/v1/repos/test-space/vb-repo/+/commits` + }) + const [pipelineAsYAML, setPipelineAsYaml] = useState('') + + const handleSaveAndRun = (): void => { + const data: OpenapiCommitFilesRequest = { + actions: [{ action: 'CREATE', path: `sample_${new Date().getTime()}.txt`, payload: pipelineAsYAML }], + branch: 'main', + new_branch: '', + title: `Create pipeline ${pipeline}`, + message: '' + } + + mutate(data) + .then(response => console.log(response)) + .catch(error => console.log(error)) + } + return ( -