Merge branch 'account-settings' into 'master'
Account settings Closes #13854 ![](https://gitlab.com/gitlab-org/gitlab-ce/uploads/4802a7b4f74f17d25a611ed1a2200445/account-settings.png) See merge request !3039
This commit is contained in:
commit
cec88d81bb
|
@ -41,6 +41,7 @@ v 8.5.3
|
|||
- Sort starred projects on dashboard based on last activity by default
|
||||
- Show commit message in JIRA mention comment
|
||||
- Makes issue page and merge request page usable on mobile browsers.
|
||||
- Improved UI for profile settings
|
||||
|
||||
v 8.5.2
|
||||
- Fix sidebar overlapping content when screen width was below 1200px
|
||||
|
|
|
@ -4,12 +4,13 @@ class @Profile
|
|||
$('.js-preferences-form').on 'change.preference', 'input[type=radio]', ->
|
||||
$(this).parents('form').submit()
|
||||
|
||||
$('.update-username form').on 'ajax:before', ->
|
||||
$('.loading-gif').show()
|
||||
$('.update-username').on 'ajax:before', ->
|
||||
$('.loading-username').show()
|
||||
$(this).find('.update-success').hide()
|
||||
$(this).find('.update-failed').hide()
|
||||
|
||||
$('.update-username form').on 'ajax:complete', ->
|
||||
$('.update-username').on 'ajax:complete', ->
|
||||
$('.loading-username').hide()
|
||||
$(this).find('.btn-save').enable()
|
||||
$(this).find('.loading-gif').hide()
|
||||
|
||||
|
|
|
@ -12,11 +12,13 @@
|
|||
.prepend-top-default { margin-top: $gl-padding !important; }
|
||||
.prepend-top-20 { margin-top:20px }
|
||||
.prepend-left-10 { margin-left:10px }
|
||||
.prepend-left-default { margin-left:$gl-padding }
|
||||
.prepend-left-default { margin-left: $gl-padding; }
|
||||
.prepend-left-20 { margin-left:20px }
|
||||
.append-right-5 { margin-right: 5px }
|
||||
.append-right-10 { margin-right:10px }
|
||||
.append-right-default { margin-right: $gl-padding; }
|
||||
.append-right-20 { margin-right:20px }
|
||||
.append-bottom-0 { margin-bottom:0 }
|
||||
.append-bottom-10 { margin-bottom:10px }
|
||||
.append-bottom-15 { margin-bottom:15px }
|
||||
.append-bottom-20 { margin-bottom:20px }
|
||||
|
|
|
@ -34,13 +34,15 @@ $error-exclamation-point: #E62958;
|
|||
$border-radius-default: 3px;
|
||||
$list-title-color: #333333;
|
||||
$list-text-color: #555555;
|
||||
$profile-settings-link-color: $md-link-color;
|
||||
|
||||
$btn-transparent-color: #8F8F8F;
|
||||
|
||||
$ssh-key-icon-color: #8F8F8F;
|
||||
$ssh-key-icon-size: 18px;
|
||||
|
||||
$provider-btn-group-border: #E5E5E5;
|
||||
$provider-btn-not-active-color: #4688F1;
|
||||
|
||||
/*
|
||||
* Color schema
|
||||
*/
|
||||
|
@ -70,7 +72,7 @@ $orange-light: rgba(252, 109, 38, 0.80);
|
|||
$orange-normal: #E75E40;
|
||||
$orange-dark: #CE5237;
|
||||
|
||||
$red-light: #F43263;
|
||||
$red-light: #F06559;
|
||||
$red-normal: #E52C5A;
|
||||
$red-dark: #D22852;
|
||||
|
||||
|
@ -94,7 +96,7 @@ $border-orange-light: #fc6d26;
|
|||
$border-orange-normal: #CE5237;
|
||||
$border-orange-dark: #C14E35;
|
||||
|
||||
$border-red-light: #E52C5A;
|
||||
$border-red-light: #F24F41;
|
||||
$border-red-normal: #D22852;
|
||||
$border-red-dark: #CA264F;
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
.account-page {
|
||||
fieldset {
|
||||
margin-bottom: 15px;
|
||||
padding-bottom: 15px;
|
||||
.profile-avatar-form-option {
|
||||
hr {
|
||||
margin: 10px 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -20,7 +19,7 @@
|
|||
|
||||
.account-btn-link,
|
||||
.profile-settings-sidebar a {
|
||||
color: $profile-settings-link-color;
|
||||
color: $md-link-color;
|
||||
}
|
||||
|
||||
.oauth-buttons {
|
||||
|
@ -172,6 +171,47 @@
|
|||
|
||||
.profile-settings-content {
|
||||
a {
|
||||
color: $profile-settings-link-color;
|
||||
color: $md-link-color;
|
||||
}
|
||||
}
|
||||
|
||||
.change-username-title {
|
||||
color: $gl-warning;
|
||||
}
|
||||
|
||||
.remove-account-title {
|
||||
color: $gl-danger;
|
||||
}
|
||||
|
||||
.provider-btn-group {
|
||||
display: inline-block;
|
||||
margin-right: 10px;
|
||||
border: 1px solid $provider-btn-group-border;
|
||||
border-radius: 3px;
|
||||
|
||||
&:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.provider-btn-image {
|
||||
display: inline-block;
|
||||
padding: 5px 10px;
|
||||
border-right: 1px solid $provider-btn-group-border;
|
||||
|
||||
> img {
|
||||
width: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.provider-btn {
|
||||
display: inline-block;
|
||||
padding: 5px 10px;
|
||||
margin-left: -3px;
|
||||
line-height: 22px;
|
||||
background-color: $gray-light;
|
||||
|
||||
&.not-active {
|
||||
color: $provider-btn-not-active-color;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,109 +5,107 @@
|
|||
.alert.alert-info
|
||||
Some options are unavailable for LDAP accounts
|
||||
|
||||
.account-page.prepend-top-default
|
||||
.panel.panel-default.update-token
|
||||
.panel-heading
|
||||
Reset Private token
|
||||
.panel-body
|
||||
= form_for @user, url: reset_private_token_profile_path, method: :put do |f|
|
||||
.data
|
||||
.row.prepend-top-default
|
||||
.col-lg-3.profile-settings-sidebar
|
||||
%h4.prepend-top-0
|
||||
Private Token
|
||||
%p
|
||||
Your private token is used to access application resources without authentication.
|
||||
%br
|
||||
It can be used for atom feeds or the API.
|
||||
%span.cred
|
||||
Keep it secret!
|
||||
|
||||
.col-lg-9
|
||||
= form_for @user, url: reset_private_token_profile_path, method: :put, html: {class: "private-token"} do |f|
|
||||
%p.cgray
|
||||
- if current_user.private_token
|
||||
= label_tag "token", "Private token", class: "label-light"
|
||||
= text_field_tag "token", current_user.private_token, class: "form-control"
|
||||
- else
|
||||
%span You don`t have one yet. Click generate to fix it.
|
||||
|
||||
.form-actions
|
||||
%p.help-block
|
||||
It can be used for atom feeds or the API. Keep it secret!
|
||||
.prepend-top-default
|
||||
- if current_user.private_token
|
||||
= f.submit 'Reset private token', data: { confirm: "Are you sure?" }, class: "btn btn-default"
|
||||
- else
|
||||
= f.submit 'Generate', class: "btn btn-default"
|
||||
|
||||
.panel.panel-default
|
||||
.panel-heading
|
||||
%hr
|
||||
.row.prepend-top-default
|
||||
.col-lg-3.profile-settings-sidebar
|
||||
%h4.prepend-top-0
|
||||
Two-factor Authentication
|
||||
.panel-body
|
||||
- if current_user.two_factor_enabled?
|
||||
.pull-right
|
||||
= link_to 'Disable Two-factor Authentication', profile_two_factor_auth_path, method: :delete, class: 'btn btn-close btn-sm',
|
||||
data: { confirm: 'Are you sure?' }
|
||||
%p.text-success
|
||||
%strong
|
||||
Two-factor Authentication is enabled
|
||||
%p
|
||||
If you lose your recovery codes you can
|
||||
%strong
|
||||
= succeed ',' do
|
||||
= link_to 'generate new ones', codes_profile_two_factor_auth_path, method: :post, data: { confirm: 'Are you sure?' }
|
||||
invalidating all previous codes.
|
||||
|
||||
- else
|
||||
%p
|
||||
Increase your account's security by enabling two-factor authentication (2FA).
|
||||
.col-lg-9
|
||||
%p
|
||||
Each time you log in you’ll be required to provide your username and
|
||||
password as usual, plus a randomly-generated code from your phone.
|
||||
|
||||
.form-actions
|
||||
= link_to 'Enable Two-factor Authentication', new_profile_two_factor_auth_path, class: 'btn btn-success'
|
||||
|
||||
Status: #{current_user.two_factor_enabled? ? 'enabled' : 'disabled'}
|
||||
- if !current_user.two_factor_enabled?
|
||||
%p
|
||||
Download the Google Authenticator application from App Store for iOS or Google Play for Android and scan this code.
|
||||
More information is available in the #{link_to('documentation', help_page_path('profile', 'two_factor_authentication'))}.
|
||||
.append-bottom-10
|
||||
= link_to 'Enable two-factor authentication', new_profile_two_factor_auth_path, class: 'btn btn-success'
|
||||
- else
|
||||
= link_to 'Disable Two-factor Authentication', profile_two_factor_auth_path, method: :delete, class: 'btn btn-danger',
|
||||
data: { confirm: 'Are you sure?' }
|
||||
%hr
|
||||
- if button_based_providers.any?
|
||||
.panel.panel-default
|
||||
.panel-heading
|
||||
.row.prepend-top-default
|
||||
.col-lg-3.profile-settings-sidebar
|
||||
%h4.prepend-top-0
|
||||
Social sign-in
|
||||
%p
|
||||
Activate signin with one of the following services
|
||||
.col-lg-9
|
||||
%label.label-light
|
||||
Connected Accounts
|
||||
.panel-body
|
||||
.oauth-buttons.append-bottom-10
|
||||
%p Click on icon to activate signin with one of the following services
|
||||
- button_based_providers.each do |provider|
|
||||
.btn-group
|
||||
= link_to provider_image_tag(provider), user_omniauth_authorize_path(provider), method: :post, class: "btn btn-lg #{'active' if auth_active?(provider)}", "data-no-turbolink" => "true"
|
||||
|
||||
.provider-btn-group
|
||||
.provider-btn-image
|
||||
= provider_image_tag(provider)
|
||||
- if auth_active?(provider)
|
||||
= link_to unlink_profile_account_path(provider: provider), method: :delete, class: 'btn btn-lg' do
|
||||
= icon('close')
|
||||
|
||||
= link_to unlink_profile_account_path(provider: provider), method: :delete, class: 'provider-btn' do
|
||||
Disconnect
|
||||
- else
|
||||
= link_to user_omniauth_authorize_path(provider), method: :post, class: "provider-btn #{'not-active' if !auth_active?(provider)}", "data-no-turbolink" => "true" do
|
||||
Connect
|
||||
%hr
|
||||
- if current_user.can_change_username?
|
||||
.panel.panel-warning.update-username
|
||||
.panel-heading
|
||||
Change Username
|
||||
.panel-body
|
||||
= form_for @user, url: update_username_profile_path, method: :put, remote: true do |f|
|
||||
.row.prepend-top-default
|
||||
.col-lg-3.profile-settings-sidebar
|
||||
%h4.prepend-top-0.change-username-title
|
||||
Change username
|
||||
%p
|
||||
Changing your username will change path to all personal projects!
|
||||
%div
|
||||
.col-lg-9
|
||||
= form_for @user, url: update_username_profile_path, method: :put, remote: true, html: {class: "update-username"} do |f|
|
||||
.form-group
|
||||
= f.label :username, "Path", class: "label-light"
|
||||
.input-group
|
||||
.input-group-addon
|
||||
= "#{root_url}u/"
|
||||
= f.text_field :username, required: true, class: 'form-control'
|
||||
|
||||
.loading-gif.hide
|
||||
%p
|
||||
= icon('spinner spin')
|
||||
Saving new username
|
||||
.form-actions
|
||||
= f.submit 'Save username', class: "btn btn-warning"
|
||||
.help-block
|
||||
Current path:
|
||||
= "#{root_url}u/#{current_user.username}"
|
||||
.prepend-top-default
|
||||
= f.button class: "btn btn-warning", type: "submit" do
|
||||
= icon "spinner spin", class: "hidden loading-username"
|
||||
Update username
|
||||
%hr
|
||||
|
||||
- if signup_enabled?
|
||||
.panel.panel-danger.remove-account
|
||||
.panel-heading
|
||||
.row.prepend-top-default
|
||||
.col-lg-3.profile-settings-sidebar
|
||||
%h4.prepend-top-0.remove-account-title
|
||||
Remove account
|
||||
.panel-body
|
||||
.col-lg-9
|
||||
- if @user.can_be_removed?
|
||||
%p Deleting an account has the following effects:
|
||||
%p
|
||||
Deleting an account has the following effects:
|
||||
%ul
|
||||
%li All user content like authored issues, snippets, comments will be removed
|
||||
- rp = current_user.personal_projects.count
|
||||
- unless rp.zero?
|
||||
%li #{pluralize rp, 'personal project'} will be removed and cannot be restored
|
||||
.form-actions
|
||||
= link_to 'Delete account', user_registration_path, data: { confirm: "REMOVE #{current_user.name}? Are you sure?" }, method: :delete, class: "btn btn-remove"
|
||||
- else
|
||||
- if @user.solo_owned_groups.present?
|
||||
|
@ -116,3 +114,4 @@
|
|||
%strong #{@user.solo_owned_groups.map(&:name).join(', ')}
|
||||
%p
|
||||
You must transfer ownership or delete these groups before you can delete your account.
|
||||
.append-bottom-default
|
||||
|
|
|
@ -1,41 +1,41 @@
|
|||
- page_title 'Two-factor Authentication', 'Account'
|
||||
|
||||
%h2.page-title Two-factor Authentication (2FA)
|
||||
.row.prepend-top-default
|
||||
.col-lg-3
|
||||
%h4.prepend-top-0
|
||||
Two-factor Authentication (2FA)
|
||||
%p
|
||||
Download the Google Authenticator application from App Store for iOS or Google
|
||||
Play for Android and scan this code.
|
||||
|
||||
Increase your account's security by enabling two-factor authentication (2FA).
|
||||
.col-lg-9
|
||||
%p
|
||||
Status: #{current_user.two_factor_enabled? ? 'enabled' : 'disabled'}
|
||||
%p
|
||||
Download the Google Authenticator application from App Store for iOS or Google Play for Android and scan this code.
|
||||
More information is available in the #{link_to('documentation', help_page_path('profile', 'two_factor_authentication'))}.
|
||||
|
||||
%hr
|
||||
|
||||
= form_tag profile_two_factor_auth_path, method: :post, class: 'form-horizontal two-factor-new' do |f|
|
||||
.row.append-bottom-10
|
||||
.col-md-3
|
||||
= raw @qr_code
|
||||
.col-md-9
|
||||
.account-well
|
||||
%p.prepend-top-0.append-bottom-0
|
||||
Can't scan the code?
|
||||
%p.prepend-top-0.append-bottom-0
|
||||
To add the entry manually, provide the following details to the application on your phone.
|
||||
%p.prepend-top-0.append-bottom-0
|
||||
Account:
|
||||
= current_user.email
|
||||
%p.prepend-top-0.append-bottom-0
|
||||
Key:
|
||||
= current_user.otp_secret.scan(/.{4}/).join(' ')
|
||||
%p.two-factor-new-manual-content
|
||||
Time based: Yes
|
||||
= form_tag profile_two_factor_auth_path, method: :post do |f|
|
||||
- if @error
|
||||
.alert.alert-danger
|
||||
= @error
|
||||
.form-group
|
||||
.col-lg-2.col-lg-offset-2
|
||||
= raw @qr_code
|
||||
.col-lg-7.col-lg-offset-1.manual-instructions
|
||||
%h3 Can't scan the code?
|
||||
|
||||
%p
|
||||
To add the entry manually, provide the following details to the
|
||||
application on your phone.
|
||||
|
||||
%dl
|
||||
%dt Account
|
||||
%dd= current_user.email
|
||||
%dl
|
||||
%dt Key
|
||||
%dd= current_user.otp_secret.scan(/.{4}/).join(' ')
|
||||
%dl
|
||||
%dt Time based
|
||||
%dd Yes
|
||||
.form-group
|
||||
= label_tag :pin_code, nil, class: "control-label"
|
||||
.col-lg-10
|
||||
= text_field_tag :pin_code, nil, class: "form-control", required: true, autofocus: true
|
||||
.form-actions
|
||||
= submit_tag 'Submit', class: 'btn btn-success'
|
||||
= label_tag :pin_code, nil, class: "label-light"
|
||||
= text_field_tag :pin_code, nil, class: "form-control", required: true
|
||||
.prepend-top-default
|
||||
= submit_tag 'Enable two-factor authentication', class: 'btn btn-success'
|
||||
= link_to 'Configure it later', skip_profile_two_factor_auth_path, :method => :patch, class: 'btn btn-cancel' if two_factor_skippable?
|
||||
|
|
|
@ -99,9 +99,9 @@ class Spinach::Features::Profile < Spinach::FeatureSteps
|
|||
end
|
||||
|
||||
step 'I reset my token' do
|
||||
page.within '.update-token' do
|
||||
page.within '.private-token' do
|
||||
@old_token = @user.private_token
|
||||
click_button "Reset"
|
||||
click_button "Reset private token"
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in New Issue