update_username.vue 3.3 KB
Newer Older
1
<script>
2
/* eslint-disable vue/no-v-html */
3
import { escape } from 'lodash';
4
import axios from '~/lib/utils/axios_utils';
5
import DeprecatedModal2 from '~/vue_shared/components/deprecated_modal_2.vue';
6
import { s__, sprintf } from '~/locale';
7
import { deprecatedCreateFlash as Flash } from '~/flash';
8 9 10

export default {
  components: {
11
    GlModal: DeprecatedModal2,
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
  },
  props: {
    actionUrl: {
      type: String,
      required: true,
    },
    rootUrl: {
      type: String,
      required: true,
    },
    initialUsername: {
      type: String,
      required: true,
    },
  },
  data() {
    return {
      isRequestPending: false,
      username: this.initialUsername,
      newUsername: this.initialUsername,
    };
  },
  computed: {
    path() {
      return sprintf(s__('Profiles|Current path: %{path}'), {
        path: `${this.rootUrl}${this.username}`,
      });
    },
    modalText() {
      return sprintf(
        s__(`Profiles|
You are going to change the username %{currentUsernameBold} to %{newUsernameBold}.
Profile and projects will be redirected to the %{newUsername} namespace but this redirect will expire once the %{currentUsername} namespace is registered by another user or group.
Please update your Git repository remotes as soon as possible.`),
        {
47 48 49 50
          currentUsernameBold: `<strong>${escape(this.username)}</strong>`,
          newUsernameBold: `<strong>${escape(this.newUsername)}</strong>`,
          currentUsername: escape(this.username),
          newUsername: escape(this.newUsername),
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
        },
        false,
      );
    },
  },
  methods: {
    onConfirm() {
      this.isRequestPending = true;
      const username = this.newUsername;
      const putData = {
        user: {
          username,
        },
      };

      return axios
        .put(this.actionUrl, putData)
        .then(result => {
          Flash(result.data.message, 'notice');
          this.username = username;
          this.isRequestPending = false;
        })
        .catch(error => {
          Flash(error.response.data.message);
          this.isRequestPending = false;
          throw error;
        });
    },
  },
  modalId: 'username-change-confirmation-modal',
  inputId: 'username-change-input',
  buttonText: s__('Profiles|Update username'),
};
</script>
<template>
  <div>
    <div class="form-group">
      <label :for="$options.inputId">{{ s__('Profiles|Path') }}</label>
      <div class="input-group">
90
        <div class="input-group-prepend">
M
Mike Greiling 已提交
91
          <div class="input-group-text">{{ rootUrl }}</div>
92
        </div>
93 94 95 96
        <input
          :id="$options.inputId"
          v-model="newUsername"
          :disabled="isRequestPending"
97 98
          class="form-control"
          required="required"
99 100
        />
      </div>
M
Mike Greiling 已提交
101
      <p class="form-text text-muted">{{ path }}</p>
102 103 104
    </div>
    <button
      :data-target="`#${$options.modalId}`"
105
      :disabled="isRequestPending || newUsername === username"
106 107 108 109 110 111 112 113 114 115
      class="btn btn-warning"
      type="button"
      data-toggle="modal"
    >
      {{ $options.buttonText }}
    </button>
    <gl-modal
      :id="$options.modalId"
      :header-title-text="s__('Profiles|Change username') + '?'"
      :footer-primary-button-text="$options.buttonText"
116
      footer-primary-button-variant="warning"
117 118 119 120 121 122
      @submit="onConfirm"
    >
      <span v-html="modalText"></span>
    </gl-modal>
  </div>
</template>