summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/feature_flags/components/strategies/flexible_rollout.vue
blob: 4daf8b4e6bfc7150dc367020bc4a9bc9ea143ec2 (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
<script>
import { GlFormInput, GlFormSelect } from '@gitlab/ui';
import { __ } from '~/locale';
import { PERCENT_ROLLOUT_GROUP_ID } from '../../constants';
import ParameterFormGroup from './parameter_form_group.vue';

export default {
  components: {
    GlFormInput,
    GlFormSelect,
    ParameterFormGroup,
  },
  props: {
    strategy: {
      required: true,
      type: Object,
    },
  },
  i18n: {
    percentageDescription: __('Enter an integer number number between 0 and 100'),
    percentageInvalid: __('Percent rollout must be an integer number between 0 and 100'),
    percentageLabel: __('Percentage'),
    stickinessDescription: __('Consistency guarantee method'),
    stickinessLabel: __('Based on'),
  },
  stickinessOptions: [
    {
      value: 'DEFAULT',
      text: __('Available ID'),
    },
    {
      value: 'USERID',
      text: __('User ID'),
    },
    {
      value: 'SESSIONID',
      text: __('Session ID'),
    },
    {
      value: 'RANDOM',
      text: __('Random'),
    },
  ],
  computed: {
    isValid() {
      const percentageNum = Number(this.percentage);
      return Number.isInteger(percentageNum) && percentageNum >= 0 && percentageNum <= 100;
    },
    percentage() {
      return this.strategy?.parameters?.rollout ?? '100';
    },
    stickiness() {
      return this.strategy?.parameters?.stickiness ?? this.$options.stickinessOptions[0].value;
    },
  },
  methods: {
    onPercentageChange(value) {
      this.$emit('change', {
        parameters: {
          groupId: PERCENT_ROLLOUT_GROUP_ID,
          rollout: value,
          stickiness: this.stickiness,
        },
      });
    },
    onStickinessChange(value) {
      this.$emit('change', {
        parameters: {
          groupId: PERCENT_ROLLOUT_GROUP_ID,
          rollout: this.percentage,
          stickiness: value,
        },
      });
    },
  },
};
</script>
<template>
  <div class="gl-display-flex">
    <div class="gl-mr-7" data-testid="strategy-flexible-rollout-percentage">
      <parameter-form-group
        :label="$options.i18n.percentageLabel"
        :description="isValid ? $options.i18n.percentageDescription : ''"
        :invalid-feedback="$options.i18n.percentageInvalid"
        :state="isValid"
      >
        <template #default="{ inputId }">
          <div class="gl-display-flex gl-align-items-center">
            <gl-form-input
              :id="inputId"
              :value="percentage"
              :state="isValid"
              class="rollout-percentage gl-text-right gl-w-9"
              type="number"
              min="0"
              max="100"
              @input="onPercentageChange"
            />
            <span class="ml-1">%</span>
          </div>
        </template>
      </parameter-form-group>
    </div>

    <div class="gl-mr-7" data-testid="strategy-flexible-rollout-stickiness">
      <parameter-form-group
        :label="$options.i18n.stickinessLabel"
        :description="$options.i18n.stickinessDescription"
      >
        <template #default="{ inputId }">
          <gl-form-select
            :id="inputId"
            :value="stickiness"
            :options="$options.stickinessOptions"
            @change="onStickinessChange"
          />
        </template>
      </parameter-form-group>
    </div>
  </div>
</template>