From cc043f32d8bfa7da5e94061806ae56fc11902d71 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Sat, 11 Feb 2012 19:56:18 +0200 Subject: [PATCH] Admin area improved --- app/assets/stylesheets/application.css | 2 +- app/assets/stylesheets/common.scss | 91 +++++++------------ app/assets/stylesheets/issues.css.scss | 3 - app/assets/stylesheets/main.scss | 64 +++++++++++++ app/assets/stylesheets/projects.css.scss | 4 + app/assets/stylesheets/reset_bootstrap.scss | 35 ------- app/assets/stylesheets/top_panel.scss | 1 + .../admin/team_members_controller.rb | 28 +----- app/controllers/admin/users_controller.rb | 20 ++++ app/models/project.rb | 1 + app/models/users_project.rb | 14 +++ app/views/admin/projects/_form.html.haml | 46 ++++++++-- app/views/admin/projects/edit.html.haml | 8 +- app/views/admin/projects/index.html.haml | 14 +-- app/views/admin/projects/show.html.haml | 60 ++++++------ app/views/admin/team_members/_form.html.haml | 34 +++---- app/views/admin/team_members/edit.html.haml | 23 ++++- app/views/admin/team_members/index.html.haml | 28 ------ app/views/admin/team_members/new.html.haml | 6 -- app/views/admin/team_members/show.html.haml | 26 ------ app/views/admin/users/_form.html.haml | 14 +-- app/views/admin/users/edit.html.haml | 7 +- app/views/admin/users/index.html.haml | 12 ++- app/views/admin/users/show.html.haml | 78 +++++++++++----- app/views/kaminari/_first_page.html.haml | 9 ++ app/views/kaminari/_gap.html.haml | 8 ++ app/views/kaminari/_last_page.html.haml | 9 ++ app/views/kaminari/_next_page.html.haml | 9 ++ app/views/kaminari/_page.html.haml | 10 ++ app/views/kaminari/_paginator.html.haml | 17 ++++ app/views/kaminari/_prev_page.html.haml | 9 ++ app/views/layouts/_app_side.html.haml | 3 - app/views/layouts/_projects_side.html.haml | 28 ++---- app/views/layouts/admin.html.haml | 1 - app/views/profile/show.html.haml | 3 +- config/routes.rb | 8 +- spec/requests/admin/admin_projects_spec.rb | 15 ++- spec/requests/admin/admin_users_spec.rb | 14 +++ spec/requests/admin/security_spec.rb | 6 -- 39 files changed, 434 insertions(+), 334 deletions(-) delete mode 100644 app/assets/stylesheets/issues.css.scss create mode 100644 app/assets/stylesheets/main.scss delete mode 100644 app/views/admin/team_members/index.html.haml delete mode 100644 app/views/admin/team_members/new.html.haml delete mode 100644 app/views/admin/team_members/show.html.haml create mode 100644 app/views/kaminari/_first_page.html.haml create mode 100644 app/views/kaminari/_gap.html.haml create mode 100644 app/views/kaminari/_last_page.html.haml create mode 100644 app/views/kaminari/_next_page.html.haml create mode 100644 app/views/kaminari/_page.html.haml create mode 100644 app/views/kaminari/_paginator.html.haml create mode 100644 app/views/kaminari/_prev_page.html.haml diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 5a1fb42f..3d809b56 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -7,5 +7,5 @@ *= require jquery-ui/jquery.tagify *= require chosen *= require_self - *= require common + *= require main */ diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index 9fabc64c..61b26bb5 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -1,50 +1,3 @@ -@import "bootstrap"; - -/** GITLAB colors **/ -$text_color:#222; -$lite_text_color: #666; -$link_color:#111; -$active_link_color:#2FA0BB; -$active_bg_color:#79C3E0; -$active_bd_color: #2FA0BB; -$border_color:#CCC; -$lite_border_color:#EEE; -$min_app_width:980px; -$max_app_width:980px; -$app_padding:20px; -$bg_color: #FFF; -$styled_border_color: #2FA0BB; -$color: "#4BB8D2"; -$blue_link: "#2fa0bb"; - -/** MIXINS **/ -@mixin round-borders-bottom($radius) { - border-top: 1px solid #eaeaea; - -moz-border-radius-bottomright: $radius; - -moz-border-radius-bottomleft: $radius; - border-bottom-right-radius: $radius; - border-bottom-left-radius: $radius; - -webkit-border-bottom-left-radius: $radius; - -webkit-border-bottom-right-radius: $radius; -} - -@mixin round-borders-top($radius) { - border-top: 1px solid #eaeaea; - -moz-border-radius-topright: $radius; - -moz-border-radius-topleft: $radius; - border-top-right-radius: $radius; - border-top-left-radius: $radius; - -webkit-border-top-left-radius: $radius; - -webkit-border-top-right-radius: $radius; -} - -@mixin round-borders-all($radius) { - border: 1px solid #eaeaea; - -moz-border-radius: $radius; - -webkit-border-radius: $radius; - border-radius: $radius; -} - /** COLORS **/ .cgray { color:gray; } .cred { color:#D12F19; } @@ -173,18 +126,38 @@ img.lil_av { .author_link { color: $active_link_color; } +.entry { + position: relative; + padding: 7px 15px; + margin-bottom: 18px; + color: #404040; + filter:none; -@import "reset_bootstrap.scss"; -@import "top_panel.scss"; -@import "projects.css.scss"; -@import "commits.css.scss"; -@import "tree.scss"; -@import "issues.css.scss"; -@import "merge_requests.css.scss"; -@import "notes.css.scss"; -@import "login.scss"; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -/** CODE HIGHTLIGHT **/ -@import "highlight.css.scss"; -@import "highlight.black.css.scss"; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); + + background:#F1F1F1; + border: 1px solid #ccc; + + p { + margin-bottom: 0; + img { + position:relative; + top:3px; + } + } +} + +.widget { + padding:20px; + margin-bottom:20px; +} diff --git a/app/assets/stylesheets/issues.css.scss b/app/assets/stylesheets/issues.css.scss deleted file mode 100644 index ecf1ca01..00000000 --- a/app/assets/stylesheets/issues.css.scss +++ /dev/null @@ -1,3 +0,0 @@ -#issue_assignee_id { - width:300px; -} diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss new file mode 100644 index 00000000..6c91b7cf --- /dev/null +++ b/app/assets/stylesheets/main.scss @@ -0,0 +1,64 @@ +@import "bootstrap"; + +/** GITLAB colors **/ +$text_color:#222; +$lite_text_color: #666; +$link_color:#111; +$active_link_color:#2FA0BB; +$active_bg_color:#79C3E0; +$active_bd_color: #2FA0BB; +$border_color:#CCC; +$lite_border_color:#EEE; +$min_app_width:980px; +$max_app_width:980px; +$app_padding:20px; +$bg_color: #FFF; +$styled_border_color: #2FA0BB; +$color: "#4BB8D2"; +$blue_link: "#2fa0bb"; + +/** MIXINS **/ +@mixin round-borders-bottom($radius) { + border-top: 1px solid #eaeaea; + -moz-border-radius-bottomright: $radius; + -moz-border-radius-bottomleft: $radius; + border-bottom-right-radius: $radius; + border-bottom-left-radius: $radius; + -webkit-border-bottom-left-radius: $radius; + -webkit-border-bottom-right-radius: $radius; +} + +@mixin round-borders-top($radius) { + border-top: 1px solid #eaeaea; + -moz-border-radius-topright: $radius; + -moz-border-radius-topleft: $radius; + border-top-right-radius: $radius; + border-top-left-radius: $radius; + -webkit-border-top-left-radius: $radius; + -webkit-border-top-right-radius: $radius; +} + +@mixin round-borders-all($radius) { + border: 1px solid #eaeaea; + -moz-border-radius: $radius; + -webkit-border-radius: $radius; + border-radius: $radius; +} + + +@import "reset_bootstrap.scss"; +@import "common.scss"; +@import "top_panel.scss"; + +@import "projects.css.scss"; +@import "commits.css.scss"; +@import "tree.scss"; +@import "merge_requests.css.scss"; +@import "notes.css.scss"; +@import "login.scss"; + +/** CODE HIGHTLIGHT **/ +@import "highlight.css.scss"; +@import "highlight.black.css.scss"; + + diff --git a/app/assets/stylesheets/projects.css.scss b/app/assets/stylesheets/projects.css.scss index df5d40b3..e7a69fd6 100644 --- a/app/assets/stylesheets/projects.css.scss +++ b/app/assets/stylesheets/projects.css.scss @@ -201,3 +201,7 @@ input.git_clone_url { width:60px; } } + +#issue_assignee_id { + width:300px; +} diff --git a/app/assets/stylesheets/reset_bootstrap.scss b/app/assets/stylesheets/reset_bootstrap.scss index c52cf670..02bed422 100644 --- a/app/assets/stylesheets/reset_bootstrap.scss +++ b/app/assets/stylesheets/reset_bootstrap.scss @@ -5,38 +5,3 @@ a { color: $active_link_color; } } - -.entry { - position: relative; - padding: 7px 15px; - margin-bottom: 18px; - color: #404040; - filter:none; - - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); - - background:#F1F1F1; - border: 1px solid #ccc; - - p { - margin-bottom: 0; - img { - position:relative; - top:3px; - } - } -} - -.widget { - padding:20px; - margin-bottom:20px; -} diff --git a/app/assets/stylesheets/top_panel.scss b/app/assets/stylesheets/top_panel.scss index a07fce17..28b972a6 100644 --- a/app/assets/stylesheets/top_panel.scss +++ b/app/assets/stylesheets/top_panel.scss @@ -11,6 +11,7 @@ body header { -moz-box-shadow: 0 -1px 0 white inset; -webkit-box-shadow: 0 -1px 0 white inset; + z-index:10; height:60px; .wrapper { diff --git a/app/controllers/admin/team_members_controller.rb b/app/controllers/admin/team_members_controller.rb index d04d32a6..57803b01 100644 --- a/app/controllers/admin/team_members_controller.rb +++ b/app/controllers/admin/team_members_controller.rb @@ -3,39 +3,15 @@ class Admin::TeamMembersController < ApplicationController before_filter :authenticate_user! before_filter :authenticate_admin! - def index - @admin_team_members = UsersProject.page(params[:page]).per(100).order("project_id DESC") - end - - def show - @admin_team_member = UsersProject.find(params[:id]) - end - - def new - @admin_team_member = UsersProject.new(params[:team_member]) - end - def edit @admin_team_member = UsersProject.find(params[:id]) end - def create - @admin_team_member = UsersProject.new(params[:team_member]) - @admin_team_member.project_id = params[:team_member][:project_id] - - if @admin_team_member.save - redirect_to admin_team_member_path(@admin_team_member), notice: 'UsersProject was successfully created.' - else - render action: "new" - end - end - def update @admin_team_member = UsersProject.find(params[:id]) - @admin_team_member.project_id = params[:team_member][:project_id] if @admin_team_member.update_attributes(params[:team_member]) - redirect_to admin_team_member_path(@admin_team_member), notice: 'UsersProject was successfully updated.' + redirect_to [:admin, @admin_team_member.project], notice: 'Project Access was successfully updated.' else render action: "edit" end @@ -45,6 +21,6 @@ class Admin::TeamMembersController < ApplicationController @admin_team_member = UsersProject.find(params[:id]) @admin_team_member.destroy - redirect_to admin_team_members_url + redirect_to :back end end diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 85a95de5..21643145 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -9,8 +9,28 @@ class Admin::UsersController < ApplicationController def show @admin_user = User.find(params[:id]) + + @projects = if @admin_user.projects.empty? + Project + else + Project.without_user(@admin_user) + end.all end + def team_update + @admin_user = User.find(params[:id]) + + UsersProject.user_bulk_import( + @admin_user, + params[:project_ids], + params[:project_access], + params[:repo_access] + ) + + redirect_to [:admin, @admin_user], notice: 'Teams were successfully updated.' + end + + def new @admin_user = User.new(:projects_limit => 10) end diff --git a/app/models/project.rb b/app/models/project.rb index d98b7d0c..49311daa 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -53,6 +53,7 @@ class Project < ActiveRecord::Base attr_protected :private_flag, :owner_id scope :public_only, where(:private_flag => false) + scope :without_user, lambda { |user| where("id not in (:ids)", :ids => user.projects.map(&:id) ) } def self.active joins(:issues, :notes, :merge_requests).order("issues.created_at, notes.created_at, merge_requests.created_at DESC") diff --git a/app/models/users_project.rb b/app/models/users_project.rb index 2d09fa74..dd843920 100644 --- a/app/models/users_project.rb +++ b/app/models/users_project.rb @@ -27,6 +27,20 @@ class UsersProject < ActiveRecord::Base end end + def self.user_bulk_import(user, project_ids, project_access, repo_access) + UsersProject.transaction do + project_ids.each do |project_id| + users_project = UsersProject.new( + :repo_access => repo_access, + :project_access => project_access, + ) + users_project.project_id = project_id + users_project.user_id = user.id + users_project.save + end + end + end + def update_repository Gitlabhq::GitHost.system.new.configure do |c| c.update_project(project.path, project) diff --git a/app/views/admin/projects/_form.html.haml b/app/views/admin/projects/_form.html.haml index d10fbf95..4f6bc692 100644 --- a/app/views/admin/projects/_form.html.haml +++ b/app/views/admin/projects/_form.html.haml @@ -1,7 +1,6 @@ = form_for [:admin, @admin_project] do |f| -if @admin_project.errors.any? - #error_explanation - %h2= "#{pluralize(@admin_project.errors.count, "error")} prohibited this admin_project from being saved:" + .alert-message.block-message.error %ul - @admin_project.errors.full_messages.each do |msg| %li= msg @@ -10,27 +9,58 @@ = f.label :name .input= f.text_field :name .clearfix - = f.label :code - .input= f.text_field :code + = f.label :path do + Path + .input + .input-prepend + %span.add-on= "git@#{GIT_HOST["host"]}:" + = f.text_field :path, :placeholder => "example_project", :disabled => !@admin_project.new_record? .clearfix - = f.label :path - .input= f.text_field :path + = f.label :code do + Code + .input + .input-prepend + %span.add-on= "http://#{GIT_HOST["host"]}/" + = f.text_field :code, :placeholder => "example" - unless @admin_project.new_record? .clearfix = f.label :owner_id .input= f.select :owner_id, User.all.map { |user| [user.name, user.id] } + - unless @admin_project.heads.empty? + .clearfix + = f.label :default_branch, "Default Branch" + .input= f.select(:default_branch, @admin_project.heads.map(&:name), {}, :style => "width:210px;") + + .well + %h5 Features + + .clearfix + = f.label :issues_enabled, "Issues" + .input= f.check_box :issues_enabled + + .clearfix + = f.label :merge_requests_enabled, "Merge Requests" + .input= f.check_box :merge_requests_enabled + + .clearfix + = f.label :wall_enabled, "Wall" + .input= f.check_box :wall_enabled + .clearfix = f.label :description - .input= f.text_area :description + .input= f.text_area :description, :class => "xxlarge" .clear %br .actions - = f.submit 'Save', :class => "btn" + = f.submit 'Save', :class => "btn primary" + = link_to 'Cancel', [:admin, @admin_project], :class => "btn" + = link_to 'Destroy', [:admin, @admin_project], :confirm => 'Are you sure?', :method => :delete, :class => "btn danger right" :javascript $(function(){ taggifyForm(); $('#project_owner_id').chosen(); + $('#project_default_branch').chosen(); }) diff --git a/app/views/admin/projects/edit.html.haml b/app/views/admin/projects/edit.html.haml index a6062be4..b8d6f689 100644 --- a/app/views/admin/projects/edit.html.haml +++ b/app/views/admin/projects/edit.html.haml @@ -1,7 +1,3 @@ -%h2= @admin_project.name +%h3= @admin_project.name +%hr = render 'form' - -%br -= link_to 'Back', admin_projects_path, :class => "" -| -= link_to 'Show', [:admin, @admin_project], :class => "" diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml index 576dbf04..7cda5220 100644 --- a/app/views/admin/projects/index.html.haml +++ b/app/views/admin/projects/index.html.haml @@ -1,7 +1,10 @@ -%table +%h3 + Projects + = link_to 'New Project', new_admin_project_path, :class => "btn small right" +%hr +%table.zebra-striped %thead %th Name - %th Code %th Path %th Team Members %th Last Commit @@ -11,12 +14,9 @@ - @admin_projects.each do |project| %tr %td= link_to project.name, [:admin, project] - %td= project.code %td= project.path %td= project.users_projects.count %td= last_commit(project) - %td= link_to 'Edit', edit_admin_project_path(project), :id => "edit_#{dom_id(project)}" - %td= link_to 'Destroy', [:admin, project], :confirm => 'Are you sure?', :method => :delete - + %td= link_to 'Edit', edit_admin_project_path(project), :id => "edit_#{dom_id(project)}", :class => "btn small" + %td= link_to 'Destroy', [:admin, project], :confirm => 'Are you sure?', :method => :delete, :class => "btn small danger" = paginate @admin_projects -= link_to 'New Project', new_admin_project_path, :class => "btn" diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml index 3e589a0c..55610fa6 100644 --- a/app/views/admin/projects/show.html.haml +++ b/app/views/admin/projects/show.html.haml @@ -1,10 +1,10 @@ -- unless notice.nil? - %p#notice= notice +%h3 + = @admin_project.name + = link_to 'Edit', edit_admin_project_path(@admin_project), :class => "btn right small" +%hr -%h2= @admin_project.name - -%table.round-borders +%table.zebra-striped %tr %td %b @@ -29,14 +29,33 @@ Description: %td = @admin_project.description - %tr - %td{:colspan => 2} - = link_to 'Edit', edit_admin_project_path(@admin_project), :class => "btn" .span-14 - %h2 Team + %h3 + Team + %small + ( #{@admin_project.users_projects.count} ) + + %hr + + %table.zebra-striped + %thead + %tr + %th Name + %th Project Access + %th Repository Access + %th + + - @admin_project.users_projects.each do |tm| + %tr + %td + = link_to tm.user_name, admin_users_path(tm.user) + %td= select_tag :tm_project_access, options_for_select(Project.access_options, tm.project_access), :class => "medium project-access-select", :disabled => :disabled + %td= select_tag :tm_repo_access, options_for_select(Repository.access_options, tm.repo_access), :class => "medium repo-access-select", :disabled => :disabled + %td= link_to 'Edit Access', edit_admin_team_member_path(tm), :class => "btn small" + %td= link_to 'Remove from team', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete, :class => "btn danger small" = form_tag team_update_admin_project_path(@admin_project), :class => "bulk_import", :method => :put do %table @@ -51,27 +70,8 @@ %td= select_tag :project_access, options_for_select(Project.access_options), :class => "project-access-select" %td= select_tag :repo_access, options_for_select(Repository.access_options), :class => "repo-access-select" - %tr - %td{ :colspan => 3 } - = submit_tag 'Add', :class => "btn primary" - - %table.round-borders - %thead - %tr - %th Name - %th Added - %th Project Access - %th Repository Access - %th - - - @admin_project.users_projects.each do |tm| - %tr - %td - = link_to tm.user_name, admin_team_member_path(tm) - %td= time_ago_in_words(tm.updated_at) + " ago" - %td= select_tag :tm_project_access, options_for_select(Project.access_options, tm.project_access), :class => "project-access-select", :disabled => :disabled - %td= select_tag :tm_repo_access, options_for_select(Repository.access_options, tm.repo_access), :class => "repo-access-select", :disabled => :disabled - %td= link_to 'Destroy', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete + .actions + = submit_tag 'Add', :class => "btn primary" :css form select { diff --git a/app/views/admin/team_members/_form.html.haml b/app/views/admin/team_members/_form.html.haml index e6dd6a43..6929ade8 100644 --- a/app/views/admin/team_members/_form.html.haml +++ b/app/views/admin/team_members/_form.html.haml @@ -1,33 +1,23 @@ -= 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| += form_for @admin_team_member, :as => :team_member, :url => admin_team_member_path(@admin_team_member) do |f| -if @admin_team_member.errors.any? - #error_explanation - %h2= "#{pluralize(@admin_team_member.errors.count, "error")} prohibited this admin_project from being saved:" + .alert-message.block-message.error %ul - @admin_team_member.errors.full_messages.each do |msg| %li= msg - - if @admin_team_member.new_record? - .span-6 - = f.label :user_id - .span-6 - = f.select :user_id, User.all.map { |user| [user.name, user.id] } - .span-6 - = f.label :project_id - .span-6 - = f.select :project_id, Project.all.map { |user| [user.name, user.id] } + .clearfix + %label Project Access: + .input + = f.select :project_access, options_for_select(Project.access_options, @admin_team_member.project_access), {}, :class => "project-access-select" - .span-6 - %b Project Access: - .span-6 - = f.select :project_access, options_for_select(Project.access_options, @admin_team_member.project_access), {}, :class => "project-access-select" - - .span-6 - %b Repository Access: - .span-6 - = f.select :repo_access, options_for_select(Repository.access_options, @admin_team_member.repo_access), {}, :class => "repo-access-select" + .clearfix + %label Repository Access: + .input + = f.select :repo_access, options_for_select(Repository.access_options, @admin_team_member.repo_access), {}, :class => "repo-access-select" %br .actions - = f.submit 'Save', :class => "btn" + = f.submit 'Save', :class => "btn primary" + = link_to 'Cancel', :back, :class => "btn" :css form select { diff --git a/app/views/admin/team_members/edit.html.haml b/app/views/admin/team_members/edit.html.haml index 2f4832b8..431387be 100644 --- a/app/views/admin/team_members/edit.html.haml +++ b/app/views/admin/team_members/edit.html.haml @@ -1,6 +1,19 @@ -= render 'form' +%h3 + Edit access + %small + = @admin_team_member.project.name + – + = @admin_team_member.user_name -%br -= link_to 'Show', admin_team_member_path(@admin_team_member) -\| -= link_to 'Back', admin_team_members_path +%hr +%table.zebra-striped + %tr + %td User: + %td= @admin_team_member.user_name + %tr + %td Project: + %td= @admin_team_member.project.name + %tr + %td Since: + %td= @admin_team_member.updated_at.stamp("Nov 11, 2010") += render 'form' diff --git a/app/views/admin/team_members/index.html.haml b/app/views/admin/team_members/index.html.haml deleted file mode 100644 index 8426c863..00000000 --- a/app/views/admin/team_members/index.html.haml +++ /dev/null @@ -1,28 +0,0 @@ -- @admin_team_members.group_by(&:project).sort.each do |project, members| - %h3= link_to project.name, [:admin, project] - %table - %thead - %th Name - %th Project Access - %th Repo Access - %th Added - %th - %th - - members.each do |tm| - - user = tm.user - %tr - %td.span-6 - = link_to tm.user_name, admin_team_member_path(tm) - %br - %br - = tm.user_email - %td.span-3= select_tag :project_access, options_for_select(Project.access_options, tm.project_access), :class => "project-access-select", :disabled => :disabled - %td.span-3= select_tag :repo_access, options_for_select(Repository.access_options, tm.repo_access), :class => "repo-access-select", :disabled => :disabled - %td.span-3= time_ago_in_words(tm.updated_at) + " ago" - %td= link_to 'Edit', edit_admin_team_member_path(tm), :id => "edit_#{dom_id(tm)}" - %td= link_to 'Destroy', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete - -%br - -= paginate @admin_team_members -= link_to 'New Team Member', new_admin_team_member_path, :class => "btn" diff --git a/app/views/admin/team_members/new.html.haml b/app/views/admin/team_members/new.html.haml deleted file mode 100644 index c08ddc48..00000000 --- a/app/views/admin/team_members/new.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -%h1 New team member - -= render 'form' - -%br -= link_to 'Back', admin_team_members_path diff --git a/app/views/admin/team_members/show.html.haml b/app/views/admin/team_members/show.html.haml deleted file mode 100644 index 8579b6af..00000000 --- a/app/views/admin/team_members/show.html.haml +++ /dev/null @@ -1,26 +0,0 @@ -#infoblock - %p - %b Name: - = @admin_team_member.user_name - %p - %b Project: - = @admin_team_member.project.name - %p - %b Since: - = @admin_team_member.updated_at.stamp("Nov 11, 2010") - -#infoblock - .span-6 - %b Project Access: - = select_tag :project_access, options_for_select(Project.access_options, @admin_team_member.project_access), :class => "project-access-select", :disabled => true - - %br - .span-6 - %b Repository Access: - = select_tag :repo_access, options_for_select(Repository.access_options, @admin_team_member.repo_access), :class => "repo-access-select", :disabled => true - -%br - -= link_to 'Edit', edit_admin_team_member_path(@admin_project) -\| -= link_to 'Back', admin_team_members_path diff --git a/app/views/admin/users/_form.html.haml b/app/views/admin/users/_form.html.haml index b137ae3d..bb54c184 100644 --- a/app/views/admin/users/_form.html.haml +++ b/app/views/admin/users/_form.html.haml @@ -18,9 +18,6 @@ .clearfix = f.label :password_confirmation .input= f.password_field :password_confirmation - .clearfix - = f.check_box :admin - = f.label :admin .clearfix = f.label :projects_limit @@ -35,8 +32,13 @@ .clearfix = f.label :twitter .input= f.text_field :twitter - .clear - %br + .clearfix + = f.label :admin do + = f.check_box :admin + %span Administrator .actions = f.submit 'Save', :class => "btn primary" - = link_to 'Cancel', admin_users_path, :class => "btn" + - if @admin_user.new_record? + = link_to 'Cancel', admin_users_path, :class => "btn" + - else + = link_to 'Cancel', admin_user_path(@admin_user), :class => "btn" diff --git a/app/views/admin/users/edit.html.haml b/app/views/admin/users/edit.html.haml index 2ccd2f72..0e94be9e 100644 --- a/app/views/admin/users/edit.html.haml +++ b/app/views/admin/users/edit.html.haml @@ -1,6 +1,3 @@ +%h3= @admin_user.name +%hr = render 'form' - -%br -= link_to 'Back', admin_users_path, :class => "" -| -= link_to 'Show', [:admin, @admin_user], :class => "" diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index b562a831..a0b4df1f 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -1,4 +1,8 @@ -%table +%h3 + Users + = link_to 'New User', new_admin_user_path, :class => "btn small right" +%hr +%table.zebra-striped %thead %th Admin %th Name @@ -13,9 +17,7 @@ %td= link_to user.name, [:admin, user] %td= user.email %td= user.users_projects.count - %td= link_to 'Edit', edit_admin_user_path(user), :id => "edit_#{dom_id(user)}" - %td= link_to 'Destroy', [:admin, user], :confirm => 'Are you sure?', :method => :delete + %td= link_to 'Edit', edit_admin_user_path(user), :id => "edit_#{dom_id(user)}", :class => "btn small" + %td= link_to 'Destroy', [:admin, user], :confirm => 'Are you sure?', :method => :delete, :class => "btn small danger" = paginate @admin_users -%br -= link_to 'New User', new_admin_user_path, :class => "btn" diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml index 755ee353..cf86fb12 100644 --- a/app/views/admin/users/show.html.haml +++ b/app/views/admin/users/show.html.haml @@ -1,6 +1,10 @@ -%h2= @admin_user.name +%h3 + = @admin_user.name + = link_to 'Edit', edit_admin_user_path(@admin_user), :class => "btn small right" -%table.round-borders +%hr + +%table.zebra-striped %tr %td %b @@ -39,31 +43,57 @@ Twitter: %td = @admin_user.twitter + +%h3 Projects +%hr + +%table.zebra-striped %tr - %td{:colspan => 2} - = link_to 'Edit', edit_admin_user_path(@admin_user), :class => "btn" + %thead + %th Name + %th Project Access + %th Repository Access + %th + %th -.span-14 - %h2 Projects - - %table.round-borders + - @admin_user.users_projects.each do |tm| + - project = tm.project %tr - %thead - %th Name - %th Added - %th Project Access - %th Repository Access - %th - %th + %td= link_to project.name, admin_project_path(project) + %td= select_tag :tm_project_access, options_for_select(Project.access_options, tm.project_access), :class => "medium project-access-select", :disabled => :disabled + %td= select_tag :tm_repo_access, options_for_select(Repository.access_options, tm.repo_access), :class => "medium repo-access-select", :disabled => :disabled + %td= link_to 'Edit Access', edit_admin_team_member_path(tm), :class => "btn small" + %td= link_to 'Remove from team', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete, :class => "btn small danger" - - @admin_user.users_projects.each do |tm| - - project = tm.project += form_tag team_update_admin_user_path(@admin_user), :class => "bulk_import", :method => :put do + %table + %thead %tr - %td= link_to project.name, admin_project_path(project) - %td= time_ago_in_words(tm.updated_at) + " ago" - %td= select_tag :project_access, options_for_select(Project.access_options, tm.project_access), :class => "project-access-select", :disabled => :disabled - %td= select_tag :repo_access, options_for_select(Repository.access_options, tm.repo_access), :class => "repo-access-select", :disabled => :disabled - %td= link_to 'Edit', edit_admin_team_member_path(tm) - %td= link_to 'Cancel', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete + %th Projects + %th Project Access: + %th Repo Access: + + %tr + %td= select_tag :project_ids, options_from_collection_for_select(@projects , :id, :name), :multiple => true + %td= select_tag :project_access, options_for_select(Project.access_options), :class => "project-access-select" + %td= select_tag :repo_access, options_for_select(Repository.access_options), :class => "repo-access-select" + + .actions + = submit_tag 'Add', :class => "btn primary" + + +:css + form select { + width:150px; + } + + #project_ids { + width:300px; + } + + +:javascript + $('select#project_ids').chosen(); + $('select#repo_access').chosen(); + $('select#project_access').chosen(); - = link_to 'Add To Another Project', new_admin_team_member_path(:team_member => {:user_id => @admin_user.id}), :class => "btn" diff --git a/app/views/kaminari/_first_page.html.haml b/app/views/kaminari/_first_page.html.haml new file mode 100644 index 00000000..fee8112f --- /dev/null +++ b/app/views/kaminari/_first_page.html.haml @@ -0,0 +1,9 @@ +-# Link to the "First" page +-# available local variables +-# url: url to the first page +-# current_page: a page object for the currently displayed page +-# num_pages: total number of pages +-# per_page: number of items to fetch per page +-# remote: data-remote +%span.first + = link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, :remote => remote diff --git a/app/views/kaminari/_gap.html.haml b/app/views/kaminari/_gap.html.haml new file mode 100644 index 00000000..f82f185a --- /dev/null +++ b/app/views/kaminari/_gap.html.haml @@ -0,0 +1,8 @@ +-# Non-link tag that stands for skipped pages... +-# available local variables +-# current_page: a page object for the currently displayed page +-# num_pages: total number of pages +-# per_page: number of items to fetch per page +-# remote: data-remote +%span.page.gap + = raw(t 'views.pagination.truncate') diff --git a/app/views/kaminari/_last_page.html.haml b/app/views/kaminari/_last_page.html.haml new file mode 100644 index 00000000..6e41d232 --- /dev/null +++ b/app/views/kaminari/_last_page.html.haml @@ -0,0 +1,9 @@ +-# Link to the "Last" page +-# available local variables +-# url: url to the last page +-# current_page: a page object for the currently displayed page +-# num_pages: total number of pages +-# per_page: number of items to fetch per page +-# remote: data-remote +%span.last + = link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {:remote => remote} diff --git a/app/views/kaminari/_next_page.html.haml b/app/views/kaminari/_next_page.html.haml new file mode 100644 index 00000000..76f40e72 --- /dev/null +++ b/app/views/kaminari/_next_page.html.haml @@ -0,0 +1,9 @@ +-# Link to the "Next" page +-# available local variables +-# url: url to the next page +-# current_page: a page object for the currently displayed page +-# num_pages: total number of pages +-# per_page: number of items to fetch per page +-# remote: data-remote +%li.next + = link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, :rel => 'next', :remote => remote diff --git a/app/views/kaminari/_page.html.haml b/app/views/kaminari/_page.html.haml new file mode 100644 index 00000000..59668129 --- /dev/null +++ b/app/views/kaminari/_page.html.haml @@ -0,0 +1,10 @@ +-# Link showing page number +-# available local variables +-# page: a page object for "this" page +-# url: url to this page +-# current_page: a page object for the currently displayed page +-# num_pages: total number of pages +-# per_page: number of items to fetch per page +-# remote: data-remote +%li{:class => "page#{' active' if page.current?}"} + = link_to page, url, {:remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil} diff --git a/app/views/kaminari/_paginator.html.haml b/app/views/kaminari/_paginator.html.haml new file mode 100644 index 00000000..6f9fb332 --- /dev/null +++ b/app/views/kaminari/_paginator.html.haml @@ -0,0 +1,17 @@ +-# The container tag +-# available local variables +-# current_page: a page object for the currently displayed page +-# num_pages: total number of pages +-# per_page: number of items to fetch per page +-# remote: data-remote +-# paginator: the paginator that renders the pagination tags inside += paginator.render do + %div.pagination + %ul + = prev_page_tag unless current_page.first? + - each_page do |page| + - if page.left_outer? || page.right_outer? || page.inside_window? + = page_tag page + - elsif !page.was_truncated? + = gap_tag + = next_page_tag unless current_page.last? diff --git a/app/views/kaminari/_prev_page.html.haml b/app/views/kaminari/_prev_page.html.haml new file mode 100644 index 00000000..cef885ee --- /dev/null +++ b/app/views/kaminari/_prev_page.html.haml @@ -0,0 +1,9 @@ +-# Link to the "Previous" page +-# available local variables +-# url: url to the previous page +-# current_page: a page object for the currently displayed page +-# num_pages: total number of pages +-# per_page: number of items to fetch per page +-# remote: data-remote +%li{:class => "prev" } + = link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, :rel => 'prev', :remote => remote diff --git a/app/views/layouts/_app_side.html.haml b/app/views/layouts/_app_side.html.haml index b4a97c5a..3c34f188 100644 --- a/app/views/layouts/_app_side.html.haml +++ b/app/views/layouts/_app_side.html.haml @@ -4,7 +4,4 @@ = link_to "Projects", projects_path, :class => "#{"active" if current_page?(projects_path)}" = link_to "Issues", dashboard_issues_path, :class => "#{"active" if current_page?(dashboard_issues_path)}", :id => "issues_slide" = link_to "Requests", dashboard_merge_requests_path, :class => "#{"active" if current_page?(dashboard_merge_requests_path)}", :id => "merge_requests_slide" - - if current_user.is_admin? - = link_to admin_root_path, :class => "admin", :title => "Admin" do - Admin = link_to "Help", help_path, :class => "#{"active" if controller.controller_name == "help"}" diff --git a/app/views/layouts/_projects_side.html.haml b/app/views/layouts/_projects_side.html.haml index a55d0004..4c35c626 100644 --- a/app/views/layouts/_projects_side.html.haml +++ b/app/views/layouts/_projects_side.html.haml @@ -4,8 +4,16 @@ You can create at least = current_user.projects_limit projects. Click on button to add a new one - = link_to new_project_path, :class => "btn small" do - New Project + .alert-actions + = link_to new_project_path, :class => "btn small" do + New Project » + + - if current_user.is_admin? + .alert-message.block-message.info + You have administrator privilegies. You can configure application following this button: + .alert-actions + = link_to admin_root_path, :class => "btn small", :title => "Admin" do + Visit Admin Area » - if current_user.projects.count > 0 %div.entry @@ -18,21 +26,5 @@ = project.name = link_to "More » ", projects_path - -#%h5 - -#Your Issues: - -#%ul - -#- current_user.assigned_issues.order("id DESC").limit(5).each do |issue| - -#%li - -#= link_to project_issue_path(issue.project, issue) do - -#= truncate issue.title - - - -#%h5 - -#Your Merge Requests: - -#%ul - -#- current_user.assigned_merge_requests.order("id DESC").limit(5).each do |issue| - -#%li - -#= link_to project_merge_request_path(issue.project, issue) do - -#= truncate issue.title diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml index df4e917c..18eb9972 100644 --- a/app/views/layouts/admin.html.haml +++ b/app/views/layouts/admin.html.haml @@ -10,7 +10,6 @@ %aside = link_to "Users", admin_users_path, :class => controller.controller_name == "users" ? "current" : nil = link_to "Projects", admin_projects_path, :class => controller.controller_name == "projects" ? "current" : nil - = link_to "Teams", admin_team_members_path, :class => controller.controller_name == "team_members" ? "current" : nil = link_to "Emails", admin_emails_path, :class => controller.controller_name == "mailer" ? "current" : nil = link_to "Resque", "/info/resque" diff --git a/app/views/profile/show.html.haml b/app/views/profile/show.html.haml index 723b6413..2c2249bf 100644 --- a/app/views/profile/show.html.haml +++ b/app/views/profile/show.html.haml @@ -28,5 +28,6 @@ = f.label :twitter .input= f.text_field :twitter - = f.submit 'Save', :class => "primary btn" + .actions + = f.submit 'Save', :class => "primary btn" diff --git a/config/routes.rb b/config/routes.rb index 923cdad7..25c4240d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,14 +7,18 @@ Gitlab::Application.routes.draw do get 'help' => 'help#index' namespace :admin do - resources :users + resources :users do + member do + put :team_update + end + end resources :projects, :constraints => { :id => /[^\/]+/ } do member do get :team put :team_update end end - resources :team_members + resources :team_members, :only => [:edit, :update, :destroy] get 'emails', :to => 'mailer#preview' get 'mailer/preview_note' get 'mailer/preview_user_new' diff --git a/spec/requests/admin/admin_projects_spec.rb b/spec/requests/admin/admin_projects_spec.rb index ffa65fc2..ceaf7245 100644 --- a/spec/requests/admin/admin_projects_spec.rb +++ b/spec/requests/admin/admin_projects_spec.rb @@ -18,7 +18,6 @@ describe "Admin::Projects" do end it "should have projects list" do - page.should have_content(@project.code) page.should have_content(@project.name) end end @@ -103,4 +102,18 @@ describe "Admin::Projects" do page.should have_content(@project.description) end end + + describe "Add new team member" do + before do + @new_user = Factory :user + visit admin_project_path(@project) + end + + it "should create new user" do + select @new_user.name, :from => "user_ids" + expect { click_button "Add" }.to change { UsersProject.count }.by(1) + page.should have_content @new_user.name + current_path.should == admin_project_path(@project) + end + end end diff --git a/spec/requests/admin/admin_users_spec.rb b/spec/requests/admin/admin_users_spec.rb index aa78db99..91082a64 100644 --- a/spec/requests/admin/admin_users_spec.rb +++ b/spec/requests/admin/admin_users_spec.rb @@ -99,4 +99,18 @@ describe "Admin::Users" do end end end + + describe "Add new project" do + before do + @new_project = Factory :project + visit admin_user_path(@user) + end + + it "should create new user" do + select @new_project.name, :from => "project_ids" + expect { click_button "Add" }.to change { UsersProject.count }.by(1) + page.should have_content @new_project.name + current_path.should == admin_user_path(@user) + end + end end diff --git a/spec/requests/admin/security_spec.rb b/spec/requests/admin/security_spec.rb index 27b60196..0b0edb85 100644 --- a/spec/requests/admin/security_spec.rb +++ b/spec/requests/admin/security_spec.rb @@ -13,12 +13,6 @@ describe "Admin::Projects" do it { admin_users_path.should be_denied_for :visitor } end - describe "GET /admin/team_members" do - it { admin_team_members_path.should be_allowed_for :admin } - it { admin_team_members_path.should be_denied_for :user } - it { admin_team_members_path.should be_denied_for :visitor } - end - describe "GET /admin/emails" do it { admin_emails_path.should be_allowed_for :admin } it { admin_emails_path.should be_denied_for :user }