Merge branch '18338-change-admin-navigation-to-match-new-ui' into 'master'
Resolve "Change admin navigation to match new UI" ## What does this MR do? Moves admin navigation to layout nav to match Project, Groups, and Profile navigation ## Are there points in the code the reviewer needs to double check? ## Why was this MR needed? ## What are the relevant issue numbers? Closes #18338 ## Screenshots (if relevant) ![Screen_Shot_2016-06-14_at_10.26.40_AM](/uploads/f0b8c8b259da16d929be2b36e8eeafb8/Screen_Shot_2016-06-14_at_10.26.40_AM.png) ![Screen_Shot_2016-06-14_at_10.26.44_AM](/uploads/07d9ece2063dfcfec1f0f2647d8ee782/Screen_Shot_2016-06-14_at_10.26.44_AM.png) ## Does this MR meet the acceptance criteria? - [ ] [CHANGELOG](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CHANGELOG) entry added - [ ] [Documentation created/updated](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/development/doc_styleguide.md) - [ ] API support added - [ ] Tests - [ ] Added for this feature/bug - [ ] All builds are passing - [ ] Conform by the [style guides](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#style-guides) - [ ] Branch has no merge conflicts with `master` (if you do - rebase it please) - [ ] [Squashed related commits together](https://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits) See merge request !4650
This commit is contained in:
commit
e09d573e2f
|
@ -0,0 +1,14 @@
|
|||
.nav-links.sub-nav
|
||||
%ul{ class: (container_class) }
|
||||
= nav_link(controller: :background_jobs) do
|
||||
= link_to admin_background_jobs_path, title: 'Background Jobs' do
|
||||
%span
|
||||
Background Jobs
|
||||
= nav_link(controller: :logs) do
|
||||
= link_to admin_logs_path, title: 'Logs' do
|
||||
%span
|
||||
Logs
|
||||
= nav_link(controller: :health_check) do
|
||||
= link_to admin_health_check_path, title: 'Health Check' do
|
||||
%span
|
||||
Health Check
|
|
@ -1,46 +1,50 @@
|
|||
- @no_container = true
|
||||
- page_title "Background Jobs"
|
||||
%h3.page-title Background Jobs
|
||||
%p.light GitLab uses #{link_to "sidekiq", "http://sidekiq.org/"} library for async job processing
|
||||
= render 'admin/background_jobs/head'
|
||||
|
||||
%hr
|
||||
%div{ class: (container_class) }
|
||||
%h3.page-title Background Jobs
|
||||
%p.light GitLab uses #{link_to "sidekiq", "http://sidekiq.org/"} library for async job processing
|
||||
|
||||
.panel.panel-default
|
||||
.panel-heading Sidekiq running processes
|
||||
.panel-body
|
||||
- if @sidekiq_processes.empty?
|
||||
%h4.cred
|
||||
%i.fa.fa-exclamation-triangle
|
||||
There are no running sidekiq processes. Please restart GitLab
|
||||
- else
|
||||
.table-holder
|
||||
%table.table
|
||||
%thead
|
||||
%th USER
|
||||
%th PID
|
||||
%th CPU
|
||||
%th MEM
|
||||
%th STATE
|
||||
%th START
|
||||
%th COMMAND
|
||||
%tbody
|
||||
- @sidekiq_processes.each do |process|
|
||||
- next unless process.match(/(sidekiq \d+\.\d+\.\d+.+$)/)
|
||||
- data = process.strip.split(' ')
|
||||
%tr
|
||||
%td= gitlab_config.user
|
||||
- 5.times do
|
||||
%td= data.shift
|
||||
%td= data.join(' ')
|
||||
%hr
|
||||
|
||||
.clearfix
|
||||
%p
|
||||
%i.fa.fa-exclamation-circle
|
||||
If '[25 of 25 busy]' is shown, restart GitLab with 'sudo service gitlab reload'.
|
||||
%p
|
||||
%i.fa.fa-exclamation-circle
|
||||
If more than one sidekiq process is listed, stop GitLab, kill the remaining sidekiq processes (sudo pkill -u #{gitlab_config.user} -f sidekiq) and restart GitLab.
|
||||
.panel.panel-default
|
||||
.panel-heading Sidekiq running processes
|
||||
.panel-body
|
||||
- if @sidekiq_processes.empty?
|
||||
%h4.cred
|
||||
%i.fa.fa-exclamation-triangle
|
||||
There are no running sidekiq processes. Please restart GitLab
|
||||
- else
|
||||
.table-holder
|
||||
%table.table
|
||||
%thead
|
||||
%th USER
|
||||
%th PID
|
||||
%th CPU
|
||||
%th MEM
|
||||
%th STATE
|
||||
%th START
|
||||
%th COMMAND
|
||||
%tbody
|
||||
- @sidekiq_processes.each do |process|
|
||||
- next unless process.match(/(sidekiq \d+\.\d+\.\d+.+$)/)
|
||||
- data = process.strip.split(' ')
|
||||
%tr
|
||||
%td= gitlab_config.user
|
||||
- 5.times do
|
||||
%td= data.shift
|
||||
%td= data.join(' ')
|
||||
|
||||
.clearfix
|
||||
%p
|
||||
%i.fa.fa-exclamation-circle
|
||||
If '[25 of 25 busy]' is shown, restart GitLab with 'sudo service gitlab reload'.
|
||||
%p
|
||||
%i.fa.fa-exclamation-circle
|
||||
If more than one sidekiq process is listed, stop GitLab, kill the remaining sidekiq processes (sudo pkill -u #{gitlab_config.user} -f sidekiq) and restart GitLab.
|
||||
|
||||
|
||||
|
||||
.panel.panel-default
|
||||
%iframe{src: sidekiq_path, width: '100%', height: 970, style: "border: none"}
|
||||
.panel.panel-default
|
||||
%iframe{src: sidekiq_path, width: '100%', height: 970, style: "border: none"}
|
||||
|
|
|
@ -1,49 +1,54 @@
|
|||
.top-area
|
||||
%ul.nav-links
|
||||
%li{class: ('active' if @scope.nil?)}
|
||||
= link_to admin_builds_path do
|
||||
All
|
||||
%span.badge.js-totalbuilds-count= @all_builds.count(:id)
|
||||
- @no_container = true
|
||||
= render "admin/dashboard/head"
|
||||
|
||||
%li{class: ('active' if @scope == 'running')}
|
||||
= link_to admin_builds_path(scope: :running) do
|
||||
Running
|
||||
%span.badge.js-running-count= number_with_delimiter(@all_builds.running_or_pending.count(:id))
|
||||
%div{ class: (container_class) }
|
||||
|
||||
%li{class: ('active' if @scope == 'finished')}
|
||||
= link_to admin_builds_path(scope: :finished) do
|
||||
Finished
|
||||
%span.badge.js-running-count= number_with_delimiter(@all_builds.finished.count(:id))
|
||||
.top-area
|
||||
%ul.nav-links
|
||||
%li{class: ('active' if @scope.nil?)}
|
||||
= link_to admin_builds_path do
|
||||
All
|
||||
%span.badge.js-totalbuilds-count= @all_builds.count(:id)
|
||||
|
||||
.nav-controls
|
||||
- if @all_builds.running_or_pending.any?
|
||||
= link_to 'Cancel all', cancel_all_admin_builds_path, data: { confirm: 'Are you sure?' }, class: 'btn btn-danger', method: :post
|
||||
%li{class: ('active' if @scope == 'running')}
|
||||
= link_to admin_builds_path(scope: :running) do
|
||||
Running
|
||||
%span.badge.js-running-count= number_with_delimiter(@all_builds.running_or_pending.count(:id))
|
||||
|
||||
.row-content-block.second-block
|
||||
#{(@scope || 'all').capitalize} builds
|
||||
%li{class: ('active' if @scope == 'finished')}
|
||||
= link_to admin_builds_path(scope: :finished) do
|
||||
Finished
|
||||
%span.badge.js-running-count= number_with_delimiter(@all_builds.finished.count(:id))
|
||||
|
||||
%ul.content-list
|
||||
- if @builds.blank?
|
||||
%li
|
||||
.nothing-here-block No builds to show
|
||||
- else
|
||||
.table-holder
|
||||
%table.table.builds
|
||||
%thead
|
||||
%tr
|
||||
%th Status
|
||||
%th Build ID
|
||||
%th Project
|
||||
%th Commit
|
||||
%th Ref
|
||||
%th Runner
|
||||
%th Name
|
||||
%th Tags
|
||||
%th Duration
|
||||
%th Finished at
|
||||
%th
|
||||
.nav-controls
|
||||
- if @all_builds.running_or_pending.any?
|
||||
= link_to 'Cancel all', cancel_all_admin_builds_path, data: { confirm: 'Are you sure?' }, class: 'btn btn-danger', method: :post
|
||||
|
||||
- @builds.each do |build|
|
||||
= render "admin/builds/build", build: build
|
||||
.row-content-block.second-block
|
||||
#{(@scope || 'all').capitalize} builds
|
||||
|
||||
= paginate @builds, theme: 'gitlab'
|
||||
%ul.content-list
|
||||
- if @builds.blank?
|
||||
%li
|
||||
.nothing-here-block No builds to show
|
||||
- else
|
||||
.table-holder
|
||||
%table.table.builds
|
||||
%thead
|
||||
%tr
|
||||
%th Status
|
||||
%th Build ID
|
||||
%th Project
|
||||
%th Commit
|
||||
%th Ref
|
||||
%th Runner
|
||||
%th Name
|
||||
%th Tags
|
||||
%th Duration
|
||||
%th Finished at
|
||||
%th
|
||||
|
||||
- @builds.each do |build|
|
||||
= render "admin/builds/build", build: build
|
||||
|
||||
= paginate @builds, theme: 'gitlab'
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
.nav-links.sub-nav
|
||||
%ul{ class: (container_class) }
|
||||
= nav_link(controller: :dashboard, html_options: {class: 'home'}) do
|
||||
= link_to admin_root_path, title: 'Overview' do
|
||||
%span
|
||||
Overview
|
||||
= nav_link(controller: [:admin, :projects]) do
|
||||
= link_to admin_namespaces_projects_path, title: 'Projects' do
|
||||
%span
|
||||
Projects
|
||||
= nav_link(controller: :users) do
|
||||
= link_to admin_users_path, title: 'Users' do
|
||||
%span
|
||||
Users
|
||||
= nav_link(controller: :groups) do
|
||||
= link_to admin_groups_path, title: 'Groups' do
|
||||
%span
|
||||
Groups
|
||||
= nav_link path: 'builds#index' do
|
||||
= link_to admin_builds_path, title: 'Builds' do
|
||||
%span
|
||||
Builds
|
|
@ -1,155 +1,159 @@
|
|||
.admin-dashboard.prepend-top-default
|
||||
.row
|
||||
.col-md-4
|
||||
%h4 Statistics
|
||||
%hr
|
||||
%p
|
||||
Forks
|
||||
%span.light.pull-right
|
||||
= number_with_delimiter(ForkedProjectLink.count)
|
||||
%p
|
||||
Issues
|
||||
%span.light.pull-right
|
||||
= number_with_delimiter(Issue.count)
|
||||
%p
|
||||
Merge Requests
|
||||
%span.light.pull-right
|
||||
= number_with_delimiter(MergeRequest.count)
|
||||
%p
|
||||
Notes
|
||||
%span.light.pull-right
|
||||
= number_with_delimiter(Note.count)
|
||||
%p
|
||||
Snippets
|
||||
%span.light.pull-right
|
||||
= number_with_delimiter(Snippet.count)
|
||||
%p
|
||||
SSH Keys
|
||||
%span.light.pull-right
|
||||
= number_with_delimiter(Key.count)
|
||||
%p
|
||||
Milestones
|
||||
%span.light.pull-right
|
||||
= number_with_delimiter(Milestone.count)
|
||||
%p
|
||||
Active Users
|
||||
%span.light.pull-right
|
||||
= number_with_delimiter(User.active.count)
|
||||
.col-md-4
|
||||
%h4
|
||||
Features
|
||||
%hr
|
||||
%p
|
||||
Sign up
|
||||
%span.light.pull-right
|
||||
= boolean_to_icon signup_enabled?
|
||||
%p
|
||||
LDAP
|
||||
%span.light.pull-right
|
||||
= boolean_to_icon Gitlab.config.ldap.enabled
|
||||
%p
|
||||
Gravatar
|
||||
%span.light.pull-right
|
||||
= boolean_to_icon gravatar_enabled?
|
||||
%p
|
||||
OmniAuth
|
||||
%span.light.pull-right
|
||||
= boolean_to_icon Gitlab.config.omniauth.enabled
|
||||
%p
|
||||
Reply by email
|
||||
%span.light.pull-right
|
||||
= boolean_to_icon Gitlab::IncomingEmail.enabled?
|
||||
.col-md-4
|
||||
%h4
|
||||
Components
|
||||
- if current_application_settings.version_check_enabled
|
||||
.pull-right
|
||||
= version_status_badge
|
||||
- @no_container = true
|
||||
= render "admin/dashboard/head"
|
||||
|
||||
%hr
|
||||
%p
|
||||
GitLab
|
||||
%span.pull-right
|
||||
= Gitlab::VERSION
|
||||
%p
|
||||
GitLab Shell
|
||||
%span.pull-right
|
||||
= Gitlab::Shell.new.version
|
||||
%p
|
||||
GitLab API
|
||||
%span.pull-right
|
||||
= API::API::version
|
||||
%p
|
||||
Git
|
||||
%span.pull-right
|
||||
= Gitlab::Git.version
|
||||
%p
|
||||
Ruby
|
||||
%span.pull-right
|
||||
#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}
|
||||
|
||||
%p
|
||||
Rails
|
||||
%span.pull-right
|
||||
#{Rails::VERSION::STRING}
|
||||
|
||||
%p
|
||||
= Gitlab::Database.adapter_name
|
||||
%span.pull-right
|
||||
= Gitlab::Database.version
|
||||
%hr
|
||||
.row
|
||||
.col-sm-4
|
||||
.light-well
|
||||
%h4 Projects
|
||||
.data
|
||||
= link_to admin_namespaces_projects_path do
|
||||
%h1= number_with_delimiter(Project.count)
|
||||
%hr
|
||||
= link_to('New Project', new_project_path, class: "btn btn-new")
|
||||
.col-sm-4
|
||||
.light-well
|
||||
%h4 Users
|
||||
.data
|
||||
= link_to admin_users_path do
|
||||
%h1= number_with_delimiter(User.count)
|
||||
%hr
|
||||
= link_to 'New User', new_admin_user_path, class: "btn btn-new"
|
||||
.col-sm-4
|
||||
.light-well
|
||||
%h4 Groups
|
||||
.data
|
||||
= link_to admin_groups_path do
|
||||
%h1= number_with_delimiter(Group.count)
|
||||
%hr
|
||||
= link_to 'New Group', new_admin_group_path, class: "btn btn-new"
|
||||
|
||||
.row.prepend-top-10
|
||||
.col-md-4
|
||||
%h4 Latest projects
|
||||
%hr
|
||||
- @projects.each do |project|
|
||||
%div{ class: (container_class) }
|
||||
.admin-dashboard.prepend-top-default
|
||||
.row
|
||||
.col-md-4
|
||||
%h4 Statistics
|
||||
%hr
|
||||
%p
|
||||
= link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project], class: 'str-truncated'
|
||||
Forks
|
||||
%span.light.pull-right
|
||||
#{time_ago_with_tooltip(project.created_at)}
|
||||
|
||||
.col-md-4
|
||||
%h4 Latest users
|
||||
%hr
|
||||
- @users.each do |user|
|
||||
= number_with_delimiter(ForkedProjectLink.count)
|
||||
%p
|
||||
= link_to [:admin, user], class: 'str-truncated' do
|
||||
= user.name
|
||||
Issues
|
||||
%span.light.pull-right
|
||||
#{time_ago_with_tooltip(user.created_at)}
|
||||
|
||||
.col-md-4
|
||||
%h4 Latest groups
|
||||
%hr
|
||||
- @groups.each do |group|
|
||||
= number_with_delimiter(Issue.count)
|
||||
%p
|
||||
= link_to [:admin, group], class: 'str-truncated' do
|
||||
= group.name
|
||||
Merge Requests
|
||||
%span.light.pull-right
|
||||
#{time_ago_with_tooltip(group.created_at)}
|
||||
= number_with_delimiter(MergeRequest.count)
|
||||
%p
|
||||
Notes
|
||||
%span.light.pull-right
|
||||
= number_with_delimiter(Note.count)
|
||||
%p
|
||||
Snippets
|
||||
%span.light.pull-right
|
||||
= number_with_delimiter(Snippet.count)
|
||||
%p
|
||||
SSH Keys
|
||||
%span.light.pull-right
|
||||
= number_with_delimiter(Key.count)
|
||||
%p
|
||||
Milestones
|
||||
%span.light.pull-right
|
||||
= number_with_delimiter(Milestone.count)
|
||||
%p
|
||||
Active Users
|
||||
%span.light.pull-right
|
||||
= number_with_delimiter(User.active.count)
|
||||
.col-md-4
|
||||
%h4
|
||||
Features
|
||||
%hr
|
||||
%p
|
||||
Sign up
|
||||
%span.light.pull-right
|
||||
= boolean_to_icon signup_enabled?
|
||||
%p
|
||||
LDAP
|
||||
%span.light.pull-right
|
||||
= boolean_to_icon Gitlab.config.ldap.enabled
|
||||
%p
|
||||
Gravatar
|
||||
%span.light.pull-right
|
||||
= boolean_to_icon gravatar_enabled?
|
||||
%p
|
||||
OmniAuth
|
||||
%span.light.pull-right
|
||||
= boolean_to_icon Gitlab.config.omniauth.enabled
|
||||
%p
|
||||
Reply by email
|
||||
%span.light.pull-right
|
||||
= boolean_to_icon Gitlab::IncomingEmail.enabled?
|
||||
.col-md-4
|
||||
%h4
|
||||
Components
|
||||
- if current_application_settings.version_check_enabled
|
||||
.pull-right
|
||||
= version_status_badge
|
||||
|
||||
%hr
|
||||
%p
|
||||
GitLab
|
||||
%span.pull-right
|
||||
= Gitlab::VERSION
|
||||
%p
|
||||
GitLab Shell
|
||||
%span.pull-right
|
||||
= Gitlab::Shell.new.version
|
||||
%p
|
||||
GitLab API
|
||||
%span.pull-right
|
||||
= API::API::version
|
||||
%p
|
||||
Git
|
||||
%span.pull-right
|
||||
= Gitlab::Git.version
|
||||
%p
|
||||
Ruby
|
||||
%span.pull-right
|
||||
#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}
|
||||
|
||||
%p
|
||||
Rails
|
||||
%span.pull-right
|
||||
#{Rails::VERSION::STRING}
|
||||
|
||||
%p
|
||||
= Gitlab::Database.adapter_name
|
||||
%span.pull-right
|
||||
= Gitlab::Database.version
|
||||
%hr
|
||||
.row
|
||||
.col-sm-4
|
||||
.light-well
|
||||
%h4 Projects
|
||||
.data
|
||||
= link_to admin_namespaces_projects_path do
|
||||
%h1= number_with_delimiter(Project.count)
|
||||
%hr
|
||||
= link_to('New Project', new_project_path, class: "btn btn-new")
|
||||
.col-sm-4
|
||||
.light-well
|
||||
%h4 Users
|
||||
.data
|
||||
= link_to admin_users_path do
|
||||
%h1= number_with_delimiter(User.count)
|
||||
%hr
|
||||
= link_to 'New User', new_admin_user_path, class: "btn btn-new"
|
||||
.col-sm-4
|
||||
.light-well
|
||||
%h4 Groups
|
||||
.data
|
||||
= link_to admin_groups_path do
|
||||
%h1= number_with_delimiter(Group.count)
|
||||
%hr
|
||||
= link_to 'New Group', new_admin_group_path, class: "btn btn-new"
|
||||
|
||||
.row.prepend-top-10
|
||||
.col-md-4
|
||||
%h4 Latest projects
|
||||
%hr
|
||||
- @projects.each do |project|
|
||||
%p
|
||||
= link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project], class: 'str-truncated'
|
||||
%span.light.pull-right
|
||||
#{time_ago_with_tooltip(project.created_at)}
|
||||
|
||||
.col-md-4
|
||||
%h4 Latest users
|
||||
%hr
|
||||
- @users.each do |user|
|
||||
%p
|
||||
= link_to [:admin, user], class: 'str-truncated' do
|
||||
= user.name
|
||||
%span.light.pull-right
|
||||
#{time_ago_with_tooltip(user.created_at)}
|
||||
|
||||
.col-md-4
|
||||
%h4 Latest groups
|
||||
%hr
|
||||
- @groups.each do |group|
|
||||
%p
|
||||
= link_to [:admin, group], class: 'str-truncated' do
|
||||
= group.name
|
||||
%span.light.pull-right
|
||||
#{time_ago_with_tooltip(group.created_at)}
|
||||
|
|
|
@ -1,41 +1,45 @@
|
|||
- @no_container = true
|
||||
- page_title "Groups"
|
||||
%h3.page-title
|
||||
Groups (#{number_with_delimiter(@groups.total_count)})
|
||||
= render "admin/dashboard/head"
|
||||
|
||||
%p.light
|
||||
Group allows you to keep projects organized.
|
||||
Use groups for uniting related projects.
|
||||
%div{ class: (container_class) }
|
||||
%h3.page-title
|
||||
Groups (#{number_with_delimiter(@groups.total_count)})
|
||||
|
||||
.top-area
|
||||
.nav-search
|
||||
= form_tag admin_groups_path, method: :get, class: 'form-inline' do
|
||||
= hidden_field_tag :sort, @sort
|
||||
= text_field_tag :name, params[:name], class: "form-control"
|
||||
= button_tag "Search", class: "btn submit btn-primary"
|
||||
%p.light
|
||||
Group allows you to keep projects organized.
|
||||
Use groups for uniting related projects.
|
||||
|
||||
.nav-controls
|
||||
.dropdown.inline
|
||||
%a.dropdown-toggle.btn{href: '#', "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_groups_path(sort: sort_value_recently_created) do
|
||||
.top-area
|
||||
.nav-search
|
||||
= form_tag admin_groups_path, method: :get, class: 'form-inline' do
|
||||
= hidden_field_tag :sort, @sort
|
||||
= text_field_tag :name, params[:name], class: "form-control"
|
||||
= button_tag "Search", class: "btn submit btn-primary"
|
||||
|
||||
.nav-controls
|
||||
.dropdown.inline
|
||||
%a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
|
||||
%span.light
|
||||
- if @sort.present?
|
||||
= sort_options_hash[@sort]
|
||||
- else
|
||||
= sort_title_recently_created
|
||||
= link_to admin_groups_path(sort: sort_value_oldest_created) do
|
||||
= sort_title_oldest_created
|
||||
= link_to admin_groups_path(sort: sort_value_recently_updated) do
|
||||
= sort_title_recently_updated
|
||||
= link_to admin_groups_path(sort: sort_value_oldest_updated) do
|
||||
= sort_title_oldest_updated
|
||||
= link_to 'New Group', new_admin_group_path, class: "btn btn-new"
|
||||
%b.caret
|
||||
%ul.dropdown-menu
|
||||
%li
|
||||
= link_to admin_groups_path(sort: sort_value_recently_created) do
|
||||
= sort_title_recently_created
|
||||
= link_to admin_groups_path(sort: sort_value_oldest_created) do
|
||||
= sort_title_oldest_created
|
||||
= link_to admin_groups_path(sort: sort_value_recently_updated) do
|
||||
= sort_title_recently_updated
|
||||
= link_to admin_groups_path(sort: sort_value_oldest_updated) do
|
||||
= sort_title_oldest_updated
|
||||
= link_to 'New Group', new_admin_group_path, class: "btn btn-new"
|
||||
|
||||
%ul.content-list
|
||||
- @groups.each do |group|
|
||||
= render 'group', group: group
|
||||
%ul.content-list
|
||||
- @groups.each do |group|
|
||||
= render 'group', group: group
|
||||
|
||||
= paginate @groups, theme: "gitlab"
|
||||
= paginate @groups, theme: "gitlab"
|
||||
|
|
|
@ -1,49 +1,52 @@
|
|||
- @no_container = true
|
||||
- page_title "Health Check"
|
||||
= render 'admin/background_jobs/head'
|
||||
|
||||
%h3.page-title
|
||||
Health Check
|
||||
.bs-callout.clearfix
|
||||
.pull-left
|
||||
%p
|
||||
Access token is
|
||||
%code#health-check-token= current_application_settings.health_check_access_token
|
||||
= button_to reset_health_check_token_admin_application_settings_path,
|
||||
method: :put, class: 'btn btn-default',
|
||||
data: { confirm: 'Are you sure you want to reset the health check token?' } do
|
||||
= icon('refresh')
|
||||
Reset health check access token
|
||||
%p.light
|
||||
Health information can be retrieved as plain text, JSON, or XML using:
|
||||
%ul
|
||||
%li
|
||||
%code= health_check_url(token: current_application_settings.health_check_access_token)
|
||||
%li
|
||||
%code= health_check_url(token: current_application_settings.health_check_access_token, format: :json)
|
||||
%li
|
||||
%code= health_check_url(token: current_application_settings.health_check_access_token, format: :xml)
|
||||
%div{ class: (container_class) }
|
||||
%h3.page-title
|
||||
Health Check
|
||||
.bs-callout.clearfix
|
||||
.pull-left
|
||||
%p
|
||||
Access token is
|
||||
%code#health-check-token= current_application_settings.health_check_access_token
|
||||
= button_to reset_health_check_token_admin_application_settings_path,
|
||||
method: :put, class: 'btn btn-default',
|
||||
data: { confirm: 'Are you sure you want to reset the health check token?' } do
|
||||
= icon('refresh')
|
||||
Reset health check access token
|
||||
%p.light
|
||||
Health information can be retrieved as plain text, JSON, or XML using:
|
||||
%ul
|
||||
%li
|
||||
%code= health_check_url(token: current_application_settings.health_check_access_token)
|
||||
%li
|
||||
%code= health_check_url(token: current_application_settings.health_check_access_token, format: :json)
|
||||
%li
|
||||
%code= health_check_url(token: current_application_settings.health_check_access_token, format: :xml)
|
||||
|
||||
%p.light
|
||||
You can also ask for the status of specific services:
|
||||
%ul
|
||||
%li
|
||||
%code= health_check_url(token: current_application_settings.health_check_access_token, checks: :cache)
|
||||
%li
|
||||
%code= health_check_url(token: current_application_settings.health_check_access_token, checks: :database)
|
||||
%li
|
||||
%code= health_check_url(token: current_application_settings.health_check_access_token, checks: :migrations)
|
||||
%p.light
|
||||
You can also ask for the status of specific services:
|
||||
%ul
|
||||
%li
|
||||
%code= health_check_url(token: current_application_settings.health_check_access_token, checks: :cache)
|
||||
%li
|
||||
%code= health_check_url(token: current_application_settings.health_check_access_token, checks: :database)
|
||||
%li
|
||||
%code= health_check_url(token: current_application_settings.health_check_access_token, checks: :migrations)
|
||||
|
||||
%hr
|
||||
.panel.panel-default
|
||||
.panel-heading
|
||||
Current Status:
|
||||
- if @errors.blank?
|
||||
= icon('circle', class: 'cgreen')
|
||||
Healthy
|
||||
- else
|
||||
= icon('warning', class: 'cred')
|
||||
Unhealthy
|
||||
.panel-body
|
||||
- if @errors.blank?
|
||||
No Health Problems Detected
|
||||
- else
|
||||
= @errors
|
||||
%hr
|
||||
.panel.panel-default
|
||||
.panel-heading
|
||||
Current Status:
|
||||
- if @errors.blank?
|
||||
= icon('circle', class: 'cgreen')
|
||||
Healthy
|
||||
- else
|
||||
= icon('warning', class: 'cred')
|
||||
Unhealthy
|
||||
.panel-body
|
||||
- if @errors.blank?
|
||||
No Health Problems Detected
|
||||
- else
|
||||
= @errors
|
||||
|
|
|
@ -1,28 +1,32 @@
|
|||
- @no_container = true
|
||||
- page_title "Logs"
|
||||
- loggers = [Gitlab::GitLogger, Gitlab::AppLogger,
|
||||
Gitlab::ProductionLogger, Gitlab::SidekiqLogger,
|
||||
Gitlab::RepositoryCheckLogger]
|
||||
%ul.nav-links.log-tabs
|
||||
- loggers.each do |klass|
|
||||
%li{ class: (klass == Gitlab::GitLogger ? 'active' : '') }
|
||||
= link_to klass::file_name, "##{klass::file_name_noext}",
|
||||
'data-toggle' => 'tab'
|
||||
.row-content-block
|
||||
To prevent performance issues admin logs output the last 2000 lines
|
||||
.tab-content
|
||||
- loggers.each do |klass|
|
||||
.tab-pane{ class: (klass == Gitlab::GitLogger ? 'active' : ''),
|
||||
id: klass::file_name_noext }
|
||||
.file-holder#README
|
||||
.file-title
|
||||
%i.fa.fa-file
|
||||
= klass::file_name
|
||||
.pull-right
|
||||
= link_to '#', class: 'log-bottom' do
|
||||
%i.fa.fa-arrow-down
|
||||
Scroll down
|
||||
.file-content.logs
|
||||
%ol
|
||||
- klass.read_latest.each do |line|
|
||||
%li
|
||||
%p= line
|
||||
= render 'admin/background_jobs/head'
|
||||
|
||||
%div{ class: (container_class) }
|
||||
%ul.nav-links.log-tabs
|
||||
- loggers.each do |klass|
|
||||
%li{ class: (klass == Gitlab::GitLogger ? 'active' : '') }
|
||||
= link_to klass::file_name, "##{klass::file_name_noext}",
|
||||
'data-toggle' => 'tab'
|
||||
.row-content-block
|
||||
To prevent performance issues admin logs output the last 2000 lines
|
||||
.tab-content
|
||||
- loggers.each do |klass|
|
||||
.tab-pane{ class: (klass == Gitlab::GitLogger ? 'active' : ''),
|
||||
id: klass::file_name_noext }
|
||||
.file-holder#README
|
||||
.file-title
|
||||
%i.fa.fa-file
|
||||
= klass::file_name
|
||||
.pull-right
|
||||
= link_to '#', class: 'log-bottom' do
|
||||
%i.fa.fa-arrow-down
|
||||
Scroll down
|
||||
.file-content.logs
|
||||
%ol
|
||||
- klass.read_latest.each do |line|
|
||||
%li
|
||||
%p= line
|
||||
|
|
|
@ -1,94 +1,97 @@
|
|||
- @no_container = true
|
||||
- page_title "Projects"
|
||||
= render 'shared/show_aside'
|
||||
= render "admin/dashboard/head"
|
||||
|
||||
.row.prepend-top-default
|
||||
%aside.col-md-3
|
||||
.panel.admin-filter
|
||||
= form_tag admin_namespaces_projects_path, method: :get, class: '' do
|
||||
.form-group
|
||||
= label_tag :name, 'Name:'
|
||||
= text_field_tag :name, params[:name], class: "form-control"
|
||||
%div{ class: (container_class) }
|
||||
.row.prepend-top-default
|
||||
%aside.col-md-3
|
||||
.panel.admin-filter
|
||||
= form_tag admin_namespaces_projects_path, method: :get, class: '' do
|
||||
.form-group
|
||||
= label_tag :name, 'Name:'
|
||||
= text_field_tag :name, params[:name], class: "form-control"
|
||||
|
||||
.form-group
|
||||
= label_tag :namespace_id, "Namespace"
|
||||
= namespace_select_tag :namespace_id, selected: params[:namespace_id], class: 'input-large'
|
||||
.form-group
|
||||
= label_tag :namespace_id, "Namespace"
|
||||
= namespace_select_tag :namespace_id, selected: params[:namespace_id], class: 'input-large'
|
||||
|
||||
.form-group
|
||||
%strong Activity
|
||||
.checkbox
|
||||
= 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
|
||||
.form-group
|
||||
%strong Activity
|
||||
.checkbox
|
||||
= 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
|
||||
|
||||
%fieldset
|
||||
%strong Visibility level:
|
||||
.visibility-levels
|
||||
- Project.visibility_levels.each do |label, level|
|
||||
.checkbox
|
||||
%label
|
||||
= check_box_tag 'visibility_levels[]', level, params[:visibility_levels].present? && params[:visibility_levels].include?(level.to_s)
|
||||
%span.descr
|
||||
= visibility_level_icon(level)
|
||||
= label
|
||||
%fieldset
|
||||
%strong Problems
|
||||
.checkbox
|
||||
= label_tag :last_repository_check_failed do
|
||||
= check_box_tag :last_repository_check_failed, 1, params[:last_repository_check_failed]
|
||||
%span Last repository check failed
|
||||
%fieldset
|
||||
%strong Visibility level:
|
||||
.visibility-levels
|
||||
- Project.visibility_levels.each do |label, level|
|
||||
.checkbox
|
||||
%label
|
||||
= check_box_tag 'visibility_levels[]', level, params[:visibility_levels].present? && params[:visibility_levels].include?(level.to_s)
|
||||
%span.descr
|
||||
= visibility_level_icon(level)
|
||||
= label
|
||||
%fieldset
|
||||
%strong Problems
|
||||
.checkbox
|
||||
= label_tag :last_repository_check_failed do
|
||||
= check_box_tag :last_repository_check_failed, 1, params[:last_repository_check_failed]
|
||||
%span Last repository check failed
|
||||
|
||||
= hidden_field_tag :sort, params[:sort]
|
||||
= button_tag "Search", class: "btn submit btn-primary"
|
||||
= link_to "Reset", admin_namespaces_projects_path, class: "btn btn-cancel"
|
||||
= hidden_field_tag :sort, params[:sort]
|
||||
= button_tag "Search", class: "btn submit btn-primary"
|
||||
= link_to "Reset", admin_namespaces_projects_path, class: "btn btn-cancel"
|
||||
|
||||
%section.col-md-9
|
||||
.panel.panel-default
|
||||
.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
|
||||
%section.col-md-9
|
||||
.panel.panel-default
|
||||
.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
|
||||
= 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"
|
||||
%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"
|
||||
|
|
|
@ -1,107 +1,110 @@
|
|||
- @no_container = true
|
||||
- page_title "Users"
|
||||
= render 'shared/show_aside'
|
||||
= render "admin/dashboard/head"
|
||||
|
||||
.admin-filter
|
||||
%ul.nav-links
|
||||
%li{class: "#{'active' unless params[:filter]}"}
|
||||
= link_to admin_users_path do
|
||||
Active
|
||||
%small.badge= number_with_delimiter(User.active.count)
|
||||
%li{class: "#{'active' if params[:filter] == "admins"}"}
|
||||
= link_to admin_users_path(filter: "admins") do
|
||||
Admins
|
||||
%small.badge= number_with_delimiter(User.admins.count)
|
||||
%li.filter-two-factor-enabled{class: "#{'active' if params[:filter] == 'two_factor_enabled'}"}
|
||||
= link_to admin_users_path(filter: 'two_factor_enabled') do
|
||||
2FA Enabled
|
||||
%small.badge= number_with_delimiter(User.with_two_factor.count)
|
||||
%li.filter-two-factor-disabled{class: "#{'active' if params[:filter] == 'two_factor_disabled'}"}
|
||||
= link_to admin_users_path(filter: 'two_factor_disabled') do
|
||||
2FA Disabled
|
||||
%small.badge= number_with_delimiter(User.without_two_factor.count)
|
||||
%li.filter-external{class: "#{'active' if params[:filter] == 'external'}"}
|
||||
= link_to admin_users_path(filter: 'external') do
|
||||
External
|
||||
%small.badge= number_with_delimiter(User.external.count)
|
||||
%li{class: "#{'active' if params[:filter] == "blocked"}"}
|
||||
= link_to admin_users_path(filter: "blocked") do
|
||||
Blocked
|
||||
%small.badge= number_with_delimiter(User.blocked.count)
|
||||
%li{class: "#{'active' if params[:filter] == "wop"}"}
|
||||
= link_to admin_users_path(filter: "wop") do
|
||||
Without projects
|
||||
%small.badge= number_with_delimiter(User.without_projects.count)
|
||||
%div{ class: (container_class) }
|
||||
.admin-filter
|
||||
%ul.nav-links
|
||||
%li{class: "#{'active' unless params[:filter]}"}
|
||||
= link_to admin_users_path do
|
||||
Active
|
||||
%small.badge= number_with_delimiter(User.active.count)
|
||||
%li{class: "#{'active' if params[:filter] == "admins"}"}
|
||||
= link_to admin_users_path(filter: "admins") do
|
||||
Admins
|
||||
%small.badge= number_with_delimiter(User.admins.count)
|
||||
%li.filter-two-factor-enabled{class: "#{'active' if params[:filter] == 'two_factor_enabled'}"}
|
||||
= link_to admin_users_path(filter: 'two_factor_enabled') do
|
||||
2FA Enabled
|
||||
%small.badge= number_with_delimiter(User.with_two_factor.count)
|
||||
%li.filter-two-factor-disabled{class: "#{'active' if params[:filter] == 'two_factor_disabled'}"}
|
||||
= link_to admin_users_path(filter: 'two_factor_disabled') do
|
||||
2FA Disabled
|
||||
%small.badge= number_with_delimiter(User.without_two_factor.count)
|
||||
%li.filter-external{class: "#{'active' if params[:filter] == 'external'}"}
|
||||
= link_to admin_users_path(filter: 'external') do
|
||||
External
|
||||
%small.badge= number_with_delimiter(User.external.count)
|
||||
%li{class: "#{'active' if params[:filter] == "blocked"}"}
|
||||
= link_to admin_users_path(filter: "blocked") do
|
||||
Blocked
|
||||
%small.badge= number_with_delimiter(User.blocked.count)
|
||||
%li{class: "#{'active' if params[:filter] == "wop"}"}
|
||||
= link_to admin_users_path(filter: "wop") do
|
||||
Without projects
|
||||
%small.badge= number_with_delimiter(User.without_projects.count)
|
||||
|
||||
.row-content-block.second-block
|
||||
.pull-right
|
||||
.dropdown.inline
|
||||
%a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
|
||||
%span.light
|
||||
- if @sort.present?
|
||||
= sort_options_hash[@sort]
|
||||
- else
|
||||
= sort_title_name
|
||||
%b.caret
|
||||
%ul.dropdown-menu
|
||||
%li
|
||||
= link_to admin_users_path(sort: sort_value_name, filter: params[:filter]) do
|
||||
.row-content-block.second-block
|
||||
.pull-right
|
||||
.dropdown.inline
|
||||
%a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"}
|
||||
%span.light
|
||||
- if @sort.present?
|
||||
= sort_options_hash[@sort]
|
||||
- else
|
||||
= sort_title_name
|
||||
= link_to admin_users_path(sort: sort_value_recently_signin, filter: params[:filter]) do
|
||||
= sort_title_recently_signin
|
||||
= link_to admin_users_path(sort: sort_value_oldest_signin, filter: params[:filter]) do
|
||||
= sort_title_oldest_signin
|
||||
= link_to admin_users_path(sort: sort_value_recently_created, filter: params[:filter]) do
|
||||
= sort_title_recently_created
|
||||
= link_to admin_users_path(sort: sort_value_oldest_created, filter: params[:filter]) do
|
||||
= sort_title_oldest_created
|
||||
= link_to admin_users_path(sort: sort_value_recently_updated, filter: params[:filter]) do
|
||||
= sort_title_recently_updated
|
||||
= link_to admin_users_path(sort: sort_value_oldest_updated, filter: params[:filter]) do
|
||||
= sort_title_oldest_updated
|
||||
%b.caret
|
||||
%ul.dropdown-menu
|
||||
%li
|
||||
= link_to admin_users_path(sort: sort_value_name, filter: params[:filter]) do
|
||||
= sort_title_name
|
||||
= link_to admin_users_path(sort: sort_value_recently_signin, filter: params[:filter]) do
|
||||
= sort_title_recently_signin
|
||||
= link_to admin_users_path(sort: sort_value_oldest_signin, filter: params[:filter]) do
|
||||
= sort_title_oldest_signin
|
||||
= link_to admin_users_path(sort: sort_value_recently_created, filter: params[:filter]) do
|
||||
= sort_title_recently_created
|
||||
= link_to admin_users_path(sort: sort_value_oldest_created, filter: params[:filter]) do
|
||||
= sort_title_oldest_created
|
||||
= link_to admin_users_path(sort: sort_value_recently_updated, filter: params[:filter]) do
|
||||
= sort_title_recently_updated
|
||||
= link_to admin_users_path(sort: sort_value_oldest_updated, filter: params[:filter]) do
|
||||
= sort_title_oldest_updated
|
||||
|
||||
= link_to 'New User', new_admin_user_path, class: "btn btn-new"
|
||||
= form_tag admin_users_path, method: :get, class: 'form-inline' do
|
||||
.form-group
|
||||
= search_field_tag :name, params[:name], placeholder: 'Name, email or username', class: 'form-control', spellcheck: false
|
||||
= hidden_field_tag "filter", params[:filter]
|
||||
= button_tag class: 'btn btn-primary' do
|
||||
%i.fa.fa-search
|
||||
= link_to 'New User', new_admin_user_path, class: "btn btn-new"
|
||||
= form_tag admin_users_path, method: :get, class: 'form-inline' do
|
||||
.form-group
|
||||
= search_field_tag :name, params[:name], placeholder: 'Name, email or username', class: 'form-control', spellcheck: false
|
||||
= hidden_field_tag "filter", params[:filter]
|
||||
= 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'
|
||||
|
||||
.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
|
||||
= 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"
|
||||
%span.light
|
||||
%i.fa.fa-envelope
|
||||
= mail_to user.email, user.email, class: 'light'
|
||||
|
||||
.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"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
- page_title "Admin Area"
|
||||
- header_title "Admin Area", admin_root_path
|
||||
- sidebar "admin"
|
||||
- nav "admin"
|
||||
|
||||
= render template: "layouts/application"
|
||||
|
|
|
@ -1,107 +1,64 @@
|
|||
%ul.nav.nav-sidebar
|
||||
= nav_link(controller: :dashboard, html_options: {class: 'home'}) do
|
||||
= link_to admin_root_path, title: 'Overview' do
|
||||
= icon('dashboard fw')
|
||||
%ul.nav-links.scrolling-tabs
|
||||
.fade-left
|
||||
= nav_link(controller: %w(dashboard admin projects users groups builds), html_options: {class: 'home'}) do
|
||||
= link_to admin_root_path, title: 'Overview', class: 'shortcuts-tree' do
|
||||
%span
|
||||
Overview
|
||||
= nav_link(controller: [:admin, :projects]) do
|
||||
= link_to admin_namespaces_projects_path, title: 'Projects' do
|
||||
= icon('cube fw')
|
||||
= nav_link(controller: %w(background_jobs logs health_check)) do
|
||||
= link_to admin_background_jobs_path, title: 'Monitoring' do
|
||||
%span
|
||||
Projects
|
||||
= nav_link(controller: :users) do
|
||||
= link_to admin_users_path, title: 'Users' do
|
||||
= icon('user fw')
|
||||
%span
|
||||
Users
|
||||
= nav_link(controller: :groups) do
|
||||
= link_to admin_groups_path, title: 'Groups' do
|
||||
= icon('group fw')
|
||||
%span
|
||||
Groups
|
||||
Monitoring
|
||||
= nav_link(controller: :deploy_keys) do
|
||||
= link_to admin_deploy_keys_path, title: 'Deploy Keys' do
|
||||
= icon('key fw')
|
||||
%span
|
||||
Deploy Keys
|
||||
= nav_link path: ['runners#index', 'runners#show'] do
|
||||
= link_to admin_runners_path, title: 'Runners' do
|
||||
= icon('cog fw')
|
||||
%span
|
||||
Runners
|
||||
%span.count= number_with_delimiter(Ci::Runner.count(:all))
|
||||
= nav_link path: 'builds#index' do
|
||||
= link_to admin_builds_path, title: 'Builds' do
|
||||
= icon('link fw')
|
||||
%span
|
||||
Builds
|
||||
%span.count= number_with_delimiter(Ci::Build.count(:all))
|
||||
= nav_link(controller: :logs) do
|
||||
= link_to admin_logs_path, title: 'Logs' do
|
||||
= icon('file-text fw')
|
||||
%span
|
||||
Logs
|
||||
= nav_link(controller: :health_check) do
|
||||
= link_to admin_health_check_path, title: 'Health Check' do
|
||||
= icon('medkit fw')
|
||||
%span
|
||||
Health Check
|
||||
= nav_link(controller: :broadcast_messages) do
|
||||
= link_to admin_broadcast_messages_path, title: 'Messages' do
|
||||
= icon('bullhorn fw')
|
||||
%span
|
||||
Messages
|
||||
= nav_link(controller: :hooks) do
|
||||
= link_to admin_hooks_path, title: 'Hooks' do
|
||||
= icon('external-link fw')
|
||||
%span
|
||||
Hooks
|
||||
= nav_link(controller: :background_jobs) do
|
||||
= link_to admin_background_jobs_path, title: 'Background Jobs' do
|
||||
= icon('cog fw')
|
||||
%span
|
||||
Background Jobs
|
||||
|
||||
= nav_link(controller: :appearances) do
|
||||
= link_to admin_appearances_path, title: 'Appearances' do
|
||||
= icon('image')
|
||||
%span
|
||||
Appearance
|
||||
|
||||
= nav_link(controller: :applications) do
|
||||
= link_to admin_applications_path, title: 'Applications' do
|
||||
= icon('cloud fw')
|
||||
%span
|
||||
Applications
|
||||
|
||||
= nav_link(controller: :services) do
|
||||
= link_to admin_application_settings_services_path, title: 'Service Templates' do
|
||||
= icon('copy fw')
|
||||
%span
|
||||
Service Templates
|
||||
|
||||
= nav_link(controller: :labels) do
|
||||
= link_to admin_labels_path, title: 'Labels' do
|
||||
= icon('tags fw')
|
||||
%span
|
||||
Labels
|
||||
|
||||
= nav_link(controller: :abuse_reports) do
|
||||
= link_to admin_abuse_reports_path, title: "Abuse Reports" do
|
||||
= icon('exclamation-circle fw')
|
||||
%span
|
||||
Abuse Reports
|
||||
%span.count= number_with_delimiter(AbuseReport.count(:all))
|
||||
%span.badge.count= number_with_delimiter(AbuseReport.count(:all))
|
||||
|
||||
- if askimet_enabled?
|
||||
= nav_link(controller: :spam_logs) do
|
||||
= link_to admin_spam_logs_path, title: "Spam Logs" do
|
||||
= icon('exclamation-triangle fw')
|
||||
%span
|
||||
Spam Logs
|
||||
%span.count= number_with_delimiter(SpamLog.count(:all))
|
||||
|
||||
= nav_link(controller: :application_settings, html_options: { class: 'separate-item'}) do
|
||||
= link_to admin_application_settings_path, title: 'Settings' do
|
||||
= icon('cogs fw')
|
||||
%span
|
||||
Settings
|
||||
.fade-right
|
||||
|
|
|
@ -5,28 +5,36 @@ Feature: Admin Active Tab
|
|||
|
||||
Scenario: On Admin Home
|
||||
Given I visit admin page
|
||||
Then the active main tab should be Home
|
||||
Then the active main tab should be Overview
|
||||
And no other main tabs should be active
|
||||
|
||||
Scenario: On Admin Projects
|
||||
Given I visit admin projects page
|
||||
Then the active main tab should be Projects
|
||||
Then the active main tab should be Overview
|
||||
And the active sub tab should be Projects
|
||||
And no other main tabs should be active
|
||||
And no other sub tabs should be active
|
||||
|
||||
Scenario: On Admin Groups
|
||||
Given I visit admin groups page
|
||||
Then the active main tab should be Groups
|
||||
Then the active main tab should be Overview
|
||||
And the active sub tab should be Groups
|
||||
And no other main tabs should be active
|
||||
And no other sub tabs should be active
|
||||
|
||||
Scenario: On Admin Users
|
||||
Given I visit admin users page
|
||||
Then the active main tab should be Users
|
||||
Then the active main tab should be Overview
|
||||
And the active sub tab should be Users
|
||||
And no other main tabs should be active
|
||||
And no other sub tabs should be active
|
||||
|
||||
Scenario: On Admin Logs
|
||||
Given I visit admin logs page
|
||||
Then the active main tab should be Logs
|
||||
Then the active main tab should be Monitoring
|
||||
And the active sub tab should be Logs
|
||||
And no other main tabs should be active
|
||||
And no other sub tabs should be active
|
||||
|
||||
Scenario: On Admin Messages
|
||||
Given I visit admin messages page
|
||||
|
@ -40,5 +48,7 @@ Feature: Admin Active Tab
|
|||
|
||||
Scenario: On Admin Resque
|
||||
Given I visit admin Resque page
|
||||
Then the active main tab should be Resque
|
||||
Then the active main tab should be Monitoring
|
||||
And the active sub tab should be Resque
|
||||
And no other main tabs should be active
|
||||
And no other sub tabs should be active
|
||||
|
|
|
@ -1,45 +1,41 @@
|
|||
class Spinach::Features::AdminActiveTab < Spinach::FeatureSteps
|
||||
include SharedAuthentication
|
||||
include SharedPaths
|
||||
include SharedSidebarActiveTab
|
||||
include SharedActiveTab
|
||||
|
||||
step 'the active main tab should be Home' do
|
||||
step 'the active main tab should be Overview' do
|
||||
ensure_active_main_tab('Overview')
|
||||
end
|
||||
|
||||
step 'the active main tab should be Projects' do
|
||||
ensure_active_main_tab('Projects')
|
||||
step 'the active sub tab should be Projects' do
|
||||
ensure_active_sub_tab('Projects')
|
||||
end
|
||||
|
||||
step 'the active main tab should be Groups' do
|
||||
ensure_active_main_tab('Groups')
|
||||
step 'the active sub tab should be Groups' do
|
||||
ensure_active_sub_tab('Groups')
|
||||
end
|
||||
|
||||
step 'the active main tab should be Users' do
|
||||
ensure_active_main_tab('Users')
|
||||
end
|
||||
|
||||
step 'the active main tab should be Logs' do
|
||||
ensure_active_main_tab('Logs')
|
||||
step 'the active sub tab should be Users' do
|
||||
ensure_active_sub_tab('Users')
|
||||
end
|
||||
|
||||
step 'the active main tab should be Hooks' do
|
||||
ensure_active_main_tab('Hooks')
|
||||
end
|
||||
|
||||
step 'the active main tab should be Resque' do
|
||||
ensure_active_main_tab('Background Jobs')
|
||||
step 'the active main tab should be Monitoring' do
|
||||
ensure_active_main_tab('Monitoring')
|
||||
end
|
||||
|
||||
step 'the active sub tab should be Resque' do
|
||||
ensure_active_sub_tab('Background Jobs')
|
||||
end
|
||||
|
||||
step 'the active sub tab should be Logs' do
|
||||
ensure_active_sub_tab('Logs')
|
||||
end
|
||||
|
||||
step 'the active main tab should be Messages' do
|
||||
ensure_active_main_tab('Messages')
|
||||
end
|
||||
|
||||
step 'no other main tabs should be active' do
|
||||
expect(page).to have_selector('.nav-sidebar > li.active', count: 1)
|
||||
end
|
||||
|
||||
def ensure_active_main_tab(content)
|
||||
expect(find('.nav-sidebar > li.active')).to have_content(content)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -12,9 +12,11 @@ describe "Admin::Hooks", feature: true do
|
|||
describe "GET /admin/hooks" do
|
||||
it "should be ok" do
|
||||
visit admin_root_path
|
||||
page.within ".sidebar-wrapper" do
|
||||
|
||||
page.within ".layout-nav" do
|
||||
click_on "Hooks"
|
||||
end
|
||||
|
||||
expect(current_path).to eq(admin_hooks_path)
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in New Issue