Commit eb3e07a509d360922ff52c3634be7770104b0994
1 parent
8bf340f5
Exists in
master
and in
4 other branches
Use project owner if no namespace. Restyled team page
Showing
13 changed files
with
96 additions
and
79 deletions
Show diff stats
app/assets/stylesheets/sections/projects.scss
app/models/ability.rb
| @@ -18,7 +18,7 @@ class Ability | @@ -18,7 +18,7 @@ class Ability | ||
| 18 | # Rules based on role in project | 18 | # Rules based on role in project |
| 19 | if project.master_access_for?(user) | 19 | if project.master_access_for?(user) |
| 20 | # TODO: replace with master rules. | 20 | # TODO: replace with master rules. |
| 21 | - # Only allow project administration for owners | 21 | + # Only allow project administration for namespace owners |
| 22 | rules << project_admin_rules | 22 | rules << project_admin_rules |
| 23 | 23 | ||
| 24 | elsif project.dev_access_for?(user) | 24 | elsif project.dev_access_for?(user) |
| @@ -31,15 +31,20 @@ class Ability | @@ -31,15 +31,20 @@ class Ability | ||
| 31 | rules << project_guest_rules | 31 | rules << project_guest_rules |
| 32 | end | 32 | end |
| 33 | 33 | ||
| 34 | - # If user own project namespace (Ex. group owner or account owner) | ||
| 35 | - if project.namespace && project.namespace.owner == user | ||
| 36 | - rules << project_admin_rules | 34 | + if project.namespace |
| 35 | + # If user own project namespace | ||
| 36 | + # (Ex. group owner or account owner) | ||
| 37 | + if project.namespace.owner == user | ||
| 38 | + rules << project_admin_rules | ||
| 39 | + end | ||
| 40 | + else | ||
| 41 | + # For compatibility with global projects | ||
| 42 | + # use projects.owner_id | ||
| 43 | + if project.owner == user | ||
| 44 | + rules << project_admin_rules | ||
| 45 | + end | ||
| 37 | end | 46 | end |
| 38 | 47 | ||
| 39 | - # If user was set as direct project owner | ||
| 40 | - if project.owner == user | ||
| 41 | - rules << project_admin_rules | ||
| 42 | - end | ||
| 43 | 48 | ||
| 44 | rules.flatten | 49 | rules.flatten |
| 45 | end | 50 | end |
app/models/project.rb
app/views/admin/projects/_form.html.haml
| @@ -24,10 +24,6 @@ | @@ -24,10 +24,6 @@ | ||
| 24 | = f.label :namespace_id | 24 | = f.label :namespace_id |
| 25 | .input= f.select :namespace_id, namespaces_options(@project.namespace_id), {}, {class: 'chosen'} | 25 | .input= f.select :namespace_id, namespaces_options(@project.namespace_id), {}, {class: 'chosen'} |
| 26 | 26 | ||
| 27 | - .clearfix | ||
| 28 | - = f.label :owner_id | ||
| 29 | - .input= f.select :owner_id, User.all.map { |user| [user.name, user.id] }, {}, {class: 'chosen'} | ||
| 30 | - | ||
| 31 | - if project.repo_exists? | 27 | - if project.repo_exists? |
| 32 | .clearfix | 28 | .clearfix |
| 33 | = f.label :default_branch, "Default Branch" | 29 | = f.label :default_branch, "Default Branch" |
app/views/admin/projects/show.html.haml
| @@ -28,13 +28,22 @@ | @@ -28,13 +28,22 @@ | ||
| 28 | %tr | 28 | %tr |
| 29 | %td | 29 | %td |
| 30 | %b | 30 | %b |
| 31 | + Namespace: | ||
| 32 | + %td | ||
| 33 | + - if @project.namespace | ||
| 34 | + = @project.namespace.human_name | ||
| 35 | + - else | ||
| 36 | + Global | ||
| 37 | + %tr | ||
| 38 | + %td | ||
| 39 | + %b | ||
| 31 | Path: | 40 | Path: |
| 32 | %td | 41 | %td |
| 33 | %code= @project.path_to_repo | 42 | %code= @project.path_to_repo |
| 34 | %tr | 43 | %tr |
| 35 | %td | 44 | %td |
| 36 | %b | 45 | %b |
| 37 | - Owner: | 46 | + Created by: |
| 38 | %td | 47 | %td |
| 39 | = @project.owner_name || '(deleted)' | 48 | = @project.owner_name || '(deleted)' |
| 40 | %tr | 49 | %tr |
app/views/groups/people.html.haml
| @@ -15,10 +15,6 @@ | @@ -15,10 +15,6 @@ | ||
| 15 | = image_tag gravatar_icon(user.email, 16), class: "avatar s16" | 15 | = image_tag gravatar_icon(user.email, 16), class: "avatar s16" |
| 16 | %strong= user.name | 16 | %strong= user.name |
| 17 | %span.cgray= user.email | 17 | %span.cgray= user.email |
| 18 | - - if @project | ||
| 19 | - - if @project.owner == user | ||
| 20 | - %span.btn.btn-small.disabled.right Project Owner | ||
| 21 | - - else | ||
| 22 | - - if @group.owner == user | ||
| 23 | - %span.btn.btn-small.disabled.right Group Owner | 18 | + - if @group.owner == user |
| 19 | + %span.btn.btn-small.disabled.right Group Owner | ||
| 24 | 20 |
app/views/layouts/project_resource.html.haml
| @@ -4,7 +4,8 @@ | @@ -4,7 +4,8 @@ | ||
| 4 | %body{class: "#{app_theme} project"} | 4 | %body{class: "#{app_theme} project"} |
| 5 | = render "layouts/flash" | 5 | = render "layouts/flash" |
| 6 | = render "layouts/head_panel", title: @project.name | 6 | = render "layouts/head_panel", title: @project.name |
| 7 | - = render 'shared/no_ssh' | 7 | + - if can?(current_user, :download_code, @project) |
| 8 | + = render 'shared/no_ssh' | ||
| 8 | .container | 9 | .container |
| 9 | %ul.main_menu | 10 | %ul.main_menu |
| 10 | = nav_link(html_options: {class: "home #{project_tab_class}"}) do | 11 | = nav_link(html_options: {class: "home #{project_tab_class}"}) do |
app/views/projects/empty.html.haml
| 1 | = render 'clone_panel' | 1 | = render 'clone_panel' |
| 2 | 2 | ||
| 3 | %div.git-empty | 3 | %div.git-empty |
| 4 | - %h4 Git global setup: | ||
| 5 | - %pre.dark | ||
| 6 | - = preserve do | ||
| 7 | - git config --global user.name "#{current_user.name}" | ||
| 8 | - git config --global user.email "#{current_user.email}" | 4 | + %fieldset |
| 5 | + %legend Git global setup: | ||
| 6 | + %pre.dark | ||
| 7 | + = preserve do | ||
| 8 | + git config --global user.name "#{current_user.name}" | ||
| 9 | + git config --global user.email "#{current_user.email}" | ||
| 9 | 10 | ||
| 10 | - %h4.prepend-top-20 Create Repository | ||
| 11 | - %pre.dark | ||
| 12 | - = preserve do | ||
| 13 | - mkdir #{@project.path} | ||
| 14 | - cd #{@project.path} | ||
| 15 | - git init | ||
| 16 | - touch README | ||
| 17 | - git add README | ||
| 18 | - git commit -m 'first commit' | ||
| 19 | - git remote add origin #{@project.url_to_repo} | ||
| 20 | - git push -u origin master | 11 | + %fieldset |
| 12 | + %legend Create Repository | ||
| 13 | + %pre.dark | ||
| 14 | + = preserve do | ||
| 15 | + mkdir #{@project.path} | ||
| 16 | + cd #{@project.path} | ||
| 17 | + git init | ||
| 18 | + touch README | ||
| 19 | + git add README | ||
| 20 | + git commit -m 'first commit' | ||
| 21 | + git remote add origin #{@project.url_to_repo} | ||
| 22 | + git push -u origin master | ||
| 21 | 23 | ||
| 22 | - %h4.prepend-top-20 Existing Git Repo? | ||
| 23 | - %pre.dark | ||
| 24 | - = preserve do | ||
| 25 | - cd existing_git_repo | ||
| 26 | - git remote add origin #{@project.url_to_repo} | ||
| 27 | - git push -u origin master | 24 | + %fieldset |
| 25 | + %legend Existing Git Repo? | ||
| 26 | + %pre.dark | ||
| 27 | + = preserve do | ||
| 28 | + cd existing_git_repo | ||
| 29 | + git remote add origin #{@project.url_to_repo} | ||
| 30 | + git push -u origin master | ||
| 28 | 31 | ||
| 29 | - if can? current_user, :admin_project, @project | 32 | - if can? current_user, :admin_project, @project |
| 30 | .prepend-top-20 | 33 | .prepend-top-20 |
app/views/shared/_clone_panel.html.haml
| 1 | .input-prepend.project_clone_holder | 1 | .input-prepend.project_clone_holder |
| 2 | %button{class: "btn active", :"data-clone" => @project.ssh_url_to_repo} SSH | 2 | %button{class: "btn active", :"data-clone" => @project.ssh_url_to_repo} SSH |
| 3 | %button{class: "btn", :"data-clone" => @project.http_url_to_repo}= Gitlab.config.web_protocol.upcase | 3 | %button{class: "btn", :"data-clone" => @project.http_url_to_repo}= Gitlab.config.web_protocol.upcase |
| 4 | - = text_field_tag :project_clone, @project.url_to_repo, class: "one_click_select span5" | 4 | + = text_field_tag :project_clone, @project.url_to_repo, class: "one_click_select input-xxlarge" |
app/views/team_members/_show.html.haml
| 1 | - user = member.user | 1 | - user = member.user |
| 2 | - allow_admin = can? current_user, :admin_project, @project | 2 | - allow_admin = can? current_user, :admin_project, @project |
| 3 | -%tr{id: dom_id(member), class: "team_member_row user_#{user.id}"} | ||
| 4 | - %td.span6 | ||
| 5 | - = link_to project_team_member_path(@project, member), title: user.name, class: "dark" do | ||
| 6 | - = image_tag gravatar_icon(user.email, 40), class: "avatar s32" | ||
| 7 | - = link_to project_team_member_path(@project, member), title: user.name, class: "dark" do | ||
| 8 | - %strong= truncate(user.name, lenght: 40) | ||
| 9 | - %br | ||
| 10 | - %small.cgray= user.email | 3 | +%li.wll{id: dom_id(member), class: "team_member_row user_#{user.id}"} |
| 4 | + .row | ||
| 5 | + .span6 | ||
| 6 | + = link_to project_team_member_path(@project, member), title: user.name, class: "dark" do | ||
| 7 | + = image_tag gravatar_icon(user.email, 40), class: "avatar s32" | ||
| 8 | + = link_to project_team_member_path(@project, member), title: user.name, class: "dark" do | ||
| 9 | + %strong= truncate(user.name, lenght: 40) | ||
| 10 | + %br | ||
| 11 | + %small.cgray= user.email | ||
| 11 | 12 | ||
| 12 | - %td.span5 | ||
| 13 | - .right | ||
| 14 | - - if current_user == user | ||
| 15 | - %span.btn.disabled This is you! | ||
| 16 | - - if @project.owner == user | ||
| 17 | - %span.btn.disabled.success Owner | ||
| 18 | - - elsif user.blocked | ||
| 19 | - %span.btn.disabled.blocked Blocked | ||
| 20 | - - elsif allow_admin | ||
| 21 | - = link_to project_team_member_path(project_id: @project, id: member.id), confirm: remove_from_team_message(@project, member), method: :delete, class: "very_small btn danger" do | ||
| 22 | - %i.icon-minus.icon-white | 13 | + .span5.right |
| 14 | + - if allow_admin | ||
| 15 | + .left | ||
| 16 | + = form_for(member, as: :team_member, url: project_team_member_path(@project, member)) do |f| | ||
| 17 | + = f.select :project_access, options_for_select(UsersProject.access_roles, member.project_access), {}, class: "medium project-access-select span2" | ||
| 18 | + .right | ||
| 19 | + - if current_user == user | ||
| 20 | + %span.btn.disabled This is you! | ||
| 21 | + - if @project.namespace_owner == user | ||
| 22 | + %span.btn.disabled.success Owner | ||
| 23 | + - elsif user.blocked | ||
| 24 | + %span.btn.disabled.blocked Blocked | ||
| 25 | + - elsif allow_admin | ||
| 26 | + = link_to project_team_member_path(project_id: @project, id: member.id), confirm: remove_from_team_message(@project, member), method: :delete, class: "very_small btn danger" do | ||
| 27 | + %i.icon-minus.icon-white | ||
| 23 | 28 | ||
| 24 | - - if allow_admin | ||
| 25 | - = form_for(member, as: :team_member, url: project_team_member_path(@project, member)) do |f| | ||
| 26 | - = f.select :project_access, options_for_select(UsersProject.access_roles, member.project_access), {}, class: "medium project-access-select span2" |
app/views/team_members/_team.html.haml
| 1 | - grouper_project_members(@project).each do |access, members| | 1 | - grouper_project_members(@project).each do |access, members| |
| 2 | - %table.low | ||
| 3 | - %thead | ||
| 4 | - %tr | ||
| 5 | - %th.span7 | ||
| 6 | - = Project.access_options.key(access).pluralize | ||
| 7 | - %th | ||
| 8 | - %tbody | 2 | + %fieldset |
| 3 | + %legend | ||
| 4 | + = Project.access_options.key(access).pluralize | ||
| 5 | + %small= members.size | ||
| 6 | + %ul.unstyled | ||
| 9 | - members.each do |up| | 7 | - members.each do |up| |
| 10 | = render(partial: 'team_members/show', locals: {member: up}) | 8 | = render(partial: 'team_members/show', locals: {member: up}) |
| 11 | 9 |
app/views/team_members/index.html.haml
| 1 | = render "projects/project_head" | 1 | = render "projects/project_head" |
| 2 | %h3.page_title | 2 | %h3.page_title |
| 3 | Team Members | 3 | Team Members |
| 4 | - %small (#{@project.users_projects.count}) | ||
| 5 | - | ||
| 6 | -- if can? current_user, :admin_team_member, @project | ||
| 7 | - %p.slead | 4 | + (#{@project.users_projects.count}) |
| 5 | + %small | ||
| 8 | Read more about project permissions | 6 | Read more about project permissions |
| 9 | %strong= link_to "here", help_permissions_path, class: "vlink" | 7 | %strong= link_to "here", help_permissions_path, class: "vlink" |
| 10 | 8 | ||
| 9 | + - if can? current_user, :admin_team_member, @project | ||
| 11 | %span.right | 10 | %span.right |
| 12 | = link_to import_project_team_members_path(@project), class: "btn small grouped", title: "Import team from another project" do | 11 | = link_to import_project_team_members_path(@project), class: "btn small grouped", title: "Import team from another project" do |
| 13 | Import team from another project | 12 | Import team from another project |
| 14 | = link_to new_project_team_member_path(@project), class: "btn success small grouped", title: "New Team Member" do | 13 | = link_to new_project_team_member_path(@project), class: "btn success small grouped", title: "New Team Member" do |
| 15 | New Team Member | 14 | New Team Member |
| 15 | +%hr | ||
| 16 | + | ||
| 16 | 17 | ||
| 17 | - .clearfix | ||
| 18 | -= render partial: "team_members/team", locals: {project: @project} | 18 | +.clearfix |
| 19 | +%div.team-table | ||
| 20 | + = render partial: "team_members/team", locals: {project: @project} |
app/views/tree/_head.html.haml
| @@ -4,4 +4,4 @@ | @@ -4,4 +4,4 @@ | ||
| 4 | = nav_link(controller: :tree) do | 4 | = nav_link(controller: :tree) do |
| 5 | = link_to 'Source', project_tree_path(@project, @ref) | 5 | = link_to 'Source', project_tree_path(@project, @ref) |
| 6 | %li.right | 6 | %li.right |
| 7 | - = render "shared/clone_panel" | ||
| 8 | \ No newline at end of file | 7 | \ No newline at end of file |
| 8 | + = render "shared/clone_panel" |