Commit c9af8e757948838cd6e7232dc189debd61e0c799
1 parent
af99e4af
Exists in
master
and in
4 other branches
New project page improved. User profile improved. Show issues, participant on Milestone show page.
Showing
20 changed files
with
200 additions
and
117 deletions
Show diff stats
257 Bytes
app/assets/stylesheets/gitlab_bootstrap.scss
app/assets/stylesheets/highlight.scss
| ... | ... | @@ -64,12 +64,8 @@ table.highlighttable pre{ |
| 64 | 64 | } |
| 65 | 65 | |
| 66 | 66 | .git-empty .highlight { |
| 67 | - @include round-borders-all(4px); | |
| 68 | - background:#eee; | |
| 69 | - padding:5px; | |
| 70 | - //overflow-x:scroll; | |
| 71 | 67 | pre{ |
| 72 | - padding:0; | |
| 68 | + padding:15px; | |
| 73 | 69 | line-height:2.0; |
| 74 | 70 | margin:0; |
| 75 | 71 | font-family: 'Menlo', 'Courier New', 'andale mono','lucida console',monospace; | ... | ... |
app/assets/stylesheets/sections/projects.scss
| ... | ... | @@ -13,3 +13,28 @@ |
| 13 | 13 | } |
| 14 | 14 | } |
| 15 | 15 | } |
| 16 | + | |
| 17 | +.new_project, | |
| 18 | +.edit_project { | |
| 19 | + .project_name_holder { | |
| 20 | + input, | |
| 21 | + label { | |
| 22 | + font-size:16px; | |
| 23 | + line-height:20px; | |
| 24 | + padding:8px; | |
| 25 | + } | |
| 26 | + label { | |
| 27 | + color:#888; | |
| 28 | + } | |
| 29 | + .btn { | |
| 30 | + padding:6px; | |
| 31 | + margin-left:10px; | |
| 32 | + } | |
| 33 | + } | |
| 34 | +} | |
| 35 | + | |
| 36 | +.new_project { | |
| 37 | + .field_with_errors { | |
| 38 | + display:inline; | |
| 39 | + } | |
| 40 | +} | ... | ... |
app/assets/stylesheets/ui_basic.scss
app/assets/stylesheets/ui_mars.scss
app/controllers/milestones_controller.rb
app/models/milestone.rb
| ... | ... | @@ -9,6 +9,10 @@ class Milestone < ActiveRecord::Base |
| 9 | 9 | where("due_date > ? OR due_date IS NULL", Date.today) |
| 10 | 10 | end |
| 11 | 11 | |
| 12 | + def participants | |
| 13 | + User.where(:id => issues.map(&:assignee_id)) | |
| 14 | + end | |
| 15 | + | |
| 12 | 16 | def percent_complete |
| 13 | 17 | @percent_complete ||= begin |
| 14 | 18 | total_i = self.issues.count | ... | ... |
app/models/user.rb
| ... | ... | @@ -131,6 +131,11 @@ class User < ActiveRecord::Base |
| 131 | 131 | self.blocked = true |
| 132 | 132 | save |
| 133 | 133 | end |
| 134 | + | |
| 135 | + def projects_limit_percent | |
| 136 | + return 100 if projects_limit.zero? | |
| 137 | + (my_own_projects.count.to_f / projects_limit) * 100 | |
| 138 | + end | |
| 134 | 139 | end |
| 135 | 140 | # == Schema Information |
| 136 | 141 | # | ... | ... |
app/views/dashboard/issues.html.haml
| 1 | 1 | %h3 |
| 2 | 2 | Issues |
| 3 | 3 | %small (assigned to you) |
| 4 | + %small.right #{@issues.total_count} issues | |
| 4 | 5 | |
| 5 | 6 | %br |
| 6 | -%div#issues-table-holder.ui-box | |
| 7 | - %title | |
| 8 | - %ul#issues-table.unstyled | |
| 9 | - - if @issues.any? | |
| 10 | - - @issues.group_by(&:project).each do |group| | |
| 11 | - %li.wll.smoke | |
| 12 | - - project = group[0] | |
| 13 | - = project.name | |
| 7 | +- if @issues.any? | |
| 8 | + - @issues.group_by(&:project).each do |group| | |
| 9 | + %div.ui-box | |
| 10 | + - project = group[0] | |
| 11 | + %h5= project.name | |
| 12 | + %ul.unstyled | |
| 14 | 13 | - group[1].each do |issue| |
| 15 | 14 | = render(:partial => 'issues/show', :locals => {:issue => issue}) |
| 16 | - %li.bottom | |
| 17 | - .row | |
| 18 | - .span7= paginate @issues, :theme => "gitlab" | |
| 19 | - .span4.right | |
| 20 | - %span.cgray.right #{@issues.total_count} issues | |
| 21 | - | |
| 22 | - - else | |
| 23 | - %li | |
| 24 | - %p.padded Nothing to show here | |
| 15 | + %hr | |
| 16 | + = paginate @issues, :theme => "gitlab" | |
| 17 | +- else | |
| 18 | + %h4.padded | |
| 19 | + %center Nothing to show here | ... | ... |
app/views/dashboard/merge_requests.html.haml
| 1 | 1 | %h3 |
| 2 | 2 | Merge Requests |
| 3 | 3 | %small (authored or assigned to you) |
| 4 | + %small.right #{@merge_requests.total_count} merge requests | |
| 4 | 5 | |
| 5 | 6 | %br |
| 6 | -%div#merge_requests-table-holder.ui-box | |
| 7 | - %title | |
| 8 | - %ul#merge_requests-table.unstyled | |
| 9 | - - if @merge_requests.any? | |
| 10 | - - @merge_requests.group_by(&:project).each do |group| | |
| 11 | - %li.wll.smoke | |
| 12 | - - project = group[0] | |
| 13 | - = project.name | |
| 14 | - - group[1].each do |merge_request| | |
| 15 | - = render(:partial => 'merge_requests/merge_request', :locals => {:merge_request => merge_request}) | |
| 16 | - %li.bottom | |
| 17 | - .row | |
| 18 | - .span7= paginate @merge_requests, :theme => "gitlab" | |
| 19 | - .span4.right | |
| 20 | - %span.cgray.right #{@merge_requests.total_count} merge requests | |
| 7 | +- if @merge_requests.any? | |
| 8 | + - @merge_requests.group_by(&:project).each do |group| | |
| 9 | + %ul.unstyled.ui-box | |
| 10 | + - project = group[0] | |
| 11 | + %h5= project.name | |
| 12 | + - group[1].each do |merge_request| | |
| 13 | + = render(:partial => 'merge_requests/merge_request', :locals => {:merge_request => merge_request}) | |
| 14 | + %hr | |
| 15 | + = paginate @merge_requests, :theme => "gitlab" | |
| 21 | 16 | |
| 22 | - - else | |
| 23 | - %li | |
| 24 | - %p.padded Nothing to show here | |
| 17 | +- else | |
| 18 | + %li | |
| 19 | + %p.padded Nothing to show here | ... | ... |
app/views/layouts/_head_panel.html.haml
| ... | ... | @@ -11,8 +11,11 @@ |
| 11 | 11 | .search |
| 12 | 12 | = form_tag search_path, :method => :get do |f| |
| 13 | 13 | = text_field_tag "search", nil, :placeholder => "Search", :class => "search-input" |
| 14 | + - if current_user.can_create_project? | |
| 15 | + = link_to new_project_path, :class => "top_panel_ico", :title => "Create New Project" do | |
| 16 | + = image_tag "new_project.png", :width => 16 | |
| 14 | 17 | - if current_user.is_admin? |
| 15 | - = link_to admin_root_path, :class => "admin_link", :title => "Admin area" do | |
| 18 | + = link_to admin_root_path, :class => "top_panel_ico", :title => "Admin area" do | |
| 16 | 19 | = image_tag "admin.PNG", :width => 16 |
| 17 | 20 | .account-box |
| 18 | 21 | = link_to profile_path, :class => "pic" do | ... | ... |
app/views/milestones/show.html.haml
| ... | ... | @@ -42,6 +42,30 @@ |
| 42 | 42 | = preserve do |
| 43 | 43 | = markdown @milestone.description |
| 44 | 44 | |
| 45 | +.row | |
| 46 | + .span6 | |
| 47 | + %h4 Open Issues: | |
| 48 | + - @issues.each do |issue| | |
| 49 | + = link_to [@project, issue] do | |
| 50 | + %h5 | |
| 51 | + = image_tag gravatar_icon(issue.assignee_email, 16), :width => "16" | |
| 52 | + | |
| 53 | + Issue ##{issue.id} | |
| 54 | + – | |
| 55 | + = truncate issue.title, :length => 50 | |
| 56 | + %small | |
| 57 | + updated at | |
| 58 | + = issue.updated_at.stamp("Aug 25, 2011") | |
| 59 | + %br | |
| 60 | + = paginate @issues, :theme => "gitlab" | |
| 61 | + | |
| 62 | + .span6 | |
| 63 | + %h4 Participants: | |
| 64 | + - @users.each do |user| | |
| 65 | + %h5 | |
| 66 | + = image_tag gravatar_icon(user.email, 16), :width => "16" | |
| 67 | + | |
| 68 | + = user.name | |
| 45 | 69 | |
| 46 | 70 | :javascript |
| 47 | 71 | $(function() { | ... | ... |
app/views/profile/password.html.haml
| ... | ... | @@ -6,7 +6,7 @@ |
| 6 | 6 | %hr |
| 7 | 7 | = form_for @user, :url => profile_password_path, :method => :put do |f| |
| 8 | 8 | .data |
| 9 | - .alert-message.block-message.warning | |
| 9 | + .alert.alert-info | |
| 10 | 10 | %p After successfull password update you will be redirected to login page where you should login with new password |
| 11 | 11 | -if @user.errors.any? |
| 12 | 12 | .alert-message.block-message.error |
| ... | ... | @@ -33,7 +33,7 @@ |
| 33 | 33 | %hr |
| 34 | 34 | = form_for @user, :url => profile_reset_private_token_path, :method => :put do |f| |
| 35 | 35 | .data |
| 36 | - .alert-message.block-message.warning | |
| 36 | + .alert.alert-info | |
| 37 | 37 | %p Private token used to access application resources without authentication. |
| 38 | 38 | %hr |
| 39 | 39 | %p * required for rss feed | ... | ... |
app/views/profile/show.html.haml
| 1 | -.row | |
| 2 | - .span8 | |
| 3 | - .profile_avatar_holder | |
| 4 | - = image_tag gravatar_icon(@user.email, 90), :class => "styled_image" | |
| 5 | - %h3 | |
| 6 | - = @user.name | |
| 7 | - %br | |
| 8 | - %small | |
| 9 | - = @user.email | |
| 10 | - | |
| 11 | - .span4.right | |
| 12 | - %div | |
| 13 | - %div | |
| 14 | - %h5.cgray | |
| 15 | - Personal projects: | |
| 16 | - %span.right | |
| 17 | - %span= current_user.my_own_projects.count | |
| 18 | - of | |
| 19 | - %span= current_user.projects_limit | |
| 20 | - %h5.cgray | |
| 21 | - SSH public keys: | |
| 22 | - %span.right | |
| 23 | - %span= current_user.keys.count | |
| 1 | +.profile_avatar_holder | |
| 2 | + = image_tag gravatar_icon(@user.email, 90), :class => "styled_image" | |
| 3 | +%h3 | |
| 4 | + = @user.name | |
| 5 | + %br | |
| 6 | + %small | |
| 7 | + = @user.email | |
| 8 | + | |
| 9 | + | |
| 24 | 10 | %hr |
| 25 | 11 | |
| 26 | 12 | = form_for @user, :url => profile_update_path, :method => :put, :html => { :class => "edit_user form-horizontal" } do |f| |
| ... | ... | @@ -41,6 +27,8 @@ |
| 41 | 27 | .controls |
| 42 | 28 | = f.text_field :email, :class => "input-xlarge" |
| 43 | 29 | %span.help-block We also use email for avatar detection. |
| 30 | + | |
| 31 | + %hr | |
| 44 | 32 | .control-group |
| 45 | 33 | = f.label :skype, :class => "control-label" |
| 46 | 34 | .controls= f.text_field :skype, :class => "input-xlarge" |
| ... | ... | @@ -56,12 +44,27 @@ |
| 56 | 44 | = f.text_area :bio, :rows => 6, :class => "input-xlarge", :maxlength => 250 |
| 57 | 45 | %span.help-block Tell us about yourself in fewer than 250 characters. |
| 58 | 46 | .span5.right |
| 59 | - %p.alert-message.block-message | |
| 47 | + | |
| 48 | + %p.alert.alert-info | |
| 60 | 49 | %strong Tip: |
| 61 | 50 | You can change your avatar at gravatar.com |
| 62 | 51 | |
| 52 | + %h4 | |
| 53 | + Personal projects: | |
| 54 | + %small.right | |
| 55 | + %span= current_user.my_own_projects.count | |
| 56 | + of | |
| 57 | + %span= current_user.projects_limit | |
| 58 | + .progress | |
| 59 | + .bar{:style => "width: #{current_user.projects_limit_percent}%;"} | |
| 60 | + | |
| 61 | + %h4 | |
| 62 | + SSH public keys: | |
| 63 | + %small.right | |
| 64 | + %span= current_user.keys.count | |
| 65 | + | |
| 66 | + = link_to "Add Public Key", new_key_path, :class => "btn small right" | |
| 67 | + | |
| 68 | + | |
| 63 | 69 | .form-actions |
| 64 | 70 | = f.submit 'Save', :class => "btn-primary btn" |
| 65 | - | |
| 66 | --#= link_to "New project", new_project_path, :class => "btn small padded" | |
| 67 | --#= link_to "New public key", new_key_path, :class => "btn small" | ... | ... |
app/views/projects/_form.html.haml
| ... | ... | @@ -4,31 +4,39 @@ |
| 4 | 4 | %ul |
| 5 | 5 | - @project.errors.full_messages.each do |msg| |
| 6 | 6 | %li= msg |
| 7 | - .clearfix | |
| 8 | - = f.label :name | |
| 9 | - .input= f.text_field :name, :placeholder => "Example Project" | |
| 10 | - .clearfix | |
| 11 | - = f.label :path do | |
| 12 | - Path | |
| 7 | + .clearfix.project_name_holder | |
| 8 | + = f.label :name do | |
| 9 | + Project name is | |
| 13 | 10 | .input |
| 14 | - .input-prepend | |
| 15 | - %span.add-on= "#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:" | |
| 16 | - = f.text_field :path, :placeholder => "example_project", :disabled => !@project.new_record? | |
| 17 | - .clearfix | |
| 18 | - = f.label :code do | |
| 19 | - Code | |
| 20 | - .input | |
| 21 | - .input-prepend | |
| 22 | - %span.add-on= web_app_url | |
| 23 | - = f.text_field :code, :placeholder => "example" | |
| 11 | + = f.text_field :name, :placeholder => "Example Project", :class => "xxlarge" | |
| 24 | 12 | |
| 25 | - - unless @project.new_record? || @project.heads.empty? | |
| 13 | + %hr | |
| 14 | + .alert.alert-info | |
| 15 | + %h5 Advanced settings: | |
| 16 | + .clearfix | |
| 17 | + = f.label :path do | |
| 18 | + Git Clone | |
| 19 | + .input | |
| 20 | + .input-prepend | |
| 21 | + %span.add-on= "#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:" | |
| 22 | + = f.text_field :path, :placeholder => "example_project", :disabled => !@project.new_record? | |
| 23 | + %span.add-on= ".git" | |
| 26 | 24 | .clearfix |
| 27 | - = f.label :default_branch, "Default Branch" | |
| 28 | - .input= f.select(:default_branch, @project.heads.map(&:name), {}, :style => "width:210px;") | |
| 25 | + = f.label :code do | |
| 26 | + URL | |
| 27 | + .input | |
| 28 | + .input-prepend | |
| 29 | + %span.add-on= web_app_url | |
| 30 | + = f.text_field :code, :placeholder => "example" | |
| 31 | + | |
| 32 | + - unless @project.new_record? || @project.heads.empty? | |
| 33 | + .clearfix | |
| 34 | + = f.label :default_branch, "Default Branch" | |
| 35 | + .input= f.select(:default_branch, @project.heads.map(&:name), {}, :style => "width:210px;") | |
| 29 | 36 | |
| 30 | - .alert-message.block-message.warning | |
| 31 | - %h5 Features | |
| 37 | + - unless @project.new_record? | |
| 38 | + .alert.alert-info | |
| 39 | + %h5 Features: | |
| 32 | 40 | |
| 33 | 41 | .clearfix |
| 34 | 42 | = f.label :issues_enabled, "Issues" |
| ... | ... | @@ -46,12 +54,6 @@ |
| 46 | 54 | = f.label :wiki_enabled, "Wiki" |
| 47 | 55 | .input= f.check_box :wiki_enabled |
| 48 | 56 | |
| 49 | - .clearfix | |
| 50 | - = f.label :description | |
| 51 | - .input | |
| 52 | - = f.text_area :description, :placeholder => "project description", :class => "xxlarge", :rows => 5 | |
| 53 | - %p.hint Markdown is enabled. | |
| 54 | - | |
| 55 | 57 | %br |
| 56 | 58 | |
| 57 | 59 | .actions | ... | ... |
| ... | ... | @@ -0,0 +1,29 @@ |
| 1 | += form_for(@project, :remote => true) do |f| | |
| 2 | + - if @project.errors.any? | |
| 3 | + .alert-message.block-message.error | |
| 4 | + %span= @project.errors.full_messages.first | |
| 5 | + .clearfix.project_name_holder | |
| 6 | + = f.label :name do | |
| 7 | + Project name is | |
| 8 | + .input | |
| 9 | + = f.text_field :name, :placeholder => "Example Project", :class => "xxlarge" | |
| 10 | + = f.submit 'Create project', :class => "btn primary" | |
| 11 | + | |
| 12 | + %hr | |
| 13 | + .alert.alert-info | |
| 14 | + %h5 Advanced settings: | |
| 15 | + .clearfix | |
| 16 | + = f.label :path do | |
| 17 | + Git Clone | |
| 18 | + .input | |
| 19 | + .input-prepend | |
| 20 | + %span.add-on= "#{GIT_HOST["git_user"]}@#{GIT_HOST["host"]}:" | |
| 21 | + = f.text_field :path, :placeholder => "example_project", :disabled => !@project.new_record? | |
| 22 | + %span.add-on= ".git" | |
| 23 | + .clearfix | |
| 24 | + = f.label :code do | |
| 25 | + URL | |
| 26 | + .input | |
| 27 | + .input-prepend | |
| 28 | + %span.add-on= web_app_url | |
| 29 | + = f.text_field :code, :placeholder => "example" | ... | ... |
app/views/projects/create.js.haml
app/views/projects/new.html.haml
spec/requests/projects_spec.rb
| ... | ... | @@ -34,19 +34,17 @@ describe "Projects" do |
| 34 | 34 | end |
| 35 | 35 | |
| 36 | 36 | it "should have labels for new project" do |
| 37 | - page.should have_content("Name") | |
| 38 | - page.should have_content("Path") | |
| 39 | - page.should have_content("Description") | |
| 37 | + page.should have_content("Project name is") | |
| 40 | 38 | end |
| 41 | 39 | end |
| 42 | 40 | |
| 43 | 41 | describe "POST /projects" do |
| 44 | 42 | before do |
| 45 | 43 | visit new_project_path |
| 46 | - fill_in 'Name', :with => 'NewProject' | |
| 47 | - fill_in 'Code', :with => 'NPR' | |
| 48 | - fill_in 'Path', :with => 'newproject' | |
| 49 | - expect { click_button "Save" }.to change { Project.count }.by(1) | |
| 44 | + fill_in 'project_name', :with => 'NewProject' | |
| 45 | + fill_in 'project_code', :with => 'NPR' | |
| 46 | + fill_in 'project_path', :with => 'newproject' | |
| 47 | + expect { click_button "Create project" }.to change { Project.count }.by(1) | |
| 50 | 48 | @project = Project.last |
| 51 | 49 | end |
| 52 | 50 | |
| ... | ... | @@ -120,9 +118,9 @@ describe "Projects" do |
| 120 | 118 | end |
| 121 | 119 | |
| 122 | 120 | it "should have labels for new project" do |
| 123 | - page.should have_content("Name") | |
| 124 | - page.should have_content("Path") | |
| 125 | - page.should have_content("Description") | |
| 121 | + page.should have_content("Project name is") | |
| 122 | + page.should have_content("Advanced settings:") | |
| 123 | + page.should have_content("Features:") | |
| 126 | 124 | end |
| 127 | 125 | end |
| 128 | 126 | |
| ... | ... | @@ -133,9 +131,8 @@ describe "Projects" do |
| 133 | 131 | |
| 134 | 132 | visit edit_project_path(@project) |
| 135 | 133 | |
| 136 | - fill_in 'Name', :with => 'Awesome' | |
| 137 | - fill_in 'Path', :with => 'gitlabhq' | |
| 138 | - fill_in 'Description', :with => 'Awesome project' | |
| 134 | + fill_in 'project_name', :with => 'Awesome' | |
| 135 | + fill_in 'project_path', :with => 'gitlabhq' | |
| 139 | 136 | click_button "Save" |
| 140 | 137 | @project = @project.reload |
| 141 | 138 | end | ... | ... |