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