Commit cc043f32 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets
Browse files

Admin area improved

parent a769204f
......@@ -7,5 +7,5 @@
*= require jquery-ui/jquery.tagify
*= require chosen
*= require_self
*= require common
*= require main
*/
@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;
}
#issue_assignee_id {
width:300px;
}
@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";
......@@ -201,3 +201,7 @@ input.git_clone_url {
width:60px;
}
}
#issue_assignee_id {
width:300px;
}
......@@ -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;
}
......@@ -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 {
......
......@@ -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 @@ def destroy
@admin_team_member = UsersProject.find(params[:id])
@admin_team_member.destroy
redirect_to admin_team_members_url
redirect_to :back
end
end
......@@ -9,8 +9,28 @@ def index
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
......
......@@ -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")
......
......@@ -27,6 +27,20 @@ def self.bulk_import(project, user_ids, project_access, repo_access)
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)
......
= 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();
})
%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 => ""
%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"
- 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 {
......
= 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 {
......
= render 'form'
%h3
Edit access
%small
= @admin_team_member.project.name
&ndash;
= @admin_team_member.user_name
%br