summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/analytics/shared/components/metric_card.vue
blob: cee186c057cddd17809d5da28f26971f5c870f12 (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
<script>
import {
  GlCard,
  GlDeprecatedSkeletonLoading as GlSkeletonLoading,
  GlLink,
  GlIcon,
  GlTooltipDirective,
} from '@gitlab/ui';

export default {
  name: 'MetricCard',
  components: {
    GlCard,
    GlSkeletonLoading,
    GlLink,
    GlIcon,
  },
  directives: {
    GlTooltip: GlTooltipDirective,
  },
  props: {
    title: {
      type: String,
      required: true,
    },
    metrics: {
      type: Array,
      required: true,
    },
    isLoading: {
      type: Boolean,
      required: false,
      default: false,
    },
  },
  methods: {
    valueText(metric) {
      const { value = null, unit = null } = metric;
      if (!value || value === '-') return '-';
      return unit && value ? `${value} ${unit}` : value;
    },
  },
};
</script>
<template>
  <gl-card>
    <template #header>
      <strong ref="title">{{ title }}</strong>
    </template>
    <template #default>
      <gl-skeleton-loading v-if="isLoading" class="gl-h-auto gl-py-3" />
      <div v-else ref="metricsWrapper" class="gl-display-flex">
        <div
          v-for="metric in metrics"
          :key="metric.key"
          ref="metricItem"
          class="js-metric-card-item gl-flex-grow-1 gl-text-center"
        >
          <gl-link v-if="metric.link" :href="metric.link">
            <h3 class="gl-my-2 gl-text-blue-700">{{ valueText(metric) }}</h3>
          </gl-link>
          <h3 v-else class="gl-my-2">{{ valueText(metric) }}</h3>
          <p class="text-secondary gl-font-sm gl-mb-2">
            {{ metric.label }}
            <span v-if="metric.tooltipText">
              &nbsp;
              <gl-icon
                v-gl-tooltip="{ title: metric.tooltipText }"
                :size="14"
                class="gl-vertical-align-middle"
                name="question"
                data-testid="tooltip"
              />
            </span>
          </p>
        </div>
      </div>
    </template>
  </gl-card>
</template>