summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/clusters_list/components/available_agents_dropdown.vue
blob: 662cf2a7e36084d25ccb438874d0229ed201754a (plain)
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
95
96
97
98
99
100
101
102
103
104
105
<script>
import {
  GlDropdown,
  GlDropdownItem,
  GlDropdownDivider,
  GlSearchBoxByType,
  GlSprintf,
} from '@gitlab/ui';
import { I18N_AVAILABLE_AGENTS_DROPDOWN } from '../constants';

export default {
  name: 'AvailableAgentsDropdown',
  i18n: I18N_AVAILABLE_AGENTS_DROPDOWN,
  components: {
    GlDropdown,
    GlDropdownItem,
    GlDropdownDivider,
    GlSearchBoxByType,
    GlSprintf,
  },
  props: {
    isRegistering: {
      required: true,
      type: Boolean,
    },
    availableAgents: {
      required: true,
      type: Array,
    },
  },
  data() {
    return {
      selectedAgent: null,
      searchTerm: '',
    };
  },
  computed: {
    dropdownText() {
      if (this.isRegistering) {
        return this.$options.i18n.registeringAgent;
      } else if (this.selectedAgent === null) {
        return this.$options.i18n.selectAgent;
      }

      return this.selectedAgent;
    },
    shouldRenderCreateButton() {
      return this.searchTerm && !this.availableAgents.includes(this.searchTerm);
    },
    filteredResults() {
      const lowerCasedSearchTerm = this.searchTerm.toLowerCase();
      return this.availableAgents.filter((resultString) =>
        resultString.toLowerCase().includes(lowerCasedSearchTerm),
      );
    },
  },
  methods: {
    selectAgent(agent) {
      this.$emit('agentSelected', agent);
      this.selectedAgent = agent;
      this.clearSearch();
    },
    isSelected(agent) {
      return this.selectedAgent === agent;
    },
    clearSearch() {
      this.searchTerm = '';
    },
    focusSearch() {
      this.$refs.searchInput.focusInput();
    },
    handleShow() {
      this.clearSearch();
      this.focusSearch();
    },
  },
};
</script>
<template>
  <gl-dropdown :text="dropdownText" :loading="isRegistering" @shown="handleShow">
    <template #header>
      <gl-search-box-by-type ref="searchInput" v-model.trim="searchTerm" />
    </template>
    <gl-dropdown-item
      v-for="agent in filteredResults"
      :key="agent"
      :is-checked="isSelected(agent)"
      is-check-item
      @click="selectAgent(agent)"
    >
      {{ agent }}
    </gl-dropdown-item>
    <gl-dropdown-item v-if="!filteredResults.length" ref="noMatchingResults">{{
      $options.i18n.noResults
    }}</gl-dropdown-item>
    <template v-if="shouldRenderCreateButton">
      <gl-dropdown-divider />
      <gl-dropdown-item data-testid="create-config-button" @click="selectAgent(searchTerm)">
        <gl-sprintf :message="$options.i18n.createButton">
          <template #searchTerm>{{ searchTerm }}</template>
        </gl-sprintf>
      </gl-dropdown-item>
    </template>
  </gl-dropdown>
</template>