debian-mirror-gitlab/app/assets/javascripts/boards/components/sidebar/board_sidebar_milestone_select.vue

159 lines
4.4 KiB
Vue
Raw Normal View History

2021-02-22 17:27:13 +05:30
<script>
import {
GlDropdown,
GlDropdownItem,
GlDropdownText,
GlSearchBoxByType,
GlDropdownDivider,
GlLoadingIcon,
} from '@gitlab/ui';
2021-03-11 19:13:27 +05:30
import { mapGetters, mapActions } from 'vuex';
2021-02-22 17:27:13 +05:30
import BoardEditableItem from '~/boards/components/sidebar/board_editable_item.vue';
import createFlash from '~/flash';
import { __, s__ } from '~/locale';
2021-03-11 19:13:27 +05:30
import projectMilestones from '../../graphql/project_milestones.query.graphql';
2021-02-22 17:27:13 +05:30
export default {
components: {
BoardEditableItem,
GlDropdown,
GlLoadingIcon,
GlDropdownItem,
GlDropdownText,
GlSearchBoxByType,
GlDropdownDivider,
},
data() {
return {
milestones: [],
searchTitle: '',
loading: false,
edit: false,
};
},
apollo: {
milestones: {
2021-03-11 19:13:27 +05:30
query: projectMilestones,
2021-02-22 17:27:13 +05:30
debounce: 250,
skip() {
return !this.edit;
},
variables() {
return {
2021-03-11 19:13:27 +05:30
fullPath: this.projectPath,
2021-02-22 17:27:13 +05:30
searchTitle: this.searchTitle,
state: 'active',
2021-03-11 19:13:27 +05:30
includeAncestors: true,
2021-02-22 17:27:13 +05:30
};
},
update(data) {
2021-03-11 19:13:27 +05:30
const edges = data?.project?.milestones?.edges ?? [];
2021-03-08 18:12:59 +05:30
return edges.map((item) => item.node);
2021-02-22 17:27:13 +05:30
},
error() {
createFlash({ message: this.$options.i18n.fetchMilestonesError });
},
},
},
computed: {
2021-04-29 21:17:54 +05:30
...mapGetters(['activeBoardItem']),
2021-02-22 17:27:13 +05:30
hasMilestone() {
2021-04-29 21:17:54 +05:30
return this.activeBoardItem.milestone !== null;
2021-02-22 17:27:13 +05:30
},
groupFullPath() {
2021-04-29 21:17:54 +05:30
const { referencePath = '' } = this.activeBoardItem;
2021-02-22 17:27:13 +05:30
return referencePath.slice(0, referencePath.indexOf('/'));
},
projectPath() {
2021-04-29 21:17:54 +05:30
const { referencePath = '' } = this.activeBoardItem;
2021-02-22 17:27:13 +05:30
return referencePath.slice(0, referencePath.indexOf('#'));
},
dropdownText() {
2021-04-29 21:17:54 +05:30
return this.activeBoardItem.milestone?.title ?? this.$options.i18n.noMilestone;
2021-02-22 17:27:13 +05:30
},
},
methods: {
...mapActions(['setActiveIssueMilestone']),
handleOpen() {
this.edit = true;
this.$refs.dropdown.show();
},
2021-03-11 19:13:27 +05:30
handleClose() {
this.edit = false;
this.$refs.sidebarItem.collapse();
},
2021-02-22 17:27:13 +05:30
async setMilestone(milestoneId) {
this.loading = true;
this.searchTitle = '';
2021-03-11 19:13:27 +05:30
this.handleClose();
2021-02-22 17:27:13 +05:30
try {
const input = { milestoneId, projectPath: this.projectPath };
await this.setActiveIssueMilestone(input);
} catch (e) {
createFlash({ message: this.$options.i18n.updateMilestoneError });
} finally {
this.loading = false;
}
},
},
i18n: {
milestone: __('Milestone'),
noMilestone: __('No milestone'),
assignMilestone: __('Assign milestone'),
noMilestonesFound: s__('Milestones|No milestones found'),
fetchMilestonesError: __('There was a problem fetching milestones.'),
updateMilestoneError: __('An error occurred while updating the milestone.'),
},
};
</script>
<template>
<board-editable-item
ref="sidebarItem"
:title="$options.i18n.milestone"
:loading="loading"
2021-04-29 21:17:54 +05:30
data-testid="sidebar-milestones"
@open="handleOpen"
2021-03-11 19:13:27 +05:30
@close="handleClose"
2021-02-22 17:27:13 +05:30
>
<template v-if="hasMilestone" #collapsed>
2021-04-29 21:17:54 +05:30
<strong class="gl-text-gray-900">{{ activeBoardItem.milestone.title }}</strong>
2021-02-22 17:27:13 +05:30
</template>
2021-03-11 19:13:27 +05:30
<gl-dropdown
ref="dropdown"
:text="dropdownText"
:header-text="$options.i18n.assignMilestone"
block
@hide="handleClose"
>
<gl-search-box-by-type ref="search" v-model.trim="searchTitle" class="gl-m-3" />
<gl-dropdown-item
data-testid="no-milestone-item"
:is-check-item="true"
2021-04-29 21:17:54 +05:30
:is-checked="!activeBoardItem.milestone"
2021-03-11 19:13:27 +05:30
@click="setMilestone(null)"
2021-02-22 17:27:13 +05:30
>
2021-03-11 19:13:27 +05:30
{{ $options.i18n.noMilestone }}
</gl-dropdown-item>
<gl-dropdown-divider />
<gl-loading-icon v-if="$apollo.loading" class="gl-py-4" />
<template v-else-if="milestones.length > 0">
2021-02-22 17:27:13 +05:30
<gl-dropdown-item
2021-03-11 19:13:27 +05:30
v-for="milestone in milestones"
:key="milestone.id"
2021-02-22 17:27:13 +05:30
:is-check-item="true"
2021-04-29 21:17:54 +05:30
:is-checked="activeBoardItem.milestone && milestone.id === activeBoardItem.milestone.id"
2021-03-11 19:13:27 +05:30
data-testid="milestone-item"
@click="setMilestone(milestone.id)"
2021-02-22 17:27:13 +05:30
>
2021-03-11 19:13:27 +05:30
{{ milestone.title }}
2021-02-22 17:27:13 +05:30
</gl-dropdown-item>
2021-03-11 19:13:27 +05:30
</template>
<gl-dropdown-text v-else data-testid="no-milestones-found">
{{ $options.i18n.noMilestonesFound }}
</gl-dropdown-text>
</gl-dropdown>
2021-02-22 17:27:13 +05:30
</board-editable-item>
</template>