OSDN Git Service

Admin area improved
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Sat, 11 Feb 2012 17:56:18 +0000 (19:56 +0200)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Sat, 11 Feb 2012 17:56:18 +0000 (19:56 +0200)
39 files changed:
app/assets/stylesheets/application.css
app/assets/stylesheets/common.scss
app/assets/stylesheets/issues.css.scss [deleted file]
app/assets/stylesheets/main.scss [new file with mode: 0644]
app/assets/stylesheets/projects.css.scss
app/assets/stylesheets/reset_bootstrap.scss
app/assets/stylesheets/top_panel.scss
app/controllers/admin/team_members_controller.rb
app/controllers/admin/users_controller.rb
app/models/project.rb
app/models/users_project.rb
app/views/admin/projects/_form.html.haml
app/views/admin/projects/edit.html.haml
app/views/admin/projects/index.html.haml
app/views/admin/projects/show.html.haml
app/views/admin/team_members/_form.html.haml
app/views/admin/team_members/edit.html.haml
app/views/admin/team_members/index.html.haml [deleted file]
app/views/admin/team_members/new.html.haml [deleted file]
app/views/admin/team_members/show.html.haml [deleted file]
app/views/admin/users/_form.html.haml
app/views/admin/users/edit.html.haml
app/views/admin/users/index.html.haml
app/views/admin/users/show.html.haml
app/views/kaminari/_first_page.html.haml [new file with mode: 0644]
app/views/kaminari/_gap.html.haml [new file with mode: 0644]
app/views/kaminari/_last_page.html.haml [new file with mode: 0644]
app/views/kaminari/_next_page.html.haml [new file with mode: 0644]
app/views/kaminari/_page.html.haml [new file with mode: 0644]
app/views/kaminari/_paginator.html.haml [new file with mode: 0644]
app/views/kaminari/_prev_page.html.haml [new file with mode: 0644]
app/views/layouts/_app_side.html.haml
app/views/layouts/_projects_side.html.haml
app/views/layouts/admin.html.haml
app/views/profile/show.html.haml
config/routes.rb
spec/requests/admin/admin_projects_spec.rb
spec/requests/admin/admin_users_spec.rb
spec/requests/admin/security_spec.rb

index 5a1fb42..3d809b5 100644 (file)
@@ -7,5 +7,5 @@
  *= require jquery-ui/jquery.tagify
  *= require chosen
  *= require_self
- *= require common
+ *= require main
 */
index 9fabc64..61b26bb 100644 (file)
@@ -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;
+
+  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;
 
-@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";
+  -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);
 
-/** CODE HIGHTLIGHT **/
-@import "highlight.css.scss";
-@import "highlight.black.css.scss";
+  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 (file)
index ecf1ca0..0000000
+++ /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 (file)
index 0000000..6c91b7c
--- /dev/null
@@ -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";
+
+
index df5d40b..e7a69fd 100644 (file)
@@ -201,3 +201,7 @@ input.git_clone_url {
     width:60px;
   }
 }
+
+#issue_assignee_id {
+  width:300px;
+}
index c52cf67..02bed42 100644 (file)
@@ -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;
-}
index a07fce1..28b972a 100644 (file)
@@ -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 { 
index d04d32a..57803b0 100644 (file)
@@ -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
index 85a95de..2164314 100644 (file)
@@ -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
index d98b7d0..49311da 100644 (file)
@@ -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")
index 2d09fa7..dd84392 100644 (file)
@@ -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)
index d10fbf9..4f6bc69 100644 (file)
@@ -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
     = 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();
   })
index a6062be..b8d6f68 100644 (file)
@@ -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 => ""
index 576dbf0..7cda522 100644 (file)
@@ -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
   - @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"
index 3e589a0..55610fa 100644 (file)
@@ -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
         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
         %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 { 
index e6dd6a4..6929ade 100644 (file)
@@ -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 { 
index 2f4832b..431387b 100644 (file)
@@ -1,6 +1,19 @@
-= render 'form'
+%h3
+  Edit access
+  %small
+    = @admin_team_member.project.name
+    &ndash;
+    = @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 (file)
index 8426c86..0000000
+++ /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 (file)
index c08ddc4..0000000
+++ /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 (file)
index 8579b6a..0000000
+++ /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
index b137ae3..bb54c18 100644 (file)
@@ -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
     .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"
index 2ccd2f7..0e94be9 100644 (file)
@@ -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 => ""
index b562a83..a0b4df1 100644 (file)
@@ -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"
index 755ee35..cf86fb1 100644 (file)
@@ -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
           Twitter:
       %td
         = @admin_user.twitter
-  %tr
-    %td{:colspan => 2}
-      = link_to 'Edit', edit_admin_user_path(@admin_user), :class => "btn"
 
-.span-14
-  %h2 Projects
+%h3 Projects
+%hr
+
+%table.zebra-striped
+  %tr
+    %thead
+      %th Name
+      %th Project Access
+      %th Repository Access
+      %th
+      %th
 
-  %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 (file)
index 0000000..fee8112
--- /dev/null
@@ -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 (file)
index 0000000..f82f185
--- /dev/null
@@ -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 (file)
index 0000000..6e41d23
--- /dev/null
@@ -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 (file)
index 0000000..76f40e7
--- /dev/null
@@ -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 (file)
index 0000000..5966812
--- /dev/null
@@ -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 (file)
index 0000000..6f9fb33
--- /dev/null
@@ -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 (file)
index 0000000..cef885e
--- /dev/null
@@ -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
index b4a97c5..3c34f18 100644 (file)
@@ -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"}"
index a55d000..4c35c62 100644 (file)
@@ -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
               = 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
 
 
index df4e917..18eb997 100644 (file)
@@ -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"
 
index 723b641..2c2249b 100644 (file)
@@ -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"
 
index 923cdad..25c4240 100644 (file)
@@ -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'
index ffa65fc..ceaf724 100644 (file)
@@ -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
index aa78db9..91082a6 100644 (file)
@@ -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
index 27b6019..0b0edb8 100644 (file)
@@ -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 }