Commit 40e71b22 authored by Nicolò Maria Mezzopera's avatar Nicolò Maria Mezzopera

Merge branch 'afontaine/folder-icon-to-button' into 'master'

Change icon to button on environment folder

See merge request gitlab-org/gitlab!75371
parents 177dc3b8 8de5b9a8
<script> <script>
import { GlCollapse, GlIcon, GlBadge, GlLink } from '@gitlab/ui'; import { GlButton, GlCollapse, GlIcon, GlBadge, GlLink } from '@gitlab/ui';
import { __, s__ } from '~/locale';
import folderQuery from '../graphql/queries/folder.query.graphql'; import folderQuery from '../graphql/queries/folder.query.graphql';
export default { export default {
components: { components: {
GlButton,
GlCollapse, GlCollapse,
GlIcon, GlIcon,
GlBadge, GlBadge,
...@@ -26,12 +28,20 @@ export default { ...@@ -26,12 +28,20 @@ export default {
}, },
}, },
}, },
i18n: {
collapse: __('Collapse'),
expand: __('Expand'),
link: s__('Environments|Show all'),
},
computed: { computed: {
icons() { icons() {
return this.visible return this.visible
? { caret: 'angle-down', folder: 'folder-open' } ? { caret: 'angle-down', folder: 'folder-open' }
: { caret: 'angle-right', folder: 'folder-o' }; : { caret: 'angle-right', folder: 'folder-o' };
}, },
label() {
return this.visible ? this.$options.i18n.collapse : this.$options.i18n.expand;
},
count() { count() {
return this.folder?.availableCount ?? 0; return this.folder?.availableCount ?? 0;
}, },
...@@ -51,18 +61,21 @@ export default { ...@@ -51,18 +61,21 @@ export default {
</script> </script>
<template> <template>
<div class="gl-border-b-solid gl-border-gray-100 gl-border-1 gl-px-3 gl-pt-3 gl-pb-5"> <div class="gl-border-b-solid gl-border-gray-100 gl-border-1 gl-px-3 gl-pt-3 gl-pb-5">
<div class="gl-w-full gl-display-flex gl-align-items-center" @click="toggleCollapse"> <div class="gl-w-full gl-display-flex gl-align-items-center">
<gl-icon <gl-button
class="gl-mr-2 gl-fill-current-color gl-text-gray-500" class="gl-mr-4 gl-fill-current-color gl-text-gray-500"
:name="icons.caret" :aria-label="label"
:size="12" :icon="icons.caret"
size="small"
category="tertiary"
@click="toggleCollapse"
/> />
<gl-icon class="gl-mr-2 gl-fill-current-color gl-text-gray-500" :name="icons.folder" /> <gl-icon class="gl-mr-2 gl-fill-current-color gl-text-gray-500" :name="icons.folder" />
<div class="gl-mr-2 gl-text-gray-500" :class="folderClass"> <div class="gl-mr-2 gl-text-gray-500" :class="folderClass">
{{ nestedEnvironment.name }} {{ nestedEnvironment.name }}
</div> </div>
<gl-badge size="sm" class="gl-mr-auto">{{ count }}</gl-badge> <gl-badge size="sm" class="gl-mr-auto">{{ count }}</gl-badge>
<gl-link v-if="visible" :href="folderPath">{{ s__('Environments|Show all') }}</gl-link> <gl-link v-if="visible" :href="folderPath">{{ $options.i18n.link }}</gl-link>
</div> </div>
<gl-collapse :visible="visible" /> <gl-collapse :visible="visible" />
</div> </div>
......
...@@ -3,8 +3,8 @@ import Vue from 'vue'; ...@@ -3,8 +3,8 @@ import Vue from 'vue';
import { GlCollapse, GlIcon } from '@gitlab/ui'; import { GlCollapse, GlIcon } from '@gitlab/ui';
import createMockApollo from 'helpers/mock_apollo_helper'; import createMockApollo from 'helpers/mock_apollo_helper';
import { mountExtended } from 'helpers/vue_test_utils_helper'; import { mountExtended } from 'helpers/vue_test_utils_helper';
import { __, s__ } from '~/locale';
import EnvironmentsFolder from '~/environments/components/new_environment_folder.vue'; import EnvironmentsFolder from '~/environments/components/new_environment_folder.vue';
import { s__ } from '~/locale';
import { resolvedEnvironmentsApp, resolvedFolder } from './graphql/mock_data'; import { resolvedEnvironmentsApp, resolvedFolder } from './graphql/mock_data';
Vue.use(VueApollo); Vue.use(VueApollo);
...@@ -14,6 +14,7 @@ describe('~/environments/components/new_environments_folder.vue', () => { ...@@ -14,6 +14,7 @@ describe('~/environments/components/new_environments_folder.vue', () => {
let environmentFolderMock; let environmentFolderMock;
let nestedEnvironment; let nestedEnvironment;
let folderName; let folderName;
let button;
const findLink = () => wrapper.findByRole('link', { name: s__('Environments|Show all') }); const findLink = () => wrapper.findByRole('link', { name: s__('Environments|Show all') });
...@@ -32,6 +33,7 @@ describe('~/environments/components/new_environments_folder.vue', () => { ...@@ -32,6 +33,7 @@ describe('~/environments/components/new_environments_folder.vue', () => {
environmentFolderMock.mockReturnValue(resolvedFolder); environmentFolderMock.mockReturnValue(resolvedFolder);
wrapper = createWrapper({ nestedEnvironment }, createApolloProvider()); wrapper = createWrapper({ nestedEnvironment }, createApolloProvider());
folderName = wrapper.findByText(nestedEnvironment.name); folderName = wrapper.findByText(nestedEnvironment.name);
button = wrapper.findByRole('button', { name: __('Expand') });
}); });
afterEach(() => { afterEach(() => {
...@@ -61,10 +63,11 @@ describe('~/environments/components/new_environments_folder.vue', () => { ...@@ -61,10 +63,11 @@ describe('~/environments/components/new_environments_folder.vue', () => {
}); });
it('opens on click', async () => { it('opens on click', async () => {
await folderName.trigger('click'); await button.trigger('click');
const link = findLink(); const link = findLink();
expect(button.attributes('aria-label')).toBe(__('Collapse'));
expect(collapse.attributes('visible')).toBe('true'); expect(collapse.attributes('visible')).toBe('true');
expect(icons.wrappers.map((i) => i.props('name'))).toEqual(['angle-down', 'folder-open']); expect(icons.wrappers.map((i) => i.props('name'))).toEqual(['angle-down', 'folder-open']);
expect(folderName.classes('gl-font-weight-bold')).toBe(true); expect(folderName.classes('gl-font-weight-bold')).toBe(true);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment