85 lines
1.7 KiB
Vue
85 lines
1.7 KiB
Vue
<script>
|
|
import { GlDropdown, GlDropdownDivider, GlDropdownItem } from '@gitlab/ui';
|
|
import { isString } from 'lodash';
|
|
|
|
const isValidItem = (item) =>
|
|
isString(item.eventName) && isString(item.title) && isString(item.description);
|
|
|
|
export default {
|
|
components: {
|
|
GlDropdown,
|
|
GlDropdownDivider,
|
|
GlDropdownItem,
|
|
},
|
|
|
|
props: {
|
|
actionItems: {
|
|
type: Array,
|
|
required: true,
|
|
validator(value) {
|
|
return value.length > 1 && value.every(isValidItem);
|
|
},
|
|
},
|
|
menuClass: {
|
|
type: String,
|
|
required: false,
|
|
default: '',
|
|
},
|
|
variant: {
|
|
type: String,
|
|
required: false,
|
|
default: 'default',
|
|
},
|
|
},
|
|
|
|
data() {
|
|
return {
|
|
selectedItem: this.actionItems[0],
|
|
};
|
|
},
|
|
|
|
computed: {
|
|
dropdownToggleText() {
|
|
return this.selectedItem.title;
|
|
},
|
|
},
|
|
|
|
methods: {
|
|
triggerEvent() {
|
|
this.$emit(this.selectedItem.eventName);
|
|
},
|
|
changeSelectedItem(item) {
|
|
this.selectedItem = item;
|
|
this.$emit('change', item);
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<template>
|
|
<gl-dropdown
|
|
:menu-class="menuClass"
|
|
split
|
|
:text="dropdownToggleText"
|
|
:variant="variant"
|
|
v-bind="$attrs"
|
|
@click="triggerEvent"
|
|
>
|
|
<template v-for="(item, itemIndex) in actionItems">
|
|
<gl-dropdown-item
|
|
:key="item.eventName"
|
|
is-check-item
|
|
:is-checked="selectedItem === item"
|
|
@click="changeSelectedItem(item)"
|
|
>
|
|
<strong>{{ item.title }}</strong>
|
|
<div>{{ item.description }}</div>
|
|
</gl-dropdown-item>
|
|
|
|
<gl-dropdown-divider
|
|
v-if="itemIndex < actionItems.length - 1"
|
|
:key="`${item.eventName}-divider`"
|
|
/>
|
|
</template>
|
|
</gl-dropdown>
|
|
</template>
|