New project page improved. User profile improved. Show issues, participant on Milestone show page.
This commit is contained in:
parent
af99e4afe1
commit
c9af8e7579
20 changed files with 200 additions and 117 deletions
BIN
app/assets/images/new_project.png
Normal file
BIN
app/assets/images/new_project.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 257 B |
|
@ -111,6 +111,7 @@ table {
|
|||
|
||||
&.btn-primary {
|
||||
background:$link_color;
|
||||
border-color: #2A79A3;
|
||||
&:hover {
|
||||
background:$blue_link;
|
||||
}
|
||||
|
|
|
@ -64,12 +64,8 @@ table.highlighttable pre{
|
|||
}
|
||||
|
||||
.git-empty .highlight {
|
||||
@include round-borders-all(4px);
|
||||
background:#eee;
|
||||
padding:5px;
|
||||
//overflow-x:scroll;
|
||||
pre{
|
||||
padding:0;
|
||||
padding:15px;
|
||||
line-height:2.0;
|
||||
margin:0;
|
||||
font-family: 'Menlo', 'Courier New', 'andale mono','lucida console',monospace;
|
||||
|
|
|
@ -13,3 +13,28 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.new_project,
|
||||
.edit_project {
|
||||
.project_name_holder {
|
||||
input,
|
||||
label {
|
||||
font-size:16px;
|
||||
line-height:20px;
|
||||
padding:8px;
|
||||
}
|
||||
label {
|
||||
color:#888;
|
||||
}
|
||||
.btn {
|
||||
padding:6px;
|
||||
margin-left:10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.new_project {
|
||||
.field_with_errors {
|
||||
display:inline;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -81,11 +81,11 @@
|
|||
}
|
||||
}
|
||||
|
||||
.admin_link {
|
||||
.top_panel_ico {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
padding: 5px;
|
||||
margin-right: 15px;
|
||||
margin-right:10px;
|
||||
float:right;
|
||||
}
|
||||
|
||||
|
|
|
@ -94,11 +94,11 @@
|
|||
}
|
||||
}
|
||||
|
||||
.admin_link {
|
||||
.top_panel_ico {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
padding: 5px;
|
||||
margin-right: 15px;
|
||||
margin-right:10px;
|
||||
float:right;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,6 +36,9 @@ class MilestonesController < ApplicationController
|
|||
end
|
||||
|
||||
def show
|
||||
@issues = @milestone.issues.opened.page(params[:page]).per(40)
|
||||
@users = @milestone.participants
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.js
|
||||
|
|
|
@ -9,6 +9,10 @@ class Milestone < ActiveRecord::Base
|
|||
where("due_date > ? OR due_date IS NULL", Date.today)
|
||||
end
|
||||
|
||||
def participants
|
||||
User.where(:id => issues.map(&:assignee_id))
|
||||
end
|
||||
|
||||
def percent_complete
|
||||
@percent_complete ||= begin
|
||||
total_i = self.issues.count
|
||||
|
|
|
@ -131,6 +131,11 @@ class User < ActiveRecord::Base
|
|||
self.blocked = true
|
||||
save
|
||||
end
|
||||
|
||||
def projects_limit_percent
|
||||
return 100 if projects_limit.zero?
|
||||
(my_own_projects.count.to_f / projects_limit) * 100
|
||||
end
|
||||
end
|
||||
# == Schema Information
|
||||
#
|
||||
|
|
|
@ -1,24 +1,19 @@
|
|||
%h3
|
||||
Issues
|
||||
%small (assigned to you)
|
||||
%small.right #{@issues.total_count} issues
|
||||
|
||||
%br
|
||||
%div#issues-table-holder.ui-box
|
||||
%title
|
||||
%ul#issues-table.unstyled
|
||||
- if @issues.any?
|
||||
- @issues.group_by(&:project).each do |group|
|
||||
%li.wll.smoke
|
||||
- project = group[0]
|
||||
= project.name
|
||||
- if @issues.any?
|
||||
- @issues.group_by(&:project).each do |group|
|
||||
%div.ui-box
|
||||
- project = group[0]
|
||||
%h5= project.name
|
||||
%ul.unstyled
|
||||
- group[1].each do |issue|
|
||||
= render(:partial => 'issues/show', :locals => {:issue => issue})
|
||||
%li.bottom
|
||||
.row
|
||||
.span7= paginate @issues, :theme => "gitlab"
|
||||
.span4.right
|
||||
%span.cgray.right #{@issues.total_count} issues
|
||||
|
||||
- else
|
||||
%li
|
||||
%p.padded Nothing to show here
|
||||
%hr
|
||||
= paginate @issues, :theme => "gitlab"
|
||||
- else
|
||||
%h4.padded
|
||||
%center Nothing to show here
|
||||
|
|
|
@ -1,24 +1,19 @@
|
|||
%h3
|
||||
Merge Requests
|
||||
%small (authored or assigned to you)
|
||||
%small.right #{@merge_requests.total_count} merge requests
|
||||
|
||||
%br
|
||||
%div#merge_requests-table-holder.ui-box
|
||||
%title
|
||||
%ul#merge_requests-table.unstyled
|
||||
- if @merge_requests.any?
|
||||
- @merge_requests.group_by(&:project).each do |group|
|
||||
%li.wll.smoke
|
||||
- project = group[0]
|
||||
= project.name
|
||||
- group[1].each do |merge_request|
|
||||
= render(:partial => 'merge_requests/merge_request', :locals => {:merge_request => merge_request})
|
||||
%li.bottom
|
||||
.row
|
||||
.span7= paginate @merge_requests, :theme => "gitlab"
|
||||
.span4.right
|
||||
%span.cgray.right #{@merge_requests.total_count} merge requests
|
||||
- if @merge_requests.any?
|
||||
- @merge_requests.group_by(&:project).each do |group|
|
||||
%ul.unstyled.ui-box
|
||||
- project = group[0]
|
||||
%h5= project.name
|
||||
- group[1].each do |merge_request|
|
||||
= render(:partial => 'merge_requests/merge_request', :locals => {:merge_request => merge_request})
|
||||
%hr
|
||||
= paginate @merge_requests, :theme => "gitlab"
|
||||
|
||||
- else
|
||||
%li
|
||||
%p.padded Nothing to show here
|
||||
- else
|
||||
%li
|
||||
%p.padded Nothing to show here
|
||||
|
|
|
@ -11,8 +11,11 @@
|
|||
.search
|
||||
= form_tag search_path, :method => :get do |f|
|
||||
= text_field_tag "search", nil, :placeholder => "Search", :class => "search-input"
|
||||
- if current_user.can_create_project?
|
||||
= link_to new_project_path, :class => "top_panel_ico", :title => "Create New Project" do
|
||||
= image_tag "new_project.png", :width => 16
|
||||
- if current_user.is_admin?
|
||||
= link_to admin_root_path, :class => "admin_link", :title => "Admin area" do
|
||||
= link_to admin_root_path, :class => "top_panel_ico", :title => "Admin area" do
|
||||
= image_tag "admin.PNG", :width => 16
|
||||
.account-box
|
||||
= link_to profile_path, :class => "pic" do
|
||||
|
|
|
@ -42,6 +42,30 @@
|
|||
= preserve do
|
||||
= markdown @milestone.description
|
||||
|
||||
.row
|
||||
.span6
|
||||
%h4 Open Issues:
|
||||
- @issues.each do |issue|
|
||||
= link_to [@project, issue] do
|
||||
%h5
|
||||
= image_tag gravatar_icon(issue.assignee_email, 16), :width => "16"
|
||||
|
||||
Issue ##{issue.id}
|
||||
–
|
||||
= truncate issue.title, :length => 50
|
||||
%small
|
||||
updated at
|
||||
= issue.updated_at.stamp("Aug 25, 2011")
|
||||
%br
|
||||
= paginate @issues, :theme => "gitlab"
|
||||
|
||||
.span6
|
||||
%h4 Participants:
|
||||
- @users.each do |user|
|
||||
%h5
|
||||
= image_tag gravatar_icon(user.email, 16), :width => "16"
|
||||
|
||||
= user.name
|
||||
|
||||
:javascript
|
||||
$(function() {
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
%hr
|
||||
= form_for @user, :url => profile_password_path, :method => :put do |f|
|
||||
.data
|
||||
.alert-message.block-message.warning
|
||||
.alert.alert-info
|
||||
%p After successfull password update you will be redirected to login page where you should login with new password
|
||||
-if @user.errors.any?
|
||||
.alert-message.block-message.error
|
||||
|
@ -33,7 +33,7 @@
|
|||
%hr
|
||||
= form_for @user, :url => profile_reset_private_token_path, :method => :put do |f|
|
||||
.data
|
||||
.alert-message.block-message.warning
|
||||
.alert.alert-info
|
||||
%p Private token used to access application resources without authentication.
|
||||
%hr
|
||||
%p * required for rss feed
|
||||
|
|
|
@ -1,26 +1,12 @@
|
|||
.row
|
||||
.span8
|
||||
.profile_avatar_holder
|
||||
= image_tag gravatar_icon(@user.email, 90), :class => "styled_image"
|
||||
%h3
|
||||
= @user.name
|
||||
%br
|
||||
%small
|
||||
= @user.email
|
||||
.profile_avatar_holder
|
||||
= image_tag gravatar_icon(@user.email, 90), :class => "styled_image"
|
||||
%h3
|
||||
= @user.name
|
||||
%br
|
||||
%small
|
||||
= @user.email
|
||||
|
||||
|
||||
.span4.right
|
||||
%div
|
||||
%div
|
||||
%h5.cgray
|
||||
Personal projects:
|
||||
%span.right
|
||||
%span= current_user.my_own_projects.count
|
||||
of
|
||||
%span= current_user.projects_limit
|
||||
%h5.cgray
|
||||
SSH public keys:
|
||||
%span.right
|
||||
%span= current_user.keys.count
|
||||
%hr
|
||||
|
||||
= form_for @user, :url => profile_update_path, :method => :put, :html => { :class => "edit_user form-horizontal" } do |f|
|
||||
|
@ -41,6 +27,8 @@
|
|||
.controls
|
||||
= f.text_field :email, :class => "input-xlarge"
|
||||
%span.help-block We also use email for avatar detection.
|
||||
|
||||
%hr
|
||||
.control-group
|
||||
= f.label :skype, :class => "control-label"
|
||||
.controls= f.text_field :skype, :class => "input-xlarge"
|
||||
|
@ -56,12 +44,27 @@
|
|||
= f.text_area :bio, :rows => 6, :class => "input-xlarge", :maxlength => 250
|
||||
%span.help-block Tell us about yourself in fewer than 250 characters.
|
||||
.span5.right
|
||||
%p.alert-message.block-message
|
||||
|
||||
%p.alert.alert-info
|
||||
%strong Tip:
|
||||
You can change your avatar at gravatar.com
|
||||
|
||||
%h4
|
||||
Personal projects:
|
||||
%small.right
|
||||
%span= current_user.my_own_projects.count
|
||||
of
|
||||
%span= current_user.projects_limit
|
||||
.progress
|
||||
.bar{:style => "width: #{current_user.projects_limit_percent}%;"}
|
||||
|
||||
%h4
|
||||
SSH public keys:
|
||||
%small.right
|
||||
%span= current_user.keys.count
|
||||
|
||||
= link_to "Add Public Key", new_key_path, :class => "btn small right"
|
||||
|
||||
|
||||
.form-actions
|
||||
= f.submit 'Save', :class => "btn-primary btn"
|
||||
|
||||
-#= link_to "New project", new_project_path, :class => "btn small padded"
|
||||
-#= link_to "New public key", new_key_path, :class => "btn small"
|
||||
|
|
|
@ -4,31 +4,39 @@
|
|||
%ul
|
||||
- @project.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
.clearfix
|
||||
= f.label :name
|
||||
.input= f.text_field :name, :placeholder => "Example Project"
|
||||
.clearfix
|
||||
= f.label :path do
|
||||
Path
|
||||
.clearfix.project_name_holder
|
||||
= f.label :name do
|
||||
Project name is
|
||||
.input
|
||||
.input-prepend
|
||||
%span.add-on= "#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:"
|
||||
= f.text_field :path, :placeholder => "example_project", :disabled => !@project.new_record?
|
||||
.clearfix
|
||||
= f.label :code do
|
||||
Code
|
||||
.input
|
||||
.input-prepend
|
||||
%span.add-on= web_app_url
|
||||
= f.text_field :code, :placeholder => "example"
|
||||
= f.text_field :name, :placeholder => "Example Project", :class => "xxlarge"
|
||||
|
||||
- unless @project.new_record? || @project.heads.empty?
|
||||
%hr
|
||||
.alert.alert-info
|
||||
%h5 Advanced settings:
|
||||
.clearfix
|
||||
= f.label :default_branch, "Default Branch"
|
||||
.input= f.select(:default_branch, @project.heads.map(&:name), {}, :style => "width:210px;")
|
||||
= f.label :path do
|
||||
Git Clone
|
||||
.input
|
||||
.input-prepend
|
||||
%span.add-on= "#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:"
|
||||
= f.text_field :path, :placeholder => "example_project", :disabled => !@project.new_record?
|
||||
%span.add-on= ".git"
|
||||
.clearfix
|
||||
= f.label :code do
|
||||
URL
|
||||
.input
|
||||
.input-prepend
|
||||
%span.add-on= web_app_url
|
||||
= f.text_field :code, :placeholder => "example"
|
||||
|
||||
.alert-message.block-message.warning
|
||||
%h5 Features
|
||||
- unless @project.new_record? || @project.heads.empty?
|
||||
.clearfix
|
||||
= f.label :default_branch, "Default Branch"
|
||||
.input= f.select(:default_branch, @project.heads.map(&:name), {}, :style => "width:210px;")
|
||||
|
||||
- unless @project.new_record?
|
||||
.alert.alert-info
|
||||
%h5 Features:
|
||||
|
||||
.clearfix
|
||||
= f.label :issues_enabled, "Issues"
|
||||
|
@ -46,12 +54,6 @@
|
|||
= f.label :wiki_enabled, "Wiki"
|
||||
.input= f.check_box :wiki_enabled
|
||||
|
||||
.clearfix
|
||||
= f.label :description
|
||||
.input
|
||||
= f.text_area :description, :placeholder => "project description", :class => "xxlarge", :rows => 5
|
||||
%p.hint Markdown is enabled.
|
||||
|
||||
%br
|
||||
|
||||
.actions
|
||||
|
|
29
app/views/projects/_new_form.html.haml
Normal file
29
app/views/projects/_new_form.html.haml
Normal file
|
@ -0,0 +1,29 @@
|
|||
= form_for(@project, :remote => true) do |f|
|
||||
- if @project.errors.any?
|
||||
.alert-message.block-message.error
|
||||
%span= @project.errors.full_messages.first
|
||||
.clearfix.project_name_holder
|
||||
= f.label :name do
|
||||
Project name is
|
||||
.input
|
||||
= f.text_field :name, :placeholder => "Example Project", :class => "xxlarge"
|
||||
= f.submit 'Create project', :class => "btn primary"
|
||||
|
||||
%hr
|
||||
.alert.alert-info
|
||||
%h5 Advanced settings:
|
||||
.clearfix
|
||||
= f.label :path do
|
||||
Git Clone
|
||||
.input
|
||||
.input-prepend
|
||||
%span.add-on= "#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:"
|
||||
= f.text_field :path, :placeholder => "example_project", :disabled => !@project.new_record?
|
||||
%span.add-on= ".git"
|
||||
.clearfix
|
||||
= f.label :code do
|
||||
URL
|
||||
.input
|
||||
.input-prepend
|
||||
%span.add-on= web_app_url
|
||||
= f.text_field :code, :placeholder => "example"
|
|
@ -4,5 +4,5 @@
|
|||
- else
|
||||
:plain
|
||||
$('.project_new_holder').show();
|
||||
$("#new_project").replaceWith("#{escape_javascript(render('form'))}");
|
||||
$("#new_project").replaceWith("#{escape_javascript(render('new_form'))}");
|
||||
$('.ajax_loader').hide();
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
.project_new_holder
|
||||
%h3 New Project
|
||||
%h3
|
||||
New Project
|
||||
%hr
|
||||
= render 'form'
|
||||
= render 'new_form'
|
||||
%div.ajax_loader.hide
|
||||
%center
|
||||
%div.padded= image_tag "ajax_loader.gif"
|
||||
|
|
|
@ -34,19 +34,17 @@ describe "Projects" do
|
|||
end
|
||||
|
||||
it "should have labels for new project" do
|
||||
page.should have_content("Name")
|
||||
page.should have_content("Path")
|
||||
page.should have_content("Description")
|
||||
page.should have_content("Project name is")
|
||||
end
|
||||
end
|
||||
|
||||
describe "POST /projects" do
|
||||
before do
|
||||
visit new_project_path
|
||||
fill_in 'Name', :with => 'NewProject'
|
||||
fill_in 'Code', :with => 'NPR'
|
||||
fill_in 'Path', :with => 'newproject'
|
||||
expect { click_button "Save" }.to change { Project.count }.by(1)
|
||||
fill_in 'project_name', :with => 'NewProject'
|
||||
fill_in 'project_code', :with => 'NPR'
|
||||
fill_in 'project_path', :with => 'newproject'
|
||||
expect { click_button "Create project" }.to change { Project.count }.by(1)
|
||||
@project = Project.last
|
||||
end
|
||||
|
||||
|
@ -120,9 +118,9 @@ describe "Projects" do
|
|||
end
|
||||
|
||||
it "should have labels for new project" do
|
||||
page.should have_content("Name")
|
||||
page.should have_content("Path")
|
||||
page.should have_content("Description")
|
||||
page.should have_content("Project name is")
|
||||
page.should have_content("Advanced settings:")
|
||||
page.should have_content("Features:")
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -133,9 +131,8 @@ describe "Projects" do
|
|||
|
||||
visit edit_project_path(@project)
|
||||
|
||||
fill_in 'Name', :with => 'Awesome'
|
||||
fill_in 'Path', :with => 'gitlabhq'
|
||||
fill_in 'Description', :with => 'Awesome project'
|
||||
fill_in 'project_name', :with => 'Awesome'
|
||||
fill_in 'project_path', :with => 'gitlabhq'
|
||||
click_button "Save"
|
||||
@project = @project.reload
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue