ItemStatsValue Component
This commit is contained in:
parent
c2951f6fc3
commit
7a2f107361
2 changed files with 148 additions and 0 deletions
|
@ -0,0 +1,67 @@
|
|||
<script>
|
||||
import tooltip from '~/vue_shared/directives/tooltip';
|
||||
import icon from '~/vue_shared/components/icon.vue';
|
||||
|
||||
export default {
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
cssClass: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: '',
|
||||
},
|
||||
iconName: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
tooltipPlacement: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: 'top',
|
||||
},
|
||||
/**
|
||||
* value could either be number or string
|
||||
* as `memberCount` is always passed as string
|
||||
* while `subgroupCount` & `projectCount`
|
||||
* are always number
|
||||
*/
|
||||
value: {
|
||||
type: [Number, String],
|
||||
required: false,
|
||||
default: '',
|
||||
},
|
||||
},
|
||||
directives: {
|
||||
tooltip,
|
||||
},
|
||||
components: {
|
||||
icon,
|
||||
},
|
||||
computed: {
|
||||
isValuePresent() {
|
||||
return this.value !== '';
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<span
|
||||
v-tooltip
|
||||
data-container="body"
|
||||
:data-placement="tooltipPlacement"
|
||||
:class="cssClass"
|
||||
:title="title"
|
||||
>
|
||||
<icon :name="iconName"/>
|
||||
<span
|
||||
v-if="isValuePresent"
|
||||
class="stat-value"
|
||||
>
|
||||
{{value}}
|
||||
</span>
|
||||
</span>
|
||||
</template>
|
81
spec/javascripts/groups/components/item_stats_value_spec.js
Normal file
81
spec/javascripts/groups/components/item_stats_value_spec.js
Normal file
|
@ -0,0 +1,81 @@
|
|||
import Vue from 'vue';
|
||||
|
||||
import itemStatsValueComponent from '~/groups/components/item_stats_value.vue';
|
||||
|
||||
import mountComponent from '../../helpers/vue_mount_component_helper';
|
||||
|
||||
const createComponent = ({ title, cssClass, iconName, tooltipPlacement, value }) => {
|
||||
const Component = Vue.extend(itemStatsValueComponent);
|
||||
|
||||
return mountComponent(Component, {
|
||||
title,
|
||||
cssClass,
|
||||
iconName,
|
||||
tooltipPlacement,
|
||||
value,
|
||||
});
|
||||
};
|
||||
|
||||
describe('ItemStatsValueComponent', () => {
|
||||
describe('computed', () => {
|
||||
let vm;
|
||||
const itemConfig = {
|
||||
title: 'Subgroups',
|
||||
cssClass: 'number-subgroups',
|
||||
iconName: 'folder',
|
||||
tooltipPlacement: 'left',
|
||||
};
|
||||
|
||||
describe('isValuePresent', () => {
|
||||
it('returns true if non-empty `value` is present', () => {
|
||||
vm = createComponent(Object.assign({}, itemConfig, { value: 10 }));
|
||||
expect(vm.isValuePresent).toBeTruthy();
|
||||
});
|
||||
|
||||
it('returns false if empty `value` is present', () => {
|
||||
vm = createComponent(itemConfig);
|
||||
expect(vm.isValuePresent).toBeFalsy();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vm.$destroy();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('template', () => {
|
||||
let vm;
|
||||
beforeEach(() => {
|
||||
vm = createComponent({
|
||||
title: 'Subgroups',
|
||||
cssClass: 'number-subgroups',
|
||||
iconName: 'folder',
|
||||
tooltipPlacement: 'left',
|
||||
value: 10,
|
||||
});
|
||||
});
|
||||
|
||||
it('renders component element correctly', () => {
|
||||
expect(vm.$el.classList.contains('number-subgroups')).toBeTruthy();
|
||||
expect(vm.$el.querySelectorAll('svg').length > 0).toBeTruthy();
|
||||
expect(vm.$el.querySelectorAll('.stat-value').length > 0).toBeTruthy();
|
||||
});
|
||||
|
||||
it('renders element tooltip correctly', () => {
|
||||
expect(vm.$el.dataset.originalTitle).toBe('Subgroups');
|
||||
expect(vm.$el.dataset.placement).toBe('left');
|
||||
});
|
||||
|
||||
it('renders element icon correctly', () => {
|
||||
expect(vm.$el.querySelector('svg use').getAttribute('xlink:href')).toContain('folder');
|
||||
});
|
||||
|
||||
it('renders value count correctly', () => {
|
||||
expect(vm.$el.querySelector('.stat-value').innerText.trim()).toContain('10');
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
vm.$destroy();
|
||||
});
|
||||
});
|
||||
});
|
Loading…
Reference in a new issue