Commit 8f259c5ecca69af417e10cba11c329a95d3052d9

Authored by Dmitriy Zaporozhets
2 parents 4f9669cd 5b26b45d

Merge branch 'improve-group-settings-ui' into 'master'

Improve group settings ui
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
app/views/groups/_settings_nav.html.haml 0 → 100644
@@ -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"
app/views/groups/projects.html.haml 0 → 100644
@@ -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