Skip to content
Snippets Groups Projects
Commit bf2a86b7 authored by Robert Speicher's avatar Robert Speicher
Browse files

Revert "Merge branch 'issue_3946' into 'master'

This reverts commit 68155ee7, reversing
changes made to 7ebd011e.
parent 39fbec94
No related branches found
No related tags found
No related merge requests found
Showing
with 294 additions and 397 deletions
Loading
@@ -22,7 +22,6 @@ v 8.10.0 (unreleased)
Loading
@@ -22,7 +22,6 @@ v 8.10.0 (unreleased)
- Fix pagination when sorting by columns with lots of ties (like priority) - Fix pagination when sorting by columns with lots of ties (like priority)
- Updated project header design - Updated project header design
- Exclude email check from the standard health check - Exclude email check from the standard health check
- Updated layout for Projects, Groups, Users on Admin area !4424
- Fix changing issue state columns in milestone view - Fix changing issue state columns in milestone view
- Add notification settings dropdown for groups - Add notification settings dropdown for groups
- Allow importing from Github using Personal Access Tokens. (Eric K Idema) - Allow importing from Github using Personal Access Tokens. (Eric K Idema)
Loading
Loading
Loading
@@ -127,7 +127,7 @@ class Dispatcher
Loading
@@ -127,7 +127,7 @@ class Dispatcher
when 'groups' when 'groups'
new UsersSelect() new UsersSelect()
when 'projects' when 'projects'
new NamespaceSelects() new NamespaceSelect()
when 'dashboard', 'root' when 'dashboard', 'root'
shortcut_handler = new ShortcutsDashboardNavigation() shortcut_handler = new ShortcutsDashboardNavigation()
when 'profiles' when 'profiles'
Loading
Loading
class @NamespaceSelect class @NamespaceSelect
constructor: (opts) -> constructor: ->
{ namespaceFormatResult = (namespace) ->
@dropdown markup = "<div class='namespace-result'>"
} = opts markup += "<span class='namespace-kind'>" + namespace.kind + "</span>"
markup += "<span class='namespace-path'>" + namespace.path + "</span>"
showAny = true markup += "</div>"
fieldName = 'namespace_id' markup
if @dropdown.attr 'data-field-name' formatSelection = (namespace) ->
fieldName = @dropdown.data 'fieldName' namespace.kind + ": " + namespace.path
if @dropdown.attr 'data-show-any' $('.ajax-namespace-select').each (i, select) ->
showAny = @dropdown.data 'showAny' $(select).select2
placeholder: "Search for namespace"
@dropdown.glDropdown( multiple: $(select).hasClass('multiselect')
filterable: true minimumInputLength: 0
selectable: true query: (query) ->
filterRemote: true Api.namespaces query.term, (namespaces) ->
search: data = { results: namespaces }
fields: ['path'] query.callback(data)
fieldName: fieldName
toggleLabel: (selected) -> dropdownCssClass: "ajax-namespace-dropdown"
return if not selected.id? then selected.text else "#{selected.kind}: #{selected.path}" formatResult: namespaceFormatResult
data: (term, dataCallback) -> formatSelection: formatSelection
Api.namespaces term, (namespaces) ->
if showAny
anyNamespace =
text: 'Any namespace'
id: null
namespaces.unshift(anyNamespace)
namespaces.splice 1, 0, 'divider'
dataCallback(namespaces)
text: (namespace) ->
return if not namespace.id? then namespace.text else "#{namespace.kind}: #{namespace.path}"
renderRow: @renderRow
clicked: @onSelectItem
)
onSelectItem: (item, el, e) =>
e.preventDefault()
class @NamespaceSelects
constructor: (opts = {}) ->
{
@$dropdowns = $('.js-namespace-select')
} = opts
@$dropdowns.each (i, dropdown) ->
$dropdown = $(dropdown)
new NamespaceSelect(
dropdown: $dropdown
)
Loading
@@ -68,10 +68,6 @@
Loading
@@ -68,10 +68,6 @@
color: $dropdown-toggle-hover-icon-color; color: $dropdown-toggle-hover-icon-color;
} }
} }
&.large {
width: 200px;
}
} }
   
.dropdown-menu, .dropdown-menu,
Loading
Loading
Loading
@@ -134,11 +134,6 @@
Loading
@@ -134,11 +134,6 @@
margin-bottom: 0; margin-bottom: 0;
border-bottom: none; border-bottom: none;
   
&.wide {
width: 100%;
display: block;
}
li a { li a {
padding: 16px 10px 11px; padding: 16px 10px 11px;
} }
Loading
@@ -169,7 +164,6 @@
Loading
@@ -169,7 +164,6 @@
> .btn { > .btn {
margin-right: $gl-padding-top; margin-right: $gl-padding-top;
display: inline-block; display: inline-block;
vertical-align: top;
   
&:last-child { &:last-child {
margin-right: 0; margin-right: 0;
Loading
Loading
Loading
@@ -71,36 +71,3 @@
Loading
@@ -71,36 +71,3 @@
@extend .broadcast-message; @extend .broadcast-message;
margin-bottom: 20px; margin-bottom: 20px;
} }
// Users List
.users-list {
.user-row {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
}
.user-details {
flex: 1 1 auto;
}
.user-name {
display: inline-block;
font-weight: bold;
}
.controls {
> .btn, > .dropdown {
margin-left: 5px;
}
}
.dropdown {
.btn-block {
margin-bottom: 0;
line-height: inherit;
}
}
}
Loading
@@ -38,39 +38,6 @@
Loading
@@ -38,39 +38,6 @@
margin-right: 15px; margin-right: 15px;
} }
} }
&.group-admin {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
.group-avatar, .group-details, .group-controls {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
}
.group-details {
flex: 1 1 auto;
flex-direction: column;
min-width: 0;
}
.group-controls {
align-items: center;
a {
margin-left: 5px;
}
}
}
}
.ldap-group-links {
.form-actions {
margin-bottom: $gl-padding;
}
} }
   
.groups-cover-block { .groups-cover-block {
Loading
Loading
Loading
@@ -475,6 +475,10 @@ pre.light-well {
Loading
@@ -475,6 +475,10 @@ pre.light-well {
a:hover { a:hover {
text-decoration: none; text-decoration: none;
} }
> span {
margin-left: 10px;
}
} }
} }
   
Loading
Loading
Loading
@@ -208,7 +208,7 @@
Loading
@@ -208,7 +208,7 @@
margin-top: 5px; margin-top: 5px;
   
@media (min-width: $screen-sm-min) { @media (min-width: $screen-sm-min) {
width: 180px; width: 160px;
margin-top: 0; margin-top: 0;
} }
} }
Loading
Loading
Loading
@@ -5,12 +5,11 @@ class Admin::ProjectsController < Admin::ApplicationController
Loading
@@ -5,12 +5,11 @@ class Admin::ProjectsController < Admin::ApplicationController
def index def index
@projects = Project.all @projects = Project.all
@projects = @projects.in_namespace(params[:namespace_id]) if params[:namespace_id].present? @projects = @projects.in_namespace(params[:namespace_id]) if params[:namespace_id].present?
@projects = @projects.where(visibility_level: params[:visibility_level]) if params[:visibility_level].present? @projects = @projects.where("projects.visibility_level IN (?)", params[:visibility_levels]) if params[:visibility_levels].present?
@projects = @projects.with_push if params[:with_push].present? @projects = @projects.with_push if params[:with_push].present?
@projects = @projects.abandoned if params[:abandoned].present? @projects = @projects.abandoned if params[:abandoned].present?
@projects = @projects.where(last_repository_check_failed: true) if params[:last_repository_check_failed].present? @projects = @projects.where(last_repository_check_failed: true) if params[:last_repository_check_failed].present?
@projects = @projects.non_archived unless params[:archived].present? @projects = @projects.non_archived unless params[:with_archived].present?
@projects = @projects.personal(current_user) if params[:personal].present?
@projects = @projects.search(params[:name]) if params[:name].present? @projects = @projects.search(params[:name]) if params[:name].present?
@projects = @projects.sort(@sort = params[:sort]) @projects = @projects.sort(@sort = params[:sort])
@projects = @projects.includes(:namespace).order("namespaces.path, projects.name ASC").page(params[:page]) @projects = @projects.includes(:namespace).order("namespaces.path, projects.name ASC").page(params[:page])
Loading
Loading
Loading
@@ -39,7 +39,7 @@ module DropdownsHelper
Loading
@@ -39,7 +39,7 @@ module DropdownsHelper
end end
end end
   
def dropdown_toggle(toggle_text, data_attr, options = {}) def dropdown_toggle(toggle_text, data_attr, options)
content_tag(:button, class: "dropdown-menu-toggle #{options[:toggle_class] if options.has_key?(:toggle_class)}", id: (options[:id] if options.has_key?(:id)), type: "button", data: data_attr) do content_tag(:button, class: "dropdown-menu-toggle #{options[:toggle_class] if options.has_key?(:toggle_class)}", id: (options[:id] if options.has_key?(:id)), type: "button", data: data_attr) do
output = content_tag(:span, toggle_text, class: "dropdown-toggle-text") output = content_tag(:span, toggle_text, class: "dropdown-toggle-text")
output << icon('chevron-down') output << icon('chevron-down')
Loading
Loading
- css_class = '' unless local_assigns[:css_class] - css_class = '' unless local_assigns[:css_class]
- css_class += ' no-description' if group.description.blank?
   
%li.group-row.group-admin{ class: css_class } %li.group-row{ class: css_class }
.group-avatar .controls.hidden-xs
= image_tag group_icon(group), class: 'avatar hidden-xs' = link_to 'Edit', edit_admin_group_path(group), id: "edit_#{dom_id(group)}", class: 'btn btn-grouped btn-sm'
.group-details = link_to 'Destroy', [:admin, group], data: {confirm: "REMOVE #{group.name}? Are you sure?"}, method: :delete, class: 'btn btn-grouped btn-sm btn-remove'
.title
= link_to [:admin, group], class: 'group-name' do
= group.name
.group-stats
%span>= pluralize(number_with_delimiter(group.projects.count), 'project')
,
%span= pluralize(number_with_delimiter(group.users.count), 'member')
   
- if group.description.present? .stats
.description %span
= markdown(group.description, pipeline: :description) = icon('bookmark')
.group-controls.hidden-xs = number_with_delimiter(group.projects.count)
= link_to 'Edit', edit_admin_group_path(group), id: "edit_#{dom_id(group)}", class: 'btn'
= link_to 'Delete', [:admin, group], data: { confirm: "Are you sure you want to remove #{group.name}?" }, method: :delete, class: 'btn btn-remove' %span
= icon('users')
= number_with_delimiter(group.users.count)
%span.visibility-icon.has-tooltip{data: { container: 'body', placement: 'left' }, title: visibility_icon_description(group)}
= visibility_level_icon(group.visibility_level, fw: false)
= image_tag group_icon(group), class: 'avatar s40 hidden-xs'
.title
= link_to [:admin, group], class: 'group-name' do
= group.name
- if group.description.present?
.description
= markdown(group.description, pipeline: :description)
Loading
@@ -3,32 +3,41 @@
Loading
@@ -3,32 +3,41 @@
= render "admin/dashboard/head" = render "admin/dashboard/head"
   
%div{ class: container_class } %div{ class: container_class }
%h3.page-title
Groups (#{number_with_delimiter(@groups.total_count)})
%p.light
Group allows you to keep projects organized.
Use groups for uniting related projects.
.top-area .top-area
.prepend-top-default.append-bottom-default .nav-search
= form_tag admin_groups_path, method: :get, class: 'js-search-form' do |f| = form_tag admin_groups_path, method: :get, class: 'form-inline' do
= hidden_field_tag :sort, @sort = hidden_field_tag :sort, @sort
.search-holder = text_field_tag :name, params[:name], class: "form-control"
- project_name = params[:name].present? ? params[:name] : nil = button_tag "Search", class: "btn submit btn-primary"
.search-field-holder
= search_field_tag :name, project_name, class: "form-control search-text-input js-search-input", autofocus: true, spellcheck: false, placeholder: 'Search by name' .nav-controls
= icon("search", class: "search-icon") .dropdown.inline
.dropdown %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
- toggle_text = @sort.present? ? sort_options_hash[@sort] : sort_title_recently_created %span.light
= dropdown_toggle(toggle_text, { toggle: 'dropdown' }) - if @sort.present?
%ul.dropdown-menu.dropdown-menu-align-right = sort_options_hash[@sort]
%li.dropdown-header - else
Sort by = sort_title_recently_created
%li %b.caret
= link_to admin_groups_path(sort: sort_value_recently_created, name: project_name) do %ul.dropdown-menu
= sort_title_recently_created %li
= link_to admin_groups_path(sort: sort_value_oldest_created, name: project_name) do = link_to admin_groups_path(sort: sort_value_recently_created) do
= sort_title_oldest_created = sort_title_recently_created
= link_to admin_groups_path(sort: sort_value_recently_updated, name: project_name) do = link_to admin_groups_path(sort: sort_value_oldest_created) do
= sort_title_recently_updated = sort_title_oldest_created
= link_to admin_groups_path(sort: sort_value_oldest_updated, name: project_name) do = link_to admin_groups_path(sort: sort_value_recently_updated) do
= sort_title_oldest_updated = sort_title_recently_updated
= link_to new_admin_group_path, class: "btn btn-new" do = link_to admin_groups_path(sort: sort_value_oldest_updated) do
New Group = sort_title_oldest_updated
= link_to 'New Group', new_admin_group_path, class: "btn btn-new"
%ul.content-list %ul.content-list
= render @groups = render @groups
   
Loading
Loading
- @no_container = true - @no_container = true
- page_title "Projects" - page_title "Projects"
- params[:visibility_level] ||= [] = render 'shared/show_aside'
= render "admin/dashboard/head" = render "admin/dashboard/head"
   
%div{ class: container_class } %div{ class: container_class }
.top-area .row.prepend-top-default
.prepend-top-default %aside.col-md-3
= form_tag admin_namespaces_projects_path, method: :get do |f| .panel.admin-filter
.search-holder = form_tag admin_namespaces_projects_path, method: :get, class: '' do
.search-field-holder .form-group
= search_field_tag :name, params[:name], class: "form-control search-text-input js-search-input", id: "dashboard_search", autofocus: true, spellcheck: false, placeholder: 'Search by name' = label_tag :name, 'Name:'
= text_field_tag :name, params[:name], class: "form-control"
- if params[:visibility_level].present?
= hidden_field_tag 'visibility_level', params[:visibility_level]
- if params[:sort].present?
= hidden_field_tag 'sort', params[:sort]
- if params[:personal].present?
= hidden_field_tag 'visibility_level', 'true'
- if params[:archived].present?
= hidden_field_tag 'archived', 'true'
= icon("search", class: "search-icon")
.dropdown
- toggle_text = 'Search for Namespace'
- if params[:namespace_id].present?
- namespace = Namespace.find(params[:namespace_id])
- toggle_text = "#{namespace.kind}: #{namespace.path}"
= dropdown_toggle(toggle_text, { toggle: 'dropdown' }, { toggle_class: 'js-namespace-select large' })
.dropdown-menu.dropdown-select.dropdown-menu-align-right
= dropdown_title('Namespaces')
= dropdown_filter("Search for Namespace")
= dropdown_content
= dropdown_loading
= button_tag "Search", class: "btn btn-primary btn-search"
%ul.nav-links
- opts = params[:visibility_level].present? ? {} : { page: admin_namespaces_projects_path }
= nav_link(opts) do
= link_to admin_namespaces_projects_path do
All
   
= nav_link(html_options: { class: params[:visibility_level] == Gitlab::VisibilityLevel::PRIVATE.to_s ? 'active' : '' }) do .form-group
= link_to admin_namespaces_projects_path(visibility_level: Gitlab::VisibilityLevel::PRIVATE) do = label_tag :namespace_id, "Namespace"
Private = namespace_select_tag :namespace_id, selected: params[:namespace_id], class: 'input-large'
= nav_link(html_options: { class: params[:visibility_level] == Gitlab::VisibilityLevel::INTERNAL.to_s ? 'active' : '' }) do
= link_to admin_namespaces_projects_path(visibility_level: Gitlab::VisibilityLevel::INTERNAL) do
Internal
= nav_link(html_options: { class: params[:visibility_level] == Gitlab::VisibilityLevel::PUBLIC.to_s ? 'active' : '' }) do
= link_to admin_namespaces_projects_path(visibility_level: Gitlab::VisibilityLevel::PUBLIC) do
Public
   
.nav-controls .form-group
= render 'shared/projects/dropdown' %strong Activity
= link_to new_project_path, class: 'btn btn-new' do .checkbox
New Project = label_tag :with_push do
= check_box_tag :with_push, 1, params[:with_push]
%span Projects with push events
.checkbox
= label_tag :abandoned do
= check_box_tag :abandoned, 1, params[:abandoned]
%span No activity over 6 month
.checkbox
= label_tag :with_archived do
= check_box_tag :with_archived, 1, params[:with_archived]
%span Show archived projects
   
.projects-list-holder %fieldset
- if @projects.any? %strong Visibility level:
%ul.projects-list.content-list .visibility-levels
- @projects.each_with_index do |project| - Project.visibility_levels.each do |label, level|
%li.project-row .checkbox
.controls.pull-right %label
- if project.archived = check_box_tag 'visibility_levels[]', level, params[:visibility_levels].present? && params[:visibility_levels].include?(level.to_s)
%span.label.label-warning archived %span.descr
%span.label.label-gray = visibility_level_icon(level)
= repository_size(project) = label
= link_to 'Edit', edit_namespace_project_path(project.namespace, project), id: "edit_#{dom_id(project)}", class: "btn" %fieldset
= link_to 'Delete', [project.namespace.becomes(Namespace), project], data: { confirm: remove_project_message(project) }, method: :delete, class: "btn btn-remove" %strong Problems
.title .checkbox
= link_to [:admin, project.namespace.becomes(Namespace), project] do = label_tag :last_repository_check_failed do
.dash-project-avatar = check_box_tag :last_repository_check_failed, 1, params[:last_repository_check_failed]
= project_icon(project, alt: '', class: 'avatar project-avatar s40') %span Last repository check failed
%span.project-full-name
%span.namespace-name
- if project.namespace
= project.namespace.human_name
\/
%span.project-name.filter-title
= project.name
   
- if project.description.present? = hidden_field_tag :sort, params[:sort]
.description = button_tag "Search", class: "btn submit btn-primary"
= markdown(project.description, pipeline: :description) = link_to "Reset", admin_namespaces_projects_path, class: "btn btn-cancel"
   
= paginate @projects, theme: 'gitlab' %section.col-md-9
- else .panel.panel-default
.nothing-here-block No projects found .panel-heading
Projects (#{@projects.total_count})
.controls
.dropdown.inline
%button.dropdown-toggle.btn.btn-sm{type: 'button', 'data-toggle' => 'dropdown'}
%span.light
- if @sort.present?
= sort_options_hash[@sort]
- else
= sort_title_recently_created
%b.caret
%ul.dropdown-menu
%li
= link_to admin_namespaces_projects_path(sort: sort_value_recently_created) do
= sort_title_recently_created
= link_to admin_namespaces_projects_path(sort: sort_value_oldest_created) do
= sort_title_oldest_created
= link_to admin_namespaces_projects_path(sort: sort_value_recently_updated) do
= sort_title_recently_updated
= link_to admin_namespaces_projects_path(sort: sort_value_oldest_updated) do
= sort_title_oldest_updated
= link_to admin_namespaces_projects_path(sort: sort_value_largest_repo) do
= sort_title_largest_repo
= link_to 'New Project', new_project_path, class: "btn btn-sm btn-success"
%ul.well-list
- @projects.each do |project|
%li
.list-item-name
%span{ class: visibility_level_color(project.visibility_level) }
= visibility_level_icon(project.visibility_level)
= link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project]
.pull-right
- if project.archived
%span.label.label-warning archived
%span.label.label-gray
= repository_size(project)
= link_to 'Edit', edit_namespace_project_path(project.namespace, project), id: "edit_#{dom_id(project)}", class: "btn btn-sm"
= link_to 'Destroy', [project.namespace.becomes(Namespace), project], data: { confirm: remove_project_message(project) }, method: :delete, class: "btn btn-sm btn-remove"
- if @projects.blank?
.nothing-here-block 0 projects matches
= paginate @projects, theme: "gitlab"
Loading
@@ -99,13 +99,7 @@
Loading
@@ -99,13 +99,7 @@
.form-group .form-group
= f.label :new_namespace_id, "Namespace", class: 'control-label' = f.label :new_namespace_id, "Namespace", class: 'control-label'
.col-sm-10 .col-sm-10
.dropdown = namespace_select_tag :new_namespace_id, selected: params[:namespace_id], class: 'input-large'
= dropdown_toggle('Search for Namespace', { toggle: 'dropdown', field_name: 'new_namespace_id', show_any: 'false' }, { toggle_class: 'js-namespace-select large' })
.dropdown-menu.dropdown-select
= dropdown_title('Namespaces')
= dropdown_filter("Search for Namespace")
= dropdown_content
= dropdown_loading
   
.form-group .form-group
.col-sm-offset-2.col-sm-10 .col-sm-offset-2.col-sm-10
Loading
Loading
%li.user-row
.user-avatar
= image_tag avatar_icon(user), class: "avatar", alt: ''
.user-details
.user-name
= link_to user.name, [:admin, user]
- if user.blocked?
%span.label.label-danger blocked
- if user.admin?
%span.label.label-success Admin
- if user.external?
%span.label.label-default External
- if user == current_user
%span It's you!
.user-email
= mail_to user.email, user.email
.controls.pull-right
= link_to 'Edit', edit_admin_user_path(user), id: "edit_#{dom_id(user)}", class: 'btn'
- unless user == current_user
.dropdown.inline
%a.dropdown-new.btn.btn-default#project-settings-button{href: '#', data: { toggle: 'dropdown' } }
= icon('cog')
= icon('caret-down')
%ul.dropdown-menu.dropdown-menu-align-right
%li.dropdown-header
Settings
%li
- if user.ldap_blocked?
%span.small Cannot unblock LDAP blocked users
- elsif user.blocked?
= link_to 'Unblock', unblock_admin_user_path(user), method: :put
- else
= link_to 'Block', block_admin_user_path(user), data: { confirm: 'USER WILL BE BLOCKED! Are you sure?' }, method: :put
- if user.access_locked?
%li
= link_to 'Unlock', unlock_admin_user_path(user), method: :put, class: 'btn-grouped btn btn-xs btn-success', data: { confirm: 'Are you sure?' }
- if user.can_be_removed?
%li.divider
%li
= link_to 'Delete User', [:admin, user], data: { confirm: "USER #{user.name} WILL BE REMOVED! All issues, merge requests and groups linked to this user will also be removed! Consider cancelling this deletion and blocking the user instead. Are you sure?" },
class: 'btn btn-remove btn-block',
method: :delete
- @no_container = true - @no_container = true
- page_title "Users" - page_title "Users"
= render 'shared/show_aside'
= render "admin/dashboard/head" = render "admin/dashboard/head"
   
%div{ class: container_class } %div{ class: container_class }
.top-area .admin-filter
.prepend-top-default %ul.nav-links
= form_tag admin_users_path, method: :get do %li{class: "#{'active' unless params[:filter]}"}
- if params[:filter].present? = link_to admin_users_path do
= hidden_field_tag "filter", h(params[:filter]) Active
.search-holder %small.badge= number_with_delimiter(User.active.count)
.search-field-holder %li{class: "#{'active' if params[:filter] == "admins"}"}
= search_field_tag :name, params[:name], placeholder: 'Search by name, email or username', class: 'form-control search-text-input js-search-input', spellcheck: false = link_to admin_users_path(filter: "admins") do
= icon("search", class: "search-icon") Admins
.dropdown %small.badge= number_with_delimiter(User.admins.count)
- toggle_text = if @sort.present? then sort_options_hash[@sort] else sort_title_name end %li.filter-two-factor-enabled{class: "#{'active' if params[:filter] == 'two_factor_enabled'}"}
= dropdown_toggle(toggle_text, { toggle: 'dropdown' }) = link_to admin_users_path(filter: 'two_factor_enabled') do
%ul.dropdown-menu.dropdown-menu-align-right 2FA Enabled
%li.dropdown-header %small.badge= number_with_delimiter(User.with_two_factor.count)
Sort by %li.filter-two-factor-disabled{class: "#{'active' if params[:filter] == 'two_factor_disabled'}"}
%li = link_to admin_users_path(filter: 'two_factor_disabled') do
= link_to admin_users_path(sort: sort_value_name, filter: params[:filter]) do 2FA Disabled
= sort_title_name %small.badge= number_with_delimiter(User.without_two_factor.count)
= link_to admin_users_path(sort: sort_value_recently_signin, filter: params[:filter]) do %li.filter-external{class: "#{'active' if params[:filter] == 'external'}"}
= sort_title_recently_signin = link_to admin_users_path(filter: 'external') do
= link_to admin_users_path(sort: sort_value_oldest_signin, filter: params[:filter]) do External
= sort_title_oldest_signin %small.badge= number_with_delimiter(User.external.count)
= link_to admin_users_path(sort: sort_value_recently_created, filter: params[:filter]) do %li{class: "#{'active' if params[:filter] == "blocked"}"}
= sort_title_recently_created = link_to admin_users_path(filter: "blocked") do
= link_to admin_users_path(sort: sort_value_oldest_created, filter: params[:filter]) do Blocked
= sort_title_oldest_created %small.badge= number_with_delimiter(User.blocked.count)
= link_to admin_users_path(sort: sort_value_recently_updated, filter: params[:filter]) do %li{class: "#{'active' if params[:filter] == "wop"}"}
= sort_title_recently_updated = link_to admin_users_path(filter: "wop") do
= link_to admin_users_path(sort: sort_value_oldest_updated, filter: params[:filter]) do Without projects
= sort_title_oldest_updated %small.badge= number_with_delimiter(User.without_projects.count)
= link_to 'New User', new_admin_user_path, class: 'btn btn-new btn-search'
   
.nav-block .row-content-block.second-block
%ul.nav-links.wide.scrolling-tabs.white.scrolling-tabs .pull-right
.fade-left .dropdown.inline
= nav_link(html_options: { class: ('active' unless params[:filter]) }) do %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
= link_to admin_users_path do %span.light
Active - if @sort.present?
%small.badge= number_with_delimiter(User.active.count) = sort_options_hash[@sort]
= nav_link(html_options: { class: ('active' if params[:filter] == 'admins') }) do - else
= link_to admin_users_path(filter: "admins") do = sort_title_name
Admins %b.caret
%small.badge= number_with_delimiter(User.admins.count) %ul.dropdown-menu
= nav_link(html_options: { class: "#{'active' if params[:filter] == 'two_factor_enabled'} filter-two-factor-enabled" }) do %li
= link_to admin_users_path(filter: 'two_factor_enabled') do = link_to admin_users_path(sort: sort_value_name, filter: params[:filter]) do
2FA Enabled = sort_title_name
%small.badge= number_with_delimiter(User.with_two_factor.count) = link_to admin_users_path(sort: sort_value_recently_signin, filter: params[:filter]) do
= nav_link(html_options: { class: "#{'active' if params[:filter] == 'two_factor_disabled'} filter-two-factor-disabled" }) do = sort_title_recently_signin
= link_to admin_users_path(filter: 'two_factor_disabled') do = link_to admin_users_path(sort: sort_value_oldest_signin, filter: params[:filter]) do
2FA Disabled = sort_title_oldest_signin
%small.badge= number_with_delimiter(User.without_two_factor.count) = link_to admin_users_path(sort: sort_value_recently_created, filter: params[:filter]) do
= nav_link(html_options: { class: ('active' if params[:filter] == 'external') }) do = sort_title_recently_created
= link_to admin_users_path(filter: 'external') do = link_to admin_users_path(sort: sort_value_oldest_created, filter: params[:filter]) do
External = sort_title_oldest_created
%small.badge= number_with_delimiter(User.external.count) = link_to admin_users_path(sort: sort_value_recently_updated, filter: params[:filter]) do
= nav_link(html_options: { class: ('active' if params[:filter] == 'blocked') }) do = sort_title_recently_updated
= link_to admin_users_path(filter: "blocked") do = link_to admin_users_path(sort: sort_value_oldest_updated, filter: params[:filter]) do
Blocked = sort_title_oldest_updated
%small.badge= number_with_delimiter(User.blocked.count)
= nav_link(html_options: { class: ('active' if params[:filter] == 'wop') }) do
= link_to admin_users_path(filter: "wop") do
Without projects
%small.badge= number_with_delimiter(User.without_projects.count)
.fade-right
   
%ul.users-list.content-list = link_to 'New User', new_admin_user_path, class: "btn btn-new"
- if @users.empty? = form_tag admin_users_path, method: :get, class: 'form-inline' do
%li .form-group
.nothing-here-block No users found. = search_field_tag :name, params[:name], placeholder: 'Name, email or username', class: 'form-control', spellcheck: false
- else = hidden_field_tag "filter", params[:filter]
= render partial: 'admin/users/user', collection: @users = button_tag class: 'btn btn-primary' do
%i.fa.fa-search
   
.panel.panel-default
%ul.well-list
- @users.each do |user|
%li
.list-item-name
- if user.blocked?
= icon("lock", class: "cred")
- else
= icon("user", class: "cgreen")
= link_to user.name, [:admin, user]
- if user.admin?
%strong.cred (Admin)
- if user.external?
%strong.cred (External)
- if user == current_user
%span.cred It's you!
.pull-right
%span.light
%i.fa.fa-envelope
= mail_to user.email, user.email, class: 'light'
&nbsp;
.pull-right
= link_to 'Edit', edit_admin_user_path(user), id: "edit_#{dom_id(user)}", class: 'btn-grouped btn btn-xs'
- unless user == current_user
- if user.ldap_blocked?
= link_to '#', title: 'Cannot unblock LDAP blocked users', data: {toggle: 'tooltip'}, class: 'btn-grouped btn btn-xs btn-success disabled' do
%i.fa.fa-lock
Unblock
- elsif user.blocked?
= link_to 'Unblock', unblock_admin_user_path(user), method: :put, class: 'btn-grouped btn btn-xs btn-success'
- else
= link_to 'Block', block_admin_user_path(user), data: {confirm: 'USER WILL BE BLOCKED! Are you sure?'}, method: :put, class: 'btn-grouped btn btn-xs btn-warning'
- if user.access_locked?
= link_to 'Unlock', unlock_admin_user_path(user), method: :put, class: 'btn-grouped btn btn-xs btn-success', data: { confirm: 'Are you sure?' }
- if user.can_be_removed?
= link_to 'Destroy', [:admin, user], data: { confirm: "USER #{user.name} WILL BE REMOVED! All issues, merge requests and groups linked to this user will also be removed! Maybe block the user instead? Are you sure?" }, method: :delete, class: 'btn-grouped btn btn-xs btn-remove'
= paginate @users, theme: "gitlab" = paginate @users, theme: "gitlab"
- @sort ||= sort_value_recently_updated - @sort ||= sort_value_recently_updated
- personal = params[:personal] - personal = params[:personal]
- archived = params[:archived] - archived = params[:archived]
- namespace_id = params[:namespace_id]
.dropdown.inline .dropdown.inline
- toggle_text = projects_sort_options_hash[@sort] %button.dropdown-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'}
= dropdown_toggle(toggle_text, { toggle: 'dropdown' }, { id: 'sort-projects-dropdown' }) %span.light
= projects_sort_options_hash[@sort]
%b.caret
%ul.dropdown-menu.dropdown-menu-align-right.dropdown-menu-selectable %ul.dropdown-menu.dropdown-menu-align-right.dropdown-menu-selectable
%li.dropdown-header %li.dropdown-header
Sort by Sort by
- projects_sort_options_hash.each do |value, title| - projects_sort_options_hash.each do |value, title|
%li %li
= link_to filter_projects_path(namespace_id: namespace_id, sort: value, archived: archived, personal: personal), class: ("is-active" if @sort == value) do = link_to filter_projects_path(sort: value, archived: archived, personal: personal), class: ("is-active" if @sort == value) do
= title = title
   
%li.divider %li.divider
%li %li
= link_to filter_projects_path(namespace_id: namespace_id, sort: @sort, archived: nil), class: ("is-active" unless params[:archived].present?) do = link_to filter_projects_path(sort: @sort, archived: nil), class: ("is-active" unless params[:archived].present?) do
Hide archived projects Hide archived projects
%li %li
= link_to filter_projects_path(namespace_id: namespace_id, sort: @sort, archived: true), class: ("is-active" if params[:archived].present?) do = link_to filter_projects_path(sort: @sort, archived: true), class: ("is-active" if params[:archived].present?) do
Show archived projects Show archived projects
- if current_user - if current_user
%li.divider %li.divider
%li %li
= link_to filter_projects_path(namespace_id: namespace_id, sort: @sort, personal: nil), class: ("is-active" unless personal.present?) do = link_to filter_projects_path(sort: @sort, personal: nil), class: ("is-active" unless personal) do
Owned by anyone Owned by anyone
%li %li
= link_to filter_projects_path(namespace_id: namespace_id, sort: @sort, personal: true), class: ("is-active" if personal.present?) do = link_to filter_projects_path(sort: @sort, personal: true), class: ("is-active" if personal) do
Owned by me Owned by me
Loading
@@ -10,11 +10,10 @@ Feature: Admin Projects
Loading
@@ -10,11 +10,10 @@ Feature: Admin Projects
Then I should see all non-archived projects Then I should see all non-archived projects
And I should not see project "Archive" And I should not see project "Archive"
   
@javascript
Scenario: I should see all projects in the list Scenario: I should see all projects in the list
Given archived project "Archive" Given archived project "Archive"
When I visit admin projects page When I visit admin projects page
And I select "Show archived projects" And I check "Show archived projects"
Then I should see all projects Then I should see all projects
And I should see "archived" label And I should see "archived" label
   
Loading
@@ -23,7 +22,6 @@ Feature: Admin Projects
Loading
@@ -23,7 +22,6 @@ Feature: Admin Projects
And I click on first project And I click on first project
Then I should see project details Then I should see project details
   
@javascript
Scenario: Transfer project Scenario: Transfer project
Given group 'Web' Given group 'Web'
And I visit admin project page And I visit admin project page
Loading
Loading
Loading
@@ -18,9 +18,9 @@ class Spinach::Features::AdminProjects < Spinach::FeatureSteps
Loading
@@ -18,9 +18,9 @@ class Spinach::Features::AdminProjects < Spinach::FeatureSteps
end end
end end
   
step 'I select "Show archived projects"' do step 'I check "Show archived projects"' do
find(:css, '#sort-projects-dropdown').click page.check 'Show archived projects'
click_link 'Show archived projects' click_button "Search"
end end
   
step 'I should see "archived" label' do step 'I should see "archived" label' do
Loading
@@ -45,8 +45,7 @@ class Spinach::Features::AdminProjects < Spinach::FeatureSteps
Loading
@@ -45,8 +45,7 @@ class Spinach::Features::AdminProjects < Spinach::FeatureSteps
step 'I transfer project to group \'Web\'' do step 'I transfer project to group \'Web\'' do
allow_any_instance_of(Projects::TransferService). allow_any_instance_of(Projects::TransferService).
to receive(:move_uploads_to_new_namespace).and_return(true) to receive(:move_uploads_to_new_namespace).and_return(true)
click_button 'Search for Namespace' find(:xpath, "//input[@id='new_namespace_id']").set group.id
click_link 'group: web'
click_button 'Transfer' click_button 'Transfer'
end end
   
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment