From 2402f07bdd296bc918e1b12498d3d4ec6a47fe6f Mon Sep 17 00:00:00 2001 From: Julia Miocene Date: Thu, 30 Jan 2025 15:18:21 +0100 Subject: [PATCH 1/2] Add breadcrumbs to the new project creation form --- .../projects/new_v2/components/app.vue | 141 +++++++++--------- .../new_v2/components/form_breadcrumb.vue | 36 +++++ .../javascripts/projects/new_v2/index.js | 6 + .../projects/new_v2/components/app_spec.js | 8 + .../new_v2/components/form_breadcrumb_spec.js | 46 ++++++ 5 files changed, 169 insertions(+), 68 deletions(-) create mode 100644 app/assets/javascripts/projects/new_v2/components/form_breadcrumb.vue create mode 100644 spec/frontend/projects/new_v2/components/form_breadcrumb_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 91b3551c237ed5..026f5803abd7ee 100644 --- a/app/assets/javascripts/projects/new_v2/components/app.vue +++ b/app/assets/javascripts/projects/new_v2/components/app.vue @@ -7,6 +7,7 @@ import SingleChoiceSelector from '~/vue_shared/components/single_choice_selector import SingleChoiceSelectorItem from '~/vue_shared/components/single_choice_selector_item.vue'; import NewProjectDestinationSelect from './project_destination_select.vue'; +import Breadcrumb from './form_breadcrumb.vue'; import CommandLine from './command_line.vue'; const OPTIONS = { @@ -68,6 +69,7 @@ export default { SingleChoiceSelector, SingleChoiceSelectorItem, NewProjectDestinationSelect, + Breadcrumb, CommandLine, }, directives: { @@ -189,75 +191,78 @@ export default { diff --git a/app/assets/javascripts/projects/new_v2/components/form_breadcrumb.vue b/app/assets/javascripts/projects/new_v2/components/form_breadcrumb.vue new file mode 100644 index 00000000000000..8979b802373ba6 --- /dev/null +++ b/app/assets/javascripts/projects/new_v2/components/form_breadcrumb.vue @@ -0,0 +1,36 @@ + + + diff --git a/app/assets/javascripts/projects/new_v2/index.js b/app/assets/javascripts/projects/new_v2/index.js index 1e039e3a44b3f9..cc7444f19a7962 100644 --- a/app/assets/javascripts/projects/new_v2/index.js +++ b/app/assets/javascripts/projects/new_v2/index.js @@ -54,6 +54,12 @@ export function initNewProjectForm() { canCreateProject: parseBoolean(canCreateProject), projectHelpPath, pushToCreateProjectCommand, + namespaceId, + userNamespaceId, + rootPath, + parentGroupUrl, + parentGroupName, + projectsUrl, }; return new Vue({ diff --git a/spec/frontend/projects/new_v2/components/app_spec.js b/spec/frontend/projects/new_v2/components/app_spec.js index f616fd060320bd..b8b3ada84a8e3f 100644 --- a/spec/frontend/projects/new_v2/components/app_spec.js +++ b/spec/frontend/projects/new_v2/components/app_spec.js @@ -1,6 +1,7 @@ import { GlAlert } from '@gitlab/ui'; import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; import App from '~/projects/new_v2/components/app.vue'; +import FormBreadcrumb from '~/projects/new_v2/components/form_breadcrumb.vue'; import CommandLine from '~/projects/new_v2/components/command_line.vue'; import MultiStepFormTemplate from '~/vue_shared/components/multi_step_form_template.vue'; import SingleChoiceSelector from '~/vue_shared/components/single_choice_selector.vue'; @@ -26,10 +27,17 @@ describe('New project creation app', () => { }; const findMultiStepForm = () => wrapper.findComponent(MultiStepFormTemplate); + const findBreadcrumbs = () => wrapper.findComponent(FormBreadcrumb); const findSingleChoiceSelector = () => wrapper.findComponent(SingleChoiceSelector); const findAlert = () => wrapper.findComponent(GlAlert); const findCommandLine = () => wrapper.findComponent(CommandLine); + it('renders breadcrumbs', () => { + createComponent(); + + expect(findBreadcrumbs().exists()).toBe(true); + }); + it('renders a form', () => { createComponent(); diff --git a/spec/frontend/projects/new_v2/components/form_breadcrumb_spec.js b/spec/frontend/projects/new_v2/components/form_breadcrumb_spec.js new file mode 100644 index 00000000000000..047378703732cd --- /dev/null +++ b/spec/frontend/projects/new_v2/components/form_breadcrumb_spec.js @@ -0,0 +1,46 @@ +import { GlBreadcrumb } from '@gitlab/ui'; +import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; +import FormBreadcrumb from '~/projects/new_v2/components/form_breadcrumb.vue'; + +describe('New project creation app', () => { + let wrapper; + + const createComponent = (props = {}) => { + wrapper = shallowMountExtended(FormBreadcrumb, { + propsData: { + rootPath: '/', + projectsUrl: '/dashboard/projects', + parentGroupName: 'test group', + userNamespaceId: '1', + ...props, + }, + provide: { + rootPath: '/', + projectsUrl: '/dashboard/projects', + userNamespaceId: '1', + ...props, + }, + }); + }; + + const findBreadcrumb = () => wrapper.findComponent(GlBreadcrumb); + + it('renders personal namespace breadcrumbs', () => { + createComponent({ parentGroupUrl: null, parentGroupName: null }); + + expect(findBreadcrumb().props('items')).toStrictEqual([ + { text: 'Your work', href: '/' }, + { text: 'Projects', href: '/dashboard/projects' }, + { text: 'New project', href: '#' }, + ]); + }); + + it('renders group namespace breadcrumbs', () => { + createComponent({ parentGroupUrl: '/group/projects', parentGroupName: 'test group' }); + + expect(findBreadcrumb().props('items')).toStrictEqual([ + { text: 'test group', href: '/group/projects' }, + { text: 'New project', href: '#' }, + ]); + }); +}); -- GitLab From ab94f98c6974d553a3c69f8cf6829068ad0fab05 Mon Sep 17 00:00:00 2001 From: Julia Miocene Date: Tue, 4 Feb 2025 10:49:04 +0100 Subject: [PATCH 2/2] Apply suggestions --- .../javascripts/projects/new_v2/components/app.vue | 2 +- app/assets/javascripts/projects/new_v2/index.js | 1 - .../projects/new_v2/components/form_breadcrumb_spec.js | 10 +--------- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/projects/new_v2/components/app.vue b/app/assets/javascripts/projects/new_v2/components/app.vue index 026f5803abd7ee..6f912ed7a548db 100644 --- a/app/assets/javascripts/projects/new_v2/components/app.vue +++ b/app/assets/javascripts/projects/new_v2/components/app.vue @@ -233,7 +233,7 @@ export default { :track-label="trackLabel" :root-url="rootUrl" :groups-only="true" - data-testid="group-selector" + data-testid="group-selector" /> diff --git a/app/assets/javascripts/projects/new_v2/index.js b/app/assets/javascripts/projects/new_v2/index.js index cc7444f19a7962..204451672e9524 100644 --- a/app/assets/javascripts/projects/new_v2/index.js +++ b/app/assets/javascripts/projects/new_v2/index.js @@ -50,7 +50,6 @@ export function initNewProjectForm() { }; const provide = { - userNamespaceId, canCreateProject: parseBoolean(canCreateProject), projectHelpPath, pushToCreateProjectCommand, diff --git a/spec/frontend/projects/new_v2/components/form_breadcrumb_spec.js b/spec/frontend/projects/new_v2/components/form_breadcrumb_spec.js index 047378703732cd..42f7c833b01589 100644 --- a/spec/frontend/projects/new_v2/components/form_breadcrumb_spec.js +++ b/spec/frontend/projects/new_v2/components/form_breadcrumb_spec.js @@ -2,22 +2,14 @@ import { GlBreadcrumb } from '@gitlab/ui'; import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; import FormBreadcrumb from '~/projects/new_v2/components/form_breadcrumb.vue'; -describe('New project creation app', () => { +describe('New project form breadcrumbs', () => { let wrapper; const createComponent = (props = {}) => { wrapper = shallowMountExtended(FormBreadcrumb, { - propsData: { - rootPath: '/', - projectsUrl: '/dashboard/projects', - parentGroupName: 'test group', - userNamespaceId: '1', - ...props, - }, provide: { rootPath: '/', projectsUrl: '/dashboard/projects', - userNamespaceId: '1', ...props, }, }); -- GitLab