Commit 796784c7c8d385b72cd1e4b5a8f0885d630586fb

Authored by Dmitriy Zaporozhets
2 parents fa07c9d6 0a0710a5

Merge branch 'events' of dev.gitlabhq.com:gitlabhq into events

Gemfile
... ... @@ -58,5 +58,5 @@ end
58 58 group :test do
59 59 gem "turn", :require => false
60 60 gem "simplecov", :require => false
61   - gem "shoulda", "~> 3.0.0.beta2"
  61 + gem "shoulda", "3.0.0"
62 62 end
... ...
Gemfile.lock
... ... @@ -232,9 +232,9 @@ GEM
232 232 ffi (~> 1.0.9)
233 233 multi_json (~> 1.0.4)
234 234 rubyzip
235   - shoulda (3.0.0.beta2)
236   - shoulda-context (~> 1.0.0.beta1)
237   - shoulda-matchers (~> 1.0.0.beta1)
  235 + shoulda (3.0.0)
  236 + shoulda-context (~> 1.0.0)
  237 + shoulda-matchers (~> 1.0.0)
238 238 shoulda-context (1.0.0)
239 239 shoulda-matchers (1.0.0)
240 240 simplecov (0.5.4)
... ... @@ -322,7 +322,7 @@ DEPENDENCIES
322 322 rspec-rails
323 323 sass-rails (= 3.2.3)
324 324 seed-fu
325   - shoulda (~> 3.0.0.beta2)
  325 + shoulda (= 3.0.0)
326 326 simplecov
327 327 six
328 328 sqlite3
... ...
app/assets/images/Gear-UI.PNG

940 Bytes

app/assets/images/admin.PNG 0 → 100644

556 Bytes

app/assets/stylesheets/common.scss
... ... @@ -40,6 +40,7 @@ a {
40 40 .cred { color:#D12F19; }
41 41 .cgreen { color:#44aa22; }
42 42 .cblack { color:#111; }
  43 +.cwhite { color:#fff !important }
43 44  
44 45 /** COMMON STYLES **/
45 46 .left {
... ... @@ -75,6 +76,10 @@ a {
75 76 .no-borders {
76 77 border:none;
77 78 }
  79 +table.no-borders {
  80 + border:none;
  81 + tr, td { border:none }
  82 +}
78 83 .no-padding {
79 84 padding:0 !important;
80 85 }
... ... @@ -433,7 +438,7 @@ input.git_clone_url {
433 438 }
434 439  
435 440 .project_list_url {
436   - width:270px;
  441 + width:250px;
437 442 background:#fff !important;
438 443 }
439 444  
... ... @@ -441,7 +446,7 @@ input.git_clone_url {
441 446 @include shade;
442 447 @include round-borders-all(4px);
443 448 margin-bottom:20px;
444   - width:338px;
  449 + width:298px;
445 450 float:left;
446 451 margin-left:20px;
447 452 border: 1px solid #DDD;
... ... @@ -600,3 +605,24 @@ p.time {
600 605 font-size: 90%;
601 606 margin: 30px 3px 3px 2px;
602 607 }
  608 +
  609 +
  610 +.dashboard_category {
  611 + margin-bottom:30px;
  612 +
  613 + .dashboard_block {
  614 + width:700px;
  615 + margin:auto;
  616 +
  617 + .wll {
  618 + border:none;
  619 + &:hover {
  620 + background:none;
  621 + }
  622 +
  623 + h4 {
  624 + color:#666;
  625 + }
  626 + }
  627 + }
  628 +}
... ...
app/assets/stylesheets/main.scss
... ... @@ -71,6 +71,11 @@ $hover: #FDF5D9;
71 71 @import "ui_basic.scss";
72 72  
73 73 /**
  74 + * UI mars theme
  75 + */
  76 +@import "ui_mars.scss";
  77 +
  78 +/**
74 79 * Most of application styles placed here.
75 80 * This file represent common UI that should not be changed between themes
76 81 * or project restyling like form width or user avatar class or commit title
... ...
app/assets/stylesheets/ui_basic.scss
... ... @@ -57,11 +57,30 @@
57 57 text-shadow: 0 1px 1px #FFF;
58 58 }
59 59  
60   - img {
61   - float: left;
62   - position: relative;
63   - top: -9px;
64   - width:46px;
  60 + &.home {
  61 + img {
  62 + float: left;
  63 + position: relative;
  64 + top: -9px;
  65 + width:46px;
  66 +
  67 + }
  68 + }
  69 + &.admin_link {
  70 + width:16px;
  71 + height:16px;
  72 + padding: 5px;
  73 + border: 1px solid #ccc;
  74 + border-radius: 4px;
  75 + margin: 0px;
  76 + background: #eee;
  77 + margin-left:20px;
  78 + &:hover {
  79 + background:#f7f7f7;
  80 + }
  81 + img {
  82 + width:16px;
  83 + }
65 84 }
66 85 }
67 86 }
... ...
app/assets/stylesheets/ui_mars.scss 0 → 100644
... ... @@ -0,0 +1,316 @@
  1 +/**
  2 + * This file represent some UI that can be changed
  3 + * during web app restyle or theme select.
  4 + *
  5 + * Next items should be placed there
  6 + * - link colors
  7 + * - header styles
  8 + * - main menu styles
  9 + *
  10 + */
  11 +.ui_mars {
  12 +
  13 + /*
  14 + * Common styles
  15 + *
  16 + */
  17 + a {
  18 + color: $link_color;
  19 + &:hover {
  20 + text-decoration:none;
  21 + color: $style_color;
  22 + }
  23 + }
  24 +
  25 +
  26 + /*
  27 + * Application Header
  28 + *
  29 + */
  30 + header {
  31 + width:100%;
  32 + padding:0;
  33 + margin:0;
  34 + top:1px;
  35 + left:0;
  36 +
  37 +
  38 + background: #474D57 url('bg-header.png') repeat-x bottom;
  39 +
  40 + z-index:10;
  41 + height:60px;
  42 +
  43 + .search-input {
  44 + background:#474D57;
  45 + border-color:#888;
  46 + }
  47 + .app_logo {
  48 + width:230px;
  49 + float:left;
  50 + position:relative;
  51 + top:-4px;
  52 +
  53 + a {
  54 + float:left;
  55 +
  56 + h1 {
  57 +
  58 + background: url('images.png') no-repeat -3px -7px;
  59 + width: 65px;
  60 + height: 26px;
  61 + margin: 5px 0;
  62 + padding: 0;
  63 + display: block;
  64 + float: left;
  65 + text-indent: -1000em;
  66 +
  67 + }
  68 +
  69 + &.home {
  70 + img {
  71 + display:none
  72 +
  73 + }
  74 + }
  75 + &.admin_link {
  76 + width:16px;
  77 + height:16px;
  78 + padding: 5px;
  79 + border: 1px solid #888;
  80 + border-radius: 4px;
  81 + margin: 0px;
  82 + background:#474D57 ;
  83 + margin-left:20px;
  84 + margin-top:4px;
  85 + &:hover {
  86 + background:#f7f7f7;
  87 + }
  88 + img {
  89 + width:16px;
  90 + }
  91 + }
  92 + }
  93 + }
  94 + .wrapper {
  95 + margin:auto;
  96 + min-width:$min_app_width;
  97 + max-width:$max_app_width;
  98 + position:relative;
  99 + padding:15px 0;
  100 +
  101 + .top_panel_content {
  102 + margin:0 $app_padding;
  103 + }
  104 + }
  105 +
  106 + .project_name {
  107 + float:left;
  108 + width:400px;
  109 + margin:0;
  110 + margin-right:30px;
  111 + font-size:20px;
  112 + line-height:34px;
  113 + font-weight:bold;
  114 + color:#fff;
  115 + text-shadow: 0 1px 1px #111;
  116 + }
  117 +
  118 + .git_url_wrapper {
  119 + padding:0px;
  120 + margin:0px;
  121 + float:left;
  122 +
  123 + .git-url {
  124 + padding:0px;
  125 + margin:0px;
  126 + font-size: 12px;
  127 + margin-right:10px;
  128 + border-radius: 4px;
  129 + -moz-border-radius: 4px;
  130 + color: #666;
  131 + border: 1px solid #AAA;
  132 + padding: 0 10px 0 30px;
  133 + background: transparent url('images.png') no-repeat 8px -42px;
  134 + width: 260px;
  135 + height:26px;
  136 + }
  137 + }
  138 +
  139 + /* Account box */
  140 + .account-box {
  141 + position: absolute;
  142 + right: 0;
  143 + top: 13px;
  144 + z-index: 10000;
  145 + width: 128px;
  146 + font-size: 11px;
  147 + float: right;
  148 + display: block;
  149 + cursor: pointer;
  150 + img {
  151 + border-radius: 4px;
  152 + right: 20px;
  153 + position: absolute;
  154 + width: 33px;
  155 + height: 33px;
  156 + display: block;
  157 + top: 0;
  158 + &:after {
  159 + content: " ";
  160 + display: block;
  161 + position: absolute;
  162 + top: 0;
  163 + right: 0;
  164 + left: 0;
  165 + bottom: 0;
  166 + float: right;
  167 + border-radius: 5px;
  168 + border: 1px solid rgba(255, 255, 255, 0.1);
  169 + border-bottom: 0;
  170 + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255, 255, 255, 0.15)), to(rgba(0, 0, 0, 0.25))), -webkit-gradient(linear, left top, right bottom, color-stop(0, rgba(255, 255, 255, 0)), color-stop(0.5, rgba(255, 255, 255, 0.1)), color-stop(0.501, rgba(255, 255, 255, 0)), color-stop(1, rgba(255, 255, 255, 0)));
  171 + background: -moz-linear-gradient(top, rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0.25)), -moz-linear-gradient(left top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0));
  172 + background: linear-gradient(top, rgba(255, 255, 255, 0.15), rgba(0, 0, 0, 0.25)), linear-gradient(left top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.1) 50%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0));
  173 + -webkit-background-origin: border-box;
  174 + -moz-background-origin: border;
  175 + background-origin: border-box; } } }
  176 +
  177 + .account-box {
  178 + &.hover {
  179 + height: 138px; }
  180 + &:hover > .account-links {
  181 + display: block; } }
  182 +
  183 + .account-links {
  184 + background: #79C3E0;
  185 + display: none;
  186 + border-radius: 5px;
  187 + width: 100px;
  188 + margin-top: 0;
  189 + float: right;
  190 + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
  191 + position: relative;
  192 + &:before {
  193 + content: ".";
  194 + width: 0;
  195 + height: 0;
  196 + position: absolute;
  197 + border: 5px solid transparent;
  198 + border-color: rgba(255, 255, 255, 0);
  199 + border-bottom-color: #333;
  200 + text-indent: -9999px;
  201 + top: -10px;
  202 + line-height: 0;
  203 + right: 10px;
  204 + z-index: 10; }
  205 + background: #333;
  206 + display: none;
  207 + z-index: 100000;
  208 + border-radius: 5px;
  209 + width: 100px;
  210 + position: absolute;
  211 + right: 20px;
  212 + top: 46px;
  213 + margin-top: 0;
  214 + float: right;
  215 + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
  216 + a {
  217 + color: #EEE;
  218 + padding: 6px 10px;
  219 + display: block;
  220 + text-shadow: none;
  221 + border-bottom: 1px solid #555;
  222 + &:hover {
  223 + background: #444; } } }
  224 +
  225 + .account-box.hover .arrow-up {
  226 + top: 41px;
  227 + right: 6px;
  228 + position: absolute; }
  229 +
  230 + .account-links a {
  231 + &:first-child {
  232 + -webkit-border-top-left-radius: 5px;
  233 + -webkit-border-top-right-radius: 5px;
  234 + -moz-border-radius-topleft: 5px;
  235 + -moz-border-radius-topright: 5px;
  236 + border-top-left-radius: 5px;
  237 + border-top-right-radius: 5px; }
  238 + &:last-child {
  239 + -webkit-border-bottom-right-radius: 5px;
  240 + -webkit-border-bottom-left-radius: 5px;
  241 + -moz-border-radius-bottomright: 5px;
  242 + -moz-border-radius-bottomleft: 5px;
  243 + border-bottom-right-radius: 5px;
  244 + border-bottom-left-radius: 5px;
  245 + border-bottom: 0; } }
  246 +
  247 + }
  248 + /*
  249 + * End of Application Header
  250 + *
  251 + */
  252 +
  253 + /*
  254 + * Main Menu of Application
  255 + *
  256 + */
  257 + nav.main_menu {
  258 + overflow:hidden;
  259 + border-radius: 4px;
  260 + margin: auto;
  261 + margin:30px $app_padding;
  262 + background:#eee;
  263 + border:1px solid #ccc;
  264 + height:38px;
  265 + background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
  266 + background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
  267 + background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
  268 + background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
  269 + @include shade;
  270 + .count {
  271 + color:#aaa;
  272 + margin-left:3px;
  273 + }
  274 + .label {
  275 + background:$hover;
  276 + text-shadow:none;
  277 + color:$style_color;
  278 + }
  279 + a {
  280 + font-weight:bold;
  281 + &:first-child{
  282 + -webkit-border-top-left-radius: 4px;
  283 + -webkit-border-bottom-left-radius: 4px;
  284 + -moz-border-radius-topleft: 4px;
  285 + -moz-border-radius-bottomleft: 4px;
  286 + border-top-left-radius: 4px;
  287 + border-bottom-left-radius: 4px;
  288 + }
  289 + padding: 10px 25px;
  290 + display: inline-block;
  291 + color: $style_color;
  292 + border-right: 1px solid #d5d5d5;
  293 + position: relative;
  294 + box-shadow: 1px 0 0 rgba(255, 255, 255, 0.1);
  295 + margin: 0;
  296 + float:left;
  297 + text-shadow:0 1px 1px white;
  298 + &.home {
  299 + background: url(home_icon.PNG) no-repeat center center;
  300 + text-indent:-9999px;
  301 + min-width:40px;
  302 + img {
  303 + position:relative;
  304 + top:4px;
  305 + }
  306 + }
  307 + &.current {
  308 + background-color:#DDD;
  309 + }
  310 + }
  311 + }
  312 + /*
  313 + * End of Main Menu
  314 + *
  315 + */
  316 +}
... ...
app/controllers/dashboard_controller.rb
... ... @@ -3,7 +3,14 @@ class DashboardController < ApplicationController
3 3  
4 4 def index
5 5 @projects = current_user.projects.all
  6 +
6 7 @active_projects = @projects.select(&:repo_exists?).select(&:last_activity_date_cached).sort_by(&:last_activity_date_cached).reverse
  8 +
  9 + @merge_requests = MergeRequest.where("author_id = :id or assignee_id = :id", :id => current_user.id).opened.order("created_at DESC").limit(10)
  10 +
  11 + @user = current_user
  12 + @issues = current_user.assigned_issues.opened.order("created_at DESC").limit(10)
  13 + @issues = @issues.includes(:author, :project)
7 14 end
8 15  
9 16 # Get authored or assigned open merge requests
... ...
app/views/dashboard/_projects_feed.html.haml
1   -- @active_projects.first(3).each do |project|
2   - = link_to project do
3   - %h4= project.name
4   - - project.updates(3).each do |update|
5   - %a.project-update{:href => dashboard_feed_path(project, update)}
6   - = image_tag gravatar_icon(update.author_email), :class => "avatar", :width => 32
7   - %div
8   - = dashboard_feed_title(update)
9   - %span.update-author
10   - %strong= update.author_name
11   - authored
12   - = time_ago_in_words(update.created_at)
13   - ago
14   - .right
15   - - klass = update.class.to_s.split("::").last.downcase
16   - %span.tag{ :class => klass }= klass
17   -
  1 +- @active_projects.first(5).each do |project|
  2 + .wll
  3 + = link_to project do
  4 + %h4
  5 + = project.name
  6 + %small
  7 + last activity at
  8 + = project.last_activity_date_cached.stamp("Aug 25, 2011")
... ...
app/views/dashboard/index.html.haml
1   -%h3 Activities
2   -%hr
3   -.news-feed= render "dashboard/projects_feed"
  1 +- if current_user.require_ssh_key?
  2 + .alert-message.warning
  3 + %p
  4 + You wont be able to pull/push project code unless you
  5 + = link_to new_key_path, :class => "vlink" do
  6 + add new key
  7 + to your profile
  8 +
  9 +%div.dashboard_category
  10 + %h3
  11 + Projects
  12 + %small
  13 + ( most recent )
  14 +
  15 + %strong.right
  16 + = link_to projects_path do
  17 + Projects list →
  18 + %hr
  19 + .row
  20 + .dashboard_block
  21 + .row
  22 + .span9= render "dashboard/projects_feed"
  23 + .span3.right
  24 + - if current_user.can_create_project?
  25 + .alert-message.block-message.warning
  26 + You can create up to
  27 + = current_user.projects_limit
  28 + projects. Click on link below to add a new one
  29 + .link_holder
  30 + = link_to new_project_path, :class => "" do
  31 + New Project »
  32 +
  33 +
  34 +- unless @merge_requests.blank?
  35 + %div.dashboard_category
  36 + %h3
  37 + Merge Requests
  38 + %small ( authored or assigned to you )
  39 + %strong.right
  40 + = link_to dashboard_merge_requests_path do
  41 + Vist merge requests page →
  42 + %hr
  43 + .row
  44 + .dashboard_block= render "dashboard/merge_requests_feed"
  45 +
  46 +- unless @issues.blank?
  47 + %div.dashboard_category
  48 + %h3
  49 + Issues
  50 + %small ( assigned to you )
  51 + %strong.right
  52 + = link_to dashboard_merge_requests_path do
  53 + Vist issues page →
  54 + %hr
  55 + .row
  56 + .dashboard_block= render "dashboard/issues_feed"
... ...
app/views/dashboard/issues.html.haml
... ... @@ -2,5 +2,5 @@
2 2 Issues
3 3 %small ( assigned to you )
4 4  
5   -%hr
6   -= render "dashboard/issues_feed"
  5 +%br
  6 +.ui-box= render "dashboard/issues_feed"
... ...
app/views/dashboard/merge_requests.html.haml
... ... @@ -2,5 +2,5 @@
2 2 Merge Requests
3 3 %small ( authored or assigned to you )
4 4  
5   -%hr
6   -= render "dashboard/merge_requests_feed"
  5 +%br
  6 +.ui-box= render "dashboard/merge_requests_feed"
... ...
app/views/errors/access_denied.html.haml
... ... @@ -2,4 +2,4 @@
2 2 %h3 Access Denied
3 3 %hr
4 4 %p Youre not allowed to access this page
5   - %p Ream more about project permissions #{link_to "here", help_permissions_path, :class => "vlink"}
  5 + %p Read more about project permissions #{link_to "here", help_permissions_path, :class => "vlink"}
... ...
app/views/layouts/_app_menu.html.haml
1 1 %nav.main_menu
2 2 = render "layouts/const_menu_links"
3   - -#= link_to "Projects", projects_path, :class => "#{"current" if current_page?(projects_path) || current_page?(root_path)}"
  3 + = link_to "Projects", projects_path, :class => "#{"current" if current_page?(projects_path)}"
4 4 = link_to "Issues", dashboard_issues_path, :class => "#{"current" if current_page?(dashboard_issues_path)}", :id => "issues_slide"
5 5 = link_to "Requests", dashboard_merge_requests_path, :class => "#{"current" if current_page?(dashboard_merge_requests_path)}", :id => "merge_requests_slide"
6 6 = link_to "Help", help_path, :class => "#{"current" if controller.controller_name == "help"}"
... ...
app/views/layouts/_const_menu_links.html.haml
1   -= link_to "Home", root_path, :class => "home #{"current" if current_page?(projects_path) || current_page?(root_path)}", :title => "Home"
  1 += link_to "Home", root_path, :class => "home #{"current" if current_page?(dashboard_path) || current_page?(root_path)}", :title => "Home"
... ...
app/views/layouts/_head_panel.html.haml
... ... @@ -5,7 +5,12 @@
5 5 %div.app_logo
6 6 = link_to root_path, :class => "home", :title => "Home" do
7 7 = image_tag "logo_tr.png", :width => 50
8   - %h1 GITLAB
  8 + %h1
  9 + GITLAB
  10 +
  11 + - if current_user.is_admin?
  12 + = link_to admin_projects_path, :class => "admin_link", :title => "Admin area" do
  13 + = image_tag "admin.PNG", :width => 16
9 14  
10 15 %h1.project_name= title
11 16 .search= text_field_tag "search", nil, :placeholder => "Search", :class => "search-input"
... ...
app/views/layouts/application.html.haml
... ... @@ -7,6 +7,4 @@
7 7 .container
8 8 = render :partial => "layouts/app_menu"
9 9 .content
10   - .row
11   - .span12= yield
12   - .sidebar= render "layouts/projects_side"
  10 + = yield
... ...
app/views/projects/_tile.html.haml
1   -- @projects.in_groups_of(2, false) do |projects|
  1 +- @projects.in_groups_of(3, false) do |projects|
2 2 .row
3 3 - projects.each_with_index do |project, i|
4 4 %div.project_tile
... ...
app/views/projects/empty.html.haml
1 1 - if current_user.require_ssh_key?
2 2 .alert-message.block-message.error
3 3 %ul
4   - %li You have no ssh keys added yo tour profile.
  4 + %li You have no ssh keys added to your profile.
5 5 %li You wont be able to pull/push repository.
6 6 %li Visit profile → keys and add public key of every machine you want to use for work with gitlabhq.
7 7  
... ...
app/views/projects/index.html.haml
1 1 %h3
2 2 Projects
3 3 %small= "( #{current_user.projects.count} )"
  4 + - if current_user.can_create_project?
  5 + %span.right
  6 + = link_to new_project_path, :class => "btn small" do
  7 + New Project
4 8 %hr
5 9 - unless @projects.empty?
6 10 %div.content_list= render "tile"
... ...
app/views/protected_branches/index.html.haml
... ... @@ -6,7 +6,7 @@
6 6 %ul
7 7 %li keep stable branches secured
8 8 %li forced code review before merge to protected branches
9   - %p Ream more about project permissions #{link_to "here", help_permissions_path, :class => "vlink"}
  9 + %p Read more about project permissions #{link_to "here", help_permissions_path, :class => "vlink"}
10 10  
11 11  
12 12  
... ...
config/routes.rb
... ... @@ -123,5 +123,5 @@ Gitlab::Application.routes.draw do
123 123 end
124 124 resources :notes, :only => [:index, :create, :destroy]
125 125 end
126   - root :to => "projects#index"
  126 + root :to => "dashboard#index"
127 127 end
... ...