Commit cc043f32d8bfa7da5e94061806ae56fc11902d71
1 parent
a769204f
Exists in
master
and in
4 other branches
Admin area improved
Showing
39 changed files
with
434 additions
and
334 deletions
Show diff stats
app/assets/stylesheets/application.css
app/assets/stylesheets/common.scss
1 | -@import "bootstrap"; | |
2 | - | |
3 | -/** GITLAB colors **/ | |
4 | -$text_color:#222; | |
5 | -$lite_text_color: #666; | |
6 | -$link_color:#111; | |
7 | -$active_link_color:#2FA0BB; | |
8 | -$active_bg_color:#79C3E0; | |
9 | -$active_bd_color: #2FA0BB; | |
10 | -$border_color:#CCC; | |
11 | -$lite_border_color:#EEE; | |
12 | -$min_app_width:980px; | |
13 | -$max_app_width:980px; | |
14 | -$app_padding:20px; | |
15 | -$bg_color: #FFF; | |
16 | -$styled_border_color: #2FA0BB; | |
17 | -$color: "#4BB8D2"; | |
18 | -$blue_link: "#2fa0bb"; | |
19 | - | |
20 | -/** MIXINS **/ | |
21 | -@mixin round-borders-bottom($radius) { | |
22 | - border-top: 1px solid #eaeaea; | |
23 | - -moz-border-radius-bottomright: $radius; | |
24 | - -moz-border-radius-bottomleft: $radius; | |
25 | - border-bottom-right-radius: $radius; | |
26 | - border-bottom-left-radius: $radius; | |
27 | - -webkit-border-bottom-left-radius: $radius; | |
28 | - -webkit-border-bottom-right-radius: $radius; | |
29 | -} | |
30 | - | |
31 | -@mixin round-borders-top($radius) { | |
32 | - border-top: 1px solid #eaeaea; | |
33 | - -moz-border-radius-topright: $radius; | |
34 | - -moz-border-radius-topleft: $radius; | |
35 | - border-top-right-radius: $radius; | |
36 | - border-top-left-radius: $radius; | |
37 | - -webkit-border-top-left-radius: $radius; | |
38 | - -webkit-border-top-right-radius: $radius; | |
39 | -} | |
40 | - | |
41 | -@mixin round-borders-all($radius) { | |
42 | - border: 1px solid #eaeaea; | |
43 | - -moz-border-radius: $radius; | |
44 | - -webkit-border-radius: $radius; | |
45 | - border-radius: $radius; | |
46 | -} | |
47 | - | |
48 | 1 | /** COLORS **/ |
49 | 2 | .cgray { color:gray; } |
50 | 3 | .cred { color:#D12F19; } |
... | ... | @@ -173,18 +126,38 @@ img.lil_av { |
173 | 126 | .author_link { |
174 | 127 | color: $active_link_color; |
175 | 128 | } |
129 | +.entry { | |
130 | + position: relative; | |
131 | + padding: 7px 15px; | |
132 | + margin-bottom: 18px; | |
133 | + color: #404040; | |
134 | + filter:none; | |
135 | + | |
136 | + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); | |
137 | + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); | |
138 | + | |
139 | + -webkit-border-radius: 4px; | |
140 | + -moz-border-radius: 4px; | |
141 | + border-radius: 4px; | |
176 | 142 | |
177 | -@import "reset_bootstrap.scss"; | |
178 | -@import "top_panel.scss"; | |
179 | -@import "projects.css.scss"; | |
180 | -@import "commits.css.scss"; | |
181 | -@import "tree.scss"; | |
182 | -@import "issues.css.scss"; | |
183 | -@import "merge_requests.css.scss"; | |
184 | -@import "notes.css.scss"; | |
185 | -@import "login.scss"; | |
143 | + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); | |
144 | + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); | |
145 | + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); | |
186 | 146 | |
187 | -/** CODE HIGHTLIGHT **/ | |
188 | -@import "highlight.css.scss"; | |
189 | -@import "highlight.black.css.scss"; | |
147 | + background:#F1F1F1; | |
148 | + border: 1px solid #ccc; | |
149 | + | |
150 | + p { | |
151 | + margin-bottom: 0; | |
152 | + img { | |
153 | + position:relative; | |
154 | + top:3px; | |
155 | + } | |
156 | + } | |
157 | +} | |
158 | + | |
159 | +.widget { | |
160 | + padding:20px; | |
161 | + margin-bottom:20px; | |
162 | +} | |
190 | 163 | ... | ... |
app/assets/stylesheets/issues.css.scss
... | ... | @@ -0,0 +1,64 @@ |
1 | +@import "bootstrap"; | |
2 | + | |
3 | +/** GITLAB colors **/ | |
4 | +$text_color:#222; | |
5 | +$lite_text_color: #666; | |
6 | +$link_color:#111; | |
7 | +$active_link_color:#2FA0BB; | |
8 | +$active_bg_color:#79C3E0; | |
9 | +$active_bd_color: #2FA0BB; | |
10 | +$border_color:#CCC; | |
11 | +$lite_border_color:#EEE; | |
12 | +$min_app_width:980px; | |
13 | +$max_app_width:980px; | |
14 | +$app_padding:20px; | |
15 | +$bg_color: #FFF; | |
16 | +$styled_border_color: #2FA0BB; | |
17 | +$color: "#4BB8D2"; | |
18 | +$blue_link: "#2fa0bb"; | |
19 | + | |
20 | +/** MIXINS **/ | |
21 | +@mixin round-borders-bottom($radius) { | |
22 | + border-top: 1px solid #eaeaea; | |
23 | + -moz-border-radius-bottomright: $radius; | |
24 | + -moz-border-radius-bottomleft: $radius; | |
25 | + border-bottom-right-radius: $radius; | |
26 | + border-bottom-left-radius: $radius; | |
27 | + -webkit-border-bottom-left-radius: $radius; | |
28 | + -webkit-border-bottom-right-radius: $radius; | |
29 | +} | |
30 | + | |
31 | +@mixin round-borders-top($radius) { | |
32 | + border-top: 1px solid #eaeaea; | |
33 | + -moz-border-radius-topright: $radius; | |
34 | + -moz-border-radius-topleft: $radius; | |
35 | + border-top-right-radius: $radius; | |
36 | + border-top-left-radius: $radius; | |
37 | + -webkit-border-top-left-radius: $radius; | |
38 | + -webkit-border-top-right-radius: $radius; | |
39 | +} | |
40 | + | |
41 | +@mixin round-borders-all($radius) { | |
42 | + border: 1px solid #eaeaea; | |
43 | + -moz-border-radius: $radius; | |
44 | + -webkit-border-radius: $radius; | |
45 | + border-radius: $radius; | |
46 | +} | |
47 | + | |
48 | + | |
49 | +@import "reset_bootstrap.scss"; | |
50 | +@import "common.scss"; | |
51 | +@import "top_panel.scss"; | |
52 | + | |
53 | +@import "projects.css.scss"; | |
54 | +@import "commits.css.scss"; | |
55 | +@import "tree.scss"; | |
56 | +@import "merge_requests.css.scss"; | |
57 | +@import "notes.css.scss"; | |
58 | +@import "login.scss"; | |
59 | + | |
60 | +/** CODE HIGHTLIGHT **/ | |
61 | +@import "highlight.css.scss"; | |
62 | +@import "highlight.black.css.scss"; | |
63 | + | |
64 | + | ... | ... |
app/assets/stylesheets/projects.css.scss
app/assets/stylesheets/reset_bootstrap.scss
... | ... | @@ -5,38 +5,3 @@ a { |
5 | 5 | color: $active_link_color; |
6 | 6 | } |
7 | 7 | } |
8 | - | |
9 | -.entry { | |
10 | - position: relative; | |
11 | - padding: 7px 15px; | |
12 | - margin-bottom: 18px; | |
13 | - color: #404040; | |
14 | - filter:none; | |
15 | - | |
16 | - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); | |
17 | - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); | |
18 | - | |
19 | - -webkit-border-radius: 4px; | |
20 | - -moz-border-radius: 4px; | |
21 | - border-radius: 4px; | |
22 | - | |
23 | - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); | |
24 | - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); | |
25 | - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); | |
26 | - | |
27 | - background:#F1F1F1; | |
28 | - border: 1px solid #ccc; | |
29 | - | |
30 | - p { | |
31 | - margin-bottom: 0; | |
32 | - img { | |
33 | - position:relative; | |
34 | - top:3px; | |
35 | - } | |
36 | - } | |
37 | -} | |
38 | - | |
39 | -.widget { | |
40 | - padding:20px; | |
41 | - margin-bottom:20px; | |
42 | -} | ... | ... |
app/assets/stylesheets/top_panel.scss
app/controllers/admin/team_members_controller.rb
... | ... | @@ -3,39 +3,15 @@ class Admin::TeamMembersController < ApplicationController |
3 | 3 | before_filter :authenticate_user! |
4 | 4 | before_filter :authenticate_admin! |
5 | 5 | |
6 | - def index | |
7 | - @admin_team_members = UsersProject.page(params[:page]).per(100).order("project_id DESC") | |
8 | - end | |
9 | - | |
10 | - def show | |
11 | - @admin_team_member = UsersProject.find(params[:id]) | |
12 | - end | |
13 | - | |
14 | - def new | |
15 | - @admin_team_member = UsersProject.new(params[:team_member]) | |
16 | - end | |
17 | - | |
18 | 6 | def edit |
19 | 7 | @admin_team_member = UsersProject.find(params[:id]) |
20 | 8 | end |
21 | 9 | |
22 | - def create | |
23 | - @admin_team_member = UsersProject.new(params[:team_member]) | |
24 | - @admin_team_member.project_id = params[:team_member][:project_id] | |
25 | - | |
26 | - if @admin_team_member.save | |
27 | - redirect_to admin_team_member_path(@admin_team_member), notice: 'UsersProject was successfully created.' | |
28 | - else | |
29 | - render action: "new" | |
30 | - end | |
31 | - end | |
32 | - | |
33 | 10 | def update |
34 | 11 | @admin_team_member = UsersProject.find(params[:id]) |
35 | - @admin_team_member.project_id = params[:team_member][:project_id] | |
36 | 12 | |
37 | 13 | if @admin_team_member.update_attributes(params[:team_member]) |
38 | - redirect_to admin_team_member_path(@admin_team_member), notice: 'UsersProject was successfully updated.' | |
14 | + redirect_to [:admin, @admin_team_member.project], notice: 'Project Access was successfully updated.' | |
39 | 15 | else |
40 | 16 | render action: "edit" |
41 | 17 | end |
... | ... | @@ -45,6 +21,6 @@ class Admin::TeamMembersController < ApplicationController |
45 | 21 | @admin_team_member = UsersProject.find(params[:id]) |
46 | 22 | @admin_team_member.destroy |
47 | 23 | |
48 | - redirect_to admin_team_members_url | |
24 | + redirect_to :back | |
49 | 25 | end |
50 | 26 | end | ... | ... |
app/controllers/admin/users_controller.rb
... | ... | @@ -9,8 +9,28 @@ class Admin::UsersController < ApplicationController |
9 | 9 | |
10 | 10 | def show |
11 | 11 | @admin_user = User.find(params[:id]) |
12 | + | |
13 | + @projects = if @admin_user.projects.empty? | |
14 | + Project | |
15 | + else | |
16 | + Project.without_user(@admin_user) | |
17 | + end.all | |
12 | 18 | end |
13 | 19 | |
20 | + def team_update | |
21 | + @admin_user = User.find(params[:id]) | |
22 | + | |
23 | + UsersProject.user_bulk_import( | |
24 | + @admin_user, | |
25 | + params[:project_ids], | |
26 | + params[:project_access], | |
27 | + params[:repo_access] | |
28 | + ) | |
29 | + | |
30 | + redirect_to [:admin, @admin_user], notice: 'Teams were successfully updated.' | |
31 | + end | |
32 | + | |
33 | + | |
14 | 34 | def new |
15 | 35 | @admin_user = User.new(:projects_limit => 10) |
16 | 36 | end | ... | ... |
app/models/project.rb
... | ... | @@ -53,6 +53,7 @@ class Project < ActiveRecord::Base |
53 | 53 | attr_protected :private_flag, :owner_id |
54 | 54 | |
55 | 55 | scope :public_only, where(:private_flag => false) |
56 | + scope :without_user, lambda { |user| where("id not in (:ids)", :ids => user.projects.map(&:id) ) } | |
56 | 57 | |
57 | 58 | def self.active |
58 | 59 | joins(:issues, :notes, :merge_requests).order("issues.created_at, notes.created_at, merge_requests.created_at DESC") | ... | ... |
app/models/users_project.rb
... | ... | @@ -27,6 +27,20 @@ class UsersProject < ActiveRecord::Base |
27 | 27 | end |
28 | 28 | end |
29 | 29 | |
30 | + def self.user_bulk_import(user, project_ids, project_access, repo_access) | |
31 | + UsersProject.transaction do | |
32 | + project_ids.each do |project_id| | |
33 | + users_project = UsersProject.new( | |
34 | + :repo_access => repo_access, | |
35 | + :project_access => project_access, | |
36 | + ) | |
37 | + users_project.project_id = project_id | |
38 | + users_project.user_id = user.id | |
39 | + users_project.save | |
40 | + end | |
41 | + end | |
42 | + end | |
43 | + | |
30 | 44 | def update_repository |
31 | 45 | Gitlabhq::GitHost.system.new.configure do |c| |
32 | 46 | c.update_project(project.path, project) | ... | ... |
app/views/admin/projects/_form.html.haml
1 | 1 | = form_for [:admin, @admin_project] do |f| |
2 | 2 | -if @admin_project.errors.any? |
3 | - #error_explanation | |
4 | - %h2= "#{pluralize(@admin_project.errors.count, "error")} prohibited this admin_project from being saved:" | |
3 | + .alert-message.block-message.error | |
5 | 4 | %ul |
6 | 5 | - @admin_project.errors.full_messages.each do |msg| |
7 | 6 | %li= msg |
... | ... | @@ -10,27 +9,58 @@ |
10 | 9 | = f.label :name |
11 | 10 | .input= f.text_field :name |
12 | 11 | .clearfix |
13 | - = f.label :code | |
14 | - .input= f.text_field :code | |
12 | + = f.label :path do | |
13 | + Path | |
14 | + .input | |
15 | + .input-prepend | |
16 | + %span.add-on= "git@#{GIT_HOST["host"]}:" | |
17 | + = f.text_field :path, :placeholder => "example_project", :disabled => !@admin_project.new_record? | |
15 | 18 | .clearfix |
16 | - = f.label :path | |
17 | - .input= f.text_field :path | |
19 | + = f.label :code do | |
20 | + Code | |
21 | + .input | |
22 | + .input-prepend | |
23 | + %span.add-on= "http://#{GIT_HOST["host"]}/" | |
24 | + = f.text_field :code, :placeholder => "example" | |
18 | 25 | |
19 | 26 | - unless @admin_project.new_record? |
20 | 27 | .clearfix |
21 | 28 | = f.label :owner_id |
22 | 29 | .input= f.select :owner_id, User.all.map { |user| [user.name, user.id] } |
23 | 30 | |
31 | + - unless @admin_project.heads.empty? | |
32 | + .clearfix | |
33 | + = f.label :default_branch, "Default Branch" | |
34 | + .input= f.select(:default_branch, @admin_project.heads.map(&:name), {}, :style => "width:210px;") | |
35 | + | |
36 | + .well | |
37 | + %h5 Features | |
38 | + | |
39 | + .clearfix | |
40 | + = f.label :issues_enabled, "Issues" | |
41 | + .input= f.check_box :issues_enabled | |
42 | + | |
43 | + .clearfix | |
44 | + = f.label :merge_requests_enabled, "Merge Requests" | |
45 | + .input= f.check_box :merge_requests_enabled | |
46 | + | |
47 | + .clearfix | |
48 | + = f.label :wall_enabled, "Wall" | |
49 | + .input= f.check_box :wall_enabled | |
50 | + | |
24 | 51 | .clearfix |
25 | 52 | = f.label :description |
26 | - .input= f.text_area :description | |
53 | + .input= f.text_area :description, :class => "xxlarge" | |
27 | 54 | .clear |
28 | 55 | %br |
29 | 56 | .actions |
30 | - = f.submit 'Save', :class => "btn" | |
57 | + = f.submit 'Save', :class => "btn primary" | |
58 | + = link_to 'Cancel', [:admin, @admin_project], :class => "btn" | |
59 | + = link_to 'Destroy', [:admin, @admin_project], :confirm => 'Are you sure?', :method => :delete, :class => "btn danger right" | |
31 | 60 | |
32 | 61 | :javascript |
33 | 62 | $(function(){ |
34 | 63 | taggifyForm(); |
35 | 64 | $('#project_owner_id').chosen(); |
65 | + $('#project_default_branch').chosen(); | |
36 | 66 | }) | ... | ... |
app/views/admin/projects/edit.html.haml
app/views/admin/projects/index.html.haml
1 | -%table | |
1 | +%h3 | |
2 | + Projects | |
3 | + = link_to 'New Project', new_admin_project_path, :class => "btn small right" | |
4 | +%hr | |
5 | +%table.zebra-striped | |
2 | 6 | %thead |
3 | 7 | %th Name |
4 | - %th Code | |
5 | 8 | %th Path |
6 | 9 | %th Team Members |
7 | 10 | %th Last Commit |
... | ... | @@ -11,12 +14,9 @@ |
11 | 14 | - @admin_projects.each do |project| |
12 | 15 | %tr |
13 | 16 | %td= link_to project.name, [:admin, project] |
14 | - %td= project.code | |
15 | 17 | %td= project.path |
16 | 18 | %td= project.users_projects.count |
17 | 19 | %td= last_commit(project) |
18 | - %td= link_to 'Edit', edit_admin_project_path(project), :id => "edit_#{dom_id(project)}" | |
19 | - %td= link_to 'Destroy', [:admin, project], :confirm => 'Are you sure?', :method => :delete | |
20 | - | |
20 | + %td= link_to 'Edit', edit_admin_project_path(project), :id => "edit_#{dom_id(project)}", :class => "btn small" | |
21 | + %td= link_to 'Destroy', [:admin, project], :confirm => 'Are you sure?', :method => :delete, :class => "btn small danger" | |
21 | 22 | = paginate @admin_projects |
22 | -= link_to 'New Project', new_admin_project_path, :class => "btn" | ... | ... |
app/views/admin/projects/show.html.haml
1 | -- unless notice.nil? | |
2 | - %p#notice= notice | |
1 | +%h3 | |
2 | + = @admin_project.name | |
3 | + = link_to 'Edit', edit_admin_project_path(@admin_project), :class => "btn right small" | |
3 | 4 | |
5 | +%hr | |
4 | 6 | |
5 | -%h2= @admin_project.name | |
6 | - | |
7 | -%table.round-borders | |
7 | +%table.zebra-striped | |
8 | 8 | %tr |
9 | 9 | %td |
10 | 10 | %b |
... | ... | @@ -29,14 +29,33 @@ |
29 | 29 | Description: |
30 | 30 | %td |
31 | 31 | = @admin_project.description |
32 | - %tr | |
33 | - %td{:colspan => 2} | |
34 | - = link_to 'Edit', edit_admin_project_path(@admin_project), :class => "btn" | |
35 | 32 | |
36 | 33 | |
37 | 34 | .span-14 |
38 | 35 | |
39 | - %h2 Team | |
36 | + %h3 | |
37 | + Team | |
38 | + %small | |
39 | + ( #{@admin_project.users_projects.count} ) | |
40 | + | |
41 | + %hr | |
42 | + | |
43 | + %table.zebra-striped | |
44 | + %thead | |
45 | + %tr | |
46 | + %th Name | |
47 | + %th Project Access | |
48 | + %th Repository Access | |
49 | + %th | |
50 | + | |
51 | + - @admin_project.users_projects.each do |tm| | |
52 | + %tr | |
53 | + %td | |
54 | + = link_to tm.user_name, admin_users_path(tm.user) | |
55 | + %td= select_tag :tm_project_access, options_for_select(Project.access_options, tm.project_access), :class => "medium project-access-select", :disabled => :disabled | |
56 | + %td= select_tag :tm_repo_access, options_for_select(Repository.access_options, tm.repo_access), :class => "medium repo-access-select", :disabled => :disabled | |
57 | + %td= link_to 'Edit Access', edit_admin_team_member_path(tm), :class => "btn small" | |
58 | + %td= link_to 'Remove from team', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete, :class => "btn danger small" | |
40 | 59 | |
41 | 60 | = form_tag team_update_admin_project_path(@admin_project), :class => "bulk_import", :method => :put do |
42 | 61 | %table |
... | ... | @@ -51,27 +70,8 @@ |
51 | 70 | %td= select_tag :project_access, options_for_select(Project.access_options), :class => "project-access-select" |
52 | 71 | %td= select_tag :repo_access, options_for_select(Repository.access_options), :class => "repo-access-select" |
53 | 72 | |
54 | - %tr | |
55 | - %td{ :colspan => 3 } | |
56 | - = submit_tag 'Add', :class => "btn primary" | |
57 | - | |
58 | - %table.round-borders | |
59 | - %thead | |
60 | - %tr | |
61 | - %th Name | |
62 | - %th Added | |
63 | - %th Project Access | |
64 | - %th Repository Access | |
65 | - %th | |
66 | - | |
67 | - - @admin_project.users_projects.each do |tm| | |
68 | - %tr | |
69 | - %td | |
70 | - = link_to tm.user_name, admin_team_member_path(tm) | |
71 | - %td= time_ago_in_words(tm.updated_at) + " ago" | |
72 | - %td= select_tag :tm_project_access, options_for_select(Project.access_options, tm.project_access), :class => "project-access-select", :disabled => :disabled | |
73 | - %td= select_tag :tm_repo_access, options_for_select(Repository.access_options, tm.repo_access), :class => "repo-access-select", :disabled => :disabled | |
74 | - %td= link_to 'Destroy', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete | |
73 | + .actions | |
74 | + = submit_tag 'Add', :class => "btn primary" | |
75 | 75 | |
76 | 76 | :css |
77 | 77 | form select { | ... | ... |
app/views/admin/team_members/_form.html.haml
1 | -= form_for @admin_team_member, :as => :team_member, :url => @admin_team_member.new_record? ? admin_team_members_path(@admin_team_member) : admin_team_member_path(@admin_team_member) do |f| | |
1 | += form_for @admin_team_member, :as => :team_member, :url => admin_team_member_path(@admin_team_member) do |f| | |
2 | 2 | -if @admin_team_member.errors.any? |
3 | - #error_explanation | |
4 | - %h2= "#{pluralize(@admin_team_member.errors.count, "error")} prohibited this admin_project from being saved:" | |
3 | + .alert-message.block-message.error | |
5 | 4 | %ul |
6 | 5 | - @admin_team_member.errors.full_messages.each do |msg| |
7 | 6 | %li= msg |
8 | 7 | |
9 | - - if @admin_team_member.new_record? | |
10 | - .span-6 | |
11 | - = f.label :user_id | |
12 | - .span-6 | |
13 | - = f.select :user_id, User.all.map { |user| [user.name, user.id] } | |
14 | - .span-6 | |
15 | - = f.label :project_id | |
16 | - .span-6 | |
17 | - = f.select :project_id, Project.all.map { |user| [user.name, user.id] } | |
8 | + .clearfix | |
9 | + %label Project Access: | |
10 | + .input | |
11 | + = f.select :project_access, options_for_select(Project.access_options, @admin_team_member.project_access), {}, :class => "project-access-select" | |
18 | 12 | |
19 | - .span-6 | |
20 | - %b Project Access: | |
21 | - .span-6 | |
22 | - = f.select :project_access, options_for_select(Project.access_options, @admin_team_member.project_access), {}, :class => "project-access-select" | |
23 | - | |
24 | - .span-6 | |
25 | - %b Repository Access: | |
26 | - .span-6 | |
27 | - = f.select :repo_access, options_for_select(Repository.access_options, @admin_team_member.repo_access), {}, :class => "repo-access-select" | |
13 | + .clearfix | |
14 | + %label Repository Access: | |
15 | + .input | |
16 | + = f.select :repo_access, options_for_select(Repository.access_options, @admin_team_member.repo_access), {}, :class => "repo-access-select" | |
28 | 17 | %br |
29 | 18 | .actions |
30 | - = f.submit 'Save', :class => "btn" | |
19 | + = f.submit 'Save', :class => "btn primary" | |
20 | + = link_to 'Cancel', :back, :class => "btn" | |
31 | 21 | |
32 | 22 | :css |
33 | 23 | form select { | ... | ... |
app/views/admin/team_members/edit.html.haml
1 | -= render 'form' | |
1 | +%h3 | |
2 | + Edit access | |
3 | + %small | |
4 | + = @admin_team_member.project.name | |
5 | + – | |
6 | + = @admin_team_member.user_name | |
2 | 7 | |
3 | -%br | |
4 | -= link_to 'Show', admin_team_member_path(@admin_team_member) | |
5 | -\| | |
6 | -= link_to 'Back', admin_team_members_path | |
8 | +%hr | |
9 | +%table.zebra-striped | |
10 | + %tr | |
11 | + %td User: | |
12 | + %td= @admin_team_member.user_name | |
13 | + %tr | |
14 | + %td Project: | |
15 | + %td= @admin_team_member.project.name | |
16 | + %tr | |
17 | + %td Since: | |
18 | + %td= @admin_team_member.updated_at.stamp("Nov 11, 2010") | |
19 | += render 'form' | ... | ... |
app/views/admin/team_members/index.html.haml
... | ... | @@ -1,28 +0,0 @@ |
1 | -- @admin_team_members.group_by(&:project).sort.each do |project, members| | |
2 | - %h3= link_to project.name, [:admin, project] | |
3 | - %table | |
4 | - %thead | |
5 | - %th Name | |
6 | - %th Project Access | |
7 | - %th Repo Access | |
8 | - %th Added | |
9 | - %th | |
10 | - %th | |
11 | - - members.each do |tm| | |
12 | - - user = tm.user | |
13 | - %tr | |
14 | - %td.span-6 | |
15 | - = link_to tm.user_name, admin_team_member_path(tm) | |
16 | - %br | |
17 | - %br | |
18 | - = tm.user_email | |
19 | - %td.span-3= select_tag :project_access, options_for_select(Project.access_options, tm.project_access), :class => "project-access-select", :disabled => :disabled | |
20 | - %td.span-3= select_tag :repo_access, options_for_select(Repository.access_options, tm.repo_access), :class => "repo-access-select", :disabled => :disabled | |
21 | - %td.span-3= time_ago_in_words(tm.updated_at) + " ago" | |
22 | - %td= link_to 'Edit', edit_admin_team_member_path(tm), :id => "edit_#{dom_id(tm)}" | |
23 | - %td= link_to 'Destroy', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete | |
24 | - | |
25 | -%br | |
26 | - | |
27 | -= paginate @admin_team_members | |
28 | -= link_to 'New Team Member', new_admin_team_member_path, :class => "btn" |
app/views/admin/team_members/new.html.haml
app/views/admin/team_members/show.html.haml
... | ... | @@ -1,26 +0,0 @@ |
1 | -#infoblock | |
2 | - %p | |
3 | - %b Name: | |
4 | - = @admin_team_member.user_name | |
5 | - %p | |
6 | - %b Project: | |
7 | - = @admin_team_member.project.name | |
8 | - %p | |
9 | - %b Since: | |
10 | - = @admin_team_member.updated_at.stamp("Nov 11, 2010") | |
11 | - | |
12 | -#infoblock | |
13 | - .span-6 | |
14 | - %b Project Access: | |
15 | - = select_tag :project_access, options_for_select(Project.access_options, @admin_team_member.project_access), :class => "project-access-select", :disabled => true | |
16 | - | |
17 | - %br | |
18 | - .span-6 | |
19 | - %b Repository Access: | |
20 | - = select_tag :repo_access, options_for_select(Repository.access_options, @admin_team_member.repo_access), :class => "repo-access-select", :disabled => true | |
21 | - | |
22 | -%br | |
23 | - | |
24 | -= link_to 'Edit', edit_admin_team_member_path(@admin_project) | |
25 | -\| | |
26 | -= link_to 'Back', admin_team_members_path |
app/views/admin/users/_form.html.haml
... | ... | @@ -18,9 +18,6 @@ |
18 | 18 | .clearfix |
19 | 19 | = f.label :password_confirmation |
20 | 20 | .input= f.password_field :password_confirmation |
21 | - .clearfix | |
22 | - = f.check_box :admin | |
23 | - = f.label :admin | |
24 | 21 | |
25 | 22 | .clearfix |
26 | 23 | = f.label :projects_limit |
... | ... | @@ -35,8 +32,13 @@ |
35 | 32 | .clearfix |
36 | 33 | = f.label :twitter |
37 | 34 | .input= f.text_field :twitter |
38 | - .clear | |
39 | - %br | |
35 | + .clearfix | |
36 | + = f.label :admin do | |
37 | + = f.check_box :admin | |
38 | + %span Administrator | |
40 | 39 | .actions |
41 | 40 | = f.submit 'Save', :class => "btn primary" |
42 | - = link_to 'Cancel', admin_users_path, :class => "btn" | |
41 | + - if @admin_user.new_record? | |
42 | + = link_to 'Cancel', admin_users_path, :class => "btn" | |
43 | + - else | |
44 | + = link_to 'Cancel', admin_user_path(@admin_user), :class => "btn" | ... | ... |
app/views/admin/users/edit.html.haml
app/views/admin/users/index.html.haml
1 | -%table | |
1 | +%h3 | |
2 | + Users | |
3 | + = link_to 'New User', new_admin_user_path, :class => "btn small right" | |
4 | +%hr | |
5 | +%table.zebra-striped | |
2 | 6 | %thead |
3 | 7 | %th Admin |
4 | 8 | %th Name |
... | ... | @@ -13,9 +17,7 @@ |
13 | 17 | %td= link_to user.name, [:admin, user] |
14 | 18 | %td= user.email |
15 | 19 | %td= user.users_projects.count |
16 | - %td= link_to 'Edit', edit_admin_user_path(user), :id => "edit_#{dom_id(user)}" | |
17 | - %td= link_to 'Destroy', [:admin, user], :confirm => 'Are you sure?', :method => :delete | |
20 | + %td= link_to 'Edit', edit_admin_user_path(user), :id => "edit_#{dom_id(user)}", :class => "btn small" | |
21 | + %td= link_to 'Destroy', [:admin, user], :confirm => 'Are you sure?', :method => :delete, :class => "btn small danger" | |
18 | 22 | |
19 | 23 | = paginate @admin_users |
20 | -%br | |
21 | -= link_to 'New User', new_admin_user_path, :class => "btn" | ... | ... |
app/views/admin/users/show.html.haml
1 | -%h2= @admin_user.name | |
1 | +%h3 | |
2 | + = @admin_user.name | |
3 | + = link_to 'Edit', edit_admin_user_path(@admin_user), :class => "btn small right" | |
2 | 4 | |
3 | -%table.round-borders | |
5 | +%hr | |
6 | + | |
7 | +%table.zebra-striped | |
4 | 8 | %tr |
5 | 9 | %td |
6 | 10 | %b |
... | ... | @@ -39,31 +43,57 @@ |
39 | 43 | Twitter: |
40 | 44 | %td |
41 | 45 | = @admin_user.twitter |
42 | - %tr | |
43 | - %td{:colspan => 2} | |
44 | - = link_to 'Edit', edit_admin_user_path(@admin_user), :class => "btn" | |
45 | 46 | |
46 | -.span-14 | |
47 | - %h2 Projects | |
47 | +%h3 Projects | |
48 | +%hr | |
49 | + | |
50 | +%table.zebra-striped | |
51 | + %tr | |
52 | + %thead | |
53 | + %th Name | |
54 | + %th Project Access | |
55 | + %th Repository Access | |
56 | + %th | |
57 | + %th | |
48 | 58 | |
49 | - %table.round-borders | |
59 | + - @admin_user.users_projects.each do |tm| | |
60 | + - project = tm.project | |
50 | 61 | %tr |
51 | - %thead | |
52 | - %th Name | |
53 | - %th Added | |
54 | - %th Project Access | |
55 | - %th Repository Access | |
56 | - %th | |
57 | - %th | |
62 | + %td= link_to project.name, admin_project_path(project) | |
63 | + %td= select_tag :tm_project_access, options_for_select(Project.access_options, tm.project_access), :class => "medium project-access-select", :disabled => :disabled | |
64 | + %td= select_tag :tm_repo_access, options_for_select(Repository.access_options, tm.repo_access), :class => "medium repo-access-select", :disabled => :disabled | |
65 | + %td= link_to 'Edit Access', edit_admin_team_member_path(tm), :class => "btn small" | |
66 | + %td= link_to 'Remove from team', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete, :class => "btn small danger" | |
58 | 67 | |
59 | - - @admin_user.users_projects.each do |tm| | |
60 | - - project = tm.project | |
68 | += form_tag team_update_admin_user_path(@admin_user), :class => "bulk_import", :method => :put do | |
69 | + %table | |
70 | + %thead | |
61 | 71 | %tr |
62 | - %td= link_to project.name, admin_project_path(project) | |
63 | - %td= time_ago_in_words(tm.updated_at) + " ago" | |
64 | - %td= select_tag :project_access, options_for_select(Project.access_options, tm.project_access), :class => "project-access-select", :disabled => :disabled | |
65 | - %td= select_tag :repo_access, options_for_select(Repository.access_options, tm.repo_access), :class => "repo-access-select", :disabled => :disabled | |
66 | - %td= link_to 'Edit', edit_admin_team_member_path(tm) | |
67 | - %td= link_to 'Cancel', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete | |
72 | + %th Projects | |
73 | + %th Project Access: | |
74 | + %th Repo Access: | |
75 | + | |
76 | + %tr | |
77 | + %td= select_tag :project_ids, options_from_collection_for_select(@projects , :id, :name), :multiple => true | |
78 | + %td= select_tag :project_access, options_for_select(Project.access_options), :class => "project-access-select" | |
79 | + %td= select_tag :repo_access, options_for_select(Repository.access_options), :class => "repo-access-select" | |
80 | + | |
81 | + .actions | |
82 | + = submit_tag 'Add', :class => "btn primary" | |
83 | + | |
84 | + | |
85 | +:css | |
86 | + form select { | |
87 | + width:150px; | |
88 | + } | |
89 | + | |
90 | + #project_ids { | |
91 | + width:300px; | |
92 | + } | |
93 | + | |
94 | + | |
95 | +:javascript | |
96 | + $('select#project_ids').chosen(); | |
97 | + $('select#repo_access').chosen(); | |
98 | + $('select#project_access').chosen(); | |
68 | 99 | |
69 | - = link_to 'Add To Another Project', new_admin_team_member_path(:team_member => {:user_id => @admin_user.id}), :class => "btn" | ... | ... |
... | ... | @@ -0,0 +1,9 @@ |
1 | +-# Link to the "First" page | |
2 | +-# available local variables | |
3 | +-# url: url to the first page | |
4 | +-# current_page: a page object for the currently displayed page | |
5 | +-# num_pages: total number of pages | |
6 | +-# per_page: number of items to fetch per page | |
7 | +-# remote: data-remote | |
8 | +%span.first | |
9 | + = link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, :remote => remote | ... | ... |
... | ... | @@ -0,0 +1,8 @@ |
1 | +-# Non-link tag that stands for skipped pages... | |
2 | +-# available local variables | |
3 | +-# current_page: a page object for the currently displayed page | |
4 | +-# num_pages: total number of pages | |
5 | +-# per_page: number of items to fetch per page | |
6 | +-# remote: data-remote | |
7 | +%span.page.gap | |
8 | + = raw(t 'views.pagination.truncate') | ... | ... |
... | ... | @@ -0,0 +1,9 @@ |
1 | +-# Link to the "Last" page | |
2 | +-# available local variables | |
3 | +-# url: url to the last page | |
4 | +-# current_page: a page object for the currently displayed page | |
5 | +-# num_pages: total number of pages | |
6 | +-# per_page: number of items to fetch per page | |
7 | +-# remote: data-remote | |
8 | +%span.last | |
9 | + = link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {:remote => remote} | ... | ... |
... | ... | @@ -0,0 +1,9 @@ |
1 | +-# Link to the "Next" page | |
2 | +-# available local variables | |
3 | +-# url: url to the next page | |
4 | +-# current_page: a page object for the currently displayed page | |
5 | +-# num_pages: total number of pages | |
6 | +-# per_page: number of items to fetch per page | |
7 | +-# remote: data-remote | |
8 | +%li.next | |
9 | + = link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, :rel => 'next', :remote => remote | ... | ... |
... | ... | @@ -0,0 +1,10 @@ |
1 | +-# Link showing page number | |
2 | +-# available local variables | |
3 | +-# page: a page object for "this" page | |
4 | +-# url: url to this page | |
5 | +-# current_page: a page object for the currently displayed page | |
6 | +-# num_pages: total number of pages | |
7 | +-# per_page: number of items to fetch per page | |
8 | +-# remote: data-remote | |
9 | +%li{:class => "page#{' active' if page.current?}"} | |
10 | + = link_to page, url, {:remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil} | ... | ... |
... | ... | @@ -0,0 +1,17 @@ |
1 | +-# The container tag | |
2 | +-# available local variables | |
3 | +-# current_page: a page object for the currently displayed page | |
4 | +-# num_pages: total number of pages | |
5 | +-# per_page: number of items to fetch per page | |
6 | +-# remote: data-remote | |
7 | +-# paginator: the paginator that renders the pagination tags inside | |
8 | += paginator.render do | |
9 | + %div.pagination | |
10 | + %ul | |
11 | + = prev_page_tag unless current_page.first? | |
12 | + - each_page do |page| | |
13 | + - if page.left_outer? || page.right_outer? || page.inside_window? | |
14 | + = page_tag page | |
15 | + - elsif !page.was_truncated? | |
16 | + = gap_tag | |
17 | + = next_page_tag unless current_page.last? | ... | ... |
... | ... | @@ -0,0 +1,9 @@ |
1 | +-# Link to the "Previous" page | |
2 | +-# available local variables | |
3 | +-# url: url to the previous page | |
4 | +-# current_page: a page object for the currently displayed page | |
5 | +-# num_pages: total number of pages | |
6 | +-# per_page: number of items to fetch per page | |
7 | +-# remote: data-remote | |
8 | +%li{:class => "prev" } | |
9 | + = link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, :rel => 'prev', :remote => remote | ... | ... |
app/views/layouts/_app_side.html.haml
... | ... | @@ -4,7 +4,4 @@ |
4 | 4 | = link_to "Projects", projects_path, :class => "#{"active" if current_page?(projects_path)}" |
5 | 5 | = link_to "Issues", dashboard_issues_path, :class => "#{"active" if current_page?(dashboard_issues_path)}", :id => "issues_slide" |
6 | 6 | = link_to "Requests", dashboard_merge_requests_path, :class => "#{"active" if current_page?(dashboard_merge_requests_path)}", :id => "merge_requests_slide" |
7 | - - if current_user.is_admin? | |
8 | - = link_to admin_root_path, :class => "admin", :title => "Admin" do | |
9 | - Admin | |
10 | 7 | = link_to "Help", help_path, :class => "#{"active" if controller.controller_name == "help"}" | ... | ... |
app/views/layouts/_projects_side.html.haml
... | ... | @@ -4,8 +4,16 @@ |
4 | 4 | You can create at least |
5 | 5 | = current_user.projects_limit |
6 | 6 | projects. Click on button to add a new one |
7 | - = link_to new_project_path, :class => "btn small" do | |
8 | - New Project | |
7 | + .alert-actions | |
8 | + = link_to new_project_path, :class => "btn small" do | |
9 | + New Project » | |
10 | + | |
11 | + - if current_user.is_admin? | |
12 | + .alert-message.block-message.info | |
13 | + You have administrator privilegies. You can configure application following this button: | |
14 | + .alert-actions | |
15 | + = link_to admin_root_path, :class => "btn small", :title => "Admin" do | |
16 | + Visit Admin Area » | |
9 | 17 | |
10 | 18 | - if current_user.projects.count > 0 |
11 | 19 | %div.entry |
... | ... | @@ -18,21 +26,5 @@ |
18 | 26 | = project.name |
19 | 27 | = link_to "More » ", projects_path |
20 | 28 | |
21 | - -#%h5 | |
22 | - -#Your Issues: | |
23 | - -#%ul | |
24 | - -#- current_user.assigned_issues.order("id DESC").limit(5).each do |issue| | |
25 | - -#%li | |
26 | - -#= link_to project_issue_path(issue.project, issue) do | |
27 | - -#= truncate issue.title | |
28 | - | |
29 | - | |
30 | - -#%h5 | |
31 | - -#Your Merge Requests: | |
32 | - -#%ul | |
33 | - -#- current_user.assigned_merge_requests.order("id DESC").limit(5).each do |issue| | |
34 | - -#%li | |
35 | - -#= link_to project_merge_request_path(issue.project, issue) do | |
36 | - -#= truncate issue.title | |
37 | 29 | |
38 | 30 | ... | ... |
app/views/layouts/admin.html.haml
... | ... | @@ -10,7 +10,6 @@ |
10 | 10 | %aside |
11 | 11 | = link_to "Users", admin_users_path, :class => controller.controller_name == "users" ? "current" : nil |
12 | 12 | = link_to "Projects", admin_projects_path, :class => controller.controller_name == "projects" ? "current" : nil |
13 | - = link_to "Teams", admin_team_members_path, :class => controller.controller_name == "team_members" ? "current" : nil | |
14 | 13 | = link_to "Emails", admin_emails_path, :class => controller.controller_name == "mailer" ? "current" : nil |
15 | 14 | = link_to "Resque", "/info/resque" |
16 | 15 | ... | ... |
app/views/profile/show.html.haml
config/routes.rb
... | ... | @@ -7,14 +7,18 @@ Gitlab::Application.routes.draw do |
7 | 7 | get 'help' => 'help#index' |
8 | 8 | |
9 | 9 | namespace :admin do |
10 | - resources :users | |
10 | + resources :users do | |
11 | + member do | |
12 | + put :team_update | |
13 | + end | |
14 | + end | |
11 | 15 | resources :projects, :constraints => { :id => /[^\/]+/ } do |
12 | 16 | member do |
13 | 17 | get :team |
14 | 18 | put :team_update |
15 | 19 | end |
16 | 20 | end |
17 | - resources :team_members | |
21 | + resources :team_members, :only => [:edit, :update, :destroy] | |
18 | 22 | get 'emails', :to => 'mailer#preview' |
19 | 23 | get 'mailer/preview_note' |
20 | 24 | get 'mailer/preview_user_new' | ... | ... |
spec/requests/admin/admin_projects_spec.rb
... | ... | @@ -18,7 +18,6 @@ describe "Admin::Projects" do |
18 | 18 | end |
19 | 19 | |
20 | 20 | it "should have projects list" do |
21 | - page.should have_content(@project.code) | |
22 | 21 | page.should have_content(@project.name) |
23 | 22 | end |
24 | 23 | end |
... | ... | @@ -103,4 +102,18 @@ describe "Admin::Projects" do |
103 | 102 | page.should have_content(@project.description) |
104 | 103 | end |
105 | 104 | end |
105 | + | |
106 | + describe "Add new team member" do | |
107 | + before do | |
108 | + @new_user = Factory :user | |
109 | + visit admin_project_path(@project) | |
110 | + end | |
111 | + | |
112 | + it "should create new user" do | |
113 | + select @new_user.name, :from => "user_ids" | |
114 | + expect { click_button "Add" }.to change { UsersProject.count }.by(1) | |
115 | + page.should have_content @new_user.name | |
116 | + current_path.should == admin_project_path(@project) | |
117 | + end | |
118 | + end | |
106 | 119 | end | ... | ... |
spec/requests/admin/admin_users_spec.rb
... | ... | @@ -99,4 +99,18 @@ describe "Admin::Users" do |
99 | 99 | end |
100 | 100 | end |
101 | 101 | end |
102 | + | |
103 | + describe "Add new project" do | |
104 | + before do | |
105 | + @new_project = Factory :project | |
106 | + visit admin_user_path(@user) | |
107 | + end | |
108 | + | |
109 | + it "should create new user" do | |
110 | + select @new_project.name, :from => "project_ids" | |
111 | + expect { click_button "Add" }.to change { UsersProject.count }.by(1) | |
112 | + page.should have_content @new_project.name | |
113 | + current_path.should == admin_user_path(@user) | |
114 | + end | |
115 | + end | |
102 | 116 | end | ... | ... |
spec/requests/admin/security_spec.rb
... | ... | @@ -13,12 +13,6 @@ describe "Admin::Projects" do |
13 | 13 | it { admin_users_path.should be_denied_for :visitor } |
14 | 14 | end |
15 | 15 | |
16 | - describe "GET /admin/team_members" do | |
17 | - it { admin_team_members_path.should be_allowed_for :admin } | |
18 | - it { admin_team_members_path.should be_denied_for :user } | |
19 | - it { admin_team_members_path.should be_denied_for :visitor } | |
20 | - end | |
21 | - | |
22 | 16 | describe "GET /admin/emails" do |
23 | 17 | it { admin_emails_path.should be_allowed_for :admin } |
24 | 18 | it { admin_emails_path.should be_denied_for :user } | ... | ... |