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