LabelsSelect DropdownValueCollapsed Component
This commit is contained in:
parent
c1ed7f3f96
commit
00db4cb733
2 changed files with 122 additions and 0 deletions
|
@ -0,0 +1,48 @@
|
|||
<script>
|
||||
import { s__, sprintf } from '~/locale';
|
||||
import tooltip from '~/vue_shared/directives/tooltip';
|
||||
|
||||
export default {
|
||||
directives: {
|
||||
tooltip,
|
||||
},
|
||||
props: {
|
||||
labels: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
labelsList() {
|
||||
const labelsString = this.labels.slice(0, 5).map(label => label.title).join(', ');
|
||||
|
||||
if (this.labels.length > 5) {
|
||||
return sprintf(s__('LabelSelect|%{labelsString}, and %{remainingLabelCount} more'), {
|
||||
labelsString,
|
||||
remainingLabelCount: this.labels.length - 5,
|
||||
});
|
||||
}
|
||||
|
||||
return labelsString;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div
|
||||
v-tooltip
|
||||
class="sidebar-collapsed-icon"
|
||||
data-placement="left"
|
||||
data-container="body"
|
||||
:title="labelsList"
|
||||
>
|
||||
<i
|
||||
aria-hidden="true"
|
||||
data-hidden="true"
|
||||
class="fa fa-tags"
|
||||
>
|
||||
</i>
|
||||
<span>{{ labels.length }}</span>
|
||||
</div>
|
||||
</template>
|
|
@ -0,0 +1,74 @@
|
|||
import Vue from 'vue';
|
||||
|
||||
import dropdownValueCollapsedComponent from '~/vue_shared/components/sidebar/labels_select/dropdown_value_collapsed.vue';
|
||||
|
||||
import { mockLabels } from './mock_data';
|
||||
|
||||
import mountComponent from '../../../../helpers/vue_mount_component_helper';
|
||||
|
||||
const createComponent = (labels = mockLabels) => {
|
||||
const Component = Vue.extend(dropdownValueCollapsedComponent);
|
||||
|
||||
return mountComponent(Component, {
|
||||
labels,
|
||||
});
|
||||
};
|
||||
|
||||
describe('DropdownValueCollapsedComponent', () => {
|
||||
let vm;
|
||||
|
||||
beforeEach(() => {
|
||||
vm = createComponent();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vm.$destroy();
|
||||
});
|
||||
|
||||
describe('computed', () => {
|
||||
describe('labelsList', () => {
|
||||
it('returns empty text when `labels` prop is empty array', () => {
|
||||
const vmEmptyLabels = createComponent([]);
|
||||
expect(vmEmptyLabels.labelsList).toBe('');
|
||||
vmEmptyLabels.$destroy();
|
||||
});
|
||||
|
||||
it('returns labels names separated by coma when `labels` prop has more than one item', () => {
|
||||
const vmMoreLabels = createComponent(mockLabels.concat(mockLabels));
|
||||
expect(vmMoreLabels.labelsList).toBe('Foo Label, Foo Label');
|
||||
vmMoreLabels.$destroy();
|
||||
});
|
||||
|
||||
it('returns labels names separated by coma with remaining labels count and `and more` phrase when `labels` prop has more than five items', () => {
|
||||
const mockMoreLabels = Object.assign([], mockLabels);
|
||||
for (let i = 0; i < 6; i += 1) {
|
||||
mockMoreLabels.unshift(mockLabels[0]);
|
||||
}
|
||||
|
||||
const vmMoreLabels = createComponent(mockMoreLabels);
|
||||
expect(vmMoreLabels.labelsList).toBe('Foo Label, Foo Label, Foo Label, Foo Label, Foo Label, and 2 more');
|
||||
vmMoreLabels.$destroy();
|
||||
});
|
||||
|
||||
it('returns first label name when `labels` prop has only one item present', () => {
|
||||
expect(vm.labelsList).toBe('Foo Label');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('template', () => {
|
||||
it('renders component container element with tooltip`', () => {
|
||||
expect(vm.$el.dataset.placement).toBe('left');
|
||||
expect(vm.$el.dataset.container).toBe('body');
|
||||
expect(vm.$el.dataset.originalTitle).toBe(vm.labelsList);
|
||||
});
|
||||
|
||||
it('renders tags icon element', () => {
|
||||
expect(vm.$el.querySelector('.fa-tags')).not.toBeNull();
|
||||
});
|
||||
|
||||
it('renders labels count', () => {
|
||||
expect(vm.$el.querySelector('span').innerText.trim()).toBe(`${vm.labels.length}`);
|
||||
});
|
||||
});
|
||||
});
|
Loading…
Reference in a new issue