From 3aba412022d3ee3f15def9bf804c4fb43a119681 Mon Sep 17 00:00:00 2001 From: Julia Miocene Date: Fri, 14 Feb 2025 01:01:20 +0100 Subject: [PATCH 1/5] Add second step to an import project form --- .../projects/new_v2/components/app.vue | 55 ++--- .../new_v2/components/import_by_url_form.vue | 39 +++ .../new_v2/components/import_project_form.vue | 225 ++++++++++++++++-- .../javascripts/projects/new_v2/index.js | 89 ++++--- .../multiple_choice_selector_item.vue | 12 +- .../single_choice_selector_item.vue | 12 +- .../components/multiple_choice_selector.scss | 4 + app/views/projects/new.html.haml | 25 +- locale/gitlab.pot | 30 +++ .../projects/new_v2/components/app_spec.js | 22 +- .../components/import_by_url_form_spec.js | 26 ++ 11 files changed, 425 insertions(+), 114 deletions(-) create mode 100644 app/assets/javascripts/projects/new_v2/components/import_by_url_form.vue create mode 100644 spec/frontend/projects/new_v2/components/import_by_url_form_spec.js diff --git a/app/assets/javascripts/projects/new_v2/components/app.vue b/app/assets/javascripts/projects/new_v2/components/app.vue index 8176c11c4e9b4d..a6571737929ff5 100644 --- a/app/assets/javascripts/projects/new_v2/components/app.vue +++ b/app/assets/javascripts/projects/new_v2/components/app.vue @@ -11,6 +11,7 @@ import { OPTIONS } from '../constants'; import NewProjectDestinationSelect from './project_destination_select.vue'; import Breadcrumb from './form_breadcrumb.vue'; import CommandLine from './command_line.vue'; +import ImportByUrlForm from './import_by_url_form.vue'; export default { OPTIONS, @@ -26,79 +27,49 @@ export default { NewProjectDestinationSelect, Breadcrumb, CommandLine, + ImportByUrlForm, }, directives: { SafeHtml, }, - inject: ['userNamespaceId', 'canCreateProject'], - props: { + inject: { rootPath: { - type: String, - required: false, default: '/', }, projectsUrl: { - type: String, - required: false, default: null, }, - parentGroupUrl: { - type: String, - required: false, + userNamespaceId: { default: null, }, - parentGroupName: { - type: String, - required: false, + isCiCdAvailable: { default: null, }, - hasErrors: { - type: Boolean, - required: false, - default: false, - }, - isCiCdAvailable: { - type: Boolean, - required: false, - default: false, + canCreateProject: { + default: null, }, canImportProjects: { - type: Boolean, - required: false, - default: false, + default: null, }, importSourcesEnabled: { - type: Boolean, - required: false, - default: false, + default: null, }, canSelectNamespace: { - type: Boolean, - required: false, - default: false, + default: null, }, namespaceFullPath: { - type: String, - required: false, default: null, }, namespaceId: { - type: String, - required: false, default: null, }, trackLabel: { - type: String, - required: false, default: null, }, userProjectLimit: { - type: Number, - required: true, + default: 0, }, newProjectGuidelines: { - type: String, - required: false, default: null, }, }, @@ -280,8 +251,12 @@ export default { v-if="currentStep === 2" :key="selectedProjectOption.key" :option="selectedProjectOption" + :namespace-id="selectedNamespace" data-testid="new-project-step2" @back="onBack" + @next="onNext" /> + + diff --git a/app/assets/javascripts/projects/new_v2/components/import_by_url_form.vue b/app/assets/javascripts/projects/new_v2/components/import_by_url_form.vue new file mode 100644 index 00000000000000..b0cd6b9e9018b7 --- /dev/null +++ b/app/assets/javascripts/projects/new_v2/components/import_by_url_form.vue @@ -0,0 +1,39 @@ + + + diff --git a/app/assets/javascripts/projects/new_v2/components/import_project_form.vue b/app/assets/javascripts/projects/new_v2/components/import_project_form.vue index 340e91a10718b1..6c6788174c61c0 100644 --- a/app/assets/javascripts/projects/new_v2/components/import_project_form.vue +++ b/app/assets/javascripts/projects/new_v2/components/import_project_form.vue @@ -1,43 +1,220 @@ diff --git a/app/assets/javascripts/projects/new_v2/index.js b/app/assets/javascripts/projects/new_v2/index.js index 204451672e9524..c35ba8d2e3507d 100644 --- a/app/assets/javascripts/projects/new_v2/index.js +++ b/app/assets/javascripts/projects/new_v2/index.js @@ -1,7 +1,7 @@ import Vue from 'vue'; import VueApollo from 'vue-apollo'; -import createDefaultClient from '~/lib/graphql'; import { parseBoolean } from '~/lib/utils/common_utils'; +import createDefaultClient from '~/lib/graphql'; import NewProjectFormApp from './components/app.vue'; export function initNewProjectForm() { @@ -12,63 +12,90 @@ export function initNewProjectForm() { } const { + namespaceFullPath, + namespaceId, + userNamespaceId, + newProjectGuidelines, pushToCreateProjectCommand, - projectHelpPath, - hasErrors, - isCiCdAvailable, - parentGroupUrl, - parentGroupName, rootPath, projectsUrl, + parentGroupUrl, + parentGroupName, + projectHelpPath, + isCiCdAvailable, canImportProjects, importSourcesEnabled, - namespaceFullPath, - namespaceId, - userNamespaceId, trackLabel, canSelectNamespace, canCreateProject, userProjectLimit, - newProjectGuidelines, + importHistoryPath, + importGitlabEnabled, + importGitlabImportPath, + importGithubEnabled, + importGithubImportPath, + importBitbucketEnabled, + importBitbucketImportPath, + importBitbucketImportConfigured, + importBitbucketDisabledMessage, + importBitbucketServerEnabled, + importBitbucketServerImportPath, + importFogbugzEnabled, + importFogbugzImportPath, + importGiteaEnabled, + importGiteaImportPath, + importGitEnabled, + importManifestEnabled, + importManifestImportPath, } = el.dataset; - const props = { - hasErrors: parseBoolean(hasErrors), - isCiCdAvailable: parseBoolean(isCiCdAvailable), - parentGroupUrl, - parentGroupName, - rootPath, - projectsUrl, - canImportProjects: parseBoolean(canImportProjects), - importSourcesEnabled: parseBoolean(importSourcesEnabled), + const provide = { namespaceFullPath, namespaceId, - trackLabel, - canSelectNamespace: parseBoolean(canSelectNamespace), - userProjectLimit: parseInt(userProjectLimit, 10), + userNamespaceId, newProjectGuidelines, - }; - - const provide = { - canCreateProject: parseBoolean(canCreateProject), - projectHelpPath, pushToCreateProjectCommand, - namespaceId, - userNamespaceId, rootPath, + projectsUrl, parentGroupUrl, parentGroupName, - projectsUrl, + projectHelpPath, + trackLabel, + isCiCdAvailable: parseBoolean(isCiCdAvailable), + importSourcesEnabled: parseBoolean(importSourcesEnabled), + canImportProjects: parseBoolean(canImportProjects), + canSelectNamespace: parseBoolean(canSelectNamespace), + canCreateProject: parseBoolean(canCreateProject), + userProjectLimit, + importHistoryPath, + importGitlabEnabled: parseBoolean(importGitlabEnabled), + importGitlabImportPath, + importGithubEnabled: parseBoolean(importGithubEnabled), + importGithubImportPath, + importBitbucketEnabled: parseBoolean(importBitbucketEnabled), + importBitbucketImportPath, + importBitbucketImportConfigured: parseBoolean(importBitbucketImportConfigured), + importBitbucketDisabledMessage, + importBitbucketServerEnabled: parseBoolean(importBitbucketServerEnabled), + importBitbucketServerImportPath, + importFogbugzEnabled: parseBoolean(importFogbugzEnabled), + importFogbugzImportPath, + importGiteaEnabled: parseBoolean(importGiteaEnabled), + importGiteaImportPath, + importGitEnabled: parseBoolean(importGitEnabled), + importManifestEnabled: parseBoolean(importManifestEnabled), + importManifestImportPath, }; return new Vue({ el, + name: 'NewProjectFormRoot', apolloProvider: new VueApollo({ defaultClient: createDefaultClient(), }), provide, render(h) { - return h(NewProjectFormApp, { props }); + return h(NewProjectFormApp); }, }); } diff --git a/app/assets/javascripts/vue_shared/components/multiple_choice_selector_item.vue b/app/assets/javascripts/vue_shared/components/multiple_choice_selector_item.vue index 9ae9263f1059b1..651b7b6f355d31 100644 --- a/app/assets/javascripts/vue_shared/components/multiple_choice_selector_item.vue +++ b/app/assets/javascripts/vue_shared/components/multiple_choice_selector_item.vue @@ -1,8 +1,12 @@ -- GitLab From a3c8a4b1c646938172761fd7b7bb1f7e37415942 Mon Sep 17 00:00:00 2001 From: Sascha Eggenberger Date: Wed, 5 Mar 2025 16:56:24 +0100 Subject: [PATCH 3/5] Fix spec --- .../new_v2/components/import_project_form.vue | 19 ++++++++++++++++++- .../components/import_project_form_spec.js | 3 ++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/projects/new_v2/components/import_project_form.vue b/app/assets/javascripts/projects/new_v2/components/import_project_form.vue index 34e89c8b53cfea..a81a490f76b787 100644 --- a/app/assets/javascripts/projects/new_v2/components/import_project_form.vue +++ b/app/assets/javascripts/projects/new_v2/components/import_project_form.vue @@ -92,6 +92,7 @@ export default { icon: 'tanuki', title: s__('ProjectImport|GitLab'), name: 'gitlab', + stepsTotal: 3, }, { isAvailable: this.importGithubEnabled, @@ -99,6 +100,7 @@ export default { icon: 'github', title: s__('ProjectImport|GitHub'), name: 'github', + stepsTotal: 4, }, { isAvailable: this.importBitbucketEnabled, @@ -108,6 +110,7 @@ export default { name: 'bitbucket-cloud', disabled: !this.importBitbucketImportConfigured, disabledMessage: this.importBitbucketDisabledMessage, + stepsTotal: 4, }, { isAvailable: this.importBitbucketServerEnabled, @@ -115,6 +118,7 @@ export default { icon: 'bitbucket', title: s__('ProjectImport|Bitbucket Server'), name: 'bitbucket-server', + stepsTotal: 4, }, { isAvailable: this.importFogbugzEnabled, @@ -122,6 +126,7 @@ export default { icon: 'bug', title: s__('ProjectImport|FogBugz'), name: 'fogbugz', + stepsTotal: 4, }, { isAvailable: this.importGiteaEnabled, @@ -129,6 +134,7 @@ export default { icon: 'gitea', title: s__('ProjectImport|Gitea'), name: 'gitea', + stepsTotal: 4, }, { isAvailable: this.importManifestEnabled, @@ -136,6 +142,7 @@ export default { icon: 'doc-text', title: s__('ProjectImport|Manifest file'), name: 'manifest', + stepsTotal: 3, }, { isAvailable: this.importGitEnabled, @@ -143,12 +150,17 @@ export default { icon: 'link', title: s__('ProjectImport|Project URL'), name: 'url', + stepsTotal: 3, }, ]; }, selectedImportPath() { return this.availableImports.find((item) => item.name === this.selectedImportName)?.path; }, + selectImportStepsTotal() { + return this.availableImports.find((item) => item.name === this.selectedImportName) + ?.stepsTotal; + }, }, created() { this.selectedImportName = this.availableImports[0].name; @@ -162,7 +174,11 @@ export default {