summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_status.vue
blob: ce90a759cee7a057a2ac96670d08008d4cec8594 (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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<script>
import { GlButton, GlIcon, GlLoadingIcon, GlTooltip, GlSprintf } from '@gitlab/ui';
import { PAGE_CONFIG } from '../../constants';
import AlertStatus from '../alert_status.vue';

export default {
  components: {
    GlIcon,
    GlButton,
    GlLoadingIcon,
    GlTooltip,
    GlSprintf,
    AlertStatus,
  },
  inject: {
    statuses: {
      default: PAGE_CONFIG.OPERATIONS.STATUSES,
    },
  },
  props: {
    projectPath: {
      type: String,
      required: true,
    },
    alert: {
      type: Object,
      required: true,
    },
    isEditable: {
      type: Boolean,
      required: false,
      default: true,
    },
    sidebarCollapsed: {
      type: Boolean,
      required: false,
    },
    textClass: {
      type: String,
      required: false,
      default: '',
    },
  },
  data() {
    return {
      isDropdownShowing: false,
      isUpdating: false,
    };
  },
  computed: {
    dropdownClass() {
      return this.isDropdownShowing ? 'show' : 'gl-display-none';
    },
  },
  methods: {
    hideDropdown() {
      this.isDropdownShowing = false;
    },
    toggleFormDropdown() {
      this.isDropdownShowing = !this.isDropdownShowing;
      const { dropdown } = this.$refs.status.$refs.dropdown.$refs;
      if (dropdown && this.isDropdownShowing) {
        dropdown.show();
      }
    },
    handleUpdating(isMutationInProgress) {
      if (!isMutationInProgress) {
        this.$emit('alert-update');
      }
      this.isUpdating = isMutationInProgress;
    },
  },
};
</script>

<template>
  <div
    class="alert-status gl-py-5"
    :class="{ 'gl-border-b-1 gl-border-b-solid gl-border-b-gray-100': !sidebarCollapsed }"
  >
    <template v-if="sidebarCollapsed">
      <div ref="status" class="gl-ml-6" data-testid="status-icon" @click="$emit('toggle-sidebar')">
        <gl-icon name="status" />
        <gl-loading-icon v-if="isUpdating" />
      </div>
      <gl-tooltip :target="() => $refs.status" boundary="viewport" placement="left">
        <gl-sprintf :message="s__('AlertManagement|Alert status: %{status}')">
          <template #status>
            {{ alert.status.toLowerCase() }}
          </template>
        </gl-sprintf>
      </gl-tooltip>
    </template>

    <div v-else>
      <p
        class="gl-text-gray-900 gl-mb-2 gl-line-height-20 gl-display-flex gl-justify-content-space-between"
      >
        {{ s__('AlertManagement|Status') }}
        <gl-button
          v-if="isEditable"
          class="gl-text-black-normal!"
          variant="link"
          @click="toggleFormDropdown"
          @keydown.esc="hideDropdown"
        >
          {{ s__('AlertManagement|Edit') }}
        </gl-button>
      </p>

      <alert-status
        ref="status"
        :alert="alert"
        :project-path="projectPath"
        :is-dropdown-showing="isDropdownShowing"
        :is-sidebar="true"
        :statuses="statuses"
        @alert-error="$emit('alert-error', $event)"
        @hide-dropdown="hideDropdown"
        @handle-updating="handleUpdating"
      />

      <gl-loading-icon v-if="isUpdating" :inline="true" />
      <p
        v-else-if="!isDropdownShowing"
        class="value gl-m-0"
        :class="{ 'no-value': !statuses[alert.status] }"
      >
        <span v-if="statuses[alert.status]" :class="textClass" data-testid="status">
          {{ statuses[alert.status] }}
        </span>
        <span v-else>
          {{ s__('AlertManagement|None') }}
        </span>
      </p>
    </div>
  </div>
</template>