Merge branch 'master' into 'pipelines_show_refactor'
# Conflicts: # config/webpack.config.js
This commit is contained in:
		
						commit
						eb08e1d112
					
				| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
import '~/profile/gl_crop';
 | 
			
		||||
import Profile from '~/profile/profile';
 | 
			
		||||
 | 
			
		||||
document.addEventListener('DOMContentLoaded', () => {
 | 
			
		||||
  $(document).on('input.ssh_key', '#key_key', function () { // eslint-disable-line func-names
 | 
			
		||||
    const $title = $('#key_title');
 | 
			
		||||
    const comment = $(this).val().match(/^\S+ \S+ (.+)\n?$/);
 | 
			
		||||
 | 
			
		||||
    // Extract the SSH Key title from its comment
 | 
			
		||||
    if (comment && comment.length > 1) {
 | 
			
		||||
      $title.val(comment[1]).change();
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  new Profile(); // eslint-disable-line no-new
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -1,103 +1,85 @@
 | 
			
		|||
/* eslint-disable comma-dangle, no-unused-vars, class-methods-use-this, quotes, consistent-return, func-names, prefer-arrow-callback, space-before-function-paren, max-len */
 | 
			
		||||
import Cookies from 'js-cookie';
 | 
			
		||||
import { getPagePath } from '~/lib/utils/common_utils';
 | 
			
		||||
import axios from '~/lib/utils/axios_utils';
 | 
			
		||||
import { __ } from '~/locale';
 | 
			
		||||
import flash from '../flash';
 | 
			
		||||
 | 
			
		||||
((global) => {
 | 
			
		||||
  class Profile {
 | 
			
		||||
    constructor({ form } = {}) {
 | 
			
		||||
      this.onSubmitForm = this.onSubmitForm.bind(this);
 | 
			
		||||
      this.form = form || $('.edit-user');
 | 
			
		||||
      this.newRepoActivated = Cookies.get('new_repo');
 | 
			
		||||
      this.setRepoRadio();
 | 
			
		||||
      this.bindEvents();
 | 
			
		||||
      this.initAvatarGlCrop();
 | 
			
		||||
export default class Profile {
 | 
			
		||||
  constructor({ form } = {}) {
 | 
			
		||||
    this.onSubmitForm = this.onSubmitForm.bind(this);
 | 
			
		||||
    this.form = form || $('.edit-user');
 | 
			
		||||
    this.newRepoActivated = Cookies.get('new_repo');
 | 
			
		||||
    this.setRepoRadio();
 | 
			
		||||
    this.bindEvents();
 | 
			
		||||
    this.initAvatarGlCrop();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  initAvatarGlCrop() {
 | 
			
		||||
    const cropOpts = {
 | 
			
		||||
      filename: '.js-avatar-filename',
 | 
			
		||||
      previewImage: '.avatar-image .avatar',
 | 
			
		||||
      modalCrop: '.modal-profile-crop',
 | 
			
		||||
      pickImageEl: '.js-choose-user-avatar-button',
 | 
			
		||||
      uploadImageBtn: '.js-upload-user-avatar',
 | 
			
		||||
      modalCropImg: '.modal-profile-crop-image'
 | 
			
		||||
    };
 | 
			
		||||
    this.avatarGlCrop = $('.js-user-avatar-input').glCrop(cropOpts).data('glcrop');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bindEvents() {
 | 
			
		||||
    $('.js-preferences-form').on('change.preference', 'input[type=radio]', this.submitForm);
 | 
			
		||||
    $('input[name="user[multi_file]"]').on('change', this.setNewRepoCookie);
 | 
			
		||||
    $('#user_notification_email').on('change', this.submitForm);
 | 
			
		||||
    $('#user_notified_of_own_activity').on('change', this.submitForm);
 | 
			
		||||
    this.form.on('submit', this.onSubmitForm);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  submitForm() {
 | 
			
		||||
    return $(this).parents('form').submit();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onSubmitForm(e) {
 | 
			
		||||
    e.preventDefault();
 | 
			
		||||
    return this.saveForm();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  saveForm() {
 | 
			
		||||
    const self = this;
 | 
			
		||||
    const formData = new FormData(this.form[0]);
 | 
			
		||||
    const avatarBlob = this.avatarGlCrop.getBlob();
 | 
			
		||||
 | 
			
		||||
    if (avatarBlob != null) {
 | 
			
		||||
      formData.append('user[avatar]', avatarBlob, 'avatar.png');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    initAvatarGlCrop() {
 | 
			
		||||
      const cropOpts = {
 | 
			
		||||
        filename: '.js-avatar-filename',
 | 
			
		||||
        previewImage: '.avatar-image .avatar',
 | 
			
		||||
        modalCrop: '.modal-profile-crop',
 | 
			
		||||
        pickImageEl: '.js-choose-user-avatar-button',
 | 
			
		||||
        uploadImageBtn: '.js-upload-user-avatar',
 | 
			
		||||
        modalCropImg: '.modal-profile-crop-image'
 | 
			
		||||
      };
 | 
			
		||||
      this.avatarGlCrop = $('.js-user-avatar-input').glCrop(cropOpts).data('glcrop');
 | 
			
		||||
    }
 | 
			
		||||
    axios({
 | 
			
		||||
      method: this.form.attr('method'),
 | 
			
		||||
      url: this.form.attr('action'),
 | 
			
		||||
      data: formData,
 | 
			
		||||
    })
 | 
			
		||||
    .then(({ data }) => flash(data.message, 'notice'))
 | 
			
		||||
    .then(() => {
 | 
			
		||||
      window.scrollTo(0, 0);
 | 
			
		||||
      // Enable submit button after requests ends
 | 
			
		||||
      self.form.find(':input[disabled]').enable();
 | 
			
		||||
    })
 | 
			
		||||
    .catch(error => flash(error.message));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    bindEvents() {
 | 
			
		||||
      $('.js-preferences-form').on('change.preference', 'input[type=radio]', this.submitForm);
 | 
			
		||||
      $('input[name="user[multi_file]"]').on('change', this.setNewRepoCookie);
 | 
			
		||||
      $('#user_notification_email').on('change', this.submitForm);
 | 
			
		||||
      $('#user_notified_of_own_activity').on('change', this.submitForm);
 | 
			
		||||
      this.form.on('submit', this.onSubmitForm);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    submitForm() {
 | 
			
		||||
      return $(this).parents('form').submit();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    onSubmitForm(e) {
 | 
			
		||||
      e.preventDefault();
 | 
			
		||||
      return this.saveForm();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    saveForm() {
 | 
			
		||||
      const self = this;
 | 
			
		||||
      const formData = new FormData(this.form[0]);
 | 
			
		||||
      const avatarBlob = this.avatarGlCrop.getBlob();
 | 
			
		||||
 | 
			
		||||
      if (avatarBlob != null) {
 | 
			
		||||
        formData.append('user[avatar]', avatarBlob, 'avatar.png');
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      axios({
 | 
			
		||||
        method: this.form.attr('method'),
 | 
			
		||||
        url: this.form.attr('action'),
 | 
			
		||||
        data: formData,
 | 
			
		||||
      })
 | 
			
		||||
      .then(({ data }) => flash(data.message, 'notice'))
 | 
			
		||||
      .then(() => {
 | 
			
		||||
        window.scrollTo(0, 0);
 | 
			
		||||
        // Enable submit button after requests ends
 | 
			
		||||
        self.form.find(':input[disabled]').enable();
 | 
			
		||||
      })
 | 
			
		||||
      .catch(error => flash(error.message));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setNewRepoCookie() {
 | 
			
		||||
      if (this.value === 'off') {
 | 
			
		||||
        Cookies.remove('new_repo');
 | 
			
		||||
      } else {
 | 
			
		||||
        Cookies.set('new_repo', true, { expires_in: 365 });
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setRepoRadio() {
 | 
			
		||||
      const multiEditRadios = $('input[name="user[multi_file]"]');
 | 
			
		||||
      if (this.newRepoActivated || this.newRepoActivated === 'true') {
 | 
			
		||||
        multiEditRadios.filter('[value=on]').prop('checked', true);
 | 
			
		||||
      } else {
 | 
			
		||||
        multiEditRadios.filter('[value=off]').prop('checked', true);
 | 
			
		||||
      }
 | 
			
		||||
  setNewRepoCookie() {
 | 
			
		||||
    if (this.value === 'off') {
 | 
			
		||||
      Cookies.remove('new_repo');
 | 
			
		||||
    } else {
 | 
			
		||||
      Cookies.set('new_repo', true, { expires_in: 365 });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $(function() {
 | 
			
		||||
    $(document).on('input.ssh_key', '#key_key', function() {
 | 
			
		||||
      const $title = $('#key_title');
 | 
			
		||||
      const comment = $(this).val().match(/^\S+ \S+ (.+)\n?$/);
 | 
			
		||||
 | 
			
		||||
      // Extract the SSH Key title from its comment
 | 
			
		||||
      if (comment && comment.length > 1) {
 | 
			
		||||
        return $title.val(comment[1]).change();
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
    if (getPagePath() === 'profiles') {
 | 
			
		||||
      return new Profile();
 | 
			
		||||
  setRepoRadio() {
 | 
			
		||||
    const multiEditRadios = $('input[name="user[multi_file]"]');
 | 
			
		||||
    if (this.newRepoActivated || this.newRepoActivated === 'true') {
 | 
			
		||||
      multiEditRadios.filter('[value=on]').prop('checked', true);
 | 
			
		||||
    } else {
 | 
			
		||||
      multiEditRadios.filter('[value=off]').prop('checked', true);
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
})(window.gl || (window.gl = {}));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,2 +0,0 @@
 | 
			
		|||
import './gl_crop';
 | 
			
		||||
import './profile';
 | 
			
		||||
| 
						 | 
				
			
			@ -1,2 +0,0 @@
 | 
			
		|||
- content_for :page_specific_javascripts do
 | 
			
		||||
  = webpack_bundle_tag('profile')
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
- page_title "Account"
 | 
			
		||||
- @content_class = "limit-container-width" unless fluid_layout
 | 
			
		||||
= render 'profiles/head'
 | 
			
		||||
 | 
			
		||||
- if current_user.ldap_user?
 | 
			
		||||
  .alert.alert-info
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
- page_title "Authentication log"
 | 
			
		||||
- @content_class = "limit-container-width" unless fluid_layout
 | 
			
		||||
= render 'profiles/head'
 | 
			
		||||
 | 
			
		||||
.row.prepend-top-default
 | 
			
		||||
  .col-lg-4.profile-settings-sidebar
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
- page_title 'Chat'
 | 
			
		||||
- @content_class = "limit-container-width" unless fluid_layout
 | 
			
		||||
= render 'profiles/head'
 | 
			
		||||
 | 
			
		||||
.row.prepend-top-default
 | 
			
		||||
  .col-lg-4.profile-settings-sidebar
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
- page_title "Emails"
 | 
			
		||||
- @content_class = "limit-container-width" unless fluid_layout
 | 
			
		||||
= render 'profiles/head'
 | 
			
		||||
 | 
			
		||||
.row.prepend-top-default
 | 
			
		||||
  .col-lg-4.profile-settings-sidebar
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
- page_title "GPG Keys"
 | 
			
		||||
- @content_class = "limit-container-width" unless fluid_layout
 | 
			
		||||
= render 'profiles/head'
 | 
			
		||||
 | 
			
		||||
.row.prepend-top-default
 | 
			
		||||
  .col-lg-4.profile-settings-sidebar
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
- page_title "SSH Keys"
 | 
			
		||||
- @content_class = "limit-container-width" unless fluid_layout
 | 
			
		||||
= render 'profiles/head'
 | 
			
		||||
 | 
			
		||||
.row.prepend-top-default
 | 
			
		||||
  .col-lg-4.profile-settings-sidebar
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,5 +2,4 @@
 | 
			
		|||
- breadcrumb_title @key.title
 | 
			
		||||
- page_title @key.title, "SSH Keys"
 | 
			
		||||
- @content_class = "limit-container-width" unless fluid_layout
 | 
			
		||||
= render 'profiles/head'
 | 
			
		||||
= render "key_details"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
- page_title "Notifications"
 | 
			
		||||
- @content_class = "limit-container-width" unless fluid_layout
 | 
			
		||||
= render 'profiles/head'
 | 
			
		||||
 | 
			
		||||
%div
 | 
			
		||||
  - if @user.errors.any?
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,6 @@
 | 
			
		|||
- page_title "Personal Access Tokens"
 | 
			
		||||
- @content_class = "limit-container-width" unless fluid_layout
 | 
			
		||||
 | 
			
		||||
= render 'profiles/head'
 | 
			
		||||
 | 
			
		||||
.row.prepend-top-default
 | 
			
		||||
  .col-lg-4.profile-settings-sidebar
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
- page_title 'Preferences'
 | 
			
		||||
- @content_class = "limit-container-width" unless fluid_layout
 | 
			
		||||
= render 'profiles/head'
 | 
			
		||||
 | 
			
		||||
= form_for @user, url: profile_preferences_path, remote: true, method: :put, html: { class: 'row prepend-top-default js-preferences-form' } do |f|
 | 
			
		||||
  .col-lg-4.application-theme
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,5 @@
 | 
			
		|||
- breadcrumb_title "Edit Profile"
 | 
			
		||||
- @content_class = "limit-container-width" unless fluid_layout
 | 
			
		||||
= render 'profiles/head'
 | 
			
		||||
 | 
			
		||||
= bootstrap_form_for @user, url: profile_path, method: :put, html: { multipart: true, class: 'edit-user prepend-top-default js-quick-submit' }, authenticity_token: true do |f|
 | 
			
		||||
  = form_errors(@user)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,6 @@
 | 
			
		|||
- add_to_breadcrumbs("Two-Factor Authentication", profile_account_path)
 | 
			
		||||
- @content_class = "limit-container-width" unless fluid_layout
 | 
			
		||||
 | 
			
		||||
= render 'profiles/head'
 | 
			
		||||
 | 
			
		||||
- content_for :page_specific_javascripts do
 | 
			
		||||
  - if inject_u2f_api?
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,7 +54,6 @@ function generateEntries() {
 | 
			
		|||
    monitoring:           './monitoring/monitoring_bundle.js',
 | 
			
		||||
    notebook_viewer:      './blob/notebook_viewer.js',
 | 
			
		||||
    pdf_viewer:           './blob/pdf_viewer.js',
 | 
			
		||||
    profile:              './profile/profile_bundle.js',
 | 
			
		||||
    project_import_gl:    './projects/project_import_gitlab_project.js',
 | 
			
		||||
    protected_branches:   './protected_branches',
 | 
			
		||||
    protected_tags:       './protected_tags',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue