1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
<script>
import { GlTokenSelector, GlAvatarLabeled } from '@gitlab/ui';
import { s__ } from '~/locale';
import { AVATAR_SHAPE_OPTION_RECT } from '~/vue_shared/constants';
import searchProjectTopics from '../queries/project_topics_search.query.graphql';
export default {
components: {
GlTokenSelector,
GlAvatarLabeled,
},
i18n: {
placeholder: s__('ProjectSettings|Search for topic'),
},
props: {
selected: {
type: Array,
required: false,
default: () => [],
},
},
apollo: {
topics: {
query: searchProjectTopics,
variables() {
return {
search: this.search,
};
},
update(data) {
return (
data.topics?.nodes.filter(
(topic) => !this.selectedTokens.some((token) => token.name === topic.name),
) || []
);
},
debounce: 250,
},
},
data() {
return {
topics: [],
selectedTokens: this.selected,
search: '',
};
},
computed: {
loading() {
return this.$apollo.queries.topics.loading;
},
placeholderText() {
return this.selectedTokens.length ? '' : this.$options.i18n.placeholder;
},
},
methods: {
handleEnter(event) {
// Prevent form from submitting when adding a token
if (event.target.value !== '') {
event.preventDefault();
}
},
filterTopics(searchTerm) {
this.search = searchTerm;
},
onTokensUpdate(tokens) {
this.$emit('update', tokens);
},
},
AVATAR_SHAPE_OPTION_RECT,
};
</script>
<template>
<gl-token-selector
ref="tokenSelector"
v-model="selectedTokens"
:dropdown-items="topics"
:loading="loading"
allow-user-defined-tokens
:placeholder="placeholderText"
@keydown.enter="handleEnter"
@text-input="filterTopics"
@input="onTokensUpdate"
>
<template #dropdown-item-content="{ dropdownItem }">
<gl-avatar-labeled
:src="dropdownItem.avatarUrl"
:entity-name="dropdownItem.name"
:label="dropdownItem.title"
:size="32"
:shape="$options.AVATAR_SHAPE_OPTION_RECT"
/>
</template>
</gl-token-selector>
</template>
|