summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue
blob: 31fe86775eedbec5bb013e8d1712071901fa8600 (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
139
140
<script>
import { GlModal, GlButton, GlFormInput, GlSprintf } from '@gitlab/ui';
import { s__, sprintf } from '~/locale';
import UserDeletionObstaclesList from '~/vue_shared/components/user_deletion_obstacles/user_deletion_obstacles_list.vue';
import eventHub, { EVENT_OPEN_DELETE_USER_MODAL } from './delete_user_modal_event_hub';

export default {
  components: {
    GlModal,
    GlButton,
    GlFormInput,
    GlSprintf,
    UserDeletionObstaclesList,
  },
  props: {
    csrfToken: {
      type: String,
      required: true,
    },
  },
  data() {
    return {
      enteredUsername: '',
      username: '',
      blockPath: '',
      deletePath: '',
      userDeletionObstacles: [],
      i18n: {
        title: '',
        primaryButtonLabel: '',
        messageBody: '',
      },
    };
  },
  computed: {
    trimmedUsername() {
      return this.username.trim();
    },
    modalTitle() {
      return sprintf(this.i18n.title, { username: this.trimmedUsername }, false);
    },
    canSubmit() {
      return this.enteredUsername && this.enteredUsername === this.trimmedUsername;
    },
    secondaryButtonLabel() {
      return s__('AdminUsers|Block user');
    },
  },
  mounted() {
    eventHub.$on(EVENT_OPEN_DELETE_USER_MODAL, this.onOpenEvent);
  },
  destroyed() {
    eventHub.$off(EVENT_OPEN_DELETE_USER_MODAL, this.onOpenEvent);
  },
  methods: {
    onOpenEvent({ username, blockPath, deletePath, userDeletionObstacles, i18n }) {
      this.username = username;
      this.blockPath = blockPath;
      this.deletePath = deletePath;
      this.userDeletionObstacles = userDeletionObstacles;
      this.i18n = i18n;
      this.openModal();
    },
    openModal() {
      this.$refs.modal.show();
    },
    onSubmit() {
      this.$refs.form.submit();
      this.enteredUsername = '';
    },
    onCancel() {
      this.enteredUsername = '';
      this.$refs.modal.hide();
    },
    onSecondaryAction() {
      const { form } = this.$refs;
      form.action = this.blockPath;
      this.$refs.method.value = 'put';
      form.submit();
    },
  },
};
</script>
<template>
  <gl-modal ref="modal" modal-id="delete-user-modal" :title="modalTitle" kind="danger">
    <p>
      <gl-sprintf :message="i18n.messageBody">
        <template #username>
          <strong data-testid="message-username">{{ trimmedUsername }}</strong>
        </template>
        <template #strong="{ content }">
          <strong>{{ content }}</strong>
        </template>
      </gl-sprintf>
    </p>

    <user-deletion-obstacles-list
      v-if="userDeletionObstacles.length"
      :obstacles="userDeletionObstacles"
      :user-name="trimmedUsername"
    />

    <p>
      <gl-sprintf :message="s__('AdminUsers|To confirm, type %{username}')">
        <template #username>
          <code data-testid="confirm-username" class="gl-white-space-pre-wrap">{{
            trimmedUsername
          }}</code>
        </template>
      </gl-sprintf>
    </p>

    <form ref="form" :action="deletePath" method="post" @submit.prevent>
      <input ref="method" type="hidden" name="_method" value="delete" />
      <input :value="csrfToken" type="hidden" name="authenticity_token" />
      <gl-form-input
        v-model="enteredUsername"
        autofocus
        type="text"
        name="username"
        autocomplete="off"
      />
    </form>

    <template #modal-footer>
      <gl-button @click="onCancel">{{ __('Cancel') }}</gl-button>
      <gl-button
        :disabled="!canSubmit"
        category="secondary"
        variant="danger"
        @click="onSecondaryAction"
      >
        {{ secondaryButtonLabel }}
      </gl-button>
      <gl-button :disabled="!canSubmit" category="primary" variant="danger" @click="onSubmit">{{
        i18n.primaryButtonLabel
      }}</gl-button>
    </template>
  </gl-modal>
</template>