gitlab-ce/app/assets/javascripts/merge_request_dashboard/components/collapsible_section.vue

104 lines
2.1 KiB
Vue

<script>
import { GlBadge, GlButton, GlTooltipDirective } from '@gitlab/ui';
import CrudComponent from '~/vue_shared/components/crud_component.vue';
import { __, sprintf } from '~/locale';
export default {
components: {
GlBadge,
GlButton,
CrudComponent,
},
directives: {
GlTooltip: GlTooltipDirective,
},
inject: ['newListsEnabled'],
props: {
title: {
type: String,
required: true,
},
helpContent: {
type: String,
required: false,
default: '',
},
count: {
type: Number,
required: false,
default: null,
},
hasMergeRequests: {
type: Boolean,
required: false,
default: true,
},
loading: {
type: Boolean,
required: false,
default: false,
},
},
data() {
return {
open: true,
};
},
computed: {
toggleButtonLabel() {
return sprintf(
this.open
? __('Collapse %{section} merge requests')
: __('Expand %{section} merge requests'),
{
section: this.title.toLowerCase(),
},
);
},
},
watch: {
loading(newVal) {
this.open = newVal || this.hasMergeRequests;
},
},
};
</script>
<template>
<crud-component
is-collapsible
:collapsed="!open"
:toggle-aria-label="toggleButtonLabel"
:body-class="{ '!gl-mx-0 gl-mb-0': hasMergeRequests || newListsEnabled }"
>
<template #title>
{{ title }}
<gl-badge v-if="count !== null" size="sm">{{ count }}</gl-badge>
</template>
<template #actions>
<gl-button
v-gl-tooltip
:title="helpContent"
icon="information-o"
variant="link"
class="gl-mr-2 gl-self-center"
/>
</template>
<template v-if="!hasMergeRequests && !loading" #empty>
{{ __('No merge requests match this list.') }}
</template>
<template #default>
<div class="gl-contents" data-testid="section-content">
<slot></slot>
</div>
</template>
<template v-if="open" #pagination>
<slot name="pagination"></slot>
</template>
</crud-component>
</template>