Commit 8f259c5ecca69af417e10cba11c329a95d3052d9
Exists in
spb-stable
and in
2 other branches
Merge branch 'improve-group-settings-ui' into 'master'
Improve group settings ui
Showing
7 changed files
with
110 additions
and
94 deletions
Show diff stats
app/assets/stylesheets/gl_bootstrap.scss
| @@ -237,4 +237,15 @@ ul.breadcrumb { | @@ -237,4 +237,15 @@ ul.breadcrumb { | ||
| 237 | float: right; | 237 | float: right; |
| 238 | } | 238 | } |
| 239 | } | 239 | } |
| 240 | + | ||
| 241 | + .panel-body { | ||
| 242 | + form { | ||
| 243 | + margin: 0; | ||
| 244 | + } | ||
| 245 | + | ||
| 246 | + .form-actions { | ||
| 247 | + margin-bottom: 0; | ||
| 248 | + background: #FFF; | ||
| 249 | + } | ||
| 250 | + } | ||
| 240 | } | 251 | } |
app/controllers/groups_controller.rb
| @@ -9,7 +9,7 @@ class GroupsController < ApplicationController | @@ -9,7 +9,7 @@ class GroupsController < ApplicationController | ||
| 9 | before_filter :authorize_create_group!, only: [:new, :create] | 9 | before_filter :authorize_create_group!, only: [:new, :create] |
| 10 | 10 | ||
| 11 | # Load group projects | 11 | # Load group projects |
| 12 | - before_filter :projects, except: [:new, :create] | 12 | + before_filter :load_projects, except: [:new, :create, :projects, :edit, :update] |
| 13 | 13 | ||
| 14 | before_filter :default_filter, only: [:issues, :merge_requests] | 14 | before_filter :default_filter, only: [:issues, :merge_requests] |
| 15 | 15 | ||
| @@ -79,9 +79,13 @@ class GroupsController < ApplicationController | @@ -79,9 +79,13 @@ class GroupsController < ApplicationController | ||
| 79 | def edit | 79 | def edit |
| 80 | end | 80 | end |
| 81 | 81 | ||
| 82 | + def projects | ||
| 83 | + @projects = @group.projects.page(params[:page]) | ||
| 84 | + end | ||
| 85 | + | ||
| 82 | def update | 86 | def update |
| 83 | if @group.update_attributes(params[:group]) | 87 | if @group.update_attributes(params[:group]) |
| 84 | - redirect_to @group, notice: 'Group was successfully updated.' | 88 | + redirect_to edit_group_path(@group), notice: 'Group was successfully updated.' |
| 85 | else | 89 | else |
| 86 | render action: "edit" | 90 | render action: "edit" |
| 87 | end | 91 | end |
| @@ -99,7 +103,7 @@ class GroupsController < ApplicationController | @@ -99,7 +103,7 @@ class GroupsController < ApplicationController | ||
| 99 | @group ||= Group.find_by(path: params[:id]) | 103 | @group ||= Group.find_by(path: params[:id]) |
| 100 | end | 104 | end |
| 101 | 105 | ||
| 102 | - def projects | 106 | + def load_projects |
| 103 | @projects ||= ProjectsFinder.new.execute(current_user, group: group).sorted_by_activity.non_archived | 107 | @projects ||= ProjectsFinder.new.execute(current_user, group: group).sorted_by_activity.non_archived |
| 104 | end | 108 | end |
| 105 | 109 |
| @@ -0,0 +1,10 @@ | @@ -0,0 +1,10 @@ | ||
| 1 | +%ul.nav.nav-pills.nav-stacked.nav-stacked-menu | ||
| 2 | + = nav_link(path: 'groups#edit') do | ||
| 3 | + = link_to edit_group_path(@group) do | ||
| 4 | + %i.icon-edit | ||
| 5 | + Group | ||
| 6 | + = nav_link(path: 'groups#projects') do | ||
| 7 | + = link_to projects_group_path(@group) do | ||
| 8 | + %i.icon-folder-close | ||
| 9 | + Projects | ||
| 10 | + |
app/views/groups/edit.html.haml
| 1 | .row | 1 | .row |
| 2 | .col-md-2 | 2 | .col-md-2 |
| 3 | - %ul.nav.nav-pills.nav-stacked.nav-stacked-menu | ||
| 4 | - %li.active | ||
| 5 | - = link_to '#tab-edit', 'data-toggle' => 'tab' do | ||
| 6 | - %i.icon-edit | ||
| 7 | - Group | ||
| 8 | - %li | ||
| 9 | - = link_to '#tab-projects', 'data-toggle' => 'tab' do | ||
| 10 | - %i.icon-folder-close | ||
| 11 | - Projects | ||
| 12 | - %li | ||
| 13 | - = link_to '#tab-remove', 'data-toggle' => 'tab' do | ||
| 14 | - %i.icon-remove-sign | ||
| 15 | - Remove | ||
| 16 | - | 3 | + = render 'settings_nav' |
| 17 | .col-md-10 | 4 | .col-md-10 |
| 18 | - .tab-content | ||
| 19 | - .tab-pane.active#tab-edit | ||
| 20 | - .panel.panel-default | ||
| 21 | - .panel-heading | ||
| 22 | - %strong= @group.name | ||
| 23 | - group settings: | ||
| 24 | - %div.form-holder | ||
| 25 | - = form_for @group, html: { multipart: true, class: "form-horizontal" }, authenticity_token: true do |f| | ||
| 26 | - - if @group.errors.any? | ||
| 27 | - .alert.alert-danger | ||
| 28 | - %span= @group.errors.full_messages.first | ||
| 29 | - .form-group | ||
| 30 | - = f.label :name, class: 'control-label' do | ||
| 31 | - Group name | ||
| 32 | - .col-sm-10 | ||
| 33 | - = f.text_field :name, placeholder: "Ex. OpenSource", class: "form-control left" | ||
| 34 | - | ||
| 35 | - .form-group.group-description-holder | ||
| 36 | - = f.label :description, "Details", class: 'control-label' | ||
| 37 | - .col-sm-10 | ||
| 38 | - = f.text_area :description, maxlength: 250, class: "form-control js-gfm-input", rows: 4 | 5 | + .panel.panel-default |
| 6 | + .panel-heading | ||
| 7 | + %strong= @group.name | ||
| 8 | + group settings: | ||
| 9 | + .panel-body | ||
| 10 | + = form_for @group, html: { multipart: true, class: "form-horizontal" }, authenticity_token: true do |f| | ||
| 11 | + - if @group.errors.any? | ||
| 12 | + .alert.alert-danger | ||
| 13 | + %span= @group.errors.full_messages.first | ||
| 14 | + .form-group | ||
| 15 | + = f.label :name, class: 'control-label' do | ||
| 16 | + Group name | ||
| 17 | + .col-sm-10 | ||
| 18 | + = f.text_field :name, placeholder: "Ex. OpenSource", class: "form-control left" | ||
| 39 | 19 | ||
| 40 | - .form-group | ||
| 41 | - .col-sm-2 | ||
| 42 | - .col-sm-10 | ||
| 43 | - = image_tag group_icon(@group.to_param), alt: '', class: 'avatar s160' | ||
| 44 | - %p.light | ||
| 45 | - - if @group.avatar? | ||
| 46 | - You can change your group avatar here | ||
| 47 | - - else | ||
| 48 | - You can upload a group avatar here | ||
| 49 | - %a.choose-btn.btn.btn-small.js-choose-group-avatar-button | ||
| 50 | - %i.icon-paper-clip | ||
| 51 | - %span Choose File ... | ||
| 52 | - | ||
| 53 | - %span.file_name.js-avatar-filename File name... | ||
| 54 | - = f.file_field :avatar, class: "js-group-avatar-input hidden" | ||
| 55 | - .light The maximum file size allowed is 100KB. | ||
| 56 | - - if @group.avatar? | ||
| 57 | - %hr | ||
| 58 | - = link_to 'Remove avatar', group_avatar_path(@group.to_param), data: { confirm: "Group avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-small remove-avatar" | 20 | + .form-group.group-description-holder |
| 21 | + = f.label :description, "Details", class: 'control-label' | ||
| 22 | + .col-sm-10 | ||
| 23 | + = f.text_area :description, maxlength: 250, class: "form-control js-gfm-input", rows: 4 | ||
| 59 | 24 | ||
| 60 | - .form-actions | ||
| 61 | - = f.submit 'Save group', class: "btn btn-save" | 25 | + .form-group |
| 26 | + .col-sm-2 | ||
| 27 | + .col-sm-10 | ||
| 28 | + = image_tag group_icon(@group.to_param), alt: '', class: 'avatar s160' | ||
| 29 | + %p.light | ||
| 30 | + - if @group.avatar? | ||
| 31 | + You can change your group avatar here | ||
| 32 | + - else | ||
| 33 | + You can upload a group avatar here | ||
| 34 | + %a.choose-btn.btn.btn-small.js-choose-group-avatar-button | ||
| 35 | + %i.icon-paper-clip | ||
| 36 | + %span Choose File ... | ||
| 37 | + | ||
| 38 | + %span.file_name.js-avatar-filename File name... | ||
| 39 | + = f.file_field :avatar, class: "js-group-avatar-input hidden" | ||
| 40 | + .light The maximum file size allowed is 100KB. | ||
| 41 | + - if @group.avatar? | ||
| 42 | + %hr | ||
| 43 | + = link_to 'Remove avatar', group_avatar_path(@group.to_param), data: { confirm: "Group avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-small remove-avatar" | ||
| 62 | 44 | ||
| 63 | - .tab-pane#tab-projects | ||
| 64 | - .panel.panel-default | ||
| 65 | - .panel-heading | ||
| 66 | - %strong= @group.name | ||
| 67 | - projects: | ||
| 68 | - - if can? current_user, :manage_group, @group | ||
| 69 | - %span.pull-right | ||
| 70 | - = link_to new_project_path(namespace_id: @group.id), class: "btn btn-tiny" do | ||
| 71 | - %i.icon-plus | ||
| 72 | - New Project | ||
| 73 | - %ul.well-list | ||
| 74 | - - @group.projects.each do |project| | ||
| 75 | - %li | ||
| 76 | - .list-item-name | ||
| 77 | - = visibility_level_icon(project.visibility_level) | ||
| 78 | - = link_to project.name_with_namespace, project | ||
| 79 | - .pull-right | ||
| 80 | - = link_to 'Members', project_team_index_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small" | ||
| 81 | - = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small" | ||
| 82 | - = link_to 'Remove', project, data: { confirm: remove_project_message(project)}, method: :delete, class: "btn btn-small btn-remove" | ||
| 83 | - - if @group.projects.blank? | ||
| 84 | - .nothing-here-block This group has no projects yet | 45 | + .form-actions |
| 46 | + = f.submit 'Save group', class: "btn btn-save" | ||
| 85 | 47 | ||
| 86 | - .tab-pane#tab-remove | ||
| 87 | - .panel.panel-default.panel.panel-danger | ||
| 88 | - .panel-heading Remove group | ||
| 89 | - .panel-body | ||
| 90 | - %p | ||
| 91 | - Removing group will cause all child projects and resources to be removed. | ||
| 92 | - %p | ||
| 93 | - %strong Removed group can not be restored! | 48 | + .panel.panel-danger |
| 49 | + .panel-heading Remove group | ||
| 50 | + .panel-body | ||
| 51 | + %p | ||
| 52 | + Removing group will cause all child projects and resources to be removed. | ||
| 53 | + %br | ||
| 54 | + %strong Removed group can not be restored! | ||
| 94 | 55 | ||
| 95 | - = link_to 'Remove Group', @group, data: {confirm: 'Removed group can not be restored! Are you sure?'}, method: :delete, class: "btn btn-remove" | 56 | + = link_to 'Remove Group', @group, data: {confirm: 'Removed group can not be restored! Are you sure?'}, method: :delete, class: "btn btn-remove" |
| @@ -0,0 +1,29 @@ | @@ -0,0 +1,29 @@ | ||
| 1 | +.row | ||
| 2 | + .col-md-2 | ||
| 3 | + = render 'settings_nav' | ||
| 4 | + .col-md-10 | ||
| 5 | + .panel.panel-default | ||
| 6 | + .panel-heading | ||
| 7 | + %strong= @group.name | ||
| 8 | + projects: | ||
| 9 | + - if can? current_user, :manage_group, @group | ||
| 10 | + .panel-head-actions | ||
| 11 | + = link_to new_project_path(namespace_id: @group.id), class: "btn btn-new" do | ||
| 12 | + %i.icon-plus | ||
| 13 | + New Project | ||
| 14 | + %ul.well-list | ||
| 15 | + - @projects.each do |project| | ||
| 16 | + %li | ||
| 17 | + .list-item-name | ||
| 18 | + = visibility_level_icon(project.visibility_level) | ||
| 19 | + %strong= link_to project.name_with_namespace, project | ||
| 20 | + %span.label.label-gray | ||
| 21 | + = repository_size(project) | ||
| 22 | + .pull-right | ||
| 23 | + = link_to 'Members', project_team_index_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small" | ||
| 24 | + = link_to 'Edit', edit_project_path(project), id: "edit_#{dom_id(project)}", class: "btn btn-small" | ||
| 25 | + = link_to 'Remove', project, data: { confirm: remove_project_message(project)}, method: :delete, class: "btn btn-small btn-remove" | ||
| 26 | + - if @projects.blank? | ||
| 27 | + .nothing-here-block This group has no projects yet | ||
| 28 | + | ||
| 29 | + = paginate @projects, theme: "gitlab" |
config/routes.rb
| @@ -146,6 +146,7 @@ Gitlab::Application.routes.draw do | @@ -146,6 +146,7 @@ Gitlab::Application.routes.draw do | ||
| 146 | get :issues | 146 | get :issues |
| 147 | get :merge_requests | 147 | get :merge_requests |
| 148 | get :members | 148 | get :members |
| 149 | + get :projects | ||
| 149 | end | 150 | end |
| 150 | 151 | ||
| 151 | resources :users_groups, only: [:create, :update, :destroy] | 152 | resources :users_groups, only: [:create, :update, :destroy] |
features/steps/group/group.rb
| @@ -38,22 +38,22 @@ class Groups < Spinach::FeatureSteps | @@ -38,22 +38,22 @@ class Groups < Spinach::FeatureSteps | ||
| 38 | end | 38 | end |
| 39 | 39 | ||
| 40 | Then 'I should see user "John Doe" in team list' do | 40 | Then 'I should see user "John Doe" in team list' do |
| 41 | - projects_with_access = find(".ui-box .well-list") | 41 | + projects_with_access = find(".panel .well-list") |
| 42 | projects_with_access.should have_content("John Doe") | 42 | projects_with_access.should have_content("John Doe") |
| 43 | end | 43 | end |
| 44 | 44 | ||
| 45 | Then 'I should not see user "John Doe" in team list' do | 45 | Then 'I should not see user "John Doe" in team list' do |
| 46 | - projects_with_access = find(".ui-box .well-list") | 46 | + projects_with_access = find(".panel .well-list") |
| 47 | projects_with_access.should_not have_content("John Doe") | 47 | projects_with_access.should_not have_content("John Doe") |
| 48 | end | 48 | end |
| 49 | 49 | ||
| 50 | Then 'I should see user "Mary Jane" in team list' do | 50 | Then 'I should see user "Mary Jane" in team list' do |
| 51 | - projects_with_access = find(".ui-box .well-list") | 51 | + projects_with_access = find(".panel .well-list") |
| 52 | projects_with_access.should have_content("Mary Jane") | 52 | projects_with_access.should have_content("Mary Jane") |
| 53 | end | 53 | end |
| 54 | 54 | ||
| 55 | Then 'I should not see user "Mary Jane" in team list' do | 55 | Then 'I should not see user "Mary Jane" in team list' do |
| 56 | - projects_with_access = find(".ui-box .well-list") | 56 | + projects_with_access = find(".panel .well-list") |
| 57 | projects_with_access.should_not have_content("Mary Jane") | 57 | projects_with_access.should_not have_content("Mary Jane") |
| 58 | end | 58 | end |
| 59 | 59 |