Skip to content
代码片段 群组 项目
未验证 提交 b6dda7ac 编辑于 作者: Justin Ho Tuan Duong's avatar Justin Ho Tuan Duong 提交者: GitLab
浏览文件

Merge branch 'new-project-breadcrumbs' into 'master'

No related branches found
No related tags found
无相关合并请求
...@@ -7,6 +7,7 @@ import SingleChoiceSelector from '~/vue_shared/components/single_choice_selector ...@@ -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 SingleChoiceSelectorItem from '~/vue_shared/components/single_choice_selector_item.vue';
import NewProjectDestinationSelect from './project_destination_select.vue'; import NewProjectDestinationSelect from './project_destination_select.vue';
import Breadcrumb from './form_breadcrumb.vue';
import CommandLine from './command_line.vue'; import CommandLine from './command_line.vue';
const OPTIONS = { const OPTIONS = {
...@@ -68,6 +69,7 @@ export default { ...@@ -68,6 +69,7 @@ export default {
SingleChoiceSelector, SingleChoiceSelector,
SingleChoiceSelectorItem, SingleChoiceSelectorItem,
NewProjectDestinationSelect, NewProjectDestinationSelect,
Breadcrumb,
CommandLine, CommandLine,
}, },
directives: { directives: {
...@@ -189,75 +191,78 @@ export default { ...@@ -189,75 +191,78 @@ export default {
</script> </script>
<template> <template>
<multi-step-form-template :title="__('Create new project')" :current-step="1"> <div>
<template #form> <breadcrumb />
<gl-form-group
v-if="canSelectNamespace"
:label="s__('ProjectNew|What do you want to create?')"
>
<gl-button-group class="gl-w-full">
<gl-button
category="primary"
variant="default"
size="medium"
:selected="isPersonalProject"
class="gl-w-full"
data-testid="personal-namespace-button"
@click="choosePersonalNamespace"
>
{{ s__('ProjectsNew|A personal project') }}
</gl-button>
<gl-button
category="primary"
variant="default"
size="medium"
:selected="!isPersonalProject"
class="gl-w-full"
data-testid="group-namespace-button"
@click="chooseGroupNamespace"
>
{{ s__('ProjectsNew|A project within a group') }}
</gl-button>
</gl-button-group>
</gl-form-group>
<gl-form-group v-if="!isPersonalProject" :label="s__('ProjectsNew|Choose a group')"> <multi-step-form-template :title="__('Create new project')" :current-step="1">
<new-project-destination-select <template #form>
:namespace-full-path="namespaceFullPath" <gl-form-group
:namespace-id="namespaceId" v-if="canSelectNamespace"
:track-label="trackLabel" :label="s__('ProjectNew|What do you want to create?')"
:root-url="rootUrl" >
:groups-only="true" <gl-button-group class="gl-w-full">
data-testid="group-selector" <gl-button
/> category="primary"
</gl-form-group> variant="default"
size="medium"
:selected="isPersonalProject"
class="gl-w-full"
data-testid="personal-namespace-button"
@click="choosePersonalNamespace"
>
{{ s__('ProjectsNew|A personal project') }}
</gl-button>
<gl-button
category="primary"
variant="default"
size="medium"
:selected="!isPersonalProject"
class="gl-w-full"
data-testid="group-namespace-button"
@click="chooseGroupNamespace"
>
{{ s__('ProjectsNew|A project within a group') }}
</gl-button>
</gl-button-group>
</gl-form-group>
<single-choice-selector v-if="canChooseOption" checked="blank_project"> <gl-form-group v-if="!isPersonalProject" :label="s__('ProjectsNew|Choose a group')">
<single-choice-selector-item v-bind="$options.OPTIONS.blank" /> <new-project-destination-select
<single-choice-selector-item v-bind="$options.OPTIONS.template" /> :namespace-full-path="namespaceFullPath"
<single-choice-selector-item :namespace-id="namespaceId"
v-if="canImportProjects && importSourcesEnabled" :track-label="trackLabel"
v-bind="$options.OPTIONS.ci" :root-url="rootUrl"
/> :groups-only="true"
<single-choice-selector-item v-if="isCiCdAvailable" v-bind="$options.OPTIONS.import"> data-testid="group-selector"
{{ $options.OPTIONS.import.title }} />
<div class="gl-flex gl-gap-2"> </gl-form-group>
<gl-icon name="tanuki" />
<gl-icon name="github" />
<gl-icon name="bitbucket" />
<gl-icon name="gitea" />
</div>
</single-choice-selector-item>
<single-choice-selector-item v-bind="$options.OPTIONS.transfer" :disabled="true" />
</single-choice-selector>
<gl-alert v-else variant="danger" :dismissible="false">
{{ errorMessage }}
</gl-alert>
</template>
<template #footer>
<div v-if="newProjectGuidelines" v-safe-html="newProjectGuidelines" class="gl-mb-6"></div>
<command-line v-if="isPersonalProject" /> <single-choice-selector v-if="canChooseOption" checked="blank_project">
</template> <single-choice-selector-item v-bind="$options.OPTIONS.blank" />
</multi-step-form-template> <single-choice-selector-item v-bind="$options.OPTIONS.template" />
<single-choice-selector-item
v-if="canImportProjects && importSourcesEnabled"
v-bind="$options.OPTIONS.ci"
/>
<single-choice-selector-item v-if="isCiCdAvailable" v-bind="$options.OPTIONS.import">
{{ $options.OPTIONS.import.title }}
<div class="gl-flex gl-gap-2">
<gl-icon name="tanuki" />
<gl-icon name="github" />
<gl-icon name="bitbucket" />
<gl-icon name="gitea" />
</div>
</single-choice-selector-item>
<single-choice-selector-item v-bind="$options.OPTIONS.transfer" :disabled="true" />
</single-choice-selector>
<gl-alert v-else variant="danger" :dismissible="false">
{{ errorMessage }}
</gl-alert>
</template>
<template #footer>
<div v-if="newProjectGuidelines" v-safe-html="newProjectGuidelines" class="gl-mb-6"></div>
<command-line v-if="isPersonalProject" />
</template>
</multi-step-form-template>
</div>
</template> </template>
<script>
import { GlBreadcrumb } from '@gitlab/ui';
import { s__ } from '~/locale';
import SuperSidebarToggle from '~/super_sidebar/components/super_sidebar_toggle.vue';
import { JS_TOGGLE_EXPAND_CLASS } from '~/super_sidebar/constants';
export default {
components: {
GlBreadcrumb,
SuperSidebarToggle,
},
inject: ['rootPath', 'projectsUrl', 'parentGroupUrl', 'parentGroupName'],
computed: {
breadcrumbs() {
const breadcrumbs = this.parentGroupUrl
? [{ text: this.parentGroupName, href: this.parentGroupUrl }]
: [
{ text: s__('Navigation|Your work'), href: this.rootPath },
{ text: s__('ProjectsNew|Projects'), href: this.projectsUrl },
];
breadcrumbs.push({ text: s__('ProjectsNew|New project'), href: '#' });
return breadcrumbs;
},
},
JS_TOGGLE_EXPAND_CLASS,
};
</script>
<template>
<div class="top-bar-fixed container-fluid" data-testid="top-bar">
<div class="top-bar-container gl-border-b gl-flex gl-items-center gl-gap-2">
<super-sidebar-toggle :class="$options.JS_TOGGLE_EXPAND_CLASS" class="xl:gl-hidden" />
<gl-breadcrumb :items="breadcrumbs" data-testid="breadcrumb-links" class="gl-grow" />
</div>
</div>
</template>
...@@ -50,10 +50,15 @@ export function initNewProjectForm() { ...@@ -50,10 +50,15 @@ export function initNewProjectForm() {
}; };
const provide = { const provide = {
userNamespaceId,
canCreateProject: parseBoolean(canCreateProject), canCreateProject: parseBoolean(canCreateProject),
projectHelpPath, projectHelpPath,
pushToCreateProjectCommand, pushToCreateProjectCommand,
namespaceId,
userNamespaceId,
rootPath,
parentGroupUrl,
parentGroupName,
projectsUrl,
}; };
return new Vue({ return new Vue({
......
import { GlAlert } from '@gitlab/ui'; import { GlAlert } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import App from '~/projects/new_v2/components/app.vue'; 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 CommandLine from '~/projects/new_v2/components/command_line.vue';
import MultiStepFormTemplate from '~/vue_shared/components/multi_step_form_template.vue'; import MultiStepFormTemplate from '~/vue_shared/components/multi_step_form_template.vue';
import SingleChoiceSelector from '~/vue_shared/components/single_choice_selector.vue'; import SingleChoiceSelector from '~/vue_shared/components/single_choice_selector.vue';
...@@ -26,10 +27,17 @@ describe('New project creation app', () => { ...@@ -26,10 +27,17 @@ describe('New project creation app', () => {
}; };
const findMultiStepForm = () => wrapper.findComponent(MultiStepFormTemplate); const findMultiStepForm = () => wrapper.findComponent(MultiStepFormTemplate);
const findBreadcrumbs = () => wrapper.findComponent(FormBreadcrumb);
const findSingleChoiceSelector = () => wrapper.findComponent(SingleChoiceSelector); const findSingleChoiceSelector = () => wrapper.findComponent(SingleChoiceSelector);
const findAlert = () => wrapper.findComponent(GlAlert); const findAlert = () => wrapper.findComponent(GlAlert);
const findCommandLine = () => wrapper.findComponent(CommandLine); const findCommandLine = () => wrapper.findComponent(CommandLine);
it('renders breadcrumbs', () => {
createComponent();
expect(findBreadcrumbs().exists()).toBe(true);
});
it('renders a form', () => { it('renders a form', () => {
createComponent(); createComponent();
......
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 form breadcrumbs', () => {
let wrapper;
const createComponent = (props = {}) => {
wrapper = shallowMountExtended(FormBreadcrumb, {
provide: {
rootPath: '/',
projectsUrl: '/dashboard/projects',
...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: '#' },
]);
});
});
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册