Commit bfe0906f2ff7a79064c1866c0278cd0c9440b246

Authored by Ariejan de Vroom
2 parents 4587ab6f df6f7481

Merge remote-tracking branch 'upstream/master'

Showing 319 changed files with 6876 additions and 5123 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 319 files displayed.

.gitignore
... ... @@ -9,5 +9,10 @@ coverage/*
9 9 *.swp
10 10 public/uploads/
11 11 .rvmrc
  12 +.rbenv-version
12 13 .directory
13 14 nohup.out
  15 +Vagrantfile
  16 +.vagrant
  17 +config/gitlab.yml
  18 +config/database.yml
... ...
.rbenv-version
... ... @@ -1 +0,0 @@
1   -1.9.2-p290
.travis.yml
... ... @@ -4,6 +4,8 @@ branches:
4 4 - 'master'
5 5 rvm: 1.9.2
6 6 before_script:
  7 + - "cp config/database.yml.example config/database.yml"
  8 + - "cp config/gitlab.yml.example config/gitlab.yml"
7 9 - "bundle exec rake db:create RAILS_ENV=test"
8 10 - "bundle exec rake db:migrate RAILS_ENV=test"
9 11 - "bundle exec rake db:seed_fu RAILS_ENV=test"
... ...
Gemfile
1 1 source "http://rubygems.org"
2 2  
3   -gem "rails", "3.1.1"
  3 +gem "rails", "3.2.1"
4 4  
5 5 gem "sqlite3"
6   -gem "rake", "0.9.2.2"
7   -gem "devise", "1.5.0"
  6 +gem "rake"
  7 +gem "devise"
8 8 gem "stamp"
9 9 gem "kaminari"
10 10 gem "haml", "3.1.4"
... ... @@ -16,7 +16,7 @@ gem "carrierwave"
16 16 gem "six"
17 17 gem "therubyracer"
18 18 gem "faker"
19   -gem "seed-fu", "~> 2.1.0"
  19 +gem "seed-fu"
20 20 gem "pygments.rb", "0.2.4"
21 21 gem "thin"
22 22 gem "git"
... ... @@ -24,20 +24,23 @@ gem "acts_as_list"
24 24 gem "rdiscount"
25 25 gem "acts-as-taggable-on", "~> 2.1.0"
26 26 gem "drapper"
27   -gem "resque"
  27 +gem "resque", "~> 1.20.0"
28 28 gem "httparty"
29 29 gem "charlock_holmes"
30 30 gem "foreman"
  31 +gem "omniauth-ldap"
  32 +gem 'bootstrap-sass', "1.4.4"
  33 +gem "colored"
31 34  
32 35 group :assets do
33   - gem "sass-rails", "~> 3.1.0"
34   - gem "coffee-rails", "~> 3.1.0"
35   - gem "uglifier"
  36 + gem "sass-rails", "3.2.3"
  37 + gem "coffee-rails", "3.2.1"
  38 + gem "uglifier", "1.0.3"
36 39 end
37 40  
38 41 group :development do
39 42 gem "letter_opener"
40   - gem "rails-footnotes", "~> 3.7.5"
  43 + gem "rails-footnotes"
41 44 gem "annotate", :git => "https://github.com/ctran/annotate_models.git"
42 45 end
43 46  
... ... @@ -46,9 +49,7 @@ group :development, :test do
46 49 gem "capybara"
47 50 gem "autotest"
48 51 gem "autotest-rails"
49   - unless ENV["CI"]
50   - gem "ruby-debug19", :require => "ruby-debug"
51   - end
  52 + gem "pry"
52 53 gem "awesome_print"
53 54 gem "database_cleaner"
54 55 gem "launchy"
... ... @@ -58,5 +59,5 @@ end
58 59 group :test do
59 60 gem "turn", :require => false
60 61 gem "simplecov", :require => false
61   - gem "shoulda", "~> 3.0.0.beta2"
  62 + gem "shoulda", "3.0.0"
62 63 end
... ...
Gemfile.lock
1 1 GIT
2 2 remote: https://github.com/ctran/annotate_models.git
3   - revision: fb73329243056a6d9a64878e5c543aba9b6417de
  3 + revision: a43c08f0eb4d69a48c6830630ebb60e35ccb2d2d
4 4 specs:
5 5 annotate (2.4.1.beta1)
6 6  
... ... @@ -25,48 +25,48 @@ GEM
25 25 remote: http://rubygems.org/
26 26 specs:
27 27 ZenTest (4.5.0)
28   - actionmailer (3.1.1)
29   - actionpack (= 3.1.1)
30   - mail (~> 2.3.0)
31   - actionpack (3.1.1)
32   - activemodel (= 3.1.1)
33   - activesupport (= 3.1.1)
  28 + actionmailer (3.2.1)
  29 + actionpack (= 3.2.1)
  30 + mail (~> 2.4.0)
  31 + actionpack (3.2.1)
  32 + activemodel (= 3.2.1)
  33 + activesupport (= 3.2.1)
34 34 builder (~> 3.0.0)
35 35 erubis (~> 2.7.0)
36   - i18n (~> 0.6)
37   - rack (~> 1.3.2)
  36 + journey (~> 1.0.1)
  37 + rack (~> 1.4.0)
38 38 rack-cache (~> 1.1)
39   - rack-mount (~> 0.8.2)
40 39 rack-test (~> 0.6.1)
41   - sprockets (~> 2.0.2)
42   - activemodel (3.1.1)
43   - activesupport (= 3.1.1)
  40 + sprockets (~> 2.1.2)
  41 + activemodel (3.2.1)
  42 + activesupport (= 3.2.1)
44 43 builder (~> 3.0.0)
45   - i18n (~> 0.6)
46   - activerecord (3.1.1)
47   - activemodel (= 3.1.1)
48   - activesupport (= 3.1.1)
49   - arel (~> 2.2.1)
  44 + activerecord (3.2.1)
  45 + activemodel (= 3.2.1)
  46 + activesupport (= 3.2.1)
  47 + arel (~> 3.0.0)
50 48 tzinfo (~> 0.3.29)
51   - activeresource (3.1.1)
52   - activemodel (= 3.1.1)
53   - activesupport (= 3.1.1)
54   - activesupport (3.1.1)
  49 + activeresource (3.2.1)
  50 + activemodel (= 3.2.1)
  51 + activesupport (= 3.2.1)
  52 + activesupport (3.2.1)
  53 + i18n (~> 0.6)
55 54 multi_json (~> 1.0)
56 55 acts-as-taggable-on (2.1.1)
57 56 rails
58 57 acts_as_list (0.1.4)
59 58 addressable (2.2.6)
60   - ansi (1.4.1)
61   - archive-tar-minitar (0.5.2)
62   - arel (2.2.1)
  59 + ansi (1.4.2)
  60 + arel (3.0.0)
63 61 autotest (4.4.6)
64 62 ZenTest (>= 4.4.1)
65 63 autotest-rails (4.1.1)
66 64 ZenTest (= 4.5)
67   - awesome_print (0.4.0)
  65 + awesome_print (1.0.2)
68 66 bcrypt-ruby (3.0.1)
69 67 blankslate (2.1.2.4)
  68 + bootstrap-sass (1.4.4)
  69 + sass-rails (~> 3.1)
70 70 builder (3.0.0)
71 71 capybara (1.1.2)
72 72 mime-types (>= 1.16)
... ... @@ -78,19 +78,20 @@ GEM
78 78 carrierwave (0.5.8)
79 79 activesupport (~> 3.0)
80 80 charlock_holmes (0.6.8)
81   - childprocess (0.2.2)
  81 + childprocess (0.3.1)
82 82 ffi (~> 1.0.6)
83   - coffee-rails (3.1.1)
  83 + coderay (1.0.5)
  84 + coffee-rails (3.2.1)
84 85 coffee-script (>= 2.2.0)
85   - railties (~> 3.1.0)
  86 + railties (~> 3.2.0.beta)
86 87 coffee-script (2.2.0)
87 88 coffee-script-source
88 89 execjs
89   - coffee-script-source (1.1.3)
90   - columnize (0.3.4)
  90 + coffee-script-source (1.2.0)
  91 + colored (1.2)
91 92 crack (0.3.1)
92   - daemons (1.1.4)
93   - database_cleaner (0.7.0)
  93 + daemons (1.1.8)
  94 + database_cleaner (0.7.1)
94 95 devise (1.5.0)
95 96 bcrypt-ruby (~> 3.0)
96 97 orm_adapter (~> 0.0.3)
... ... @@ -99,13 +100,13 @@ GEM
99 100 drapper (0.8.4)
100 101 erubis (2.7.0)
101 102 eventmachine (0.12.10)
102   - execjs (1.2.9)
  103 + execjs (1.3.0)
103 104 multi_json (~> 1.0)
104 105 faker (1.0.1)
105 106 i18n (~> 0.4)
106 107 ffi (1.0.11)
107   - foreman (0.27.0)
108   - term-ansicolor (~> 1.0.5)
  108 + foreman (0.39.0)
  109 + term-ansicolor (~> 1.0.7)
109 110 thor (>= 0.13.6)
110 111 git (1.2.5)
111 112 haml (3.1.4)
... ... @@ -115,139 +116,143 @@ GEM
115 116 haml (~> 3.0)
116 117 railties (~> 3.0)
117 118 hashery (1.4.0)
  119 + hashie (1.2.0)
118 120 hike (1.2.1)
119 121 httparty (0.8.1)
120 122 multi_json
121 123 multi_xml
122 124 i18n (0.6.0)
123   - jquery-rails (1.0.17)
124   - railties (~> 3.0)
  125 + journey (1.0.1)
  126 + jquery-rails (2.0.0)
  127 + railties (>= 3.2.0.beta, < 5.0)
125 128 thor (~> 0.14)
126   - json (1.6.1)
127   - json_pure (1.6.1)
128   - kaminari (0.12.4)
129   - rails (>= 3.0.0)
  129 + json (1.6.5)
  130 + kaminari (0.13.0)
  131 + actionpack (>= 3.0.0)
  132 + activesupport (>= 3.0.0)
  133 + railties (>= 3.0.0)
130 134 launchy (2.0.5)
131 135 addressable (~> 2.2.6)
132 136 letter_opener (0.0.2)
133 137 launchy
134 138 libv8 (3.3.10.4)
135   - linecache19 (0.5.12)
136   - ruby_core_source (>= 0.1.4)
137   - mail (2.3.0)
  139 + mail (2.4.1)
138 140 i18n (>= 0.4.0)
139 141 mime-types (~> 1.16)
140 142 treetop (~> 1.4.8)
  143 + method_source (0.7.0)
141 144 mime-types (1.17.2)
142   - multi_json (1.0.3)
  145 + multi_json (1.0.4)
143 146 multi_xml (0.4.1)
  147 + net-ldap (0.2.2)
144 148 nokogiri (1.5.0)
145   - orm_adapter (0.0.5)
  149 + omniauth (1.0.2)
  150 + hashie (~> 1.2)
  151 + rack
  152 + omniauth-ldap (1.0.2)
  153 + net-ldap (~> 0.2.2)
  154 + omniauth (~> 1.0)
  155 + pyu-ruby-sasl (~> 0.0.3.1)
  156 + rubyntlm (~> 0.1.1)
  157 + orm_adapter (0.0.6)
146 158 polyglot (0.3.3)
147 159 posix-spawn (0.3.6)
  160 + pry (0.9.8.2)
  161 + coderay (~> 1.0.5)
  162 + method_source (~> 0.7)
  163 + slop (>= 2.4.4, < 3)
148 164 pygments.rb (0.2.4)
149 165 rubypython (~> 0.5.3)
150   - rack (1.3.5)
  166 + pyu-ruby-sasl (0.0.3.3)
  167 + rack (1.4.1)
151 168 rack-cache (1.1)
152 169 rack (>= 0.4)
153   - rack-mount (0.8.3)
154   - rack (>= 1.0.0)
155   - rack-protection (1.1.4)
  170 + rack-protection (1.2.0)
156 171 rack
157 172 rack-ssl (1.3.2)
158 173 rack
159 174 rack-test (0.6.1)
160 175 rack (>= 1.0)
161   - rails (3.1.1)
162   - actionmailer (= 3.1.1)
163   - actionpack (= 3.1.1)
164   - activerecord (= 3.1.1)
165   - activeresource (= 3.1.1)
166   - activesupport (= 3.1.1)
  176 + rails (3.2.1)
  177 + actionmailer (= 3.2.1)
  178 + actionpack (= 3.2.1)
  179 + activerecord (= 3.2.1)
  180 + activeresource (= 3.2.1)
  181 + activesupport (= 3.2.1)
167 182 bundler (~> 1.0)
168   - railties (= 3.1.1)
  183 + railties (= 3.2.1)
169 184 rails-footnotes (3.7.5)
170 185 rails (>= 3.0.0)
171   - railties (3.1.1)
172   - actionpack (= 3.1.1)
173   - activesupport (= 3.1.1)
  186 + railties (3.2.1)
  187 + actionpack (= 3.2.1)
  188 + activesupport (= 3.2.1)
174 189 rack-ssl (~> 1.3.2)
175 190 rake (>= 0.8.7)
176 191 rdoc (~> 3.4)
177 192 thor (~> 0.14.6)
178 193 rake (0.9.2.2)
179 194 rdiscount (1.6.8)
180   - rdoc (3.11)
  195 + rdoc (3.12)
181 196 json (~> 1.4)
182 197 redis (2.2.2)
183 198 redis-namespace (1.0.3)
184 199 redis (< 3.0.0)
185   - resque (1.19.0)
  200 + resque (1.20.0)
186 201 multi_json (~> 1.0)
187 202 redis-namespace (~> 1.0.2)
188 203 sinatra (>= 0.9.2)
189 204 vegas (~> 0.1.2)
190   - rspec (2.7.0)
191   - rspec-core (~> 2.7.0)
192   - rspec-expectations (~> 2.7.0)
193   - rspec-mocks (~> 2.7.0)
194   - rspec-core (2.7.1)
195   - rspec-expectations (2.7.0)
  205 + rspec (2.8.0)
  206 + rspec-core (~> 2.8.0)
  207 + rspec-expectations (~> 2.8.0)
  208 + rspec-mocks (~> 2.8.0)
  209 + rspec-core (2.8.0)
  210 + rspec-expectations (2.8.0)
196 211 diff-lcs (~> 1.1.2)
197   - rspec-mocks (2.7.0)
198   - rspec-rails (2.7.0)
199   - actionpack (~> 3.0)
200   - activesupport (~> 3.0)
201   - railties (~> 3.0)
202   - rspec (~> 2.7.0)
203   - ruby-debug-base19 (0.11.25)
204   - columnize (>= 0.3.1)
205   - linecache19 (>= 0.5.11)
206   - ruby_core_source (>= 0.1.4)
207   - ruby-debug19 (0.11.6)
208   - columnize (>= 0.3.1)
209   - linecache19 (>= 0.5.11)
210   - ruby-debug-base19 (>= 0.11.19)
211   - ruby_core_source (0.1.5)
212   - archive-tar-minitar (>= 0.5.2)
  212 + rspec-mocks (2.8.0)
  213 + rspec-rails (2.8.1)
  214 + actionpack (>= 3.0)
  215 + activesupport (>= 3.0)
  216 + railties (>= 3.0)
  217 + rspec (~> 2.8.0)
  218 + rubyntlm (0.1.1)
213 219 rubypython (0.5.3)
214 220 blankslate (>= 2.1.2.3)
215 221 ffi (~> 1.0.7)
216   - rubyzip (0.9.4)
217   - sass (3.1.10)
218   - sass-rails (3.1.4)
219   - actionpack (~> 3.1.0)
220   - railties (~> 3.1.0)
221   - sass (>= 3.1.4)
222   - sprockets (~> 2.0.0)
223   - tilt (~> 1.3.2)
224   - seed-fu (2.1.0)
225   - activerecord (~> 3.1.0)
226   - activesupport (~> 3.1.0)
227   - selenium-webdriver (2.12.2)
228   - childprocess (>= 0.2.1)
  222 + rubyzip (0.9.6.1)
  223 + sass (3.1.15)
  224 + sass-rails (3.2.3)
  225 + railties (~> 3.2.0.beta)
  226 + sass (>= 3.1.10)
  227 + tilt (~> 1.3)
  228 + seed-fu (2.2.0)
  229 + activerecord (~> 3.1)
  230 + activesupport (~> 3.1)
  231 + selenium-webdriver (2.19.0)
  232 + childprocess (>= 0.2.5)
229 233 ffi (~> 1.0.9)
230   - json_pure
  234 + multi_json (~> 1.0.4)
231 235 rubyzip
232   - shoulda (3.0.0.beta2)
233   - shoulda-context (~> 1.0.0.beta1)
234   - shoulda-matchers (~> 1.0.0.beta1)
  236 + shoulda (3.0.0)
  237 + shoulda-context (~> 1.0.0)
  238 + shoulda-matchers (~> 1.0.0)
235 239 shoulda-context (1.0.0)
236 240 shoulda-matchers (1.0.0)
237 241 simplecov (0.5.4)
238 242 multi_json (~> 1.0.3)
239 243 simplecov-html (~> 0.5.3)
240 244 simplecov-html (0.5.3)
241   - sinatra (1.3.1)
242   - rack (~> 1.3, >= 1.3.4)
243   - rack-protection (~> 1.1, >= 1.1.2)
  245 + sinatra (1.3.2)
  246 + rack (~> 1.3, >= 1.3.6)
  247 + rack-protection (~> 1.2)
244 248 tilt (~> 1.3, >= 1.3.3)
245 249 six (0.2.0)
246   - sprockets (2.0.3)
  250 + slop (2.4.4)
  251 + sprockets (2.1.2)
247 252 hike (~> 1.2)
248 253 rack (~> 1.0)
249 254 tilt (~> 1.1, != 1.3.0)
250   - sqlite3 (1.3.4)
  255 + sqlite3 (1.3.5)
251 256 stamp (0.1.6)
252 257 term-ansicolor (1.0.7)
253 258 therubyracer (0.9.9)
... ... @@ -261,17 +266,17 @@ GEM
261 266 treetop (1.4.10)
262 267 polyglot
263 268 polyglot (>= 0.3.1)
264   - turn (0.8.3)
  269 + turn (0.9.2)
265 270 ansi
266 271 tzinfo (0.3.31)
267   - uglifier (1.1.0)
  272 + uglifier (1.0.3)
268 273 execjs (>= 0.3.0)
269 274 multi_json (>= 1.0.2)
270   - vegas (0.1.8)
  275 + vegas (0.1.11)
271 276 rack (>= 1.0.0)
272 277 warden (1.1.0)
273 278 rack (>= 1.0)
274   - webmock (1.7.8)
  279 + webmock (1.7.10)
275 280 addressable (~> 2.2, > 2.2.5)
276 281 crack (>= 0.1.7)
277 282 xpath (0.1.4)
... ... @@ -287,12 +292,14 @@ DEPENDENCIES
287 292 autotest
288 293 autotest-rails
289 294 awesome_print
  295 + bootstrap-sass (= 1.4.4)
290 296 capybara
291 297 carrierwave
292 298 charlock_holmes
293   - coffee-rails (~> 3.1.0)
  299 + coffee-rails (= 3.2.1)
  300 + colored
294 301 database_cleaner
295   - devise (= 1.5.0)
  302 + devise
296 303 drapper
297 304 faker
298 305 foreman
... ... @@ -306,17 +313,18 @@ DEPENDENCIES
306 313 kaminari
307 314 launchy
308 315 letter_opener
  316 + omniauth-ldap
  317 + pry
309 318 pygments.rb (= 0.2.4)
310   - rails (= 3.1.1)
311   - rails-footnotes (~> 3.7.5)
312   - rake (= 0.9.2.2)
  319 + rails (= 3.2.1)
  320 + rails-footnotes
  321 + rake
313 322 rdiscount
314   - resque
  323 + resque (~> 1.20.0)
315 324 rspec-rails
316   - ruby-debug19
317   - sass-rails (~> 3.1.0)
318   - seed-fu (~> 2.1.0)
319   - shoulda (~> 3.0.0.beta2)
  325 + sass-rails (= 3.2.3)
  326 + seed-fu
  327 + shoulda (= 3.0.0)
320 328 simplecov
321 329 six
322 330 sqlite3
... ... @@ -324,5 +332,5 @@ DEPENDENCIES
324 332 therubyracer
325 333 thin
326 334 turn
327   - uglifier
  335 + uglifier (= 1.0.3)
328 336 webmock
... ...
Procfile.production
1 1 web: bundle exec rails s -p $PORT -e production
2   -worker: bundle exec rake environment resque:work RAILS_ENV=production QUEUE=* VVERBOSE=1
  2 +worker: bundle exec rake environment resque:work RAILS_ENV=production QUEUE=*
... ...
VERSION
1   -2.1.0
  1 +2.2.0
... ...
app/assets/images/Gear-UI.PNG

940 Bytes

app/assets/images/Home-UI.PNG

782 Bytes

app/assets/images/Info-UI.PNG

800 Bytes | W: | H:

801 Bytes | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/images/admin.PNG 0 → 100644

556 Bytes

app/assets/images/blueprint_add.png

518 Bytes | W: | H:

177 Bytes | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/images/blueprint_delete.png

469 Bytes | W: | H:

295 Bytes | W: | H:

  • 2-up
  • Swipe
  • Onion skin
app/assets/images/comment_add.png 0 → 100644

1.16 KB

app/assets/images/help_commit.png

95.7 KB

app/assets/images/help_merge_request.png

54.5 KB

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

596 Bytes

app/assets/images/logo_tr.png 0 → 100644

7.71 KB

app/assets/images/submodule.png 0 → 100644

641 Bytes

app/assets/javascripts/application.js
... ... @@ -10,6 +10,8 @@
10 10 //= require jquery.ui.selectmenu
11 11 //= require jquery.tagify
12 12 //= require jquery.cookie
  13 +//= require jquery.endless-scroll
  14 +//= require bootstrap-modal
13 15 //= require modernizr
14 16 //= require chosen
15 17 //= require raphael
... ... @@ -21,9 +23,6 @@ $(document).ready(function(){
21 23 $(this).select();
22 24 });
23 25  
24   - $('select#branch').selectmenu({style:'popup', width:200});
25   - $('select#tag').selectmenu({style:'popup', width:200});
26   -
27 26 $(".account-box").mouseenter(showMenu);
28 27 $(".account-box").mouseleave(resetMenu);
29 28  
... ... @@ -43,6 +42,9 @@ $(document).ready(function(){
43 42 }
44 43 });
45 44  
  45 + /**
  46 + * Focus search field by pressing 's' key
  47 + */
46 48 $(document).keypress(function(e) {
47 49 if( $(e.target).is(":input") ) return;
48 50 switch(e.which) {
... ... @@ -50,27 +52,12 @@ $(document).ready(function(){
50 52 e.preventDefault();
51 53 }
52 54 });
53   -
54 55 });
55 56  
56 57 function focusSearch() {
57 58 $("#search").focus();
58 59 }
59 60  
60   -function taggifyForm(){
61   - var tag_field = $('#tag_field').tagify();
62   -
63   - tag_field.tagify('inputField').autocomplete({
64   - source: '/tags.json'
65   - });
66   -
67   - $('form').submit( function() {
68   - var tag_field = $('#tag_field')
69   - tag_field.val( tag_field.tagify('serialize') );
70   - return true;
71   - });
72   -}
73   -
74 61 function updatePage(data){
75 62 $.ajax({type: "GET", url: location.href, data: data, dataType: "script"});
76 63 }
... ... @@ -82,5 +69,3 @@ function showMenu() {
82 69 function resetMenu() {
83 70 $(this).removeClass("hover");
84 71 }
85   -
86   -
... ...
app/assets/javascripts/commits.js
... ... @@ -2,6 +2,7 @@ var CommitsList = {
2 2 ref:null,
3 3 limit:0,
4 4 offset:0,
  5 + disable:false,
5 6  
6 7 init:
7 8 function(ref, limit) {
... ... @@ -36,15 +37,21 @@ var CommitsList = {
36 37 $("#commits_list").append(html);
37 38 if(count > 0) {
38 39 this.offset += count;
39   - this.initLoadMore();
  40 + } else {
  41 + this.disable = true;
40 42 }
41 43 },
42 44  
43 45 initLoadMore:
44 46 function() {
45   - $(window).bind('scroll', function(){
46   - if($(window).scrollTop() == $(document).height() - $(window).height()){
47   - $(window).unbind('scroll');
  47 + $(document).endlessScroll({
  48 + bottomPixels: 400,
  49 + fireDelay: 1000,
  50 + fireOnce:true,
  51 + ceaseFire: function() {
  52 + return CommitsList.disable;
  53 + },
  54 + callback: function(i) {
48 55 CommitsList.getOld();
49 56 }
50 57 });
... ...
app/assets/javascripts/issues.js
1 1 function switchToNewIssue(form){
2   - $("#issues-table-holder").hide("slide", { direction: "left" }, 150, function(){
3   - $(".project-content").append(form);
  2 + $(".issues_content").hide("fade", { direction: "left" }, 150, function(){
  3 + $(".issues_content").after(form);
4 4 $('select#issue_assignee_id').chosen();
5   - $("#new_issue_dialog").show("slide", { direction: "right" }, 150);
  5 + $("#new_issue_dialog").show("fade", { direction: "right" }, 150);
  6 + $('.top-tabs .add_new').hide();
6 7 });
7 8 }
8 9  
9 10 function switchToEditIssue(form){
10   - $("#issues-table-holder").hide("slide", { direction: "left" }, 150, function(){
11   - $(".project-content").append(form);
  11 + $(".issues_content").hide("fade", { direction: "left" }, 150, function(){
  12 + $(".issues_content").after(form);
12 13 $('select#issue_assignee_id').chosen();
13   - $("#edit_issue_dialog").show("slide", { direction: "right" }, 150);
  14 + $("#edit_issue_dialog").show("fade", { direction: "right" }, 150);
  15 + $('.add_new').hide();
14 16 });
15 17 }
16 18  
... ... @@ -23,10 +25,11 @@ function switchFromEditIssue(){
23 25 }
24 26  
25 27 function backToIssues(){
26   - $("#edit_issue_dialog, #new_issue_dialog").hide("slide", { direction: "right" }, 150, function(){
27   - $("#issues-table-holder").show("slide", { direction: "left" }, 150, function() {
  28 + $("#edit_issue_dialog, #new_issue_dialog").hide("fade", { direction: "right" }, 150, function(){
  29 + $(".issues_content").show("fade", { direction: "left" }, 150, function() {
28 30 $("#edit_issue_dialog").remove();
29 31 $("#new_issue_dialog").remove();
  32 + $('.add_new').show();
30 33 });
31 34 });
32 35 }
... ...
app/assets/javascripts/merge_requests.js
... ... @@ -4,46 +4,27 @@ var MergeRequest = {
4 4  
5 5 init:
6 6 function() {
7   - $(".merge-tabs a").live("click", function() {
8   - $(".merge-tabs a").removeClass("active");
9   - $(this).addClass("active");
  7 + $(".tabs a").live("click", function() {
  8 + $(".tabs a").parent().removeClass("active");
  9 + $(this).parent().addClass("active");
10 10 });
11 11  
12   - $(".merge-tabs a.merge-notes-tab").live("click", function() {
13   - $(".merge-request-commits, .merge-request-diffs").hide();
  12 + $(".tabs a.merge-notes-tab").live("click", function(e) {
  13 + $(".merge-request-diffs").hide();
14 14 $(".merge-request-notes").show();
  15 + e.preventDefault();
15 16 });
16 17  
17   - $(".merge-tabs a.merge-commits-tab").live("click", function() {
18   - if(!MergeRequest.commits_loaded) {
19   - MergeRequest.loadCommits();
20   - }
21   - $(".merge-request-notes, .merge-request-diffs").hide();
22   - $(".merge-request-commits").show();
23   - });
24   -
25   - $(".merge-tabs a.merge-diffs-tab").live("click", function() {
  18 + $(".tabs a.merge-diffs-tab").live("click", function(e) {
26 19 if(!MergeRequest.diffs_loaded) {
27 20 MergeRequest.loadDiff();
28 21 }
29   - $(".merge-request-notes, .merge-request-commits").hide();
  22 + $(".merge-request-notes").hide();
30 23 $(".merge-request-diffs").show();
  24 + e.preventDefault();
31 25 });
32 26 },
33 27  
34   - loadCommits:
35   - function() {
36   - $(".dashboard-loader").show();
37   - $.ajax({
38   - type: "GET",
39   - url: $(".merge-commits-tab").attr("data-url"),
40   - complete: function(){
41   - MergeRequest.commits_loaded = true;
42   - $(".merge-request-notes, .merge-request-diffs").hide();
43   - $(".dashboard-loader").hide()},
44   - dataType: "script"});
45   - },
46   -
47 28 loadDiff:
48 29 function() {
49 30 $(".dashboard-loader").show();
... ... @@ -52,7 +33,7 @@ var MergeRequest = {
52 33 url: $(".merge-diffs-tab").attr("data-url"),
53 34 complete: function(){
54 35 MergeRequest.diffs_loaded = true;
55   - $(".merge-request-notes, .merge-request-commits").hide();
  36 + $(".merge-request-notes").hide();
56 37 $(".dashboard-loader").hide()},
57 38 dataType: "script"});
58 39 }
... ...
app/assets/javascripts/note.js
1 1 var NoteList = {
2 2  
  3 +notes_path: null,
  4 +target_params: null,
  5 +target_id: 0,
  6 +target_type: null,
3 7 first_id: 0,
4 8 last_id: 0,
5   -resource_name: null,
  9 +disable:false,
6 10  
7 11 init:
8   - function(resource_name, first_id, last_id) {
9   - this.resource_name = resource_name;
10   - this.first_id = first_id;
11   - this.last_id = last_id;
  12 + function(tid, tt, path) {
  13 + this.notes_path = path + ".js";
  14 + this.target_id = tid;
  15 + this.target_type = tt;
  16 + this.target_params = "&target_type=" + this.target_type + "&target_id=" + this.target_id;
  17 +
  18 + // get notes
  19 + this.getContent();
  20 +
  21 + // get new notes every n seconds
12 22 this.initRefresh();
13   - this.initLoadMore();
14   - },
15 23  
16   -getOld:
17   - function() {
18   - $('.loading').show();
19   - $.ajax({
20   - type: "GET",
21   - url: location.href,
22   - data: "first_id=" + this.first_id,
23   - complete: function(){ $('.loading').hide()},
24   - dataType: "script"});
  24 + $('.delete-note').live('ajax:success', function() {
  25 + $(this).closest('li').fadeOut(); });
  26 +
  27 + $("#new_note").live("ajax:before", function(){
  28 + $("#submit_note").attr("disabled", "disabled");
  29 + })
  30 +
  31 + $("#new_note").live("ajax:complete", function(){
  32 + $("#submit_note").removeAttr("disabled");
  33 + })
  34 +
  35 + $("#note_note").live("click", function(){
  36 + $(this).css("height", "100px");
  37 + $('.attach_holder').show();
  38 + });
  39 +
25 40 },
26 41  
27   -append:
28   - function(id, html) {
29   - this.first_id = id;
30   - $("#notes-list").append(html);
31   - this.initLoadMore();
  42 +
  43 +/**
  44 + * Load new notes to fresh list called 'new_notes_list':
  45 + * - Replace 'new_notes_list' with new list every n seconds
  46 + * - Append new notes to this list after submit
  47 + */
  48 +
  49 +initRefresh:
  50 + function() {
  51 + // init timer
  52 + var intNew = setInterval("NoteList.getNew()", 10000);
32 53 },
33 54  
34 55 replace:
35   - function(fid, lid, html) {
36   - this.first_id = fid;
37   - this.last_id = lid;
38   - $("#notes-list").html(html);
39   - this.initLoadMore();
  56 + function(html) {
  57 + $("#new_notes_list").html(html);
40 58 },
41 59  
42 60 prepend:
43 61 function(id, html) {
44 62 if(id != this.last_id) {
45   - this.last_id = id;
46   - $("#notes-list").prepend(html);
  63 + $("#new_notes_list").prepend(html);
47 64 }
48 65 },
49 66  
... ... @@ -52,8 +69,8 @@ getNew:
52 69 // refersh notes list
53 70 $.ajax({
54 71 type: "GET",
55   - url: location.href,
56   - data: "last_id=" + this.last_id,
  72 + url: this.notes_path,
  73 + data: "last_id=" + this.last_id + this.target_params,
57 74 dataType: "script"});
58 75 },
59 76  
... ... @@ -62,25 +79,85 @@ refresh:
62 79 // refersh notes list
63 80 $.ajax({
64 81 type: "GET",
65   - url: location.href,
66   - data: "first_id=" + this.first_id + "&last_id=" + this.last_id,
  82 + url: this.notes_path,
  83 + data: "first_id=" + this.first_id + "&last_id=" + this.last_id + this.target_params,
67 84 dataType: "script"});
68 85 },
69 86  
70   -initRefresh:
  87 +
  88 +/**
  89 + * Init load of notes:
  90 + * 1. Get content with ajax call
  91 + * 2. Set content of notes list with loaded one
  92 + */
  93 +
  94 +
  95 +getContent:
  96 + function() {
  97 + $.ajax({
  98 + type: "GET",
  99 + url: this.notes_path,
  100 + data: "?" + this.target_params,
  101 + complete: function(){ $('.status').removeClass("loading")},
  102 + beforeSend: function() { $('.status').addClass("loading") },
  103 + dataType: "script"});
  104 + },
  105 +
  106 +setContent:
  107 + function(fid, lid, html) {
  108 + this.last_id = lid;
  109 + this.first_id = fid;
  110 + $("#notes-list").html(html);
  111 +
  112 + // Init infinite scrolling
  113 + this.initLoadMore();
  114 + },
  115 +
  116 +
  117 +/**
  118 + * Paging for old notes when scroll to bottom:
  119 + * 1. Init scroll events with 'initLoadMore'
  120 + * 2. Load onlder notes with 'getOld' method
  121 + * 3. append old notes to bottom of list with 'append'
  122 + *
  123 + */
  124 +
  125 +
  126 +getOld:
71 127 function() {
72   - // init timer
73   - var intNew = setInterval("NoteList.getNew()", 15000);
74   - var intRefresh = setInterval("NoteList.refresh()", 90000);
  128 + $('.loading').show();
  129 + $.ajax({
  130 + type: "GET",
  131 + url: this.notes_path,
  132 + data: "first_id=" + this.first_id + this.target_params,
  133 + complete: function(){ $('.status').removeClass("loading")},
  134 + beforeSend: function() { $('.status').addClass("loading") },
  135 + dataType: "script"});
  136 + },
  137 +
  138 +append:
  139 + function(id, html) {
  140 + if(this.first_id == id) {
  141 + this.disable = true;
  142 + } else {
  143 + this.first_id = id;
  144 + $("#notes-list").append(html);
  145 + }
75 146 },
76 147  
  148 +
77 149 initLoadMore:
78 150 function() {
79   - $(window).bind('scroll', function(){
80   - if($(window).scrollTop() == $(document).height() - $(window).height()){
81   - $(window).unbind('scroll');
  151 + $(document).endlessScroll({
  152 + bottomPixels: 400,
  153 + fireDelay: 1000,
  154 + fireOnce:true,
  155 + ceaseFire: function() {
  156 + return NoteList.disable;
  157 + },
  158 + callback: function(i) {
82 159 NoteList.getOld();
83 160 }
84   - });
  161 + });
85 162 }
86 163 }
... ...
app/assets/javascripts/pager.js 0 → 100644
... ... @@ -0,0 +1,50 @@
  1 +var Pager = {
  2 + limit:0,
  3 + offset:0,
  4 + disable:false,
  5 +
  6 + init:
  7 + function(limit) {
  8 + this.limit=limit;
  9 + this.offset=limit;
  10 + this.initLoadMore();
  11 + $('.loading').show();
  12 + },
  13 +
  14 + getOld:
  15 + function() {
  16 + $('.loading').show();
  17 + $.ajax({
  18 + type: "GET",
  19 + url: location.href,
  20 + data: "limit=" + this.limit + "&offset=" + this.offset,
  21 + complete: function(){ $('.loading').hide()},
  22 + dataType: "script"});
  23 + },
  24 +
  25 + append:
  26 + function(count, html) {
  27 + $(".content_list").append(html);
  28 + if(count > 0) {
  29 + this.offset += count;
  30 + } else {
  31 + this.disable = true;
  32 + }
  33 + },
  34 +
  35 + initLoadMore:
  36 + function() {
  37 + $(document).endlessScroll({
  38 + bottomPixels: 400,
  39 + fireDelay: 1000,
  40 + fireOnce:true,
  41 + ceaseFire: function() {
  42 + return Pager.disable;
  43 + },
  44 + callback: function(i) {
  45 + $('.loading').show();
  46 + Pager.getOld();
  47 + }
  48 + });
  49 + }
  50 +}
... ...
app/assets/javascripts/projects.js
... ... @@ -1,42 +0,0 @@
1   -var ProjectsList = {
2   - limit:0,
3   - offset:0,
4   -
5   - init:
6   - function(limit) {
7   - this.limit=limit;
8   - this.offset=limit;
9   - this.initLoadMore();
10   - },
11   -
12   - getOld:
13   - function() {
14   - $('.loading').show();
15   - $.ajax({
16   - type: "GET",
17   - url: location.href,
18   - data: "limit=" + this.limit + "&offset=" + this.offset,
19   - complete: function(){ $('.loading').hide()},
20   - dataType: "script"});
21   - },
22   -
23   - append:
24   - function(count, html) {
25   - $(".tile").append(html);
26   - if(count > 0) {
27   - this.offset += count;
28   - this.initLoadMore();
29   - }
30   - },
31   -
32   - initLoadMore:
33   - function() {
34   - $(window).bind('scroll', function(){
35   - if($(window).scrollTop() == $(document).height() - $(window).height()){
36   - $(window).unbind('scroll');
37   - $('.loading').show();
38   - ProjectsList.getOld();
39   - }
40   - });
41   - }
42   -}
app/assets/javascripts/team.js
1 1 function backToMembers(){
2   - $("#team_member_new").hide("slide", { direction: "right" }, 150, function(){
  2 + $("#new_team_member").hide("slide", { direction: "right" }, 150, function(){
3 3 $("#team-table").show("slide", { direction: "left" }, 150, function() {
4   - $("#team_member_new").remove();
  4 + $("#new_team_member").remove();
5 5 $(".add_new").show();
6 6 });
7 7 });
... ...
app/assets/javascripts/tree.js
... ... @@ -5,21 +5,24 @@
5 5 var Tree = {
6 6 init:
7 7 function() {
8   - (new Image).src = "ajax-loader-facebook.gif";
9   -
10   - $('#tree-slider td.tree-item-file-name a, #tree-breadcrumbs a').live("click", function() {
11   - history.pushState({ path: this.path }, '', this.href)
  8 + $('#tree-slider .tree-item-file-name a, .breadcrumb li > a').live("click", function() {
12 9 $("#tree-content-holder").hide("slide", { direction: "left" }, 150)
13 10 })
14 11  
15   - $("#tree-slider tr.tree-item").live('click', function(e){
  12 + $('.project-refs-form').live({
  13 + "ajax:beforeSend": function() {
  14 + $("#tree-content-holder").hide("slide", { direction: "left" }, 150);
  15 + }
  16 + })
  17 +
  18 + $("#tree-slider .tree-item").live('click', function(e){
16 19 if(e.target.nodeName != "A") {
17   - link = $(this).find("td.tree-item-file-name a");
  20 + link = $(this).find(".tree-item-file-name a");
18 21 link.trigger("click");
19 22 }
20 23 });
21 24  
22   - $('#tree-slider td.tree-item-file-name a, #tree-breadcrumbs a').live({
  25 + $('#tree-slider .tree-item-file-name a, .breadcrumb a, .project-refs-form').live({
23 26 "ajax:beforeSend": function() { $('.tree_progress').addClass("loading"); },
24 27 "ajax:complete": function() { $('.tree_progress').removeClass("loading"); }
25 28 });
... ...
app/assets/stylesheets/application.css
... ... @@ -7,5 +7,5 @@
7 7 *= require jquery-ui/jquery.tagify
8 8 *= require chosen
9 9 *= require_self
10   - *= require common
  10 + *= require main
11 11 */
... ...
app/assets/stylesheets/commits.css.scss
... ... @@ -1,191 +0,0 @@
1   -/* Commit Page */
2   -body.project-page.commits-page .commit-info{float: right;}
3   -body.project-page.commits-page .commit-info data{
4   - padding: 4px 10px;
5   - font-size: 11px;
6   -}
7   -body.project-page.commits-page .commit-info data.commit-button{
8   - background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.192, #fff), to(#f4f4f4));
9   - background-image: -webkit-linear-gradient(#fff 19.2%, #f4f4f4);
10   - background-image: -moz-linear-gradient(#fff 19.2%, #f4f4f4);
11   - background-image: -o-linear-gradient(#fff 19.2%, #f4f4f4);
12   - box-shadow: 0 -1px 0 white inset;
13   - display: block;
14   - border: 1px solid #eee;
15   - border-radius: 5px;
16   - margin-bottom: 2px;
17   - position: relative;
18   - padding-right: 20px;
19   -}
20   -
21   -body.project-page.commits-page .commit-button i{
22   - background: url('images.png') no-repeat -138px -27px;
23   - width: 6px;
24   - height: 9px;
25   - float: right;
26   - position: absolute;
27   - top: 6px;
28   - right: 5px;
29   -}
30   -body.project-page.commits-page .commits-date {display: block; width: 100%; margin-bottom: 20px}
31   -body.project-page.commits-page .commits-date .data {padding: 0}
32   -body.project-page.commits-page a.commit{padding: 10px; border-bottom: 1px solid #eee; overflow: hidden; display: block;}
33   -body.project-page.commits-page .commits-date a.commit {padding: 10px; border-bottom: none; overflow: hidden; display: block;}
34   -body.project-page.commits-page .commits-date a.commit:last-child{border-bottom: 0}
35   -body.project-page.commits-page .commits-date a.commit img{float: left; margin-right: 10px;}
36   -body.project-page.commits-page .commits-date a.commit span.commit-title{display: block;}
37   -body.project-page.commits-page .commits-date a.commit span.commit-title{margin-bottom: 10px}
38   -body.project-page.commits-page .commits-date a.commit span.commit-author{color: #999; font-weight: normal; font-style: italic;}
39   -body.project-page.commits-page .commits-date a.commit span.commit-author strong{font-weight: bold; font-style: normal;}
40   -
41   -/* eo Commit Page */
42   -/** Commit diff view **/
43   -.diff_file {
44   - border:1px solid #CCC;
45   - margin-bottom:1em;
46   -
47   - .diff_file_header {
48   - padding:5px 5px;
49   - border-bottom:1px solid #CCC;
50   - background: #eee;
51   - }
52   - .diff_file_content {
53   - overflow:auto;
54   - overflow-y:hidden;
55   - background:#fff;
56   - color:#333;
57   - font-size: 12px;
58   - font-family: 'Courier New', 'andale mono','lucida console',monospace;
59   - }
60   - .diff_file_content_image {
61   - background:#eee;
62   - text-align:center;
63   - img {
64   - padding:100px;
65   - max-width:300px;
66   - }
67   - }
68   -}
69   -
70   -.diff_file_content{
71   - table {
72   - border:none;
73   - margin:0px;
74   - padding:0px;
75   - }
76   - .old_line, .new_line {
77   - margin:0px;
78   - padding:0px;
79   - border:none;
80   - background:#F7F7F7;
81   - color:#aaa;
82   - padding: 0px 5px;
83   - border-right: 1px solid #ccc;
84   - text-align:right;
85   - min-width:35px;
86   - max-width:35px;
87   - width:35px;
88   - a {
89   - float:left;
90   - width:35px;
91   - font-weight:normal;
92   - color:#aaa;
93   - &:hover {
94   - text-decoration:underline;
95   - }
96   - }
97   - }
98   - .line_content {
99   - white-space:pre;
100   - height:14px;
101   - margin:0px;
102   - padding:0px;
103   - border:none;
104   - &.new {
105   - background: #DFD;
106   - }
107   - &.old {
108   - background: #FDD;
109   - }
110   - }
111   -}
112   -
113   -pre.commit_message {
114   - white-space: pre-wrap;
115   - font-family: "Helvetica", sans-serif;
116   - color: #555;
117   - font-weight:bold;
118   - font-size:15px;
119   -}
120   -
121   -/** COMMIT BLOCK **/
122   -.commit-title{display: block;}
123   -.commit-title{margin-bottom: 10px}
124   -.commit-author{color: #999; font-weight: normal; font-style: italic;}
125   -.commit-author strong{font-weight: bold; font-style: normal;}
126   -
127   -/** bordered list **/
128   -ul.bordered-list {
129   - margin:5px 0px;
130   - padding:0px;
131   - li {
132   - padding: 5px 0;
133   - border-bottom: 1px solid #EEE;
134   - overflow: hidden;
135   - display: block;
136   - margin:0px;
137   - }
138   -}
139   -
140   -ul.bordered-list li:last-child { border:none }
141   -
142   -.line_holder {
143   - &:hover {
144   - td {
145   - background: #FFFFCF !important;
146   - }
147   - }
148   -}
149   -
150   -.per_line_form {
151   - font-family: "Helvetica", sans-serif;
152   - background: #2FA0BB;
153   -
154   - td {
155   - padding:0;
156   - }
157   -
158   - form {
159   - margin:5px;
160   - width: 756px;
161   - border: 1px solid #CCC;
162   - padding: 20px;
163   - background: white;
164   - }
165   -}
166   -
167   -
168   -tr.line_notes_row {
169   - font-family: "Helvetica", sans-serif;
170   - &:hover {
171   - background:none;
172   - }
173   - td {
174   - margin:0px;
175   - padding:0px;
176   - border-bottom:1px solid #DEE2E3;
177   -
178   -
179   - ul {
180   - display:block;
181   - list-style:none;
182   - margin:0px;
183   - padding:0px;
184   -
185   - li {
186   - border-top:1px solid #DEE2E3;
187   - padding:10px;
188   - }
189   - }
190   - }
191   -}
app/assets/stylesheets/common.scss
1   -$text_color:#222;
2   -$lite_text_color: #666;
3   -$link_color:#111;
4   -$active_link_color:#2FA0BB;
5   -$active_bg_color:#79C3E0;
6   -$active_bd_color: #2FA0BB;
7   -$border_color:#CCC;
8   -$lite_border_color:#EEE;
9   -$app_width:980px;
10   -$app_padding:20px;
11   -$bg_color: #FFF;
12   -$styled_border_color: #2FA0BB;
13   -
14   -/** MIXINS **/
15   -@mixin round-borders-bottom($radius) {
16   - border-top: 1px solid #eaeaea;
17   - -moz-border-radius-bottomright: $radius;
18   - -moz-border-radius-bottomleft: $radius;
19   - border-bottom-right-radius: $radius;
20   - border-bottom-left-radius: $radius;
21   - -webkit-border-bottom-left-radius: $radius;
22   - -webkit-border-bottom-right-radius: $radius;
23   -}
24   -
25   -@mixin round-borders-top($radius) {
26   - border-top: 1px solid #eaeaea;
27   - -moz-border-radius-topright: $radius;
28   - -moz-border-radius-topleft: $radius;
29   - border-top-right-radius: $radius;
30   - border-top-left-radius: $radius;
31   - -webkit-border-top-left-radius: $radius;
32   - -webkit-border-top-right-radius: $radius;
33   -}
34   -
35   -@mixin round-borders-all($radius) {
36   - border: 1px solid #eaeaea;
37   - -moz-border-radius: $radius;
38   - -webkit-border-radius: $radius;
39   - border-radius: $radius;
  1 +a {
  2 + color: $link_color;
  3 + &:hover {
  4 + text-decoration:none;
  5 + color: $style_color;
  6 + }
  7 +
  8 + &.btn {
  9 + color: $style_color;
  10 + }
  11 +}
  12 +
  13 +.vlink {
  14 + color: $link_color !important;
  15 +}
  16 +
  17 +.pills a:hover {
  18 + background-color:#ccc;
  19 +}
  20 +
  21 +.pills .active a {
  22 + background-color: #aaa;
  23 +}
  24 +
  25 +.label {
  26 + background-color: #474D57;
  27 +}
  28 +
  29 +.tabs > li > a, .pills > li > a {
  30 + color:$style_color;
  31 +}
  32 +
  33 +.diff_file_header a,
  34 +.file_stats a {
  35 + color:$style_color;
40 36 }
41 37  
42 38 /** COLORS **/
43 39 .cgray { color:gray; }
44 40 .cred { color:#D12F19; }
45 41 .cgreen { color:#44aa22; }
  42 +.cblack { color:#111; }
  43 +.cwhite { color:#fff !important }
46 44  
47 45 /** COMMON STYLES **/
48 46 .left {
49 47 float:left;
50 48 }
51 49 .right {
52   - float:right;
  50 + float:right !important;
53 51 }
54 52 .width-50p{
55 53 width:50%;
... ... @@ -78,38 +76,559 @@ $styled_border_color: #2FA0BB;
78 76 .no-borders {
79 77 border:none;
80 78 }
  79 +table.no-borders {
  80 + border:none;
  81 + tr, td { border:none }
  82 +}
81 83 .no-padding {
82 84 padding:0 !important;
83 85 }
  86 +.underlined {
  87 + border-bottom: 1px solid $border_color;
  88 +}
84 89  
85   -/* General */
  90 +/** LAYOUT **/
86 91  
87   -body.collapsed {
88   - background-color: $bg_color;
  92 +.container {
  93 + width:$min_app_width;
  94 + padding-top:0;
  95 + z-index:5;
  96 +}
89 97  
90   - #container{
91   - margin: auto;
92   - margin-top:51px;
93   - width: $app_width;
94   - border-top: 0;
95   - background-color: $bg_color;
  98 +.container .content {
  99 + margin:0 $app_padding;
  100 +}
  101 +
  102 +.container .sidebar {
  103 + width: 200px;
  104 + height:100%;
  105 + min-height:450px;
  106 + float:right;
  107 +}
  108 +
  109 +img.avatar {
  110 + float:left;
  111 + margin-right:15px;
  112 + width:40px;
  113 + -webkit-border-radius: 4px;
  114 + -moz-border-radius: 4px;
  115 + border-radius: 4px;
  116 +}
  117 +
  118 +img.lil_av {
  119 + padding-left: 5px;
  120 + position: relative;
  121 + top: 3px;
  122 +}
  123 +
  124 +.media-grid {
  125 + h3, h2 , h4 {
  126 + &.media_h {
  127 + padding-left:10px;
  128 + float:left;
  129 + }
96 130 }
97 131 }
98 132  
99   -a {
  133 +.wll {
  134 + background-color: #FFF;
  135 + padding: 10px 5px;
  136 + min-height: 20px;
  137 + border-bottom: 1px solid #eee;
  138 + border-bottom: 1px solid rgba(0, 0, 0, 0.05);
  139 + cursor:pointer;
  140 + &:hover {
  141 + background:$hover;
  142 + }
  143 + &:last-child { border:none }
  144 + p { padding-top:5px; margin:0; color:$style_color;}
  145 + .author { color: #999; }
  146 + p {
  147 + color:#222;
  148 + margin-bottom: 0;
  149 + img {
  150 + position:relative;
  151 + top:3px;
  152 + }
  153 + }
  154 +}
  155 +
  156 +.visible_link,
  157 +.author_link {
100 158 color: $link_color;
101 159 }
  160 +.entry {
  161 + position: relative;
  162 + padding: 7px 15px;
  163 + margin-bottom: 18px;
  164 + color: #404040;
  165 + filter:none;
  166 +
  167 + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
  168 + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
  169 +
  170 + -webkit-border-radius: 4px;
  171 + -moz-border-radius: 4px;
  172 + border-radius: 4px;
  173 +
  174 + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
  175 + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
  176 + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
  177 +
  178 + background:#F1F1F1;
  179 + border: 1px solid #ccc;
  180 +
  181 +
  182 + p {
  183 + color:$style_color;
  184 + margin-bottom: 0;
  185 + img {
  186 + position:relative;
  187 + top:3px;
  188 + }
  189 + }
  190 +}
  191 +
  192 +.widget {
  193 + @include shade;
  194 + padding:20px;
  195 + margin-bottom:20px;
  196 + border: 1px solid #DDD;
  197 + border-radius: 5px;
  198 + background:#fafafa;
  199 +
  200 + .link_holder {
  201 + background:#eee;
  202 + position:relative;
  203 + left:-20px;
  204 + top:20px;
  205 + padding:10px 20px;
  206 + width:100%;
  207 + border-top:1px solid #ccc;
  208 +
  209 + a {
  210 + font-size:14px;
  211 + color:#666;
  212 + }
  213 + }
  214 +}
  215 +
  216 +
  217 +.ui-box {
  218 + margin-bottom: 40px;
  219 + @include round-borders-all(4px);
  220 + @include shade;
  221 + border-color:#ddd;
  222 +
  223 + ul {
  224 + margin:0;
  225 + }
  226 +
  227 + h5, .title {
  228 + padding: 0 10px;
  229 + background:#f5f5f5;
  230 + border-bottom: 1px solid #eee;
  231 + @include round-borders-top(4px);
  232 + border-top:none;
  233 +
  234 + form {
  235 + padding-top:16px;
  236 + }
  237 + }
  238 +
  239 + .row_title {
  240 + font-weight:bold;
  241 + color:#444;
  242 + &:hover {
  243 + text-decoration:underline;
  244 + }
  245 + }
  246 +
  247 + li, .wll {
  248 + padding:10px;
  249 + &:first-child {
  250 + @include round-borders-top(4px);
  251 + border-top:none;
  252 + }
  253 +
  254 + &:last-child {
  255 + @include round-borders-bottom(4px);
  256 + border:none;
  257 + }
  258 + }
  259 +
  260 +}
  261 +
  262 +.help li { color:#111 }
  263 +
  264 +.back_link {
  265 + text-decoration:underline;
  266 + font-size:14px;
  267 + font-weight:bold;
  268 + padding:10px 0;
  269 + padding-bottom:0;
  270 +}
  271 +
  272 +.info_link {
  273 + margin-right:5px;
  274 + float:left;
  275 +
  276 + img {
  277 + width:20px;
  278 + }
  279 +}
  280 +
  281 +.borders {
  282 + border: 1px solid #ccc;
  283 + @include shade;
  284 +}
  285 +
  286 +.download_repo_link {
  287 + background: url("images.png") no-repeat 0 -48px;
  288 + padding-left:20px;
  289 +}
  290 +
  291 +.number {
  292 + border-radius: 4px;
  293 + text-shadow: none;
  294 + background: rgba(0,0,0,.12);
  295 + text-align: center;
  296 + padding: 2px 4px;
  297 + line-height:20px;
  298 + margin-left:2px;
  299 +}
  300 +
  301 +table a code {
  302 + position: relative;
  303 + top: -2px;
  304 + margin-right: 3px;
  305 +}
  306 +
  307 +.span12 hr{
  308 + margin-top: 5px;
  309 +}
  310 +
  311 +.btn.padded {
  312 + margin-right:3px;
  313 +}
102 314  
103   -@import "style.scss";
104   -@import "projects.css.scss";
105   -@import "commits.css.scss";
106   -@import "notes.css.scss";
107   -@import "merge_requests.css.scss";
108   -@import "highlight.css.scss";
109   -@import "highlight.black.css.scss";
110   -@import "issues.css.scss";
111   -@import "commits.css.scss";
  315 +.loading {
  316 + margin:20px auto;
  317 + background: url(ajax-loader-facebook.gif) no-repeat center center;
  318 + width:40px;
  319 + height:40px;
  320 +}
  321 +
  322 +/** FLASH message **/
  323 +#flash_container {
  324 + height:45px;
  325 + position:fixed;
  326 + z-index:10001;
  327 + top:0px;
  328 + width:100%;
  329 + margin-bottom:15px;
  330 + overflow:hidden;
  331 + background:white;
  332 + cursor:pointer;
  333 + border-bottom:1px solid #777;
  334 +
  335 + h4 {
  336 + color:#444;
  337 + font-size:22px;
  338 + padding-top:5px;
  339 + margin:2px;
  340 + }
  341 +}
  342 +
  343 +.git_url_wrapper {
  344 + margin-right:50px
  345 +}
  346 +.file_stats {
  347 + span {
  348 + img {
  349 + width:14px;
  350 + float:left;
  351 + margin-right:6px;
  352 + padding:2px 0;
  353 + }
  354 + }
  355 +}
  356 +
  357 +.handle:hover {
  358 + cursor:move;
  359 +}
  360 +
  361 +span.update-author {
  362 + display:block;
  363 +}
  364 +span.update-author {
  365 + color:#999;
  366 + font-weight:normal;
  367 + font-style:italic;
  368 +}
  369 +span.update-author strong {
  370 + font-weight:bold;
  371 + font-style: normal;
  372 +}
  373 +
  374 +/** UPDATE ITEM **/
  375 +span.update-author {
  376 + display:block;
  377 +}
  378 +/** END UPDATE ITEM **/
  379 +.ajax-tab-loading {
  380 + padding:40px;
  381 + display:none;
  382 +}
  383 +.dashboard-loader {
  384 + float:left;
  385 + margin:10px;
  386 + display:none;
  387 +}
  388 +.user-mention {
  389 + color:#2FA0BB;
  390 + font-weight:bold;
  391 +}
112 392  
113   -@import "top_panel.scss";
114   -@import "dashboard.scss";
115   -@import "tree.scss";
  393 +a.project-update.titled {
  394 + position:relative;
  395 + padding-left:35% !important;
  396 + .title-block {
  397 + padding:10px;
  398 + width:35%;
  399 + position:absolute;
  400 + left:0;
  401 + top:0;
  402 + }
  403 +}
  404 +/**
  405 + * Project graph
  406 + */
  407 +#holder {
  408 + cursor: move;
  409 + height: 70%;
  410 + overflow: hidden;
  411 +}
  412 +
  413 +
  414 +
  415 +input.git_clone_url {
  416 + width:475px;
  417 +}
  418 +
  419 +.team_member_row {
  420 + img {
  421 + width:60px;
  422 + }
  423 +}
  424 +
  425 +.merge-request-form-holder {
  426 + select {
  427 + width:300px;
  428 + }
  429 +}
  430 +
  431 +/** Issues **/
  432 +#issue_assignee_id {
  433 + width:300px;
  434 +}
  435 +
  436 +#new_issue_dialog textarea{
  437 + height: 100px;
  438 +}
  439 +
  440 +.project_list_url {
  441 + width:250px;
  442 + background:#fff !important;
  443 +}
  444 +
  445 +.project_tile {
  446 + @include shade;
  447 + @include round-borders-all(4px);
  448 + margin-bottom:20px;
  449 + width:298px;
  450 + float:left;
  451 + margin-left:20px;
  452 + border: 1px solid #DDD;
  453 + padding-bottom:20px;
  454 +
  455 + .title {
  456 + background:#f5f5f5;
  457 + padding: 5px 10px 2px 20px;
  458 + border-bottom: 1px solid #DDD;
  459 + margin-bottom: 15px;
  460 +
  461 + h3 {
  462 + &:hover {
  463 + text-decoration: underline;
  464 + }
  465 + }
  466 + }
  467 + .data {
  468 + margin: 0 20px;
  469 + }
  470 + .buttons {
  471 + margin: 0 20px;
  472 + }
  473 +}
  474 +
  475 +/**
  476 + *
  477 + * COMMIT SHOw
  478 + *
  479 + */
  480 +.diff_file {
  481 + border:1px solid #CCC;
  482 + margin-bottom:1em;
  483 +
  484 + .diff_file_header {
  485 + padding:5px 5px;
  486 + border-bottom:1px solid #CCC;
  487 + background: #eee;
  488 + }
  489 + .diff_file_content {
  490 + overflow:auto;
  491 + overflow-y:hidden;
  492 + background:#fff;
  493 + color:#333;
  494 + font-size: 12px;
  495 + font-family: 'Menlo', 'Courier New', 'andale mono','lucida console',monospace;
  496 + }
  497 + .diff_file_content_image {
  498 + background:#eee;
  499 + text-align:center;
  500 + img {
  501 + padding:100px;
  502 + max-width:300px;
  503 + }
  504 + }
  505 +}
  506 +
  507 +.diff_file_content{
  508 + table {
  509 + border:none;
  510 + margin:0px;
  511 + padding:0px;
  512 + tr {
  513 + td {
  514 + font-size:12px;
  515 + }
  516 + }
  517 + }
  518 + .old_line, .new_line {
  519 + margin:0px;
  520 + padding:0px;
  521 + border:none;
  522 + background:#F7F7F7;
  523 + color:#aaa;
  524 + padding: 0px 5px;
  525 + border-right: 1px solid #ccc;
  526 + text-align:right;
  527 + min-width:35px;
  528 + max-width:35px;
  529 + width:35px;
  530 + moz-user-select: none;
  531 + -khtml-user-select: none;
  532 + user-select: none;
  533 + a {
  534 + float:left;
  535 + width:35px;
  536 + font-weight:normal;
  537 + color:#aaa;
  538 + &:hover {
  539 + text-decoration:underline;
  540 + }
  541 + }
  542 + }
  543 + .line_content {
  544 + white-space:pre;
  545 + height:14px;
  546 + margin:0px;
  547 + padding:0px;
  548 + border:none;
  549 + &.new {
  550 + background: #CFD;
  551 + }
  552 + &.old {
  553 + background: #FDD;
  554 + }
  555 + &.matched {
  556 + color:#ccc;
  557 + background:#fafafa;
  558 + }
  559 + }
  560 +}
  561 +
  562 +/** COMMIT BLOCK **/
  563 +.commit-title{display: block;}
  564 +.commit-title{margin-bottom: 10px}
  565 +.commit-author, .commit-committer{display: block;color: #999; font-weight: normal; font-style: italic;}
  566 +.commit-author strong, .commit-committer strong{font-weight: bold; font-style: normal;}
  567 +
  568 +/** bordered list **/
  569 +ul.bordered-list {
  570 + margin:5px 0px;
  571 + padding:0px;
  572 + li {
  573 + padding: 5px 0;
  574 + border-bottom: 1px solid #EEE;
  575 + overflow: hidden;
  576 + display: block;
  577 + margin:0px;
  578 + }
  579 +}
  580 +
  581 +ul.bordered-list li:last-child { border:none }
  582 +
  583 +.line_holder {
  584 + &:hover {
  585 + td {
  586 + background: #FFFFCF !important;
  587 + }
  588 + }
  589 +}
  590 +
  591 +li.commit {
  592 + .avatar {
  593 + width:24px;
  594 + top:-3px;
  595 + margin-right:10px;
  596 + margin-left:10px;
  597 + }
  598 +
  599 + code {
  600 + padding:4px;
  601 + }
  602 +}
  603 +p.time {
  604 + color: #999;
  605 + font-size: 90%;
  606 + margin: 30px 3px 3px 2px;
  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 +}
  629 +
  630 +.event_feed {
  631 + ul {
  632 + margin-left:50px;
  633 + }
  634 +}
... ...
app/assets/stylesheets/dashboard.scss
... ... @@ -1,30 +0,0 @@
1   -body.dashboard-page h2.icon span{ background-position: 9px -69px; }
2   -body.dashboard-page header{margin-bottom: 0}
3   -body.dashboard-page .news-feed{margin-left: 285px; min-height: 600px; margin-top: 20px; margin-right:2px; padding:20px;}
4   -body.dashboard-page .dashboard-content{ position: relative; float: left; width: 100%; height: 100%; }
5   -body.dashboard-page .news-feed h2{float: left;}
6   -
7   -body.dashboard-page aside{
8   - min-height: 820px; position: relative; top: 0; bottom: 0; right: 0; width: 260px; float: left; border-right: 1px solid $border_color; padding:20px; padding-right:0;
9   - h4{margin: 0; border-bottom: 1px solid #ccc; padding: 20px 20px 20px 0px; font-size: 11px; font-weight: bold; text-transform: uppercase;}
10   - h4 a.button-small{float: right; text-transform: none; border-radius: 4px; margin-right: 2%; margin-top: -4px; display: block;}
11   - .project-list {list-style: none; margin: 0; padding: 0;}
12   - .project-list li a {background: white; color: #{$blue_link}; display: block; border-bottom: 1px solid $lite_border_color; padding: 14px 6% 14px 0px;}
13   - .project-list li a span.project-name{font-size: 14px; display: block; margin-bottom: 8px}
14   - .project-list li a span.time{color: #666; font-weight: normal; font-size: 11px}
15   - .project-list li a span.arrow{float: right; background: #E3E5EA; padding: 10px; border-radius: 5px; margin-top: 2px; text-shadow: none; color: #999}
16   -}
17   -
18   -body.dashboard-page .news-feed .project-updates {
19   - margin-bottom: 20px; display: block; width: 100%;
20   - .data{ padding: 0}
21   - a.project-update {padding: 10px; overflow: hidden; display: block;}
22   - a.project-update:last-child{border-bottom: 0}
23   - a.project-update img{float: left; margin-right: 10px;}
24   - a.project-update span.update-title, .dashboard-page .news-feed .project-updates li a span.update-author{display: block;}
25   - a.project-update span.update-title{margin-bottom: 10px}
26   - a.project-update span.update-author{color: #999; font-weight: normal; font-style: italic;}
27   - a.project-update span.update-author strong{font-weight: bold; font-style: normal;}
28   -}
29   -/* eo Dashboard Page */
30   -
app/assets/stylesheets/highlight.black.css.scss
... ... @@ -1,67 +0,0 @@
1   -.black .highlighttable {
2   - background: #333;
3   - pre { color: #eee }
4   - .highlight { background: #333; border-left:1px solid #555; }
5   -
6   - .hll { background-color: #ffffff }
7   - .c { color: #888888; font-style: italic } /* Comment */
8   - .err { color: #a61717; background-color: #e3d2d2 } /* Error */
9   - .k { color: #CDA869; font-weight: bold } /* Keyword */
10   - .kp { color: #CDA869; font-weight: bold } /* Keyword */
11   - .cm { color: #888888 } /* Comment.Multiline */
12   - .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
13   - .c1 { color: #888888 } /* Comment.Single */
14   - .cs { color: #cc0000; font-weight: bold; background-color: transparent } /* Comment.Special */
15   - .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
16   - .ge { font-style: italic } /* Generic.Emph */
17   - .gr { color: #aa0000 } /* Generic.Error */
18   - .gh { color: #303030 } /* Generic.Heading */
19   - .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
20   - .go { color: #888888 } /* Generic.Output */
21   - .gp { color: #555555 } /* Generic.Prompt */
22   - .gs { font-weight: bold } /* Generic.Strong */
23   - .gu { color: #606060 } /* Generic.Subheading */
24   - .gt { color: #aa0000 } /* Generic.Traceback */
25   - .highlight .kc{font-weight:bold;} /* Keyword.Constant */
26   - .highlight .kd{font-weight:bold;} /* Keyword.Declaration */
27   - .highlight .kn{font-weight:bold;} /* Keyword.Namespace */
28   - .highlight .kp{font-weight:bold;} /* Keyword.Pseudo */
29   - .highlight .kr{font-weight:bold;} /* Keyword.Reserved */
30   - .highlight .kt{color:#458;font-weight:bold;} /* Keyword.Type */
31   - .m { color: #0000DD; font-weight: bold } /* Literal.Number */
32   - .p { color: #eee; }
33   - .s { color: #dd2200; background-color: transparent } /* Literal.String */
34   - .highlight .na{color:#008080;} /* Name.Attribute */
35   - .highlight .nb{color:#0086B3;} /* Name.Builtin */
36   - .highlight .nc{color:#ccc;font-weight:bold;} /* Name.Class */
37   - .highlight .no{color:turquoise;} /* Name.Constant */
38   - .highlight .ni{color:#800080;}
39   - .highlight .ne{color:#900;font-weight:bold;} /* Name.Exception */
40   - .highlight .nf{color:#ccc;font-weight:bold;} /* Name.Function */
41   - .highlight .nn{color:#79C3E0;font-weight:bold;} /* Name.Namespace */
42   - .highlight .nt{color:#fc5;} /* Name.Tag */
43   - .highlight .nv{color:#008080;} /* Name.Variable */
44   - .py { color: #336699; font-weight: bold } /* Name.Property */
45   - .ow { color: #008800 } /* Operator.Word */
46   - .w { color: #bbbbbb } /* Text.Whitespace */
47   - .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
48   - .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
49   - .highlight .mi {color:#099;} /* Literal.Number.Integer */
50   - .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
51   - .sb { color: #dd2200; background-color: transparent; } /* Literal.String.Backtick */
52   - .highlight .sc{color:#d14;} /* Literal.String.Char */
53   - .sd { color: #dd2200; background-color: transparent; } /* Literal.String.Doc */
54   - .highlight .s2{color:orange;} /* Literal.String.Double */
55   - .highlight .se{color:orange;} /* Literal.String.Escape */
56   - .highlight .sh{color:orange;} /* Literal.String.Heredoc */
57   - .highlight .si{color:orange;} /* Literal.String.Interpol */
58   - .highlight .sx{color:orange;} /* Literal.String.Other */
59   - .highlight .sr{color:orange;} /* Literal.String.Regex */
60   - .highlight .s1{color:orange;} /* Literal.String.Single */
61   - .highlight .ss{color:orange;} /* Literal.String.Symbol */
62   - .bp { color: #003388 } /* Name.Builtin.Pseudo */
63   - .vc { color: #336699 } /* Name.Variable.Class */
64   - .vg { color: #dd7700 } /* Name.Variable.Global */
65   - .vi { color: cyan }
66   -}
67   -
app/assets/stylesheets/highlight.black.scss 0 → 100644
... ... @@ -0,0 +1,68 @@
  1 +.black .highlighttable {
  2 + background: #333;
  3 + td.linenos { border:none; }
  4 + pre { color: #eee }
  5 + .highlight { background: #333; border-left:1px solid #555; }
  6 +
  7 + .hll { background-color: #ffffff }
  8 + .c { color: #888888; font-style: italic } /* Comment */
  9 + .err { color: #a61717; background-color: #e3d2d2 } /* Error */
  10 + .k { color: #CDA869; font-weight: bold } /* Keyword */
  11 + .kp { color: #CDA869; font-weight: bold } /* Keyword */
  12 + .cm { color: #888888 } /* Comment.Multiline */
  13 + .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
  14 + .c1 { color: #888888 } /* Comment.Single */
  15 + .cs { color: #cc0000; font-weight: bold; background-color: transparent } /* Comment.Special */
  16 + .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
  17 + .ge { font-style: italic } /* Generic.Emph */
  18 + .gr { color: #aa0000 } /* Generic.Error */
  19 + .gh { color: #303030 } /* Generic.Heading */
  20 + .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
  21 + .go { color: #888888 } /* Generic.Output */
  22 + .gp { color: #555555 } /* Generic.Prompt */
  23 + .gs { font-weight: bold } /* Generic.Strong */
  24 + .gu { color: #606060 } /* Generic.Subheading */
  25 + .gt { color: #aa0000 } /* Generic.Traceback */
  26 + .highlight .kc{font-weight:bold;} /* Keyword.Constant */
  27 + .highlight .kd{font-weight:bold;} /* Keyword.Declaration */
  28 + .highlight .kn{font-weight:bold;} /* Keyword.Namespace */
  29 + .highlight .kp{font-weight:bold;} /* Keyword.Pseudo */
  30 + .highlight .kr{font-weight:bold;} /* Keyword.Reserved */
  31 + .highlight .kt{color:#458;font-weight:bold;} /* Keyword.Type */
  32 + .m { color: #0000DD; font-weight: bold } /* Literal.Number */
  33 + .p { color: #eee; }
  34 + .s { color: #dd2200; background-color: transparent } /* Literal.String */
  35 + .highlight .na{color:#008080;} /* Name.Attribute */
  36 + .highlight .nb{color:#0086B3;} /* Name.Builtin */
  37 + .highlight .nc{color:#ccc;font-weight:bold;} /* Name.Class */
  38 + .highlight .no{color:turquoise;} /* Name.Constant */
  39 + .highlight .ni{color:#800080;}
  40 + .highlight .ne{color:#900;font-weight:bold;} /* Name.Exception */
  41 + .highlight .nf{color:#ccc;font-weight:bold;} /* Name.Function */
  42 + .highlight .nn{color:#79C3E0;font-weight:bold;} /* Name.Namespace */
  43 + .highlight .nt{color:#fc5;} /* Name.Tag */
  44 + .highlight .nv{color:#008080;} /* Name.Variable */
  45 + .py { color: #336699; font-weight: bold } /* Name.Property */
  46 + .ow { color: #008800 } /* Operator.Word */
  47 + .w { color: #bbbbbb } /* Text.Whitespace */
  48 + .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
  49 + .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
  50 + .highlight .mi {color:#099;} /* Literal.Number.Integer */
  51 + .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
  52 + .sb { color: #dd2200; background-color: transparent; } /* Literal.String.Backtick */
  53 + .highlight .sc{color:#d14;} /* Literal.String.Char */
  54 + .sd { color: #dd2200; background-color: transparent; } /* Literal.String.Doc */
  55 + .highlight .s2{color:orange;} /* Literal.String.Double */
  56 + .highlight .se{color:orange;} /* Literal.String.Escape */
  57 + .highlight .sh{color:orange;} /* Literal.String.Heredoc */
  58 + .highlight .si{color:orange;} /* Literal.String.Interpol */
  59 + .highlight .sx{color:orange;} /* Literal.String.Other */
  60 + .highlight .sr{color:orange;} /* Literal.String.Regex */
  61 + .highlight .s1{color:orange;} /* Literal.String.Single */
  62 + .highlight .ss{color:orange;} /* Literal.String.Symbol */
  63 + .bp { color: #003388 } /* Name.Builtin.Pseudo */
  64 + .vc { color: #336699 } /* Name.Variable.Class */
  65 + .vg { color: #dd7700 } /* Name.Variable.Global */
  66 + .vi { color: cyan }
  67 +}
  68 +
... ...
app/assets/stylesheets/highlight.css.scss
... ... @@ -1,133 +0,0 @@
1   -@mixin round-borders-all($radius) {
2   - border: 1px solid #eaeaea;
3   - -moz-border-radius: $radius;
4   - -webkit-border-radius: $radius;
5   - border-radius: $radius;
6   -}
7   -
8   -table.highlighttable
9   -{
10   - margin:0px;
11   - padding:0px;
12   - font-size:12px;
13   - table-layout:fixed
14   -}
15   -
16   -td.code,
17   -td.linenos{
18   - padding:0;
19   - margin:0;
20   - vertical-align:top;
21   -}
22   -
23   -.highlight{
24   - background:none;
25   - padding:10px 0px 0px 10px;
26   - margin-left:0px;
27   -}
28   -.highlight pre{
29   -}
30   -
31   -.linenodiv pre {
32   - white-space:pre-line;
33   -}
34   -
35   -td.linenos {
36   - /*background:#F7F7F7;*/
37   - color:#777;
38   - padding:10px 0px 0px 10px;
39   - float:left;
40   - width:45px;
41   - border-right: 1px solid #ccc;
42   -
43   -}
44   -
45   -td.code .highlight {
46   - overflow: auto;
47   -}
48   -table.highlighttable pre{
49   - padding:0;
50   - margin:0;
51   - font-family: 'Courier New', 'andale mono','lucida console',monospace;
52   - color: #333;
53   - text-align:left;
54   -}
55   -
56   -.git-empty .highlight {
57   - @include round-borders-all(4px);
58   - background:#eee;
59   - padding:5px;
60   - //overflow-x:scroll;
61   - pre{
62   - padding:0;
63   - line-height:2.0;
64   - margin:0;
65   - font-family: 'Courier New', 'andale mono','lucida console',monospace;
66   - color: #333;
67   - text-align:left;}
68   - }
69   -
70   -.shadow{
71   - -webkit-box-shadow:0 5px 15px #000;
72   - -moz-box-shadow:0 5px 15px #000;
73   - box-shadow:0 5px 15px #000;
74   -}
75   -
76   -.hll { background-color: #ffffff }
77   -.c { color: #888888; font-style: italic } /* Comment */
78   -.err { color: #a61717; background-color: #e3d2d2 } /* Error */
79   -.k { color: #000000; font-weight: bold } /* Keyword */
80   -.cm { color: #888888 } /* Comment.Multiline */
81   -.cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
82   -.c1 { color: #888888 } /* Comment.Single */
83   -.cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
84   -.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
85   -.ge { font-style: italic } /* Generic.Emph */
86   -.gr { color: #aa0000 } /* Generic.Error */
87   -.gh { color: #303030 } /* Generic.Heading */
88   -.gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
89   -.go { color: #888888 } /* Generic.Output */
90   -.gp { color: #555555 } /* Generic.Prompt */
91   -.gs { font-weight: bold } /* Generic.Strong */
92   -.gu { color: #606060 } /* Generic.Subheading */
93   -.gt { color: #aa0000 } /* Generic.Traceback */
94   -.highlight .kc{font-weight:bold;} /* Keyword.Constant */
95   -.highlight .kd{font-weight:bold;} /* Keyword.Declaration */
96   -.highlight .kn{font-weight:bold;} /* Keyword.Namespace */
97   -.highlight .kp{font-weight:bold;} /* Keyword.Pseudo */
98   -.highlight .kr{font-weight:bold;} /* Keyword.Reserved */
99   -.highlight .kt{color:#458;font-weight:bold;} /* Keyword.Type */
100   -.m { color: #0000DD; font-weight: bold } /* Literal.Number */
101   -.s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
102   -.highlight .na{color:#008080;} /* Name.Attribute */
103   -.highlight .nb{color:#0086B3;} /* Name.Builtin */
104   -.highlight .nc{color:#458;font-weight:bold;} /* Name.Class */
105   -.highlight .no{color:#008080;} /* Name.Constant */
106   -.highlight .ni{color:#800080;}
107   -.highlight .ne{color:#900;font-weight:bold;} /* Name.Exception */
108   -.highlight .nf{color:#900;font-weight:bold;} /* Name.Function */
109   -.highlight .nn{color:#005;font-weight:bold;} /* Name.Namespace */
110   -.highlight .nt{color:#000080;} /* Name.Tag */
111   -.highlight .nv{color:#008080;} /* Name.Variable */
112   -.py { color: #336699; font-weight: bold } /* Name.Property */
113   -.ow { color: #008800 } /* Operator.Word */
114   -.w { color: #bbbbbb } /* Text.Whitespace */
115   -.mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
116   -.mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
117   -.highlight .mi {color:#099;} /* Literal.Number.Integer */
118   -.mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
119   -.sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
120   -.highlight .sc{color:#d14;} /* Literal.String.Char */
121   -.sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
122   -.highlight .s2{color:#d14;} /* Literal.String.Double */
123   -.highlight .se{color:#d14;} /* Literal.String.Escape */
124   -.highlight .sh{color:#d14;} /* Literal.String.Heredoc */
125   -.highlight .si{color:#d14;} /* Literal.String.Interpol */
126   -.highlight .sx{color:#d14;} /* Literal.String.Other */
127   -.highlight .sr{color:#d14;} /* Literal.String.Regex */
128   -.highlight .s1{color:#d14;} /* Literal.String.Single */
129   -.highlight .ss{color:#d14;} /* Literal.String.Symbol */
130   -.bp { color: #003388 } /* Name.Builtin.Pseudo */
131   -.vc { color: #336699 } /* Name.Variable.Class */
132   -.vg { color: #dd7700 } /* Name.Variable.Global */
133   -.vi { color: #3333bb }
app/assets/stylesheets/highlight.scss 0 → 100644
... ... @@ -0,0 +1,143 @@
  1 +@mixin round-borders-all($radius) {
  2 + border: 1px solid #eaeaea;
  3 + -moz-border-radius: $radius;
  4 + -webkit-border-radius: $radius;
  5 + border-radius: $radius;
  6 +}
  7 +
  8 +table.highlighttable
  9 +{
  10 + margin:0px;
  11 + padding:0px;
  12 + font-size:12px;
  13 + table-layout:fixed;
  14 + background: #F7F7F7;
  15 +}
  16 +
  17 +td.code,
  18 +td.linenos{
  19 + padding:0;
  20 + margin:0;
  21 + border-top:0;
  22 + vertical-align:top;
  23 +}
  24 +
  25 +.highlight{
  26 + background:none;
  27 + padding:10px 0px 0px 10px;
  28 + margin-left:0px;
  29 + border-left: 1px solid #DEE2E3;
  30 + background: white;
  31 +}
  32 +
  33 +.linenodiv pre,
  34 +.highlight pre{
  35 + margin:0;
  36 + padding:0;
  37 + background:none;
  38 + border:none;
  39 +}
  40 +
  41 +.linenodiv pre {
  42 + white-space:pre-line;
  43 +}
  44 +
  45 +td.linenos {
  46 + /*background:#F7F7F7;*/
  47 + color:#777;
  48 + padding:10px 0px 0px 10px;
  49 + float:left;
  50 + width:45px;
  51 + border-right: 1px solid #ccc;
  52 +
  53 +}
  54 +
  55 +td.code .highlight {
  56 + overflow: auto;
  57 +}
  58 +table.highlighttable pre{
  59 + padding:0;
  60 + margin:0;
  61 + font-family: 'Menlo', 'Courier New', 'andale mono','lucida console',monospace;
  62 + color: #333;
  63 + text-align:left;
  64 +}
  65 +
  66 +.git-empty .highlight {
  67 + @include round-borders-all(4px);
  68 + background:#eee;
  69 + padding:5px;
  70 + //overflow-x:scroll;
  71 + pre{
  72 + padding:0;
  73 + line-height:2.0;
  74 + margin:0;
  75 + font-family: 'Menlo', 'Courier New', 'andale mono','lucida console',monospace;
  76 + color: #333;
  77 + text-align:left;}
  78 + }
  79 +
  80 +.shadow{
  81 + -webkit-box-shadow:0 5px 15px #000;
  82 + -moz-box-shadow:0 5px 15px #000;
  83 + box-shadow:0 5px 15px #000;
  84 +}
  85 +
  86 +.hll { background-color: #ffffff }
  87 +.c { color: #888888; font-style: italic } /* Comment */
  88 +.err { color: #a61717; background-color: #e3d2d2 } /* Error */
  89 +.k { color: #000000; font-weight: bold } /* Keyword */
  90 +.cm { color: #888888 } /* Comment.Multiline */
  91 +.cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
  92 +.c1 { color: #888888 } /* Comment.Single */
  93 +.cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
  94 +.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
  95 +.ge { font-style: italic } /* Generic.Emph */
  96 +.gr { color: #aa0000 } /* Generic.Error */
  97 +.gh { color: #303030 } /* Generic.Heading */
  98 +.gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
  99 +.go { color: #888888 } /* Generic.Output */
  100 +.gp { color: #555555 } /* Generic.Prompt */
  101 +.gs { font-weight: bold } /* Generic.Strong */
  102 +.gu { color: #606060 } /* Generic.Subheading */
  103 +.gt { color: #aa0000 } /* Generic.Traceback */
  104 +.highlight .kc{font-weight:bold;} /* Keyword.Constant */
  105 +.highlight .kd{font-weight:bold;} /* Keyword.Declaration */
  106 +.highlight .kn{font-weight:bold;} /* Keyword.Namespace */
  107 +.highlight .kp{font-weight:bold;} /* Keyword.Pseudo */
  108 +.highlight .kr{font-weight:bold;} /* Keyword.Reserved */
  109 +.highlight .kt{color:#458;font-weight:bold;} /* Keyword.Type */
  110 +.m { color: #0000DD; font-weight: bold } /* Literal.Number */
  111 +.s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
  112 +.highlight .na{color:#008080;} /* Name.Attribute */
  113 +.highlight .nb{color:#0086B3;} /* Name.Builtin */
  114 +.highlight .nc{color:#458;font-weight:bold;} /* Name.Class */
  115 +.highlight .no{color:#008080;} /* Name.Constant */
  116 +.highlight .ni{color:#800080;}
  117 +.highlight .ne{color:#900;font-weight:bold;} /* Name.Exception */
  118 +.highlight .nf{color:#900;font-weight:bold;} /* Name.Function */
  119 +.highlight .nn{color:#005;font-weight:bold;} /* Name.Namespace */
  120 +.highlight .nt{color:#000080;} /* Name.Tag */
  121 +.highlight .nv{color:#008080;} /* Name.Variable */
  122 +.py { color: #336699; font-weight: bold } /* Name.Property */
  123 +.ow { color: #008800 } /* Operator.Word */
  124 +.w { color: #bbbbbb } /* Text.Whitespace */
  125 +.mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
  126 +.mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
  127 +.highlight .mi {color:#099;} /* Literal.Number.Integer */
  128 +.mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
  129 +.sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
  130 +.highlight .sc{color:#d14;} /* Literal.String.Char */
  131 +.sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
  132 +.highlight .s2{color:#d14;} /* Literal.String.Double */
  133 +.highlight .se{color:#d14;} /* Literal.String.Escape */
  134 +.highlight .sh{color:#d14;} /* Literal.String.Heredoc */
  135 +.highlight .si{color:#d14;} /* Literal.String.Interpol */
  136 +.highlight .sx{color:#d14;} /* Literal.String.Other */
  137 +.highlight .sr{color:#d14;} /* Literal.String.Regex */
  138 +.highlight .s1{color:#d14;} /* Literal.String.Single */
  139 +.highlight .ss{color:#d14;} /* Literal.String.Symbol */
  140 +.bp { color: #003388 } /* Name.Builtin.Pseudo */
  141 +.vc { color: #336699 } /* Name.Variable.Class */
  142 +.vg { color: #dd7700 } /* Name.Variable.Global */
  143 +.vi { color: #3333bb }
... ...
app/assets/stylesheets/issues.css.scss
... ... @@ -1,84 +0,0 @@
1   -.issue-number {
2   - float: left;
3   - border-radius: 5px;
4   - text-shadow: none;
5   - background: rgba(0, 0, 0, 0.12);
6   - text-align: center;
7   - padding: 14px 8px;
8   - width: 40px;
9   - margin-right: 10px;
10   - color: #444;
11   -}
12   -
13   -.issues_filter {
14   - margin:10px 0;
15   - .left {
16   - margin-right:15px;
17   - }
18   -}
19   -
20   -.top_panel_issues{
21   - #issue_search_form {
22   - margin:5px 0;
23   - input {
24   - border:1px solid #D3D3D3;
25   - padding: 3px;
26   - height: 28px;
27   - width: 250px;
28   - -webkit-appearance:none;
29   - box-sizing: border-box;
30   - -moz-box-sizing: border-box;
31   -
32   - &:focus {
33   - border-color:#c2e1ef;
34   - }
35   - }
36   - }
37   -}
38   -
39   -/** ISSUES LIST **/
40   -.issue .action-links {
41   - display:none;
42   - a {
43   - margin-left:10px;
44   - }
45   -}
46   -.issue:hover .action-links { display:block; }
47   -.issue-show-holder {
48   - width:100%;
49   - .data p { font-size:16px }
50   -}
51   -
52   -#issue_assignee_id {
53   - width:300px;
54   -}
55   -
56   -.issue-form-holder .ui-box .data {
57   - margin: 0;
58   - padding: 0;
59   -}
60   -
61   -body.project-page .merge-request-form-holder table.no-borders tr,
62   -body.project-page .merge-request-form-holder table.no-borders td,
63   -body.project-page .issue-form-holder table.no-borders tr,
64   -body.project-page .issue-form-holder table.no-borders td,
65   -body.project-page .new_snippet table tr,
66   -body.project-page .new_snippet table td,
67   -body.project-page .edit_snippet table tr,
68   -body.project-page .edit_snippet table td
69   -{
70   - &:hover {
71   - background:none;
72   - }
73   -}
74   -
75   -
76   -#issues-table {
77   - tr {
78   - border-top: 1px solid $lite_border_color;
79   - &:first-child {
80   - border:none;
81   - }
82   - }
83   -
84   -}
app/assets/stylesheets/login.scss 0 → 100644
... ... @@ -0,0 +1,44 @@
  1 +/* Login Page */
  2 +body.login-page{
  3 + padding-top: 10%;
  4 + background:#f1f1f1;
  5 +}
  6 +
  7 +.login-box{
  8 + width: 304px;
  9 + position: relative;
  10 + border-radius: 5px;
  11 + margin: auto;
  12 + padding: 20px;
  13 + background: white;
  14 +}
  15 +
  16 +.login-box .login-logo{
  17 + margin: 10px 0 30px 0;
  18 + display: block;
  19 +}
  20 +
  21 +.login-box input.text{background-color: #f1f1f1; font-size: 16px; border-radius: 0; padding: 14px 10px; width: 280px}
  22 +
  23 +.login-box input.text.top{
  24 + -webkit-border-top-left-radius: 5px;
  25 + -webkit-border-top-right-radius: 5px;
  26 + -moz-border-radius-topleft: 5px;
  27 + -moz-border-radius-topright: 5px;
  28 + border-top-left-radius: 5px;
  29 + border-top-right-radius: 5px;
  30 +}
  31 +
  32 +.login-box input.text.bottom{
  33 + -webkit-border-bottom-right-radius: 5px;
  34 + -webkit-border-bottom-left-radius: 5px;
  35 + -moz-border-radius-bottomright: 5px;
  36 + -moz-border-radius-bottomleft: 5px;
  37 + border-bottom-right-radius: 5px;
  38 + border-bottom-left-radius: 5px;
  39 + border-top: 0;
  40 + margin-bottom: 20px;
  41 +}
  42 +
  43 +.login-box a.forgot{float: right; padding-top: 6px}
  44 +
... ...
app/assets/stylesheets/main.scss 0 → 100644
... ... @@ -0,0 +1,118 @@
  1 +@import "bootstrap";
  2 +
  3 +/** GITLAB colors **/
  4 +$text_color:#222;
  5 +$lite_text_color: #666;
  6 +$link_color:#2A79A3;
  7 +$active_link_color:#2FA0BB;
  8 +$active_bg_color:#79C3E0;
  9 +$active_bd_color: #2FA0BB;
  10 +$border_color:#CCC;
  11 +$lite_border_color:#EEE;
  12 +$min_app_width:980px;
  13 +$max_app_width:980px;
  14 +$app_padding:20px;
  15 +$bg_color: #FFF;
  16 +$styled_border_color: #2FA0BB;
  17 +$color: "#4BB8D2";
  18 +$blue_link: "#2fa0bb";
  19 +
  20 +
  21 +/** Style colors **/
  22 +$style_color: #474D57;
  23 +$hover: #FDF5D9;
  24 +
  25 +
  26 +/** MIXINS **/
  27 +@mixin shade {
  28 + -moz-box-shadow: 0 0 3px #ddd;
  29 + -webkit-box-shadow: 0 0 3px #ddd;
  30 + box-shadow: 0 0 3px #ddd;
  31 +}
  32 +
  33 +
  34 +@mixin round-borders-bottom($radius) {
  35 + border-top: 1px solid #eaeaea;
  36 + -moz-border-radius-bottomright: $radius;
  37 + -moz-border-radius-bottomleft: $radius;
  38 + border-bottom-right-radius: $radius;
  39 + border-bottom-left-radius: $radius;
  40 + -webkit-border-bottom-left-radius: $radius;
  41 + -webkit-border-bottom-right-radius: $radius;
  42 +}
  43 +
  44 +@mixin round-borders-top($radius) {
  45 + border-top: 1px solid #eaeaea;
  46 + -moz-border-radius-topright: $radius;
  47 + -moz-border-radius-topleft: $radius;
  48 + border-top-right-radius: $radius;
  49 + border-top-left-radius: $radius;
  50 + -webkit-border-top-left-radius: $radius;
  51 + -webkit-border-top-right-radius: $radius;
  52 +}
  53 +
  54 +@mixin round-borders-all($radius) {
  55 + border: 1px solid #eaeaea;
  56 + -moz-border-radius: $radius;
  57 + -webkit-border-radius: $radius;
  58 + border-radius: $radius;
  59 +}
  60 +
  61 +/**
  62 + * This file represent some UI that can be changed
  63 + * during web app restyle or theme select.
  64 + *
  65 + * Next items should be placed there
  66 + * - link colors
  67 + * - header styles
  68 + * - main menu styles
  69 + *
  70 + */
  71 +@import "ui_basic.scss";
  72 +
  73 +/**
  74 + * UI mars theme
  75 + */
  76 +@import "ui_mars.scss";
  77 +
  78 +/**
  79 + * Most of application styles placed here.
  80 + * This file represent common UI that should not be changed between themes
  81 + * or project restyling like form width or user avatar class or commit title
  82 + *
  83 + * TODO: clean it
  84 + */
  85 +@import "common.scss";
  86 +
  87 +/**
  88 + * This scss file redefine chozen selectbox styles for
  89 + * project Branch/Tag select element
  90 + */
  91 +@import "ref_select.scss";
  92 +
  93 +/**
  94 + * Code (files list) styles. Browsing project files there
  95 + */
  96 +@import "tree.scss";
  97 +
  98 +/**
  99 + * This file represent notes(comments) styles
  100 + */
  101 +@import "notes.scss";
  102 +
  103 +/**
  104 + * Devise styles
  105 + */
  106 +@import "login.scss";
  107 +
  108 +/**
  109 + * CODE HIGHTLIGHT BASE
  110 + *
  111 + */
  112 +@import "highlight.scss";
  113 +
  114 +/**
  115 + * CODE HIGHTLIGHT DARK schema
  116 + *
  117 + */
  118 +@import "highlight.black.scss";
... ...
app/assets/stylesheets/merge_requests.css.scss
... ... @@ -1,10 +0,0 @@
1   -// Place all the styles related to the MergeRequests controller here.
2   -// They will automatically be included in application.css.
3   -// You can use Sass (SCSS) here: http://sass-lang.com/
4   -
5   -
6   -.merge-request-form-holder {
7   - select {
8   - width:300px;
9   - }
10   -}
app/assets/stylesheets/notes.css.scss
... ... @@ -1,52 +0,0 @@
1   -/** Notes **/
2   -
3   -#notes-list {
4   - display:block;
5   - list-style:none;
6   - margin:0px;
7   - padding:0px;
8   -}
9   -
10   -.issue_notes {
11   - .note_content {
12   - float:left;
13   - width:400px;
14   - }
15   -}
16   -
17   -/* Note textare */
18   -#note_note {
19   - height:100px;
20   - width:97%;
21   - font-size:14px;
22   -}
23   -
24   -#new_note {
25   - #note_note {
26   - height:25px;
27   - }
28   - .attach_holder {
29   - display:none;
30   - }
31   -}
32   -
33   -#notes-list .note .delete-note { display:none; }
34   -#notes-list .note:hover .delete-note { display:block; }
35   -
36   -body.project-page #notes-list .note {padding: 10px 0; border-bottom: 1px solid #eee; overflow: hidden; display: block;}
37   -body.project-page #notes-list .note img{float: left; margin-right: 10px;}
38   -body.project-page #notes-list .note span.note-title{display: block;}
39   -body.project-page #notes-list .note span.note-title{margin-bottom: 10px}
40   -body.project-page #notes-list .note span.note-author{color: #999; font-weight: normal; font-style: italic;}
41   -body.project-page #notes-list .note span.note-author strong{font-weight: bold; font-style: normal;}
42   -
43   -
44   -.note .note-title { margin-left:55px; }
45   -
46   -p.notify_controls input{
47   - margin: 5px;
48   -}
49   -
50   -p.notify_controls span{
51   - font-weight: 700;
52   -}
app/assets/stylesheets/notes.scss 0 → 100644
... ... @@ -0,0 +1,121 @@
  1 +/**
  2 + * Notes
  3 + *
  4 + */
  5 +#notes-list,
  6 +#new_notes_list {
  7 + display:block;
  8 + list-style:none;
  9 + margin:0px;
  10 + padding:0px;
  11 +}
  12 +
  13 +#new_notes_list li:last-child{
  14 + border-bottom:1px solid #aaa;
  15 +}
  16 +
  17 +.issue_notes {
  18 + .note_content {
  19 + float:left;
  20 + width:400px;
  21 + }
  22 +}
  23 +
  24 +/* Note textare */
  25 +#note_note {
  26 + height:100px;
  27 + width:97%;
  28 + font-size:14px;
  29 +}
  30 +
  31 +#new_note {
  32 + #note_note {
  33 + height:25px;
  34 + }
  35 + .attach_holder {
  36 + display:none;
  37 + }
  38 +}
  39 +
  40 +.note .delete-note {
  41 + display:none;
  42 + float:right;
  43 +}
  44 +.note:hover .delete-note { display:block; }
  45 +.note {padding: 10px 0; border-bottom: 1px solid #eee; overflow: hidden; display: block;}
  46 +.note img{float: left; margin-right: 10px;}
  47 +.note span.note-title{display: block;}
  48 +.note span.note-title{margin-bottom: 10px}
  49 +.note span.note-author{color: #999; font-weight: normal; font-style: italic;}
  50 +.note span.note-author strong{font-weight: bold; font-style: normal;}
  51 +.note p { color:$style_color; }
  52 +.note .note-author { color: $style_color;}
  53 +
  54 +.note .note-title { margin-left:55px; }
  55 +
  56 +p.notify_controls input{
  57 + margin: 5px;
  58 +}
  59 +
  60 +p.notify_controls span{
  61 + font-weight: 700;
  62 +}
  63 +
  64 +tr.line_notes_row {
  65 + border-bottom:1px solid #DDD;
  66 + &.reply {
  67 + background:#eee;
  68 +
  69 + td {
  70 + padding:7px 10px;
  71 + }
  72 + a.line_note_reply_link {
  73 + @include round-borders-all(4px);
  74 + border-color:#aaa;
  75 + background: #bbb;
  76 + padding: 3px 20px;
  77 + color: white;
  78 + }
  79 + }
  80 + ul {
  81 + margin:0;
  82 + li {
  83 + padding:0;
  84 + border:none;
  85 + }
  86 + }
  87 +}
  88 +
  89 +.line_notes_row, .per_line_form { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; }
  90 +
  91 +.per_line_form {
  92 + background:#f5f5f5;
  93 + form { margin: 0; }
  94 + td {
  95 + border-bottom:1px solid #ddd;
  96 + }
  97 +}
  98 +
  99 +td .line_note_link {
  100 + position:absolute;
  101 + margin-left:-70px;
  102 + margin-top:-10px;
  103 + z-index:10;
  104 + background: url("comment_add.png") no-repeat left 0;
  105 + width:32px;
  106 + height:32px;
  107 +
  108 + opacity: 0.0;
  109 + filter: alpha(opacity=0);
  110 +
  111 + &:hover {
  112 + opacity: 1.0;
  113 + filter: alpha(opacity=100);
  114 + }
  115 +}
  116 +
  117 +.diff_file_content tr.line_holder:hover > td { background: $hover !important; }
  118 +.diff_file_content tr.line_holder:hover > td .line_note_link {
  119 + opacity: 1.0;
  120 + filter: alpha(opacity=100);
  121 +}
... ...
app/assets/stylesheets/projects.css.scss
... ... @@ -1,572 +0,0 @@
1   -body.project-page h2.icon .project-name, body.project-page h2.icon d{border: 1px solid #eee; padding: 5px 30px 5px 10px; border-radius: 5px; position: relative;}
2   -body.project-page h2.icon .project-name i.arrow{float: right;
3   - position: absolute;
4   - right: 10px;
5   - top: 13px;
6   - display: block;
7   - background: url('images.png') no-repeat -97px -29px;
8   - width: 4px;
9   - height: 5px;
10   -}
11   -
12   -body.project-page h2.icon span{ background-position: -78px -68px; }
13   -body.project-page .project-container{ position: relative; float: left; width: 100%; height: 100%; padding-bottom: 10px;}
14   -body.project-page .page-title{margin-bottom: 0}
15   -
16   -body.project-page .project-sidebar {
17   - width: 110px;
18   - left: 0;
19   - top: 0;
20   - height: 100%;
21   - bottom: 0;
22   - position: absolute;
23   - float: left;
24   - display: inline-block;
25   - background: #FFF;
26   - padding: $app_padding;
27   - padding-right:0px;
28   - margin: 0;
29   - border-right: 1px solid $border_color;
30   -}
31   -
32   -body.projects-page input.text.git-url { font-size: 12px; border-radius: 5px; color: #666; box-shadow: 0 1px 2px rgba(0,0,0,.2) inset; padding: 8px 0 8px 30px; margin-bottom: 20px; background: white url('images.png') no-repeat 8px -40px; width: 136px}
33   -body.projects-page input.text.git-url {margin:10px 0 0 }
34   -.git_url_wrapper { margin-right:50px }
35   -
36   -.projects_selector:hover > .project-box{ -moz-box-shadow:0px 0px 10px rgba(0, 0, 0, .1); -webkit-box-shadow:0px 0px 10px rgba(0, 0, 0, .1); box-shadow:0px 0px 10px rgba(0, 0, 0, .1); }
37   -
38   -
39   -/* New project Page */
40   -.new-project-page .container table{background: white}
41   -body.project-page .project-sidebar aside{width: 109px}
42   -body.project-page .project-sidebar aside a{
43   - display: block;
44   - position: relative;
45   - padding: 15px 10px;
46   - margin: 10px 0 0 0;
47   -
48   -
49   -}
50   -body.project-page .project-sidebar aside a span.number{float: right; border-radius: 5px; text-shadow: none; background: rgba(0,0,0,.12); text-align: center; padding: 5px 8px; position: absolute; top: 10px; right: 10px}
51   -body.project-page .project-sidebar aside a.current {
52   - color: white;
53   - background: $active_bg_color;
54   - border: 1px solid $active_bd_color;
55   - border-radius:5px;
56   -
57   -
58   - -webkit-border-top-right-radius: 0;
59   - -webkit-border-bottom-right-radius: 0;
60   - -moz-border-radius-topright: 0px;
61   - -moz-border-radius-bottomright: 0px;
62   - border-top-right-radius: 0;
63   - border-bottom-right-radius: 0;
64   - margin-right: -1px;
65   -}
66   -body.project-page .project-content{ padding: $app_padding; display: block; margin-left: 130px; min-height: 600px}
67   -body.project-page .project-content h2{ margin-top: 6px}
68   -body.project-page .project-content .button.right{margin-left: 20px}
69   -body.project-page table .commit a{color: #{$blue_link}}
70   -body.project-page table th, body.project-page table td{ border-bottom: 1px solid #DEE2E3;}
71   -body.project-page .fixed{position: fixed; }
72   -
73   -
74   -
75   -
76   -/** File stat **/
77   -.file_stats {
78   - span {
79   - img {
80   - width:14px;
81   - float:left;
82   - margin-right: 6px;
83   - padding:2px 0;
84   - }
85   - }
86   -}
87   -
88   -.round-borders {
89   - @include round-borders-all(4px);
90   - padding: 4px 0px;
91   -}
92   -
93   -table.round-borders {
94   - float:left;
95   - text-align: left;
96   -}
97   -
98   -
99   -
100   -/** PROJECTS **/
101   -input.ssh_project_url {
102   - padding:5px;
103   - margin:0px;
104   - float:right;
105   - width:400px;
106   - text-align:center;
107   -}
108   -
109   -#projects-list .project {
110   - height:50px;
111   -}
112   -
113   -#tree-slider .tree-item,
114   -#projects-list .project,
115   -#snippets-table .snippet,
116   -#issues-table .issue{
117   - cursor:pointer;
118   -}
119   -
120   -.clear {
121   - clear: both;
122   -}
123   -
124   -
125   -/** Buttons **/
126   -.lbutton,
127   -.lite_button {
128   - display:block;
129   - float:left;
130   - margin: 0px 5px 0px 0px;
131   - padding:5px 10px;
132   -
133   - font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;
134   - border:1px solid #D3D3D3;
135   - background:white;
136   - font-size:12px !important;
137   - line-height:130%;
138   - text-decoration:none;
139   - font-weight:bold;
140   - color:#565656;
141   - cursor:pointer;
142   -
143   - &:hover {
144   - border:1px solid #C2E1EF;
145   - color: #0099FF;
146   - }
147   -
148   - &.hm {
149   - margin: 0px 0px;
150   - }
151   -
152   - &.vm {
153   - margin: 5px 0px;
154   - }
155   -}
156   -
157   -#user_projects_limit{
158   - width: 60px;
159   -}
160   -
161   -.handle:hover{
162   - cursor: move;
163   -}
164   -
165   -.project-refs-form {
166   - span {
167   - background: none !important;
168   - position:static !important;
169   - width:auto !important;
170   - height: auto !important;
171   - }
172   -}
173   -
174   -.project-refs-select {
175   - width:200px;
176   -}
177   -
178   -.filter .left { margin-right:15px; }
179   -
180   -body.project-page table .commit {
181   - a.tree-commit-link {
182   - color:#444;
183   - &:hover {
184   - text-decoration:underline;
185   - }
186   - }
187   -}
188   -
189   -/** NEW PROJECT **/
190   -.new-project-hodler {
191   - .icon span { background-position: -31px -70px; }
192   - td { border-bottom: 1px solid #DEE2E3; }
193   -}
194   -
195   -/** Feed entry **/
196   -.commit,
197   -.snippet,
198   -.message {
199   - .title {
200   - color:#666;
201   - a { color:#666 !important; }
202   - p { margin-top:0px; }
203   - }
204   - .author { color: #999 }
205   -}
206   -
207   -/** JQuery UI **/
208   -.ui-autocomplete { @include round-borders-all(5px); }
209   -.ui-menu-item { cursor: pointer }
210   -.ui-selectmenu{
211   - @include round-borders-all(4px);
212   - margin-right:10px;
213   - font-size:1.5em;
214   - height:auto;
215   - font-weight:bold;
216   - .ui-selectmenu-status {
217   - padding:3px 10px;
218   - }
219   -}
220   -
221   -/** Snippets **/
222   -.new_snippet textarea,
223   -.edit_snippet textarea {
224   - height:300px;
225   - padding: 8px;
226   - width: 95%;
227   -}
228   -.snippet .action-links {
229   - display:none;
230   - a {
231   - margin-left:10px;
232   - }
233   -}
234   -.snippet:hover .action-links { display:block; }
235   -
236   -/** ISSUES TAGS **/
237   -.tag {
238   - @include round-borders-all(4px);
239   - padding:2px 4px;
240   - border:none;
241   - text-shadow:none;
242   -
243   - &.inline {
244   - display:inline;
245   - }
246   -
247   - &.high, &.closed {
248   - background: #D12F19;
249   - color:white;
250   - }
251   -
252   - &.today, &.open {
253   - background: #44aa22;
254   - color:white;
255   - }
256   -
257   - &.yours {
258   - background: #4466cc;
259   - color:white;
260   - }
261   - &.normal {
262   - background: #2c5ca6;
263   - color:white;
264   - }
265   - &.notes {
266   - background: #2c5c66;
267   - color:white;
268   - }
269   - &.note {
270   - background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.076, #fefefe), to(#F6F7F8));
271   - background-image: -webkit-linear-gradient(#fefefe 7.6%, #F6F7F8);
272   - background-image: -moz-linear-gradient(#fefefe 7.6%, #F6F7F8);
273   - background-image: -o-linear-gradient(#fefefe 7.6%, #F6F7F8);
274   - color: #777;
275   - border: 1px solid #DEDFE1;
276   - }
277   - &.issue {
278   - background: #D12F19;
279   - color:white;
280   - }
281   - &.commit {
282   - background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.076, #fefefe), to(#F6F7F8));
283   - background-image: -webkit-linear-gradient(#fefefe 7.6%, #F6F7F8);
284   - background-image: -moz-linear-gradient(#fefefe 7.6%, #F6F7F8);
285   - background-image: -o-linear-gradient(#fefefe 7.6%, #F6F7F8);
286   - color: #777;
287   - border: 1px solid #DEDFE1;
288   - }
289   -}
290   -
291   -#holder {
292   - background:#FAFAFA;
293   - border: 1px solid #EEE;
294   - cursor: move;
295   - height: 70%;
296   - overflow: hidden;
297   -}
298   -
299   -/* Project Dashboard Page */
300   -html, body { height: 100%; }
301   -
302   -body.dashboard.project-page .news-feed h2{float: left;}
303   -body.dashboard.project-page .news-feed .project-updates {margin-bottom: 20px; display: block; width: 100%;}
304   -body.dashboard.project-page .news-feed .project-updates .data{ padding: 0}
305   -body.dashboard.project-page .news-feed .project-updates a.project-update {padding: 10px; border-bottom: 1px solid #eee; overflow: hidden; display: block;}
306   -body.dashboard.project-page .news-feed .project-updates a.project-update:last-child{border-bottom: 0}
307   -body.dashboard.project-page .news-feed .project-updates a.project-update img{float: left; margin-right: 10px;}
308   -body.dashboard.project-page .news-feed .project-updates a.project-update span.update-title, .dashboard-page .news-feed .project-updates li a span.update-author{display: block;}
309   -body.dashboard.project-page .news-feed .project-updates a.project-update span.update-title{margin-bottom: 10px}
310   -body.dashboard.project-page .news-feed .project-updates a.project-update span.update-author{color: #999; font-weight: normal; font-style: italic;}
311   -body.dashboard.project-page .news-feed .project-updates a.project-update span.update-author strong{font-weight: bold; font-style: normal;}
312   -/* eo Dashboard Page */
313   -
314   -
315   -/** Merge requests */
316   -body.project-page .merge-request-commits {margin-bottom: 20px; display: block; width: 100%;}
317   -body.project-page .merge-request-commits .data{ padding: 0}
318   -body.project-page .merge-request-commits a.commit {padding: 10px; border-bottom: 1px solid #eee; overflow: hidden; display: block;}
319   -body.project-page .merge-request-commits a.commit:last-child{border-bottom: 0}
320   -body.project-page .merge-request-commits a.commit img{float: left; margin-right: 10px;}
321   -body.project-page .merge-request-commits a.commit span.update-title, .dashboard-page .news-feed .project-updates li a span.update-author{display: block;}
322   -body.project-page .merge-request-commits a.commit span.update-title{margin-bottom: 10px}
323   -body.project-page .merge-request-commits a.commit span.update-author{color: #999; font-weight: normal; font-style: italic;}
324   -body.project-page .merge-request-commits a.commit span.update-author strong{font-weight: bold; font-style: normal;}
325   -
326   -
327   -/** Update entry **/
328   -.update-data { padding: 0 }
329   -.update-data { width:100%; }
330   -.update-data.ui-box .data { padding:0; }
331   -a.update-item {padding: 10px; border-bottom: 1px solid #eee; overflow: hidden; display: block;}
332   -a.update-item:last-child{border-bottom: 0}
333   -a.update-item img{float: left; margin-right: 10px;}
334   -a.update-item span.update-title, .dashboard-page .news-feed .project-updates li a span.update-author{display: block;}
335   -a.update-item span.update-title{margin-bottom: 10px}
336   -a.update-item span.update-author{color: #999; font-weight: normal; font-style: italic;}
337   -a.update-item span.update-author strong{font-weight: bold; font-style: normal;}
338   -
339   -
340   -body.project-page .team_member_new .span-6, .team_member_edit .span-6{ padding:10px 0; }
341   -
342   -body.projects-page input.text.git-url.project_list_url { width:165px; }
343   -
344   -
345   -body.project-page table.no-borders th {
346   - background:none;
347   - border-bottom:1px solid #CCC;
348   - color:#333;
349   -}
350   -
351   -body.project-page table.no-borders tr,
352   -body.project-page table.no-borders td{
353   - border:none;
354   -}
355   -
356   -.ajax-tab-loading {
357   - padding:40px;
358   - display:none;
359   -}
360   -
361   -#tree-content-holder { float:left; width:100%; }
362   -
363   -#tree-readme-holder {
364   - float:left;
365   - width:100%;
366   -
367   - .readme {
368   - @include round-borders-all(4px);
369   - padding: 4px 15px;
370   - background:#F7F7F7;
371   - }
372   -}
373   -
374   -
375   -
376   -/* Commit Page */
377   -.entity-info {float: right;}
378   -.entity-button{
379   - background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.192, #fff), to(#f4f4f4));
380   - background-image: -webkit-linear-gradient(#fff 19.2%, #f4f4f4);
381   - background-image: -moz-linear-gradient(#fff 19.2%, #f4f4f4);
382   - background-image: -o-linear-gradient(#fff 19.2%, #f4f4f4);
383   - box-shadow: 0 -1px 0 white inset;
384   - display: block;
385   - border: 1px solid #eee;
386   - border-radius: 5px;
387   - margin-bottom: 2px;
388   - position: relative;
389   - padding: 4px 10px;
390   - font-size: 11px;
391   - padding-right: 20px;
392   -}
393   -
394   -.entity-button i{
395   - background: url('images.png') no-repeat -138px -27px;
396   - width: 6px;
397   - height: 9px;
398   - float: right;
399   - position: absolute;
400   - top: 6px;
401   - right: 5px;
402   -}
403   -.box-arrow{float: right; background: #E3E5EA; padding: 10px; border-radius: 5px; margin-top: 2px; text-shadow: none; color: #999; margin: 1.5em 0;}
404   -
405   -h4.dash-tabs {
406   - margin: 0;
407   - border-bottom: 1px solid #ccc;
408   - padding: 10px 10px;
409   - font-size: 11px;
410   - padding-left:20px;
411   - font-weight: bold; text-transform: uppercase;
412   - background: #F7F7F7;
413   - margin-bottom:20px;
414   - height:13px;
415   -
416   -}
417   -
418   -.dash-button {
419   - border-right: 1px solid #ddd;
420   - background:none;
421   - padding: 10px 15px;
422   - float:left;
423   - position:relative;
424   - top:-10px;
425   - left:0px;
426   - height:13px;
427   -
428   - &:first-child {
429   - border-left: 1px solid #ddd;
430   - }
431   - &.active {
432   - background: #eaeaea;
433   - }
434   -}
435   -
436   -
437   -.dashboard-loader {
438   - float:right;
439   - margin-right:30px;
440   - display:none;
441   -}
442   -
443   -
444   -.merge-tabs {
445   - margin: 0;
446   - border: 1px solid #ccc;
447   - padding: 5px;
448   - font-size: 12px;
449   - background: #F7F7F7;
450   - margin-bottom:20px;
451   - height:26px;
452   -
453   - -moz-border-radius: 4px;
454   - -webkit-border-radius: 4px;
455   - border-radius: 4px;
456   -
457   - .tab {
458   - font-weight: bold;
459   - border-right: 1px solid #ddd;
460   - background:none;
461   - padding: 10px;
462   - min-width:60px;
463   - float:left;
464   - position:relative;
465   - top:-5px;
466   - left:-5px;
467   - height:16px;
468   - padding-left:34px;
469   -
470   - span {
471   - width: 20px;
472   - height: 20px;
473   - display: inline-block;
474   - position: absolute;
475   - left: 8px;
476   - top: 8px;
477   - }
478   -
479   - &.active {
480   - background: #eaeaea;
481   - }
482   - }
483   -}
484   -.merge-tabs.repository .tab span{ background: url("images.png") no-repeat -38px -77px; }
485   -.activities-tab span { background: url("images.png") no-repeat -161px -1px; }
486   -.stat-tab span,
487   -.team-tab span,
488   -.snippets-tab span { background: url("images.png") no-repeat -38px -77px; }
489   -.files-tab span { background: url("images.png") no-repeat -112px -23px; }
490   -
491   -.merge-notes-tab span { background: url("images.png") no-repeat -161px -1px; }
492   -.merge-commits-tab span { background: url("images.png") no-repeat -86px 1px; }
493   -.merge-diffs-tab span { background: url("images.png") no-repeat -118px 1px; }
494   -.merge-tabs .dashboard-loader { padding:8px; }
495   -
496   -.user-mention {
497   - color: #2FA0BB;
498   - font-weight: bold;
499   -}
500   -
501   -.author {
502   - color: #999;
503   -}
504   -
505   -
506   -.red-button{
507   - border-radius: 5px;
508   - font-size: 12px;
509   - font-weight: bold;
510   - padding: 5px 17px;
511   - border: 1px solid #999;
512   - color: #666;
513   - display: inline-block;
514   - box-shadow: 0 1px 2px rgba(0,0,0,.3);
515   - background: #D12F19;
516   - color: white;
517   -}
518   -
519   -.positive-button{
520   - border-radius: 5px;
521   - font-size: 12px;
522   - font-weight: bold;
523   - padding: 5px 17px;
524   - border: 1px solid #999;
525   - color: #666;
526   - display: inline-block;
527   - box-shadow: 0 1px 2px rgba(0,0,0,.3);
528   - background: #4A2;
529   - color: white;
530   -}
531   -
532   -
533   -.dark_scheme_box {
534   - padding:20px 0;
535   -
536   - label {
537   - float:left;
538   - box-shadow: 0 0px 5px rgba(0,0,0,.3);
539   -
540   - img {
541   - }
542   - }
543   -}
544   -
545   -a.project-update.titled {
546   - position: relative;
547   - padding-left: 235px !important;
548   -
549   - .title-block {
550   - padding: 10px;
551   - width: 205px;
552   - position: absolute;
553   - left: 0;
554   - top: 0;
555   - }
556   -}
557   -
558   -.add_new {
559   - float: right;
560   - background: #A6B807;
561   - color: white;
562   - padding: 4px 10px;
563   - @include round-borders-all(4px);
564   - font-size:11px;
565   - margin: 10px 0;
566   -}
567   -
568   -
569   -
570   -.new-project-hodler {
571   - padding:20px;
572   -}
app/assets/stylesheets/projects.css.scss~ 0 → 100644
... ... @@ -0,0 +1,385 @@
  1 +.git_url_wrapper { margin-right:50px }
  2 +
  3 +.sidebar aside a{
  4 + display: block;
  5 + position: relative;
  6 + padding: 15px 10px;
  7 + margin: 10px 0 0 0;
  8 +
  9 + font-size:13px;
  10 + font-weight:bold;
  11 + color:#333;
  12 +
  13 + &.current {
  14 + color: white;
  15 + background: $active_bg_color;
  16 + border: 1px solid $active_bd_color;
  17 + border-radius:5px;
  18 +
  19 + -webkit-border-top-right-radius: 0;
  20 + -webkit-border-bottom-right-radius: 0;
  21 + -moz-border-radius-topright: 0px;
  22 + -moz-border-radius-bottomright: 0px;
  23 + border-top-right-radius: 0;
  24 + border-bottom-right-radius: 0;
  25 + margin-right: -1px;
  26 + }
  27 +}
  28 +
  29 +body table .commit a{color: #{$blue_link}}
  30 +body table th, body table td{ border-bottom: 1px solid #DEE2E3;}
  31 +body .fixed{position: fixed; }
  32 +
  33 +/** File stat **/
  34 +.file_stats {
  35 + span {
  36 + img {
  37 + width:14px;
  38 + float:left;
  39 + margin-right: 6px;
  40 + padding:2px 0;
  41 + }
  42 + }
  43 +}
  44 +
  45 +.round-borders {
  46 + @include round-borders-all(4px);
  47 + padding: 4px 0px;
  48 +}
  49 +
  50 +table.round-borders {
  51 + float:left;
  52 + text-align: left;
  53 +}
  54 +
  55 +
  56 +
  57 +/** PROJECTS **/
  58 +input.ssh_project_url {
  59 + padding:5px;
  60 + margin:0px;
  61 + float:right;
  62 + width:400px;
  63 + text-align:center;
  64 +}
  65 +
  66 +#projects-list .project {
  67 + height:50px;
  68 +}
  69 +
  70 +#tree-slider .tree-item,
  71 +#projects-list .project,
  72 +#snippets-table .snippet,
  73 +#issues-table .issue{
  74 + cursor:pointer;
  75 +}
  76 +
  77 +.clear {
  78 + clear: both;
  79 +}
  80 +
  81 +
  82 +
  83 +#user_projects_limit{
  84 + width: 60px;
  85 +}
  86 +
  87 +.handle:hover{
  88 + cursor: move;
  89 +}
  90 +
  91 +.project-refs-form {
  92 + span {
  93 + background: none !important;
  94 + position:static !important;
  95 + width:auto !important;
  96 + height: auto !important;
  97 + }
  98 +}
  99 +
  100 +.project-refs-select {
  101 + width:200px;
  102 +}
  103 +
  104 +.filter .left { margin-right:15px; }
  105 +
  106 +body table .commit {
  107 + a.tree-commit-link {
  108 + color:#444;
  109 + &:hover {
  110 + text-decoration:underline;
  111 + }
  112 + }
  113 +}
  114 +
  115 +/** NEW PROJECT **/
  116 +.new-project-hodler {
  117 + .icon span { background-position: -31px -70px; }
  118 + td { border-bottom: 1px solid #DEE2E3; }
  119 +}
  120 +
  121 +/** Feed entry **/
  122 +.commit,
  123 +.snippet,
  124 +.message {
  125 + .title {
  126 + color:#666;
  127 + a { color:#666 !important; }
  128 + p { margin-top:0px; }
  129 + }
  130 + .author { color: #999 }
  131 +}
  132 +
  133 +/** JQuery UI **/
  134 +.ui-autocomplete { @include round-borders-all(5px); }
  135 +.ui-menu-item { cursor: pointer }
  136 +.ui-selectmenu{
  137 + @include round-borders-all(4px);
  138 + margin-right:10px;
  139 + font-size:1.5em;
  140 + height:auto;
  141 + font-weight:bold;
  142 + .ui-selectmenu-status {
  143 + padding:3px 10px;
  144 + }
  145 +}
  146 +
  147 +#holder {
  148 + background:#FAFAFA;
  149 + border: 1px solid #EEE;
  150 + cursor: move;
  151 + height: 70%;
  152 + overflow: hidden;
  153 +}
  154 +
  155 +/* Project Dashboard Page */
  156 +html, body { height: 100%; }
  157 +
  158 +.news-feed h2{float: left;}
  159 +.news-feed .project-updates {margin-bottom: 20px; display: block; width: 100%;}
  160 +.news-feed .project-updates .data{ padding: 0}
  161 +.news-feed .project-updates a.project-update {padding: 10px; border-bottom: 1px solid #eee; overflow: hidden; display: block;}
  162 +.news-feed .project-updates a.project-update:last-child{border-bottom: 0}
  163 +.news-feed .project-updates a.project-update img{float: left; margin-right: 10px;}
  164 +.news-feed .project-updates a.project-update span.update-title, .dashboard-page .news-feed .project-updates li a span.update-author{display: block;}
  165 +.news-feed .project-updates a.project-update span.update-title{margin-bottom: 10px}
  166 +.news-feed .project-updates a.project-update span.update-author{color: #999; font-weight: normal; font-style: italic;}
  167 +.news-feed .project-updates a.project-update span.update-author strong{font-weight: bold; font-style: normal;}
  168 +/* eo Dashboard Page */
  169 +
  170 +
  171 +/** Update entry **/
  172 +.update-data { padding: 0 }
  173 +.update-data { width:100%; }
  174 +.update-data.ui-box .data { padding:0; }
  175 +a.update-item {padding: 10px; border-bottom: 1px solid #eee; overflow: hidden; display: block;}
  176 +a.update-item:last-child{border-bottom: 0}
  177 +a.update-item img{float: left; margin-right: 10px;}
  178 +a.update-item span.update-title, .dashboard-page .news-feed .project-updates li a span.update-author{display: block;}
  179 +a.update-item span.update-title{margin-bottom: 10px}
  180 +a.update-item span.update-author{color: #999; font-weight: normal; font-style: italic;}
  181 +a.update-item span.update-author strong{font-weight: bold; font-style: normal;}
  182 +
  183 +
  184 +body .team_member_new .span-6, .team_member_edit .span-6{ padding:10px 0; }
  185 +
  186 +body.projects-page input.text.git-url.project_list_url { width:165px; }
  187 +
  188 +
  189 +body table.no-borders th {
  190 + background:none;
  191 + border-bottom:1px solid #CCC;
  192 + color:#333;
  193 +}
  194 +
  195 +body table.no-borders tr,
  196 +body table.no-borders td{
  197 + border:none;
  198 +}
  199 +
  200 +.ajax-tab-loading {
  201 + padding:40px;
  202 + display:none;
  203 +}
  204 +
  205 +#tree-content-holder { float:left; width:100%; }
  206 +
  207 +#tree-readme-holder {
  208 + float:left;
  209 + width:100%;
  210 +
  211 + .readme {
  212 + @include round-borders-all(4px);
  213 + padding: 4px 15px;
  214 + background:#F7F7F7;
  215 + }
  216 +}
  217 +
  218 +
  219 +
  220 +/* Commit Page */
  221 +.entity-info {float: right;}
  222 +.entity-button{
  223 + background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.192, #fff), to(#f4f4f4));
  224 + background-image: -webkit-linear-gradient(#fff 19.2%, #f4f4f4);
  225 + background-image: -moz-linear-gradient(#fff 19.2%, #f4f4f4);
  226 + background-image: -o-linear-gradient(#fff 19.2%, #f4f4f4);
  227 + box-shadow: 0 -1px 0 white inset;
  228 + display: block;
  229 + border: 1px solid #eee;
  230 + border-radius: 5px;
  231 + margin-bottom: 2px;
  232 + position: relative;
  233 + padding: 4px 10px;
  234 + font-size: 11px;
  235 + padding-right: 20px;
  236 +}
  237 +
  238 +.entity-button i{
  239 + background: url('images.png') no-repeat -138px -27px;
  240 + width: 6px;
  241 + height: 9px;
  242 + float: right;
  243 + position: absolute;
  244 + top: 6px;
  245 + right: 5px;
  246 +}
  247 +.box-arrow{float: right; background: #E3E5EA; padding: 10px; border-radius: 5px; margin-top: 2px; text-shadow: none; color: #999; margin: 1.5em 0;}
  248 +
  249 +h4.dash-tabs {
  250 + margin: 0;
  251 + border-bottom: 1px solid #ccc;
  252 + padding: 10px 10px;
  253 + font-size: 11px;
  254 + padding-left:20px;
  255 + font-weight: bold; text-transform: uppercase;
  256 + background: #F7F7F7;
  257 + margin-bottom:20px;
  258 + height:13px;
  259 +
  260 +}
  261 +
  262 +.dash-button {
  263 + border-right: 1px solid #ddd;
  264 + background:none;
  265 + padding: 10px 15px;
  266 + float:left;
  267 + position:relative;
  268 + top:-10px;
  269 + left:0px;
  270 + height:13px;
  271 +
  272 + &:first-child {
  273 + border-left: 1px solid #ddd;
  274 + }
  275 + &.active {
  276 + background: #eaeaea;
  277 + }
  278 +}
  279 +
  280 +
  281 +.dashboard-loader {
  282 + float:right;
  283 + margin-right:30px;
  284 + display:none;
  285 +}
  286 +
  287 +
  288 +.merge-tabs {
  289 + margin: 0;
  290 + border: 1px solid #ccc;
  291 + padding: 5px;
  292 + font-size: 12px;
  293 + background: #F7F7F7;
  294 + margin-bottom:20px;
  295 + height:26px;
  296 +
  297 + -moz-border-radius: 4px;
  298 + -webkit-border-radius: 4px;
  299 + border-radius: 4px;
  300 +
  301 + .tab {
  302 + font-weight: bold;
  303 + border-right: 1px solid #ddd;
  304 + background:none;
  305 + padding: 10px;
  306 + min-width:60px;
  307 + float:left;
  308 + position:relative;
  309 + top:-5px;
  310 + left:-5px;
  311 + height:16px;
  312 + padding-left:34px;
  313 +
  314 + span {
  315 + width: 20px;
  316 + height: 20px;
  317 + display: inline-block;
  318 + position: absolute;
  319 + left: 8px;
  320 + top: 8px;
  321 + }
  322 +
  323 + &.active {
  324 + background: #eaeaea;
  325 + }
  326 + }
  327 +}
  328 +.merge-tabs.repository .tab span{ background: url("images.png") no-repeat -38px -77px; }
  329 +.activities-tab span { background: url("images.png") no-repeat -161px -1px; }
  330 +.stat-tab span,
  331 +.team-tab span,
  332 +.snippets-tab span { background: url("images.png") no-repeat -38px -77px; }
  333 +.files-tab span { background: url("images.png") no-repeat -112px -23px; }
  334 +
  335 +.merge-notes-tab span { background: url("images.png") no-repeat -161px -1px; }
  336 +.merge-commits-tab span { background: url("images.png") no-repeat -86px 1px; }
  337 +.merge-diffs-tab span { background: url("images.png") no-repeat -118px 1px; }
  338 +.merge-tabs .dashboard-loader { padding:8px; }
  339 +
  340 +.user-mention {
  341 + color: #2FA0BB;
  342 + font-weight: bold;
  343 +}
  344 +
  345 +.author {
  346 + color: #999;
  347 +}
  348 +
  349 +
  350 +
  351 +
  352 +.dark_scheme_box {
  353 + padding:20px 0;
  354 +
  355 + label {
  356 + float:left;
  357 + box-shadow: 0 0px 5px rgba(0,0,0,.3);
  358 +
  359 + img {
  360 + }
  361 + }
  362 +}
  363 +
  364 +a.project-update.titled {
  365 + position: relative;
  366 + padding-left: 235px !important;
  367 +
  368 + .title-block {
  369 + padding: 10px;
  370 + width: 205px;
  371 + position: absolute;
  372 + left: 0;
  373 + top: 0;
  374 + }
  375 +}
  376 +
  377 +.add_new {
  378 + float: right;
  379 + background: #A6B807;
  380 + color: white;
  381 + padding: 4px 10px;
  382 + @include round-borders-all(4px);
  383 + font-size:11px;
  384 + margin: 10px 0;
  385 +}
... ...
app/assets/stylesheets/ref_select.scss 0 → 100644
... ... @@ -0,0 +1,50 @@
  1 +/** Branch/tag selector **/
  2 +.project-refs-form {
  3 + margin:0;
  4 + span {
  5 + background:none !important;
  6 + position:static !important;
  7 + width:auto !important;
  8 + height:auto !important;
  9 + }
  10 +}
  11 +.project-refs-select {
  12 + width:120px;
  13 +}
  14 +
  15 +.project-refs-form .chzn-container {
  16 + position: relative;
  17 + top: 0;
  18 + left: 0;
  19 + margin-right: 10px;
  20 +
  21 + .chzn-drop {
  22 + margin:7px 0;
  23 + border: 1px solid #CCC;
  24 + min-width: 300px;
  25 +
  26 + .chzn-results {
  27 + max-height:300px;
  28 + }
  29 +
  30 + .chzn-search input {
  31 + min-width:200px;
  32 + }
  33 + }
  34 +
  35 + .chzn-single {
  36 + background:#ddd;
  37 + //border:none;
  38 + //box-shadow:none;
  39 +
  40 + div {
  41 + background:transparent;
  42 + border-left:none;
  43 + }
  44 +
  45 + span {
  46 + font-weight: normal;
  47 + }
  48 + }
  49 +}
  50 +
... ...
app/assets/stylesheets/style.scss
... ... @@ -1,802 +0,0 @@
1   -/* HTML5 ✰ Boilerplate
2   - * ==|== normalize ==========================================================
3   - */
4   -
5   -article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; }
6   -audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; }
7   -audio:not([controls]) { display: none; }
8   -[hidden] { display: none; }
9   -
10   -html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
11   -body { margin: 0; font-size: 13px; line-height: 1.231; }
12   -body, button, input, select, textarea {
13   - font-family: "helvetica", "arial", "freesans", "clean", sans-serif;
14   -color: #222; }
15   -
16   -::-moz-selection { background: #79c3e0; color: #fff; text-shadow: none; }
17   -::selection { background: #79c3e0; color: #fff; text-shadow: none; }
18   -
19   -a { color: #00e; }
20   -a:hover { color: #06e; }
21   -a:focus { outline: thin dotted; }
22   -a:hover, a:active { outline: 0; }
23   -
24   -abbr[title] { border-bottom: 1px dotted; }
25   -b, strong { font-weight: bold; }
26   -blockquote { margin: 1em 40px; }
27   -dfn { font-style: italic; }
28   -hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
29   -ins { background: #ff9; color: #000; text-decoration: none; }
30   -mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
31   -pre, code, kbd, samp { font-family: monospace, monospace; _font-family: 'courier new', monospace; font-size: 1em; }
32   -pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; }
33   -q { quotes: none; }
34   -q:before, q:after { content: ""; content: none; }
35   -small { font-size: 85%; }
36   -sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
37   -sup { top: -0.5em; }
38   -sub { bottom: -0.25em; }
39   -ul, ol { margin: 1em 0; padding: 0 0 0 40px; }
40   -dd { margin: 0 0 0 40px; }
41   -nav ul, nav ol { list-style: none; list-style-image: none; margin: 0; padding: 0; }
42   -img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
43   -svg:not(:root) { overflow: hidden; }
44   -figure { margin: 0; }
45   -
46   -form { margin: 0; }
47   -fieldset { border: 0; margin: 0; padding: 0; }
48   -label { cursor: pointer; }
49   -legend { border: 0; *margin-left: -7px; padding: 0; }
50   -button, input, select, textarea { font-size: 100%; margin: 0; vertical-align: baseline; *vertical-align: middle; }
51   -button, input { line-height: normal; *overflow: visible; }
52   -table button, table input { *overflow: auto; }
53   -button, input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; }
54   -input[type="checkbox"], input[type="radio"] { box-sizing: border-box; }
55   -input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; }
56   -input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
57   -button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
58   -textarea { overflow: auto; vertical-align: top; resize: vertical; }
59   -input:valid, textarea:valid { }
60   -input:invalid, textarea:invalid { background-color: #f0dddd; }
61   -
62   -table { border-collapse: collapse; border-spacing: 0; }
63   -td { vertical-align: top; }
64   -
65   -/* ==|== primary styles =====================================================
66   - Author: Ricardo Rauch
67   - ========================================================================== */
68   -
69   -/* 960gs */
70   -.container_4{width:98%;margin-left:1%;margin-right:1%}.grid_1,.grid_2,.grid_3,.grid_4{display:inline;float:left;position:relative;margin-left:1%;margin-right:1%}.alpha{margin-left:0}.omega{margin-right:0}.container_4 .grid_1{width:23.0%}.container_4 .grid_2{width:48.0%}.container_4 .grid_3{width:73.0%}.container_4 .grid_4{width:98.0%}.container_4 .prefix_1{padding-left:25.0%}.container_4 .prefix_2{padding-left:50.0%}.container_4 .prefix_3{padding-left:75.0%}.container_4 .suffix_1{padding-right:25.0%}.container_4 .suffix_2{padding-right:50.0%}.container_4 .suffix_3{padding-right:75.0%}.container_4 .push_1{left:25.0%}.container_4 .push_2{left:50.0%}.container_4 .push_3{left:75.0%}.container_4 .pull_1{left:-25.0%}.container_4 .pull_2{left:-50.0%}.container_4 .pull_3{left:-75.0%}.clear{clear:both;display:block;overflow:hidden;visibility:hidden;width:0;height:0}.clearfix:after{clear:both;content:' ';display:block;font-size:0;line-height:0;visibility:hidden;width:0;height:0}.clearfix{display:inline-block}* html .clearfix{height:1%}.clearfix{display:block}
71   -/* eo 960gs*/
72   -
73   -/* Vars */
74   -$color: "#4BB8D2";
75   -$blue_link: "#2fa0bb";
76   -/* eo Vars */
77   -
78   -html{ -webkit-font-smoothing:antialiased; }
79   -body {
80   - font-size: 12px;
81   - background-color: #FFFFFF;
82   -}
83   -a{text-decoration: none; font-weight: bold; color: #444}
84   -a:hover{color: #555}
85   -/* Typography */
86   -h1,h2,h3,h4,h5{font-weight: normal; color: #666}
87   -h2{margin: 1.5em 0}
88   -/* eo Typography */
89   -
90   -/* Forms */
91   -input[type="text"]:focus, input[type="password"]:focus { outline: none; }
92   -input.text{border: 1px solid #ccc; border-radius: 4px; display: block; padding: 10px}
93   -
94   -.form-row{
95   - padding: 0px 0px 10px 0px;
96   -}
97   -
98   -.form-row label{
99   - font-weight:bold;
100   - display: inline-block;
101   - padding: 0px 0px 5px 0px;
102   -}
103   -
104   -/* eo Forms */
105   -
106   -/* Tables */
107   -table {width:100%; border: 1px solid #DEE2E3; margin-bottom: 20px}
108   -table thead{
109   - -webkit-border-top-left-radius: 5px;
110   - -webkit-border-top-right-radius: 5px;
111   - -moz-border-radius-topleft: 5px;
112   - -moz-border-radius-topright: 5px;
113   - border-top-left-radius: 5px;
114   - border-top-right-radius: 5px;
115   -}
116   -table thead th{
117   - background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.076, #fefefe), to(#F6F7F8));
118   - background-image: -webkit-linear-gradient(#fefefe 7.6%, #F6F7F8);
119   - background-image: -moz-linear-gradient(#fefefe 7.6%, #F6F7F8);
120   - background-image: -o-linear-gradient(#fefefe 7.6%, #F6F7F8);
121   - margin: 0;
122   - font-weight: normal;
123   - font-weight: bold;
124   - text-align: left;
125   - color: #97A0A5;
126   -}
127   -td, th{ padding: .9em 1em; vertical-align: middle; }
128   -
129   -table thead .image{width:100px}
130   -.listed_items tr.odd:hover{background-color:#FFFFCF}
131   -/* eo Tables */
132   -
133   -/* Buttons */
134   -.grey-button{
135   - border-radius: 5px;
136   - font-size: 12px;
137   - font-weight: bold;
138   - padding: 5px 17px;
139   - border: 1px solid #999;
140   - color: #666;
141   - display: inline-block;
142   - box-shadow: 0 1px 2px rgba(0,0,0,.3);
143   - background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.076, #f7f7f7), to(#d5d5d5));
144   - background-image: -webkit-linear-gradient(#f7f7f7 7.6%, #d5d5d5);
145   - background-image: -moz-linear-gradient(#f7f7f7 7.6%, #d5d5d5);
146   - background-image: -o-linear-gradient(#f7f7f7 7.6%, #d5d5d5);
147   -}
148   -
149   -a.button, input.button {
150   - font-weight: bold;
151   - padding: 10px 20px;
152   - text-align: center;
153   - display: inline-block;
154   - border-radius: 5px;
155   - color: #578E91;
156   - font-size: 12px;
157   - text-transform: uppercase;
158   - border: 1px solid #8CE2E6;
159   - background-image: -webkit-gradient(linear, 0 0, 0 34, color-stop(0.794, #dbf5f6), to(#c5eef0));
160   - background-image: -webkit-linear-gradient(#dbf5f6 79.4%, #c5eef0);
161   - background-image: -moz-linear-gradient(#dbf5f6 79.4%, #c5eef0);
162   - background-image: -o-linear-gradient(#dbf5f6 79.4%, #c5eef0);
163   -}
164   -
165   -input.button{margin-bottom: 1.5em}
166   -
167   -.button:hover {color: rgba(0,0,0,.8)}
168   -
169   -.button.green {margin-right: 0; }
170   -
171   -.button.yellow{
172   - color: #908054;
173   - border-color: #DDCDA1;
174   - background-image: -webkit-gradient(linear, 0 0, 0 34, color-stop(0.794, #FFEFC3), to(#F3E3B7));
175   - background-image: -webkit-linear-gradient(#FFEFC3 79.4%, #F3E3B7);
176   - background-image: -moz-linear-gradient(#FFEFC3 79.4%, #F3E3B7);
177   - background-image: -o-linear-gradient(#FFEFC3 79.4%, #F3E3B7);
178   -}
179   -
180   -.button.blue{
181   - color: #417E97;
182   - border-color: #b2cdec;
183   - background-image: -webkit-gradient(linear, 0 0, 0 34, color-stop(0.794, #dbe8f6), to(#c7daf1));
184   - background-image: -webkit-linear-gradient(#dbe8f6 79.4%, #c7daf1);
185   - background-image: -moz-linear-gradient(#dbe8f6 79.4%, #c7daf1);
186   - background-image: -o-linear-gradient(#dbe8f6 79.4%, #c7daf1);
187   -}
188   -
189   -.button-small{ text-shadow: none; padding: 4px 10px; }
190   -.button-green{background: #A6B807; color: white}
191   -
192   -/* eo Buttons */
193   -
194   -/* UI Box */
195   -//.ui-box{border: 1px solid #DEDFE1; float: left; border-radius: 5px}
196   -.ui-box{float: left;}
197   -.ui-box h3{
198   - background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.076, #fefefe), to(#F6F7F8));
199   - background-image: -webkit-linear-gradient(#fefefe 7.6%, #F6F7F8);
200   - background-image: -moz-linear-gradient(#fefefe 7.6%, #F6F7F8);
201   - background-image: -o-linear-gradient(#fefefe 7.6%, #F6F7F8);
202   - background:none;
203   - margin: 0;
204   - padding: 1em;
205   - font-size: 12px;
206   - font-weight: normal;
207   - font-weight: bold;
208   - font-size: 16px;
209   - border-bottom: 1px solid #DEDFE1;
210   - -webkit-border-top-left-radius: 5px;
211   - -webkit-border-top-right-radius: 5px;
212   - -moz-border-radius-topleft: 5px;
213   - -moz-border-radius-topright: 5px;
214   - border-top-left-radius: 5px;
215   - border-top-right-radius: 5px;
216   -}
217   -
218   -.ui-box.ui-box-small h3{
219   - padding: 8px 10px;
220   - font-size: 12px;
221   -}
222   -
223   -.ui-box .data{padding: .5em 1em}
224   -
225   -.ui-box .buttons{
226   - padding: 1em;
227   - border-top:1px solid $lite_border_color;
228   -}
229   -
230   -.ui-box .buttons .button{padding: 8px 9px; font-size: 11px}
231   -
232   -.ui-box.hover:hover{box-shadow: 0 0 10px rgba(0,0,0,.1); border: 1px solid #ccc;
233   -
234   - -webkit-transition: all 200ms cubic-bezier(0.470, 0.000, 0.745, 0.715);
235   - -moz-transition: all 200ms cubic-bezier(0.470, 0.000, 0.745, 0.715);
236   - -o-transition: all 200ms cubic-bezier(0.470, 0.000, 0.745, 0.715);
237   - transition: all 200ms cubic-bezier(0.470, 0.000, 0.745, 0.715);
238   -}
239   -
240   -/* eo UI Box */
241   -
242   -/* Login Page */
243   -body.login-page{background-color: #f1f1f1; padding-top: 10%}
244   -
245   -.login-box{
246   - width: 304px;
247   - position: relative;
248   - border-radius: 5px;
249   - margin: auto;
250   - padding: 20px;
251   - background: white;
252   - box-shadow: rgba(0, 0, 0, 0.07) 0 1px 0,white 0 2px 0,rgba(0, 0, 0, 0.07) 0 3px 0,white 0 4px 0, rgba(0, 0, 0, 0.07) 0 5px 0;
253   -}
254   -
255   -.login-box .login-logo{
256   - margin: 10px 0 30px 0;
257   - display: block;
258   -}
259   -
260   -.login-box input.text{background-color: #f1f1f1; font-size: 16px; border-radius: 0; padding: 14px 10px; width: 280px}
261   -
262   -.login-box input.text.top{
263   - -webkit-border-top-left-radius: 5px;
264   - -webkit-border-top-right-radius: 5px;
265   - -moz-border-radius-topleft: 5px;
266   - -moz-border-radius-topright: 5px;
267   - border-top-left-radius: 5px;
268   - border-top-right-radius: 5px;
269   -}
270   -
271   -.login-box input.text.bottom{
272   - -webkit-border-bottom-right-radius: 5px;
273   - -webkit-border-bottom-left-radius: 5px;
274   - -moz-border-radius-bottomright: 5px;
275   - -moz-border-radius-bottomleft: 5px;
276   - border-bottom-right-radius: 5px;
277   - border-bottom-left-radius: 5px;
278   - border-top: 0;
279   - margin-bottom: 20px;
280   -}
281   -
282   -.login-box a.forgot{float: right; padding-top: 6px}
283   -
284   -/* Icons */
285   -.directory, .file{
286   - display: inline-block;
287   - margin-right: 10px;
288   - width: 14px;
289   -}
290   -
291   -.directory{
292   - background: url('images.png') no-repeat -73px -26px;
293   - height: 11px;
294   - margin-bottom: -1px;
295   -}
296   -
297   -.file{
298   - background: url('images.png') no-repeat -114px -24px;
299   - height: 16px;
300   - margin-bottom: -3px;
301   -}
302   -
303   -/* eo Icons*/
304   -
305   -/* Errors */
306   -#error_explanation{background: #ffe5eb; padding: 20px; margin-bottom: 20px; border-radius: 5px}
307   -#error_explanation h2{margin: 0; margin-bottom: 20px; color: red}
308   -#error_explanation ul li{margin-bottom: 10px}
309   -#error_explanation ul li:last-child{margin-bottom: 0}
310   -.field_with_errors {
311   - input[type="text"],
312   - input[type="password"],
313   - textarea
314   - {
315   - border: 1px solid #D30 !important;
316   - }
317   -}
318   -/* eo Errors */
319   -
320   -/* Notices */
321   -#notice{background: #dfffe1; padding: 20px; margin-bottom: 20px; border-radius: 5px; color: green; font-size: 1.3em;}
322   -/* eo Notices */
323   -
324   -/* InfoBlock */
325   -#infoblock{
326   - background: #eeeeee;
327   - padding: 20px;
328   - margin-bottom: 20px;
329   - border-radius: 5px;
330   -}
331   -/* eo InfoBlock */
332   -
333   -/* Header */
334   -header{
335   - background: #474D57 url('bg-header.png') repeat-x bottom;
336   - z-index: 10000;
337   - height: 44px;
338   - padding: 10px 2% 6px 2%;
339   -}
340   -header a:hover{color: #f1f1f1}
341   -header h1{
342   - width: 65px;
343   -}
344   -header h1.logo{margin: 0; padding: 0}
345   -header h1.logo a{
346   - background: url('images.png') no-repeat -3px -7px;
347   - width: 65px;
348   - height: 26px;
349   - margin: 5px 0;
350   - padding: 0;
351   - display: block;
352   - float: left;
353   - text-indent: -1000em;
354   -}
355   -
356   -header nav{border-radius: 4px; box-shadow: 0 1px 2px black; width: 294px; margin: auto;
357   - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #595d63), to(#31363e));
358   - background-image: -webkit-linear-gradient(#595d63 6.6%, #31363e);
359   - background-image: -moz-linear-gradient(#595d63 6.6%, #31363e);
360   - background-image: -o-linear-gradient(#595d63 6.6%, #31363e);
361   - margin-top: 2px;
362   - height:30px
363   -}
364   -header nav.shorter_nav{
365   - width: 207px;
366   -}
367   -header nav a{padding: 8px 12px 8px 34px; display: inline-block; color: #D6DADF; border-right: 1px solid #31363E; position: relative; box-shadow: 1px 0 0 rgba(255,255,255,.1); margin: 0}
368   -header nav a span{width: 20px; height: 20px; display: inline-block; background: red; position: absolute; left: 8px; top: 6px;}
369   -header nav a:last-child {border: 0; box-shadow: none}
370   -header nav a:hover, header nav a.current{
371   - background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #595d63), to(#2c2f35));
372   - background-image: -webkit-linear-gradient(#595d63 6.6%, #2c2f35);
373   - background-image: -moz-linear-gradient(#595d63 6.6%, #202227);
374   - background-image: -o-linear-gradient(#595d63 6.6%, #202227);
375   -}
376   -
377   -header nav a:active{
378   - box-shadow: 0 1px 4px rgba(0,0,0,.8) inset;
379   -}
380   -
381   -header nav a.dashboard {
382   - -webkit-border-top-left-radius: 4px;
383   - -webkit-border-bottom-left-radius: 4px;
384   - -moz-border-radius-topleft: 4px;
385   - -moz-border-radius-bottomleft: 4px;
386   - border-top-left-radius: 4px;
387   - border-bottom-left-radius: 4px;
388   -}
389   -
390   -header nav a.last_elem{
391   - -webkit-border-top-right-radius: 4px;
392   - -webkit-border-bottom-right-radius: 4px;
393   - -moz-border-radius-topright: 4px;
394   - -moz-border-radius-bottomright: 4px;
395   - border-top-right-radius: 4px;
396   - border-bottom-right-radius: 4px;
397   -}
398   -
399   -header .search{ display: inline-block; float: right; margin-right: 90px}
400   -
401   -header nav a span{width: 20px; height: 20px; display: inline-block; background: red; position: absolute; left: 8px; top: 6px;}
402   -
403   -header nav a.dashboard span{background: url('images.png') no-repeat -161px 0;}
404   -header nav a.admin span{background: url('images.png') no-repeat -184px 0;}
405   -header nav a.project span{background: url('images.png') no-repeat -209px -1px; top: 7px}
406   -header nav a.issues span{background: url('images.png') no-repeat -209px -1px; top: 7px}
407   -
408   -header .login-top{float: right; width: 180px;
409   - background-image: -webkit-gradient(linear, 0 0, 0 62, color-stop(0.032, #464c56), to(#363c45));
410   - background-image: -webkit-linear-gradient(#464c56 3.2%, #363c45);
411   - background-image: -moz-linear-gradient(#464c56 3.2%, #363c45);
412   - background-image: -o-linear-gradient(#464c56 3.2%, #363c45);
413   - padding: 0 10px;
414   - height: 44px;
415   -}
416   -header .login-top a{display: block;}
417   -header .login-top a.pic{float: left; margin-right: 10px;
418   - img{ height: 36px; width: 36px; border: 1px solid black}
419   -}
420   -header .login-top a.username{margin-bottom: 5px}
421   -header .login-top a.logout{color: #ccc}
422   -header{margin-bottom: 0; clear: both; position:relative;}
423   -
424   -.page-title{background-color: #f1f1f1;display: block; float: left; clear: both; width: 98%; padding: 1% 1%; border-bottom: 1px solid #ccc; box-shadow: 0 -1px 0 white inset; margin-bottom: 1.5em}
425   -.page-title h1{font-size: 20px; width: 400px; margin: 0; padding-top: 8px }
426   -.page-title a.grey-button{float: right;}
427   -.right{float: right;}
428   -
429   -/* Account box */
430   -header .account-box{
431   - position: absolute;
432   - right: 0;
433   - top: 8px;
434   - z-index: 10000;
435   - width: 128px;
436   - font-size: 11px;
437   - float: right;
438   - display: block;
439   - cursor: pointer;}
440   -header .account-box img{
441   - border-radius: 4px;
442   - right: 20px;
443   - position: absolute;
444   - width: 33px; height: 33px;
445   - display: block; top:0;}
446   -header .account-box img:after{
447   - content: " ";
448   - display: block;
449   - position: absolute;
450   - top: 0;
451   - right: 0;
452   -left: 0;
453   - bottom: 0;
454   -float: right;
455   - border-radius: 5px;
456   - border: 1px solid rgba(255, 255, 255, .1);
457   - border-bottom: 0;
458   - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255, 255, 255, .15)), to(rgba(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, .1)), color-stop(0.501, rgba(255, 255, 255, 0)), color-stop(1, rgba(255, 255, 255, 0)));
459   - background: -moz-linear-gradient(top, rgba(255, 255, 255, .15), rgba(0, 0, 0, .25)), -moz-linear-gradient(left top, rgba(255, 255, 255, 0), rgba(255, 255, 255, .1) 50%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0));
460   - background: linear-gradient(top, rgba(255, 255, 255, .15), rgba(0, 0, 0, .25)), linear-gradient(left top, rgba(255, 255, 255, 0), rgba(255, 255, 255, .1) 50%, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0));
461   - -webkit-background-origin: border-box;
462   - -moz-background-origin: border;
463   - background-origin: border-box;
464   -}
465   -
466   -.account-box.hover{height: 138px;}
467   -
468   -.account-box:hover > .account-links{display: block;}
469   -header .account-links{
470   - background: #79C3E0; display: none; border-radius: 5px; width: 100px; margin-top: 0; float: right; box-shadow: 0 1px 1px rgba(0,0,0,.2); position:relative;}
471   -header .account-links:before {
472   - content: ".";
473   - width:0;
474   - height:0;
475   - position:absolute;
476   - border:5px solid transparent;
477   - border-color:rgba(255,255,255,0);
478   - border-bottom-color:#fafafa;
479   - text-indent:-9999px;
480   - top:-10px;
481   - line-height:0;
482   - right:10px;
483   - z-index:10;
484   -}
485   -
486   -/* Inspired by http://maxvoltar.com/temp/nowplaying/ */
487   -header .account-links{background: white; display: none; z-index: 100000; border-radius: 5px; width: 100px; position: absolute; right: 20px; top: 46px; margin-top: 0; float: right; box-shadow: 0 1px 1px rgba(0,0,0,.2); }
488   -header .account-links a{color: #666; padding: 6px 10px; display: block; text-shadow: none; border-bottom: 1px solid #eee}
489   -header .account-links a:hover{
490   - background: #3aacec;
491   - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#39acec), to(#279ada), color-stop(.05, #4cbefe));
492   - background: -moz-linear-gradient(top, #39acec, #4cbefe 5%, #279ada);
493   - background: linear-gradient(top, #39acec, #4cbefe 5%, #279ada);
494   - color: #fff;
495   - text-shadow: #1488c8 0 -1px 0;
496   -}
497   -.account-box.hover .arrow-up{top: 41px; right: 6px; position: absolute}
498   -header .account-links a:first-child{
499   - -webkit-border-top-left-radius: 5px;
500   - -webkit-border-top-right-radius: 5px;
501   - -moz-border-radius-topleft: 5px;
502   - -moz-border-radius-topright: 5px;
503   - border-top-left-radius: 5px;
504   - border-top-right-radius: 5px;
505   -}
506   -
507   -header .account-links a:last-child{
508   - -webkit-border-bottom-right-radius: 5px;
509   - -webkit-border-bottom-left-radius: 5px;
510   - -moz-border-radius-bottomright: 5px;
511   - -moz-border-radius-bottomleft: 5px;
512   - border-bottom-right-radius: 5px;
513   - border-bottom-left-radius: 5px;
514   - border-bottom: 0;
515   -}
516   -
517   -.big-message{
518   - background-image: -webkit-gradient(linear, 0 48, 0 0, color-stop(0.041, #eccb40), to(#ffee4d));
519   - background-image: -webkit-linear-gradient(90deg, #eccb40 4.1%, #ffee4d);
520   - background-image: -moz-linear-gradient(90deg, #eccb40 4.1%, #ffee4d);
521   - background-image: -o-linear-gradient(90deg, #eccb40 4.1%, #ffee4d);
522   - text-align: center;
523   - font-weight: bold;
524   - padding: 10px 20px;
525   - text-shadow: 0 1px 0 rgba(255,255,255,.3);
526   - color: #333;
527   - color: rgba(0,0,0,.7);
528   - font-size: 14px;
529   - box-shadow: 0 1px 2px rgba(0,0,0,.7);
530   - z-index: 100000;
531   - margin-bottom: 2px;
532   -}
533   -
534   -.big-message a{color: #000; text-decoration: underline;}
535   -
536   -.big-message.error{
537   - background-color: #722523;
538   - background-image: -webkit-gradient(linear, 0 49, 0 0, color-stop(0.04, #722523), to(#ad4846));
539   - background-image: -webkit-linear-gradient(90deg, #9b403f 4%, #c16765);
540   - background-image: -moz-linear-gradient(90deg, #722523 4%, #ad4846);
541   - background-image: -o-linear-gradient(90deg, #722523 4%, #ad4846);
542   - color: #2E0D0C;
543   -}
544   -
545   -.big-message.success{
546   - background-color: #7a9339;
547   - background-image: -webkit-gradient(linear, 0 48, 0 0, color-stop(0.062, #7a9339), to(#93ae46));
548   - background-image: -webkit-linear-gradient(90deg, #7a9339 6.2%, #93ae46);
549   - background-image: -moz-linear-gradient(90deg, #7a9339 6.2%, #93ae46);
550   - background-image: -o-linear-gradient(90deg, #7a9339 6.2%, #93ae46)
551   -}
552   -
553   -.big-message.success{
554   - background-color: #7a9339;
555   - background-image: -webkit-gradient(linear, 0 48, 0 0, color-stop(0.062, #7a9339), to(#93ae46));
556   - background-image: -webkit-linear-gradient(90deg, #7a9339 6.2%, #93ae46);
557   - background-image: -moz-linear-gradient(90deg, #7a9339 6.2%, #93ae46);
558   - background-image: -o-linear-gradient(90deg, #7a9339 6.2%, #93ae46)
559   -}
560   -
561   -.big-message.notice{
562   - background-image: -webkit-gradient(linear, 0 49, 0 0, color-stop(0.061, #447790), color-stop(0.897, #5da2bf));
563   - background-image: -webkit-linear-gradient(90deg, #447790 6.1%, #5da2bf 89.7%);
564   - background-image: -moz-linear-gradient(90deg, #447790 6.1%, #5da2bf 89.7%);
565   - background-image: -o-linear-gradient(90deg, #447790 6.1%, #5da2bf 89.7%)
566   -}
567   -
568   -/* eo Account Box */
569   -input.search-input{
570   - float: left;
571   - text-shadow: none;
572   - width: 116px;
573   - background-image: url('icon-search.png') ;
574   - background-repeat: no-repeat;
575   - background-position: 10px;
576   - border-radius: 4px;
577   - border: 1px solid #AAA;
578   - background-color: #FFF;
579   - padding: 5px;
580   - padding-left: 26px;
581   - margin-top: 2px;
582   - margin-right: 10px;
583   -}
584   -/*input.search-input:focus{ background-color: white; width: 216px;}*/
585   -input.search-input::-webkit-input-placeholder {color: #666}
586   -/* eo Header */
587   -
588   -h2.icon{position: relative; padding-left: 40px; float: left; }
589   -/*h2 a{font-weight: normal;}*/
590   -h2.icon span{background: #E3E5EA url('images.png'); height: 32px; width: 32px; left: 0; top: -5px; border-radius: 4px; display: inline-block; position: absolute}
591   -
592   -/* Dashboard Page */
593   -html, body { height: 100%; }
594   -
595   -
596   -
597   -
598   -.grey-button.right{margin-top: 20px}
599   -
600   -/* Project Page */
601   -/* eo New Project Page */
602   -
603   -
604   -/* eo Project Page */
605   -
606   -/* Projects Page */
607   -body.projects-page h2.icon span{background-position: -31px -70px;}
608   -body.projects-page .project-box.ui-box .data .repository {margin-bottom: 20px}
609   -body.projects-page .project-box.ui-box .data .title span{ font-weight: bold;}
610   -body.projects-page .project-box{width: 100%; margin-bottom: 3em}
611   -body.projects-page .browse-code{margin-right: 10px}
612   -/* eo Projects Page */
613   -
614   -/* ==|== non-semantic helper classes ======================================== */
615   -.ir { display: block; border: 0; text-indent: -999em; overflow: hidden; background-color: transparent; background-repeat: no-repeat; text-align: left; direction: ltr; }
616   -.ir br { display: none; }
617   -.hidden { display: none !important; visibility: hidden; }
618   -.visuallyhidden { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
619   -.visuallyhidden.focusable:active, .visuallyhidden.focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; }
620   -.invisible { visibility: hidden; }
621   -.clearfix:before, .clearfix:after { content: ""; display: table; }
622   -.clearfix:after { clear: both; }
623   -.clearfix { zoom: 1; }
624   -
625   -/* ==|== media queries ====================================================== */
626   -
627   -@media only screen and (min-width: 480px) {
628   -
629   -}
630   -
631   -@media only screen and (min-width: 768px) {
632   -
633   -}
634   -
635   -/* ==|== print styles ======================================================= */
636   -
637   -@media print {
638   - * { background: transparent !important; color: black !important; text-shadow: none !important; filter:none !important; -ms-filter: none !important; }
639   - a, a:visited { text-decoration: underline; }
640   - a[href]:after { content: " (" attr(href) ")"; }
641   - abbr[title]:after { content: " (" attr(title) ")"; }
642   - .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }
643   - pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
644   - thead { display: table-header-group; }
645   - tr, img { page-break-inside: avoid; }
646   - img { max-width: 100% !important; }
647   - @page { margin: 0.5cm; }
648   - p, h2, h3 { orphans: 3; widows: 3; }
649   - h2, h3 { page-break-after: avoid; }
650   -}
651   -
652   -body, button, input, select, textarea {
653   - font-family: "helvetica", "arial", "freesans", "clean", sans-serif;
654   -}
655   -
656   -/** FORM INPUTS **/
657   -.new_merge_request,
658   -.edit_merge_request,
659   -.user_new,
660   -.new_key,
661   -.new_issue,
662   -.new_note,
663   -.edit_user,
664   -.edit_issue,
665   -.new_project,
666   -.new_snippet,
667   -.edit_snippet,
668   -.edit_project {
669   - input[type='text'],
670   - input[type='email'],
671   - input[type='password'],
672   - textarea {
673   - width:400px;
674   - padding:8px;
675   - font-size:14px;
676   - @include round-borders-all(4px);
677   - }
678   -}
679   -
680   -.text_field {
681   - width:400px;
682   - padding:8px;
683   - font-size:14px;
684   - @include round-borders-all(4px);
685   -}
686   -
687   -.input_button {
688   - padding:8px;
689   - font-size:14px;
690   - cursor:pointer;
691   - background-color: #F5F5F5;
692   - border-color: #EEEEEE #DEDEDE #DEDEDE #EEEEEE;
693   - border-right: 1px solid #DEDEDE;
694   - border-style: solid;
695   - border-width: 1px;
696   -}
697   -
698   -/** FLASH **/
699   -#flash_container {
700   - height:45px;
701   - position:fixed;
702   - z-index:10001;
703   - top:0px;
704   - width:100%;
705   - margin-bottom:15px;
706   - overflow:hidden;
707   - background:white;
708   - cursor:pointer;
709   - border-bottom:1px solid #777;
710   -
711   - h4 {
712   - color:#444;
713   - font-size:22px;
714   - padding-top:5px;
715   - margin:2px;
716   - }
717   -}
718   -
719   -
720   -.errors_holder {
721   - background:#D30;
722   - color:#fff;
723   - @include round-borders-all(4px);
724   - border:1px solid #a30;
725   - padding:5px;
726   - list-style:none;
727   - font-weight: bold;
728   - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
729   -
730   - li {
731   - padding:10px;
732   - }
733   -}
734   -
735   -.notice_holder {
736   - background:#DDF4FB;
737   - color:#444;
738   - border:1px solid #C6EDF9;
739   - @include round-borders-all(4px);
740   - padding:5px;
741   - list-style:none;
742   - font-weight: bold;
743   - text-shadow: 0 -1px 0 rgba(255, 255, 255, 0.25);
744   -
745   - li {
746   - padding:10px;
747   - }
748   -}
749   -
750   -.alert_holder {
751   - background:#FDF5D9;
752   - color:#444;
753   - border:1px solid #FCEEC1;
754   - @include round-borders-all(4px);
755   - padding:5px;
756   - list-style:none;
757   - font-weight: bold;
758   - text-shadow: 0 -1px 0 rgba(255, 255, 255, 0.25);
759   -
760   - li {
761   - padding:10px;
762   - }
763   -}
764   -
765   -.help_content {
766   - margin:20px;
767   - margin-top:71px;
768   -
769   - h2 {
770   - margin:0;
771   - padding:0;
772   - }
773   -
774   - .menu {
775   - float:left;
776   - width:20%;
777   -
778   - .active {
779   - color: $active_bd_color;
780   - }
781   - }
782   -
783   - .content {
784   - float:right;
785   - width:78%;
786   - }
787   -
788   - .bash {
789   - @include round-borders-all(4px);
790   - background:#eee;
791   - padding:5px;
792   - //overflow-x:scroll;
793   - pre{
794   - padding:0;
795   - line-height:2.0;
796   - margin:0;
797   - font-family: 'Courier New', 'andale mono','lucida console',monospace;
798   - color: #333;
799   - text-align:left;
800   - }
801   - }
802   -}
app/assets/stylesheets/tags.css.css
... ... @@ -1,42 +0,0 @@
1   -.tags-list {
2   - padding : 0px 10px 10px 10px;
3   -
4   -}
5   -
6   -.tags-list a {
7   - display: inline-block;
8   - padding: 8px 11px 8px 11px;
9   - margin: 1px 5px 0px 0px;
10   - border-radius: 4px;
11   - border: 1px solid #72bbdf;
12   - background-color: #72bbdf;
13   - color: #0f326d;
14   - font-weight: bold;
15   - font-size: 14px;
16   -}
17   -
18   -.small-tags a{
19   - font-size: 9px;
20   -
21   - display: inline-block;
22   - padding: 2px 3px 1px 3px;
23   - margin: 0px 3px 0px 0px;
24   - border-radius: 2px;
25   - background-color: #72bbdf;
26   - color: #FFF;
27   - text-shadow: none;
28   - font-weight: bold;
29   -}
30   -
31   -.medium-tags a{
32   - font-size: 12px;
33   -
34   - display: inline-block;
35   - padding: 3px 4px 2px 4px;
36   - margin: 0px 7px 8px 0px;
37   - border-radius: 3px;
38   - background-color: #72bbdf;
39   - color: #FFF;
40   - text-shadow: none;
41   - font-weight: bold;
42   -}
app/assets/stylesheets/top_panel.scss
... ... @@ -1,146 +0,0 @@
1   -.main_links {
2   - width:130px;
3   - float:left;
4   -
5   - a {
6   - float:left;
7   - }
8   -}
9   -
10   -.dashboard_links {
11   - padding:7px;
12   - float:left;
13   - a {
14   - margin: 0 14px;
15   - float: left;
16   - font-size: 14px;
17   -
18   - &.active {
19   - color:$active_link_color;
20   - }
21   - &:hover {
22   - color:$active_link_color;
23   - }
24   - }
25   -}
26   -
27   -.top-tabs {
28   - margin: 0;
29   - padding: 5px;
30   - font-size: 14px;
31   - padding-bottom:10px;
32   - margin-bottom:20px;
33   - height:26px;
34   - border-bottom:1px solid #ccc;
35   -
36   - .tab {
37   - font-weight: bold;
38   - background:none;
39   - padding: 10px;
40   - float:left;
41   - padding-left:0px;
42   - padding-right:40px;
43   -
44   - &.active {
45   - color: $active_link_color;
46   - }
47   - }
48   -}
49   -
50   -body header {
51   - position:absolute;
52   - width:100%;
53   - padding:0;
54   - margin:0;
55   - top:0;
56   - left:0;
57   - background: #999; /* for non-css3 browsers */
58   - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFF', endColorstr='#EAEAEA'); /* for IE */
59   - background: -webkit-gradient(linear, left top, left bottom, from(#FFFFFF), to(#EAEAEA)); /* for webkit browsers */
60   - background: -moz-linear-gradient(top, #FFFFFF, #EAEAEA); /* for firefox 3.6+ */
61   - background: -o-linear-gradient(top, #FFFFFF, #EAEAEA); /* for firefox 3.6+ */
62   - border-bottom: 1px solid #ccc;
63   -
64   - height:50px;
65   -
66   - .wrapper {
67   - margin:auto;
68   - width:$app_width;
69   - position:relative;
70   -
71   - .top_panel_content {
72   - padding:10px $app_padding;
73   - }
74   - }
75   -
76   - .project_name {
77   - float:left;
78   - width:235px;
79   - margin-right:30px;
80   - font-size:16px;
81   - font-weight:bold;
82   - padding:8px;
83   - color:#333;
84   - }
85   -
86   - .git_url_wrapper {
87   - padding:0px;
88   - margin:0px;
89   - float:left;
90   -
91   - .git-url {
92   - padding:0px;
93   - margin:0px;
94   - font-size: 12px;
95   -
96   - margin-right:10px;
97   - border-radius: 4px;
98   - -moz-border-radius: 4px;
99   -
100   -
101   - color: #666;
102   - border: 1px solid #AAA;
103   - padding: 0 10px 0 30px;
104   - background: transparent url('images.png') no-repeat 8px -42px;
105   - width: 160px;
106   - height:26px;
107   - }
108   - }
109   -}
110   -
111   -.top_panel_holder .chzn-container {
112   - position:relative;
113   -
114   - .chzn-drop {
115   - margin:7px 0;
116   - border: 1px solid #CCC;
117   - min-width: 300px;
118   -
119   - .chzn-results {
120   - max-height:300px;
121   - }
122   - }
123   -
124   - .chzn-single {
125   - background:transparent;
126   - -moz-border-radius: 4px;
127   - border-radius: 4px;
128   -
129   - div {
130   - background:transparent;
131   - border-left:none;
132   - }
133   -
134   - span {
135   - font-weight: normal;
136   - }
137   - }
138   -}
139   -
140   -.rss-icon {
141   - margin:0 15px;
142   - padding:3px;
143   - border:1px solid #AAA;
144   - border-radius:3px;
145   - float:left;
146   -}
app/assets/stylesheets/tree.scss
1   -#tree-breadcrumbs {
2   - div {
3   - margin:0;
4   - margin-bottom:20px;
  1 +#tree-holder {
  2 + #tree-content-holder {
5 3 float:left;
6   - font-size:14px;
  4 + width:100%;
  5 + }
  6 + #tree-readme-holder {
  7 + float:left;
  8 + width:100%;
  9 + .readme {
  10 + @include round-borders-all(4px);
  11 + padding:4px 15px;
  12 + background: #F7F7F7;
  13 + }
7 14 }
8   -}
9 15  
10   -.tree_progress {
11   - float:left;
12   - width:16px;
13   - height:16px;
14   - margin:2px 6px;
15   - &.loading {
16   - background-position: 0px 0px;
17   - background: url("ajax-loader-facebook.gif") no-repeat;
  16 + .tree_progress {
  17 + display:none;
  18 + margin:20px;
  19 + &.loading {
  20 + display:block;
  21 + }
18 22 }
19   -}
20 23  
21 24  
22   -/** FILE CONTENT VIEW **/
23   -.view_file_content{
24   - .old_line, .new_line {
25   - background:#ECECEC;
26   - color:#777;
27   - width:15px;
28   - float:left;
29   - padding: 0px 10px;
30   - border-right: 1px solid #ccc;
31   - }
32   - .old_line{
33   - display:none;
  25 + /** FILE CONTENT VIEW **/
  26 + .view_file_content{
  27 + .old_line, .new_line {
  28 + background:#ECECEC;
  29 + color:#777;
  30 + width:15px;
  31 + float:left;
  32 + padding: 0px 10px;
  33 + border-right: 1px solid #ccc;
  34 + }
  35 + .old_line{
  36 + display:none;
  37 + }
34 38 }
35   -}
36 39  
37   -.view_file .view_file_header,
38   -.diff_file .diff_file_header {
39   - background-image: -webkit-gradient(linear, 0 0, 0 26, color-stop(0.076, #fefefe), to(#F6F7F8));
40   - background-image: -webkit-linear-gradient(#fefefe 7.6%, #F6F7F8);
41   - background-image: -moz-linear-gradient(#fefefe 7.6%, #F6F7F8);
42   - background-image: -o-linear-gradient(#fefefe 7.6%, #F6F7F8);
  40 + .view_file .view_file_header,
  41 + .diff_file .diff_file_header {
  42 + background:#f5f5f5;
43 43 margin: 0;
44 44 font-weight: normal;
45 45 font-weight: bold;
46 46 text-align: left;
47 47 color: #666;
48   - border-bottom: 1px solid #DEE2E3;
  48 + border-bottom: 1px solid #ccc;
49 49 padding: 7px 10px;
50 50  
51 51 .mode_text,
52 52 .file_icon {
53   - margin-right:15px;
54   - padding-right:15px;
55   - border-right:1px solid $lite_border_color;
56   - float:left;
57 53 color:#aaa;
58 54 }
  55 + }
59 56  
60   - .file_icon {
61   - padding-left:15px;
  57 + .view_file {
  58 + border:1px solid #CCC;
  59 + margin-bottom:1em;
  60 +
  61 + .view_file_content {
  62 + background:#fff;
  63 + color:#514721;
  64 + font-size: 11px;
62 65 }
63   -}
  66 + .view_file_content_image {
  67 + background:#eee;
  68 + text-align:center;
  69 + img {
  70 + padding:100px;
  71 + max-width:300px;
  72 + }
  73 + }
  74 + }
64 75  
65   -.view_file {
66   - border:1px solid #CCC;
67   - margin-bottom:1em;
68   -
69   - .view_file_content {
70   - background:#fff;
71   - color:#514721;
72   - font-size: 11px;
73   - }
74   - .view_file_content_image {
75   - background:#eee;
76   - text-align:center;
77   - img {
78   - padding:100px;
79   - max-width:300px;
  76 + td.code {
  77 + width: 100%;
  78 + .highlight {
  79 + margin-left: 55px;
  80 + overflow:auto;
  81 + overflow-y:hidden;
80 82 }
81 83 }
82   -}
  84 + .highlight pre {
  85 + white-space: pre;
  86 + word-wrap:normal;
  87 + }
83 88  
84   -td.code {
85   - width: 100%;
86   - .highlight {
87   - margin-left: 55px;
88   - overflow:auto;
89   - overflow-y:hidden;
90   - border-left: 1px solid #DEE2E3;
91   - background: white;
  89 + table.highlighttable {
  90 + border: none;
92 91 }
93   -}
94   -.highlight pre {
95   - white-space: pre;
96   - word-wrap:normal;
97   -}
  92 + body.project-page table.highlighttable td { border: none }
  93 + table.highlighttable tr:hover { background:none;}
98 94  
99   -table.highlighttable {
100   - border: none;
101   - background: #F7F7F7;
102   -}
103   -body.project-page table.highlighttable td { border: none }
104   -table.highlighttable tr:hover { background:none;}
  95 + table.highlighttable pre{
  96 + line-height:16px !important;
  97 + font-size:12px !important;
  98 + }
105 99  
106   -table.highlighttable pre{
107   - line-height:16px !important;
108   - font-size:12px !important;
109   -}
  100 + table.highlighttable .linenodiv pre {
  101 + text-align: right;
  102 + padding-right: 4px;
  103 + color:#888;
  104 + }
110 105  
111   -table.highlighttable .linenodiv pre {
112   - text-align: right;
113   - padding-right: 4px;
114   - color:#888;
115   -}
  106 + .tree-item {
  107 + &:hover {
  108 + background: $hover;
  109 + cursor:pointer;
  110 + }
  111 +
  112 +
  113 + .tree-item-file-name {
  114 + font-weight:bold;
  115 + a {
  116 + color:$style_color;
  117 + }
  118 +
  119 + img {
  120 + position: relative;
  121 + top: 2px;
  122 + }
  123 + }
  124 + }
  125 +
  126 + ul.breadcrumb {
  127 + background:white;
  128 + border:none;
  129 +
  130 + a {
  131 + color:#666;
  132 + font-weight:bold;
  133 + font-size:14px;
  134 + }
  135 + }
  136 +
  137 + #tree-slider {
  138 + @include shade;
  139 +
  140 + td {
  141 + padding:7px;
  142 + border-color:#f1f1f1;
  143 + }
  144 +
  145 + th {
  146 + background:#f5f5f5;
  147 + }
  148 + }
  149 +
  150 + .tree-commit-link {
  151 + color:#333;
  152 + }
  153 +
  154 + #tree-content-holder .view_file{
  155 + @include shade;
  156 + }
  157 +
  158 + #tree-readme-holder .readme {
  159 + @include shade;
  160 + margin-bottom:20px;
  161 + }
  162 +
  163 + a.tree-commit-link {
  164 + color: #666;
  165 + &:hover {
  166 + text-decoration: underline;
  167 + }
  168 + }
116 169  
117   -.tree-item {
118   - &:hover {
119   - background: #FFFFCF;
  170 + .arrow {
  171 + background: url("images.png") no-repeat -85px -77px;
  172 + width: 19px;
  173 + height: 16px;
  174 + float: left;
  175 + position: relative;
  176 + left: -10px;
120 177 }
121 178 }
... ...
app/assets/stylesheets/ui_basic.scss 0 → 100644
... ... @@ -0,0 +1,309 @@
  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_basic {
  12 + /*
  13 + * Common styles
  14 + *
  15 + */
  16 + a {
  17 + color: $link_color;
  18 + &:hover {
  19 + text-decoration:none;
  20 + color: $style_color;
  21 + }
  22 + }
  23 +
  24 +
  25 + /*
  26 + * Application Header
  27 + *
  28 + */
  29 + header {
  30 + width:100%;
  31 + padding:0;
  32 + margin:0;
  33 + top:1px;
  34 + left:0;
  35 + background: #F1F1F1; /* for non-css3 browsers */
  36 + border-bottom: 1px solid #ccc;
  37 + box-shadow: 0 -1px 0 white inset;
  38 + -moz-box-shadow: 0 -1px 0 white inset;
  39 + -webkit-box-shadow: 0 -1px 0 white inset;
  40 + z-index:10;
  41 + height:60px;
  42 +
  43 + .app_logo {
  44 + width:230px;
  45 + float:left;
  46 +
  47 + a {
  48 + float:left;
  49 +
  50 + h1 {
  51 + float:left;
  52 + margin-left:5px;
  53 + font-size:20px;
  54 + line-height:34px;
  55 + font-weight:bold;
  56 + color:#aaa;
  57 + text-shadow: 0 1px 1px #FFF;
  58 + }
  59 +
  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 + }
  84 + }
  85 + }
  86 + }
  87 + .wrapper {
  88 + margin:auto;
  89 + min-width:$min_app_width;
  90 + max-width:$max_app_width;
  91 + position:relative;
  92 + padding:15px 0;
  93 +
  94 + .top_panel_content {
  95 + margin:0 $app_padding;
  96 + }
  97 + }
  98 +
  99 + .project_name {
  100 + float:left;
  101 + width:400px;
  102 + margin:0;
  103 + margin-right:30px;
  104 + font-size:20px;
  105 + line-height:34px;
  106 + font-weight:bold;
  107 + color:$style_color;
  108 + text-shadow: 0 1px 1px #FFF;
  109 + }
  110 +
  111 + .git_url_wrapper {
  112 + padding:0px;
  113 + margin:0px;
  114 + float:left;
  115 +
  116 + .git-url {
  117 + padding:0px;
  118 + margin:0px;
  119 + font-size: 12px;
  120 + margin-right:10px;
  121 + border-radius: 4px;
  122 + -moz-border-radius: 4px;
  123 + color: #666;
  124 + border: 1px solid #AAA;
  125 + padding: 0 10px 0 30px;
  126 + background: transparent url('images.png') no-repeat 8px -42px;
  127 + width: 260px;
  128 + height:26px;
  129 + }
  130 + }
  131 +
  132 + /* Account box */
  133 + .account-box {
  134 + position: absolute;
  135 + right: 0;
  136 + top: 13px;
  137 + z-index: 10000;
  138 + width: 128px;
  139 + font-size: 11px;
  140 + float: right;
  141 + display: block;
  142 + cursor: pointer;
  143 + img {
  144 + border-radius: 4px;
  145 + right: 20px;
  146 + position: absolute;
  147 + width: 33px;
  148 + height: 33px;
  149 + display: block;
  150 + top: 0;
  151 + &:after {
  152 + content: " ";
  153 + display: block;
  154 + position: absolute;
  155 + top: 0;
  156 + right: 0;
  157 + left: 0;
  158 + bottom: 0;
  159 + float: right;
  160 + border-radius: 5px;
  161 + border: 1px solid rgba(255, 255, 255, 0.1);
  162 + border-bottom: 0;
  163 + 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)));
  164 + 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));
  165 + 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));
  166 + -webkit-background-origin: border-box;
  167 + -moz-background-origin: border;
  168 + background-origin: border-box; } } }
  169 +
  170 + .account-box {
  171 + &.hover {
  172 + height: 138px; }
  173 + &:hover > .account-links {
  174 + display: block; } }
  175 +
  176 + .account-links {
  177 + background: #79C3E0;
  178 + display: none;
  179 + border-radius: 5px;
  180 + width: 100px;
  181 + margin-top: 0;
  182 + float: right;
  183 + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
  184 + position: relative;
  185 + &:before {
  186 + content: ".";
  187 + width: 0;
  188 + height: 0;
  189 + position: absolute;
  190 + border: 5px solid transparent;
  191 + border-color: rgba(255, 255, 255, 0);
  192 + border-bottom-color: #333;
  193 + text-indent: -9999px;
  194 + top: -10px;
  195 + line-height: 0;
  196 + right: 10px;
  197 + z-index: 10; }
  198 + background: #333;
  199 + display: none;
  200 + z-index: 100000;
  201 + border-radius: 5px;
  202 + width: 100px;
  203 + position: absolute;
  204 + right: 20px;
  205 + top: 46px;
  206 + margin-top: 0;
  207 + float: right;
  208 + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
  209 + a {
  210 + color: #EEE;
  211 + padding: 6px 10px;
  212 + display: block;
  213 + text-shadow: none;
  214 + border-bottom: 1px solid #555;
  215 + &:hover {
  216 + background: #444; } } }
  217 +
  218 + .account-box.hover .arrow-up {
  219 + top: 41px;
  220 + right: 6px;
  221 + position: absolute; }
  222 +
  223 + .account-links a {
  224 + &:first-child {
  225 + -webkit-border-top-left-radius: 5px;
  226 + -webkit-border-top-right-radius: 5px;
  227 + -moz-border-radius-topleft: 5px;
  228 + -moz-border-radius-topright: 5px;
  229 + border-top-left-radius: 5px;
  230 + border-top-right-radius: 5px; }
  231 + &:last-child {
  232 + -webkit-border-bottom-right-radius: 5px;
  233 + -webkit-border-bottom-left-radius: 5px;
  234 + -moz-border-radius-bottomright: 5px;
  235 + -moz-border-radius-bottomleft: 5px;
  236 + border-bottom-right-radius: 5px;
  237 + border-bottom-left-radius: 5px;
  238 + border-bottom: 0; } }
  239 +
  240 + }
  241 + /*
  242 + * End of Application Header
  243 + *
  244 + */
  245 +
  246 + /*
  247 + * Main Menu of Application
  248 + *
  249 + */
  250 + nav.main_menu {
  251 + overflow:hidden;
  252 + border-radius: 4px;
  253 + margin: auto;
  254 + margin:30px $app_padding;
  255 + background:#eee;
  256 + border:1px solid #ccc;
  257 + height:38px;
  258 + background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
  259 + background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
  260 + background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
  261 + background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
  262 + @include shade;
  263 + .count {
  264 + color:#aaa;
  265 + margin-left:3px;
  266 + }
  267 + .label {
  268 + background:$hover;
  269 + text-shadow:none;
  270 + color:$style_color;
  271 + }
  272 + a {
  273 + font-weight:bold;
  274 + &:first-child{
  275 + -webkit-border-top-left-radius: 4px;
  276 + -webkit-border-bottom-left-radius: 4px;
  277 + -moz-border-radius-topleft: 4px;
  278 + -moz-border-radius-bottomleft: 4px;
  279 + border-top-left-radius: 4px;
  280 + border-bottom-left-radius: 4px;
  281 + }
  282 + padding: 10px 25px;
  283 + display: inline-block;
  284 + color: $style_color;
  285 + border-right: 1px solid #d5d5d5;
  286 + position: relative;
  287 + box-shadow: 1px 0 0 rgba(255, 255, 255, 0.1);
  288 + margin: 0;
  289 + float:left;
  290 + text-shadow:0 1px 1px white;
  291 + &.home {
  292 + background: url(home_icon.PNG) no-repeat center center;
  293 + text-indent:-9999px;
  294 + min-width:40px;
  295 + img {
  296 + position:relative;
  297 + top:4px;
  298 + }
  299 + }
  300 + &.current {
  301 + background-color:#DDD;
  302 + }
  303 + }
  304 + }
  305 + /*
  306 + * End of Main Menu
  307 + *
  308 + */
  309 +}
... ...
app/assets/stylesheets/ui_mars.scss 0 → 100644
... ... @@ -0,0 +1,337 @@
  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-image:url("icon-search.png");
  45 + float: right;
  46 + text-shadow: none;
  47 + width: 116px;
  48 + background-image: url("icon-search.png");
  49 + background-repeat: no-repeat;
  50 + background-position: 10px;
  51 + border-radius: 100px;
  52 + border: 1px solid rgba(0, 0, 0, 0.7);
  53 + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2), 0 2px 2px rgba(0, 0, 0, 0.4) inset;
  54 + background-color: #D2D5DA;
  55 + background-color: rgba(255, 255, 255, 0.5);
  56 + padding: 5px;
  57 + padding-left: 26px;
  58 + margin-right: 50px;
  59 +
  60 + &:focus {
  61 + background-color: white;
  62 + width: 166px;
  63 + }
  64 + }
  65 + .search-input::-webkit-input-placeholder {
  66 + color: #666;
  67 + }
  68 + .app_logo {
  69 + width:230px;
  70 + float:left;
  71 + position:relative;
  72 + top:-4px;
  73 +
  74 + a {
  75 + float:left;
  76 +
  77 + h1 {
  78 +
  79 + background: url('images.png') no-repeat -3px -7px;
  80 + width: 65px;
  81 + height: 26px;
  82 + margin: 5px 0;
  83 + padding: 0;
  84 + display: block;
  85 + float: left;
  86 + text-indent: -1000em;
  87 +
  88 + }
  89 +
  90 + &.home {
  91 + img {
  92 + display:none
  93 +
  94 + }
  95 + }
  96 + &.admin_link {
  97 + width:16px;
  98 + height:16px;
  99 + padding: 5px;
  100 + border: 1px solid #888;
  101 + border-radius: 4px;
  102 + margin: 0px;
  103 + background:#474D57 ;
  104 + margin-left:20px;
  105 + margin-top:4px;
  106 + &:hover {
  107 + background:#f7f7f7;
  108 + }
  109 + img {
  110 + width:16px;
  111 + }
  112 + }
  113 + }
  114 + }
  115 + .wrapper {
  116 + margin:auto;
  117 + min-width:$min_app_width;
  118 + max-width:$max_app_width;
  119 + position:relative;
  120 + padding:15px 0;
  121 +
  122 + .top_panel_content {
  123 + margin:0 $app_padding;
  124 + }
  125 + }
  126 +
  127 + .project_name {
  128 + float:left;
  129 + width:400px;
  130 + margin:0;
  131 + margin-right:30px;
  132 + font-size:20px;
  133 + line-height:34px;
  134 + font-weight:bold;
  135 + color:#fff;
  136 + text-shadow: 0 1px 1px #111;
  137 + }
  138 +
  139 + .git_url_wrapper {
  140 + padding:0px;
  141 + margin:0px;
  142 + float:left;
  143 +
  144 + .git-url {
  145 + padding:0px;
  146 + margin:0px;
  147 + font-size: 12px;
  148 + margin-right:10px;
  149 + border-radius: 4px;
  150 + -moz-border-radius: 4px;
  151 + color: #666;
  152 + border: 1px solid #AAA;
  153 + padding: 0 10px 0 30px;
  154 + background: transparent url('images.png') no-repeat 8px -42px;
  155 + width: 260px;
  156 + height:26px;
  157 + }
  158 + }
  159 +
  160 + /* Account box */
  161 + .account-box {
  162 + position: absolute;
  163 + right: 0;
  164 + top: 13px;
  165 + z-index: 10000;
  166 + width: 128px;
  167 + font-size: 11px;
  168 + float: right;
  169 + display: block;
  170 + cursor: pointer;
  171 + img {
  172 + border-radius: 4px;
  173 + right: 20px;
  174 + position: absolute;
  175 + width: 33px;
  176 + height: 33px;
  177 + display: block;
  178 + top: 0;
  179 + &:after {
  180 + content: " ";
  181 + display: block;
  182 + position: absolute;
  183 + top: 0;
  184 + right: 0;
  185 + left: 0;
  186 + bottom: 0;
  187 + float: right;
  188 + border-radius: 5px;
  189 + border: 1px solid rgba(255, 255, 255, 0.1);
  190 + border-bottom: 0;
  191 + 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)));
  192 + 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));
  193 + 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));
  194 + -webkit-background-origin: border-box;
  195 + -moz-background-origin: border;
  196 + background-origin: border-box; } } }
  197 +
  198 + .account-box {
  199 + &.hover {
  200 + height: 138px; }
  201 + &:hover > .account-links {
  202 + display: block; } }
  203 +
  204 + .account-links {
  205 + background: #79C3E0;
  206 + display: none;
  207 + border-radius: 5px;
  208 + width: 100px;
  209 + margin-top: 0;
  210 + float: right;
  211 + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
  212 + position: relative;
  213 + &:before {
  214 + content: ".";
  215 + width: 0;
  216 + height: 0;
  217 + position: absolute;
  218 + border: 5px solid transparent;
  219 + border-color: rgba(255, 255, 255, 0);
  220 + border-bottom-color: #333;
  221 + text-indent: -9999px;
  222 + top: -10px;
  223 + line-height: 0;
  224 + right: 10px;
  225 + z-index: 10; }
  226 + background: #333;
  227 + display: none;
  228 + z-index: 100000;
  229 + border-radius: 5px;
  230 + width: 100px;
  231 + position: absolute;
  232 + right: 20px;
  233 + top: 46px;
  234 + margin-top: 0;
  235 + float: right;
  236 + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
  237 + a {
  238 + color: #EEE;
  239 + padding: 6px 10px;
  240 + display: block;
  241 + text-shadow: none;
  242 + border-bottom: 1px solid #555;
  243 + &:hover {
  244 + background: #444; } } }
  245 +
  246 + .account-box.hover .arrow-up {
  247 + top: 41px;
  248 + right: 6px;
  249 + position: absolute; }
  250 +
  251 + .account-links a {
  252 + &:first-child {
  253 + -webkit-border-top-left-radius: 5px;
  254 + -webkit-border-top-right-radius: 5px;
  255 + -moz-border-radius-topleft: 5px;
  256 + -moz-border-radius-topright: 5px;
  257 + border-top-left-radius: 5px;
  258 + border-top-right-radius: 5px; }
  259 + &:last-child {
  260 + -webkit-border-bottom-right-radius: 5px;
  261 + -webkit-border-bottom-left-radius: 5px;
  262 + -moz-border-radius-bottomright: 5px;
  263 + -moz-border-radius-bottomleft: 5px;
  264 + border-bottom-right-radius: 5px;
  265 + border-bottom-left-radius: 5px;
  266 + border-bottom: 0; } }
  267 +
  268 + }
  269 + /*
  270 + * End of Application Header
  271 + *
  272 + */
  273 +
  274 + /*
  275 + * Main Menu of Application
  276 + *
  277 + */
  278 + nav.main_menu {
  279 + overflow:hidden;
  280 + border-radius: 4px;
  281 + margin: auto;
  282 + margin:30px $app_padding;
  283 + background:#eee;
  284 + border:1px solid #ccc;
  285 + height:38px;
  286 + background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
  287 + background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
  288 + background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
  289 + background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
  290 + @include shade;
  291 + .count {
  292 + color:#aaa;
  293 + margin-left:3px;
  294 + }
  295 + .label {
  296 + background:$hover;
  297 + text-shadow:none;
  298 + color:$style_color;
  299 + }
  300 + a {
  301 + font-weight:bold;
  302 + &:first-child{
  303 + -webkit-border-top-left-radius: 4px;
  304 + -webkit-border-bottom-left-radius: 4px;
  305 + -moz-border-radius-topleft: 4px;
  306 + -moz-border-radius-bottomleft: 4px;
  307 + border-top-left-radius: 4px;
  308 + border-bottom-left-radius: 4px;
  309 + }
  310 + padding: 10px 25px;
  311 + display: inline-block;
  312 + color: $style_color;
  313 + border-right: 1px solid #d5d5d5;
  314 + position: relative;
  315 + box-shadow: 1px 0 0 rgba(255, 255, 255, 0.1);
  316 + margin: 0;
  317 + float:left;
  318 + text-shadow:0 1px 1px white;
  319 + &.home {
  320 + background: url(home_icon.PNG) no-repeat center center;
  321 + text-indent:-9999px;
  322 + min-width:40px;
  323 + img {
  324 + position:relative;
  325 + top:4px;
  326 + }
  327 + }
  328 + &.current {
  329 + background-color:#DDD;
  330 + }
  331 + }
  332 + }
  333 + /*
  334 + * End of Main Menu
  335 + *
  336 + */
  337 +}
... ...
app/controllers/admin/projects_controller.rb
... ... @@ -52,6 +52,12 @@ class Admin::ProjectsController &lt; ApplicationController
52 52 def update
53 53 @admin_project = Project.find_by_code(params[:id])
54 54  
  55 + owner_id = params[:project].delete(:owner_id)
  56 +
  57 + if owner_id
  58 + @admin_project.owner = User.find(owner_id)
  59 + end
  60 +
55 61 if @admin_project.update_attributes(params[:project])
56 62 redirect_to [:admin, @admin_project], notice: 'Project was successfully updated.'
57 63 else
... ...
app/controllers/admin/team_members_controller.rb
... ... @@ -3,39 +3,15 @@ class Admin::TeamMembersController &lt; ApplicationController
3 3 before_filter :authenticate_user!
4 4 before_filter :authenticate_admin!
5 5  
6   - def index
7   - @admin_team_members = UsersProject.page(params[:page]).per(100).order("project_id DESC")
8   - end
9   -
10   - def show
11   - @admin_team_member = UsersProject.find(params[:id])
12   - end
13   -
14   - def new
15   - @admin_team_member = UsersProject.new(params[:team_member])
16   - end
17   -
18 6 def edit
19 7 @admin_team_member = UsersProject.find(params[:id])
20 8 end
21 9  
22   - def create
23   - @admin_team_member = UsersProject.new(params[:team_member])
24   - @admin_team_member.project_id = params[:team_member][:project_id]
25   -
26   - if @admin_team_member.save
27   - redirect_to admin_team_member_path(@admin_team_member), notice: 'UsersProject was successfully created.'
28   - else
29   - render action: "new"
30   - end
31   - end
32   -
33 10 def update
34 11 @admin_team_member = UsersProject.find(params[:id])
35   - @admin_team_member.project_id = params[:team_member][:project_id]
36 12  
37 13 if @admin_team_member.update_attributes(params[:team_member])
38   - redirect_to admin_team_member_path(@admin_team_member), notice: 'UsersProject was successfully updated.'
  14 + redirect_to [:admin, @admin_team_member.project], notice: 'Project Access was successfully updated.'
39 15 else
40 16 render action: "edit"
41 17 end
... ... @@ -45,6 +21,6 @@ class Admin::TeamMembersController &lt; ApplicationController
45 21 @admin_team_member = UsersProject.find(params[:id])
46 22 @admin_team_member.destroy
47 23  
48   - redirect_to admin_team_members_url
  24 + redirect_to :back
49 25 end
50 26 end
... ...
app/controllers/admin/users_controller.rb
... ... @@ -9,8 +9,28 @@ class Admin::UsersController &lt; ApplicationController
9 9  
10 10 def show
11 11 @admin_user = User.find(params[:id])
  12 +
  13 + @projects = if @admin_user.projects.empty?
  14 + Project
  15 + else
  16 + Project.without_user(@admin_user)
  17 + end.all
12 18 end
13 19  
  20 + def team_update
  21 + @admin_user = User.find(params[:id])
  22 +
  23 + UsersProject.user_bulk_import(
  24 + @admin_user,
  25 + params[:project_ids],
  26 + params[:project_access],
  27 + params[:repo_access]
  28 + )
  29 +
  30 + redirect_to [:admin, @admin_user], notice: 'Teams were successfully updated.'
  31 + end
  32 +
  33 +
14 34 def new
15 35 @admin_user = User.new(:projects_limit => 10)
16 36 end
... ...
app/controllers/application_controller.rb
... ... @@ -5,7 +5,11 @@ class ApplicationController &lt; ActionController::Base
5 5 helper_method :abilities, :can?
6 6  
7 7 rescue_from Gitlabhq::Gitolite::AccessDenied do |exception|
8   - render :file => File.join(Rails.root, "public", "githost_error"), :layout => false
  8 + render "errors/gitolite", :layout => "error"
  9 + end
  10 +
  11 + rescue_from ActiveRecord::RecordNotFound do |exception|
  12 + render "errors/not_found", :layout => "error", :status => 404
9 13 end
10 14  
11 15 layout :layout_by_resource
... ... @@ -33,7 +37,8 @@ class ApplicationController &lt; ActionController::Base
33 37 end
34 38  
35 39 def project
36   - @project ||= Project.find_by_code(params[:project_id])
  40 + @project ||= current_user.projects.find_by_code(params[:project_id])
  41 + @project || render_404
37 42 end
38 43  
39 44 def add_project_abilities
... ... @@ -45,11 +50,23 @@ class ApplicationController &lt; ActionController::Base
45 50 end
46 51  
47 52 def authorize_project!(action)
48   - return render_404 unless can?(current_user, action, project)
  53 + return access_denied! unless can?(current_user, action, project)
  54 + end
  55 +
  56 + def authorize_code_access!
  57 + return access_denied! unless can?(current_user, :download_code, project)
49 58 end
50 59  
51 60 def access_denied!
52   - render_404
  61 + render "errors/access_denied", :layout => "error", :status => 404
  62 + end
  63 +
  64 + def not_found!
  65 + render "errors/not_found", :layout => "error", :status => 404
  66 + end
  67 +
  68 + def git_not_found!
  69 + render "errors/git_not_found", :layout => "error", :status => 404
53 70 end
54 71  
55 72 def method_missing(method_sym, *arguments, &block)
... ... @@ -78,21 +95,13 @@ class ApplicationController &lt; ActionController::Base
78 95 redirect_to @project unless @project.repo_exists? && @project.has_commits?
79 96 end
80 97  
81   - def respond_with_notes
82   - if params[:last_id] && params[:first_id]
83   - @notes = @notes.where("id >= ?", params[:first_id])
84   - elsif params[:last_id]
85   - @notes = @notes.where("id > ?", params[:last_id])
86   - elsif params[:first_id]
87   - @notes = @notes.where("id < ?", params[:first_id])
88   - else
89   - nil
90   - end
91   - end
92   -
93 98 def no_cache_headers
94 99 response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
95 100 response.headers["Pragma"] = "no-cache"
96 101 response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
97 102 end
  103 +
  104 + def render_full_content
  105 + @full_content = true
  106 + end
98 107 end
... ...
app/controllers/commits_controller.rb
... ... @@ -7,12 +7,14 @@ class CommitsController &lt; ApplicationController
7 7 # Authorize
8 8 before_filter :add_project_abilities
9 9 before_filter :authorize_read_project!
  10 + before_filter :authorize_code_access!
10 11 before_filter :require_non_empty_project
11 12 before_filter :load_refs, :only => :index # load @branch, @tag & @ref
  13 + before_filter :render_full_content
12 14  
13 15 def index
14 16 @repo = project.repo
15   - @limit, @offset = (params[:limit] || 20), (params[:offset] || 0)
  17 + @limit, @offset = (params[:limit] || 40), (params[:offset] || 0)
16 18 @commits = @project.commits(@ref, params[:path], @limit, @offset)
17 19  
18 20 respond_to do |format|
... ... @@ -24,14 +26,31 @@ class CommitsController &lt; ApplicationController
24 26  
25 27 def show
26 28 @commit = project.commit(params[:id])
27   - @notes = project.commit_notes(@commit).fresh.limit(20)
28   - @note = @project.build_commit_note(@commit)
29 29  
  30 + git_not_found! and return unless @commit
  31 +
  32 + @note = @project.build_commit_note(@commit)
  33 + @comments_allowed = true
30 34 @line_notes = project.commit_line_notes(@commit)
  35 + end
31 36  
32   - respond_to do |format|
33   - format.html
34   - format.js { respond_with_notes }
  37 + def compare
  38 + first = project.commit(params[:to])
  39 + last = project.commit(params[:from])
  40 +
  41 + @diffs = []
  42 + @commits = []
  43 + @line_notes = []
  44 +
  45 + if first && last
  46 + commits = [first, last].sort_by(&:created_at)
  47 + younger = commits.first
  48 + older = commits.last
  49 +
  50 +
  51 + @commits = project.repo.commits_between(younger.id, older.id).map {|c| Commit.new(c)}
  52 + @diffs = project.repo.diff(younger.id, older.id) rescue []
  53 + @commit = Commit.new(older)
35 54 end
36 55 end
37 56 end
... ...
app/controllers/dashboard_controller.rb
... ... @@ -3,7 +3,16 @@ class DashboardController &lt; 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)
  14 +
  15 + @events = Event.where(:project_id => @projects.map(&:id)).recent.limit(20)
7 16 end
8 17  
9 18 # Get authored or assigned open merge requests
... ...
app/controllers/errors_controller.rb
1 1 class ErrorsController < ApplicationController
  2 + layout "error"
  3 +
2 4 def githost
3   - render :file => File.join(Rails.root, "public", "githost_error"), :layout => false
  5 + render "errors/gitolite"
4 6 end
5 7 end
... ...
app/controllers/issues_controller.rb
1 1 class IssuesController < ApplicationController
2 2 before_filter :authenticate_user!
3 3 before_filter :project
  4 + before_filter :module_enabled
4 5 before_filter :issue, :only => [:edit, :update, :destroy, :show]
5 6 layout "project"
6 7  
... ... @@ -48,7 +49,6 @@ class IssuesController &lt; ApplicationController
48 49 end
49 50  
50 51 def show
51   - @notes = @issue.notes.inc_author.order("created_at DESC").limit(20)
52 52 @note = @project.notes.new(:noteable => @issue)
53 53  
54 54 @commits = if @issue.branch_name && @project.repo.heads.map(&:name).include?(@issue.branch_name)
... ... @@ -60,7 +60,7 @@ class IssuesController &lt; ApplicationController
60 60  
61 61 respond_to do |format|
62 62 format.html
63   - format.js { respond_with_notes }
  63 + format.js
64 64 end
65 65 end
66 66  
... ... @@ -69,7 +69,10 @@ class IssuesController &lt; ApplicationController
69 69 @issue.author = current_user
70 70 @issue.save
71 71  
72   - respond_with(@issue)
  72 + respond_to do |format|
  73 + format.html { redirect_to project_issue_path(@project, @issue) }
  74 + format.js
  75 + end
73 76 end
74 77  
75 78 def update
... ... @@ -125,11 +128,14 @@ class IssuesController &lt; ApplicationController
125 128 end
126 129  
127 130 def authorize_modify_issue!
128   - can?(current_user, :modify_issue, @issue) ||
129   - @issue.assignee == current_user
  131 + return render_404 unless can?(current_user, :modify_issue, @issue)
130 132 end
131 133  
132 134 def authorize_admin_issue!
133   - can?(current_user, :admin_issue, @issue)
  135 + return render_404 unless can?(current_user, :admin_issue, @issue)
  136 + end
  137 +
  138 + def module_enabled
  139 + return render_404 unless @project.issues_enabled
134 140 end
135 141 end
... ...
app/controllers/keys_controller.rb
1 1 class KeysController < ApplicationController
2 2 layout "profile"
3   - respond_to :js
  3 + respond_to :js, :html
4 4  
5 5 def index
6 6 @keys = current_user.keys.all
... ...
app/controllers/merge_requests_controller.rb
1 1 class MergeRequestsController < ApplicationController
2 2 before_filter :authenticate_user!
3 3 before_filter :project
  4 + before_filter :module_enabled
4 5 before_filter :merge_request, :only => [:edit, :update, :destroy, :show, :commits, :diffs]
5 6 layout "project"
6 7  
... ... @@ -23,7 +24,9 @@ class MergeRequestsController &lt; ApplicationController
23 24 @merge_requests = @project.merge_requests
24 25  
25 26 @merge_requests = case params[:f].to_i
  27 + when 1 then @merge_requests
26 28 when 2 then @merge_requests.closed
  29 + when 2 then @merge_requests.opened.assigned(current_user)
27 30 else @merge_requests.opened
28 31 end
29 32  
... ... @@ -33,26 +36,31 @@ class MergeRequestsController &lt; ApplicationController
33 36 def show
34 37 unless @project.repo.heads.map(&:name).include?(@merge_request.target_branch) &&
35 38 @project.repo.heads.map(&:name).include?(@merge_request.source_branch)
36   - head(404)and return
  39 + git_not_found! and return
37 40 end
38 41  
39   - @notes = @merge_request.notes.inc_author.order("created_at DESC").limit(20)
40 42 @note = @project.notes.new(:noteable => @merge_request)
41 43  
  44 + @commits = @project.repo.
  45 + commits_between(@merge_request.target_branch, @merge_request.source_branch).
  46 + map {|c| Commit.new(c)}.
  47 + sort_by(&:created_at).
  48 + reverse
  49 +
  50 + render_full_content
  51 +
42 52 respond_to do |format|
43 53 format.html
44   - format.js { respond_with_notes }
  54 + format.js
45 55 end
46 56 end
47 57  
48   - def commits
49   - @commits = @project.repo.commits_between(@merge_request.target_branch, @merge_request.source_branch).map {|c| Commit.new(c)}
50   - end
51   -
52 58 def diffs
53 59 @diffs = @merge_request.diffs
54 60 @commit = @merge_request.last_commit
55   - @line_notes = []
  61 +
  62 + @comments_allowed = true
  63 + @line_notes = @merge_request.notes.where("line_code is not null")
56 64 end
57 65  
58 66 def new
... ... @@ -105,11 +113,14 @@ class MergeRequestsController &lt; ApplicationController
105 113 end
106 114  
107 115 def authorize_modify_merge_request!
108   - can?(current_user, :modify_merge_request, @merge_request) ||
109   - @merge_request.assignee == current_user
  116 + return render_404 unless can?(current_user, :modify_merge_request, @merge_request)
110 117 end
111 118  
112 119 def authorize_admin_merge_request!
113   - can?(current_user, :admin_merge_request, @merge_request)
  120 + return render_404 unless can?(current_user, :admin_merge_request, @merge_request)
  121 + end
  122 +
  123 + def module_enabled
  124 + return render_404 unless @project.merge_requests_enabled
114 125 end
115 126 end
... ...
app/controllers/notes_controller.rb
... ... @@ -9,6 +9,11 @@ class NotesController &lt; ApplicationController
9 9  
10 10 respond_to :js
11 11  
  12 + def index
  13 + notes
  14 + respond_with(@notes)
  15 + end
  16 +
12 17 def create
13 18 @note = @project.notes.new(params[:note])
14 19 @note.author = current_user
... ... @@ -24,9 +29,7 @@ class NotesController &lt; ApplicationController
24 29  
25 30 def destroy
26 31 @note = @project.notes.find(params[:id])
27   -
28 32 return access_denied! unless can?(current_user, :admin_note, @note)
29   -
30 33 @note.destroy
31 34  
32 35 respond_to do |format|
... ... @@ -34,4 +37,28 @@ class NotesController &lt; ApplicationController
34 37 end
35 38 end
36 39  
  40 + protected
  41 +
  42 + def notes
  43 + @notes = case params[:target_type]
  44 + when "commit"
  45 + then project.commit_notes(project.commit((params[:target_id]))).fresh.limit(20)
  46 + when "snippet"
  47 + then project.snippets.find(params[:target_id]).notes
  48 + when "wall"
  49 + then project.common_notes.order("created_at DESC").fresh.limit(50)
  50 + when "issue"
  51 + then project.issues.find(params[:target_id]).notes.inc_author.order("created_at DESC").limit(20)
  52 + when "merge_request"
  53 + then project.merge_requests.find(params[:target_id]).notes.inc_author.order("created_at DESC").limit(20)
  54 + end
  55 +
  56 + @notes = if params[:last_id]
  57 + @notes.where("id > ?", params[:last_id])
  58 + elsif params[:first_id]
  59 + @notes.where("id < ?", params[:first_id])
  60 + else
  61 + @notes
  62 + end
  63 + end
37 64 end
... ...
app/controllers/omniauth_callbacks_controller.rb 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +class OmniauthCallbacksController < Devise::OmniauthCallbacksController
  2 +
  3 + def ldap
  4 + # We only find ourselves here if the authentication to LDAP was successful.
  5 + info = request.env["omniauth.auth"]["info"]
  6 + @user = User.find_for_ldap_auth(info)
  7 + if @user.persisted?
  8 + @user.remember_me = true
  9 + end
  10 + sign_in_and_redirect @user
  11 + end
  12 +
  13 +end
... ...
app/controllers/projects_controller.rb
... ... @@ -28,7 +28,7 @@ class ProjectsController &lt; ApplicationController
28 28  
29 29 Project.transaction do
30 30 @project.save!
31   - @project.users_projects.create!(:repo_access => Repository::REPO_RW , :project_access => Project::PROJECT_RWA, :user => current_user)
  31 + @project.users_projects.create!(:project_access => UsersProject::MASTER, :user => current_user)
32 32  
33 33 # when project saved no team member exist so
34 34 # project repository should be updated after first user add
... ... @@ -57,7 +57,7 @@ class ProjectsController &lt; ApplicationController
57 57 def update
58 58 respond_to do |format|
59 59 if project.update_attributes(params[:project])
60   - format.html { redirect_to info_project_path(project), :notice => 'Project was successfully updated.' }
  60 + format.html { redirect_to edit_project_path(project), :notice => 'Project was successfully updated.' }
61 61 format.js
62 62 else
63 63 format.html { render action: "edit" }
... ... @@ -68,33 +68,29 @@ class ProjectsController &lt; ApplicationController
68 68  
69 69 def show
70 70 return render "projects/empty" unless @project.repo_exists? && @project.has_commits?
71   - limit = (params[:limit] || 20).to_i
72   - @activities = @project.activities(limit)#updates_wo_repo(limit)
  71 + limit = (params[:limit] || 10).to_i
  72 + @activities = @project.activities(limit)
73 73 end
74 74  
75 75 def files
76 76 @notes = @project.notes.where("attachment != 'NULL'").order("created_at DESC").limit(100)
77 77 end
78 78  
79   - def info
80   - end
81   -
82 79 #
83 80 # Wall
84 81 #
85 82  
86 83 def wall
  84 + return render_404 unless @project.wall_enabled
87 85 @note = Note.new
88   - @notes = @project.common_notes.order("created_at DESC")
89   - @notes = @notes.fresh.limit(20)
90 86  
91 87 respond_to do |format|
92 88 format.html
93   - format.js { respond_with_notes }
94 89 end
95 90 end
96 91  
97 92 def graph
  93 + render_full_content
98 94 @days_json, @commits_json = GraphCommit.to_graph(project)
99 95 end
100 96  
... ... @@ -114,6 +110,7 @@ class ProjectsController &lt; ApplicationController
114 110  
115 111 def project
116 112 @project ||= Project.find_by_code(params[:id])
  113 + @project || render_404
117 114 end
118 115  
119 116 def determine_layout
... ...
app/controllers/protected_branches_controller.rb 0 → 100644
... ... @@ -0,0 +1,32 @@
  1 +class ProtectedBranchesController < ApplicationController
  2 + before_filter :project
  3 +
  4 + # Authorize
  5 + before_filter :add_project_abilities
  6 + before_filter :authorize_read_project!
  7 + before_filter :require_non_empty_project
  8 +
  9 + before_filter :authorize_admin_project!, :only => [:destroy, :create]
  10 + before_filter :render_full_content
  11 +
  12 + layout "project"
  13 +
  14 + def index
  15 + @branches = @project.protected_branches.all
  16 + @protected_branch = @project.protected_branches.new
  17 + end
  18 +
  19 + def create
  20 + @project.protected_branches.create(params[:protected_branch])
  21 + redirect_to project_protected_branches_path(@project)
  22 + end
  23 +
  24 + def destroy
  25 + @project.protected_branches.find(params[:id]).destroy
  26 +
  27 + respond_to do |format|
  28 + format.html { redirect_to project_protected_branches_path }
  29 + format.js { render :nothing => true }
  30 + end
  31 + end
  32 +end
... ...
app/controllers/refs_controller.rb
... ... @@ -4,20 +4,32 @@ class RefsController &lt; ApplicationController
4 4 # Authorize
5 5 before_filter :add_project_abilities
6 6 before_filter :authorize_read_project!
  7 + before_filter :authorize_code_access!
7 8 before_filter :require_non_empty_project
8 9  
9 10 before_filter :ref
10 11 before_filter :define_tree_vars, :only => [:tree, :blob]
  12 + before_filter :render_full_content
  13 +
11 14 layout "project"
12 15  
13 16 def switch
14   - new_path = if params[:destination] == "tree"
15   - tree_project_ref_path(@project, params[:ref])
16   - else
17   - project_commits_path(@project, :ref => params[:ref])
18   - end
  17 + respond_to do |format|
  18 + format.html do
  19 + new_path = if params[:destination] == "tree"
  20 + tree_project_ref_path(@project, params[:ref])
  21 + else
  22 + project_commits_path(@project, :ref => params[:ref])
  23 + end
19 24  
20   - redirect_to new_path
  25 + redirect_to new_path
  26 + end
  27 + format.js do
  28 + @ref = params[:ref]
  29 + define_tree_vars
  30 + render "tree"
  31 + end
  32 + end
21 33 end
22 34  
23 35 #
... ... @@ -37,7 +49,12 @@ class RefsController &lt; ApplicationController
37 49  
38 50 def blob
39 51 if @tree.is_blob?
40   - send_data(@tree.data, :type => @tree.mime_type, :disposition => 'inline', :filename => @tree.name)
  52 + send_data(
  53 + @tree.data,
  54 + :type => @tree.text? ? "text/plain" : @tree.mime_type,
  55 + :disposition => 'inline',
  56 + :filename => @tree.name
  57 + )
41 58 else
42 59 head(404)
43 60 end
... ... @@ -48,6 +65,8 @@ class RefsController &lt; ApplicationController
48 65 protected
49 66  
50 67 def define_tree_vars
  68 + params[:path] = nil if params[:path].blank?
  69 +
51 70 @repo = project.repo
52 71 @commit = project.commit(@ref)
53 72 @tree = Tree.new(@commit.tree, project, @ref, params[:path])
... ...
app/controllers/repositories_controller.rb
... ... @@ -4,7 +4,9 @@ class RepositoriesController &lt; ApplicationController
4 4 # Authorize
5 5 before_filter :add_project_abilities
6 6 before_filter :authorize_read_project!
  7 + before_filter :authorize_code_access!
7 8 before_filter :require_non_empty_project
  9 + before_filter :render_full_content
8 10  
9 11 layout "project"
10 12  
... ... @@ -19,4 +21,28 @@ class RepositoriesController &lt; ApplicationController
19 21 def tags
20 22 @tags = @project.repo.tags.sort_by(&:name).reverse
21 23 end
  24 +
  25 + def archive
  26 + unless can?(current_user, :download_code, @project)
  27 + render_404 and return
  28 + end
  29 +
  30 + ref = params[:ref] || @project.root_ref
  31 + commit = @project.commit(ref)
  32 + render_404 and return unless commit
  33 +
  34 + # Build file path
  35 + file_name = @project.code + "-" + commit.id.to_s + ".tar.gz"
  36 + storage_path = File.join(Rails.root, "tmp", "repositories", @project.code)
  37 + file_path = File.join(storage_path, file_name)
  38 +
  39 + # Create file if not exists
  40 + unless File.exists?(file_path)
  41 + FileUtils.mkdir_p storage_path
  42 + file = @project.repo.archive_to_file(ref, nil, file_path)
  43 + end
  44 +
  45 + # Send file to user
  46 + send_file file_path
  47 + end
22 48 end
... ...
app/controllers/snippets_controller.rb
1 1 class SnippetsController < ApplicationController
2 2 before_filter :authenticate_user!
3 3 before_filter :project
  4 + before_filter :snippet, :only => [:show, :edit, :destroy, :update]
4 5 layout "project"
5 6  
6 7 # Authorize
... ... @@ -41,11 +42,9 @@ class SnippetsController &lt; ApplicationController
41 42 end
42 43  
43 44 def edit
44   - @snippet = @project.snippets.find(params[:id])
45 45 end
46 46  
47 47 def update
48   - @snippet = @project.snippets.find(params[:id])
49 48 @snippet.update_attributes(params[:snippet])
50 49  
51 50 if @snippet.valid?
... ... @@ -56,14 +55,11 @@ class SnippetsController &lt; ApplicationController
56 55 end
57 56  
58 57 def show
59   - @snippet = @project.snippets.find(params[:id])
60   - @notes = @snippet.notes
61 58 @note = @project.notes.new(:noteable => @snippet)
  59 + render_full_content
62 60 end
63 61  
64 62 def destroy
65   - @snippet = @project.snippets.find(params[:id])
66   -
67 63 return access_denied! unless can?(current_user, :admin_snippet, @snippet)
68 64  
69 65 @snippet.destroy
... ... @@ -72,12 +68,15 @@ class SnippetsController &lt; ApplicationController
72 68 end
73 69  
74 70 protected
  71 + def snippet
  72 + @snippet ||= @project.snippets.find(params[:id])
  73 + end
75 74  
76 75 def authorize_modify_snippet!
77   - can?(current_user, :modify_snippet, @snippet)
  76 + return render_404 unless can?(current_user, :modify_snippet, @snippet)
78 77 end
79 78  
80 79 def authorize_admin_snippet!
81   - can?(current_user, :admin_snippet, @snippet)
  80 + return render_404 unless can?(current_user, :admin_snippet, @snippet)
82 81 end
83 82 end
... ...
app/controllers/tags_controller.rb
... ... @@ -1,11 +0,0 @@
1   -class TagsController < ApplicationController
2   - def index
3   - @tags = Project.tag_counts.order('count DESC')
4   - @tags = @tags.where('name like ?', "%#{params[:term]}%") unless params[:term].blank?
5   -
6   - respond_to do |format|
7   - format.html
8   - format.json { render json: @tags.limit(8).map {|t| t.name}}
9   - end
10   - end
11   -end
app/controllers/team_members_controller.rb
... ... @@ -40,7 +40,7 @@ class TeamMembersController &lt; ApplicationController
40 40 @team_member.destroy
41 41  
42 42 respond_to do |format|
43   - format.html { redirect_to root_path }
  43 + format.html { redirect_to team_project_path(@project) }
44 44 format.js { render :nothing => true }
45 45 end
46 46 end
... ...
app/controllers/wikis_controller.rb 0 → 100644
... ... @@ -0,0 +1,59 @@
  1 +class WikisController < ApplicationController
  2 + before_filter :project
  3 + before_filter :add_project_abilities
  4 + before_filter :authorize_read_wiki!
  5 + before_filter :authorize_write_wiki!, :only => [:edit, :create, :history]
  6 + before_filter :authorize_admin_wiki!, :only => :destroy
  7 + layout "project"
  8 +
  9 + def show
  10 + if params[:old_page_id]
  11 + @wiki = @project.wikis.find(params[:old_page_id])
  12 + else
  13 + @wiki = @project.wikis.where(:slug => params[:id]).order("created_at").last
  14 + end
  15 +
  16 + unless @wiki
  17 + return render_404 unless can?(current_user, :write_wiki, @project)
  18 + end
  19 +
  20 + respond_to do |format|
  21 + if @wiki
  22 + format.html
  23 + else
  24 + @wiki = @project.wikis.new(:slug => params[:id])
  25 + format.html { render "edit" }
  26 + end
  27 + end
  28 + end
  29 +
  30 + def edit
  31 + @wiki = @project.wikis.where(:slug => params[:id]).order("created_at").last
  32 + @wiki = Wiki.regenerate_from @wiki
  33 + end
  34 +
  35 + def create
  36 + @wiki = @project.wikis.new(params[:wiki])
  37 + @wiki.user = current_user
  38 +
  39 + respond_to do |format|
  40 + if @wiki.save
  41 + format.html { redirect_to [@project, @wiki], notice: 'Wiki was successfully updated.' }
  42 + else
  43 + format.html { render action: "edit" }
  44 + end
  45 + end
  46 + end
  47 +
  48 + def history
  49 + @wikis = @project.wikis.where(:slug => params[:id]).order("created_at")
  50 + end
  51 +
  52 + def destroy
  53 + @wikis = @project.wikis.where(:slug => params[:id]).delete_all
  54 +
  55 + respond_to do |format|
  56 + format.html { redirect_to project_wiki_path(@project, :index), notice: "Page was successfully deleted" }
  57 + end
  58 + end
  59 +end
... ...
app/helpers/application_helper.rb
... ... @@ -3,7 +3,8 @@ module ApplicationHelper
3 3  
4 4 def gravatar_icon(user_email, size = 40)
5 5 gravatar_host = request.ssl? ? "https://secure.gravatar.com" : "http://www.gravatar.com"
6   - "#{gravatar_host}/avatar/#{Digest::MD5.hexdigest(user_email)}?s=#{size}&d=identicon"
  6 + user_email.strip!
  7 + "#{gravatar_host}/avatar/#{Digest::MD5.hexdigest(user_email.downcase)}?s=#{size}&d=identicon"
7 8 end
8 9  
9 10 def fixed_mode?
... ... @@ -52,6 +53,13 @@ module ApplicationHelper
52 53 [ "Tag", @project.tags ]
53 54 ]
54 55  
  56 + # If reference is commit id -
  57 + # we should add it to branch/tag selectbox
  58 + if(@ref && !options.flatten.include?(@ref) &&
  59 + @ref =~ /^[0-9a-zA-Z]{6,52}$/)
  60 + options << ["Commit", [@ref]]
  61 + end
  62 +
55 63 grouped_options_for_select(options, @ref || @project.default_branch)
56 64 end
57 65  
... ... @@ -71,11 +79,11 @@ module ApplicationHelper
71 79  
72 80 if @project && !@project.new_record?
73 81 project_nav = [
74   - { :label => "#{@project.code} / Issues", :url => project_issues_path(@project) },
75   - { :label => "#{@project.code} / Wall", :url => wall_project_path(@project) },
76   - { :label => "#{@project.code} / Tree", :url => tree_project_ref_path(@project, @project.root_ref) },
77   - { :label => "#{@project.code} / Commits", :url => project_commits_path(@project) },
78   - { :label => "#{@project.code} / Team", :url => team_project_path(@project) }
  82 + { :label => "#{@project.name} / Issues", :url => project_issues_path(@project) },
  83 + { :label => "#{@project.name} / Wall", :url => wall_project_path(@project) },
  84 + { :label => "#{@project.name} / Tree", :url => tree_project_ref_path(@project, @project.root_ref) },
  85 + { :label => "#{@project.name} / Commits", :url => project_commits_path(@project) },
  86 + { :label => "#{@project.name} / Team", :url => team_project_path(@project) }
79 87 ]
80 88 end
81 89  
... ... @@ -83,14 +91,26 @@ module ApplicationHelper
83 91 end
84 92  
85 93 def project_layout
86   - @project && !@project.new_record?
  94 + layout == "project"
  95 + end
  96 +
  97 + def admin_layout
  98 + layout == "admin"
87 99 end
88 100  
89 101 def profile_layout
90   - controller.controller_name == "dashboard" || current_page?(projects_path) || controller.controller_name == "profile" || controller.controller_name == "keys"
  102 + layout == "profile"
91 103 end
92 104  
93 105 def help_layout
94 106 controller.controller_name == "help"
95 107 end
  108 +
  109 + def ldap_enable?
  110 + Devise.omniauth_providers.include?(:ldap)
  111 + end
  112 +
  113 + def layout
  114 + controller.send :_layout
  115 + end
96 116 end
... ...
app/helpers/commits_helper.rb
... ... @@ -7,16 +7,6 @@ module CommitsHelper
7 7  
8 8 end
9 9  
10   - def diff_line_class(line)
11   - if line[0] == "+"
12   - "new"
13   - elsif line[0] == "-"
14   - "old"
15   - else
16   - nil
17   - end
18   - end
19   -
20 10 def more_commits_link
21 11 offset = params[:offset] || 0
22 12 limit = params[:limit] || 100
... ... @@ -42,11 +32,58 @@ module CommitsHelper
42 32 preserve out
43 33 end
44 34  
45   - def build_line_code(line, index, line_new, line_old)
46   - if diff_line_class(line) == "new"
47   - "NEW_#{index}_#{line_new}"
  35 + def diff_line_class(line)
  36 + if line[0] == "+"
  37 + "new"
  38 + elsif line[0] == "-"
  39 + "old"
48 40 else
49   - "OLD_#{index}_#{line_old}"
  41 + nil
  42 + end
  43 + end
  44 +
  45 + def build_line_code(line, index, line_new, line_old)
  46 + "#{index}_#{line_old}_#{line_new}"
  47 + end
  48 +
  49 + def each_diff_line(diff_arr, index)
  50 + line_old = 1
  51 + line_new = 1
  52 + type = nil
  53 +
  54 + lines_arr = diff_arr
  55 + lines_arr.each do |line|
  56 + next if line.match(/^\-\-\- \/dev\/null/)
  57 + next if line.match(/^\+\+\+ \/dev\/null/)
  58 + next if line.match(/^\-\-\- a/)
  59 + next if line.match(/^\+\+\+ b/)
  60 +
  61 + full_line = html_escape(line.gsub(/\n/, '')).force_encoding("UTF-8")
  62 +
  63 + if line.match(/^@@ -/)
  64 + type = "match"
  65 +
  66 + line_old = line.match(/\-[0-9]*/)[0].to_i.abs rescue 0
  67 + line_new = line.match(/\+[0-9]*/)[0].to_i.abs rescue 0
  68 +
  69 + next if line_old == 1 && line_new == 1
  70 + yield(line, type, nil, nil, nil)
  71 + next
  72 + else
  73 + type = diff_line_class(line)
  74 + line_code = build_line_code(line, index, line_new, line_old)
  75 + yield(full_line, type, line_code, line_new, line_old)
  76 + end
  77 +
  78 +
  79 + if line[0] == "+"
  80 + line_new += 1
  81 + elsif line[0] == "-"
  82 + line_old += 1
  83 + else
  84 + line_new += 1
  85 + line_old += 1
  86 + end
50 87 end
51 88 end
52 89 end
... ...
app/helpers/dashboard_helper.rb
... ... @@ -3,6 +3,7 @@ module DashboardHelper
3 3 case object.class.name.to_s
4 4 when "Issue" then project_issue_path(project, project.issues.find(object.id))
5 5 when "Commit" then project_commit_path(project, project.repo.commits(object.id).first)
  6 + when "MergeRequest" then project_merge_request_path(project, object.id)
6 7 when "Note"
7 8 then
8 9 note = object
... ... @@ -26,6 +27,7 @@ module DashboardHelper
26 27 when "Note" then markdown(object.note)
27 28 when "Issue" then object.title
28 29 when "Commit" then object.safe_message
  30 + when "MergeRequest" then object.title
29 31 else return "Project Wall"
30 32 end
31 33  
... ...
app/helpers/issues_helper.rb
... ... @@ -9,4 +9,26 @@ module IssuesHelper
9 9 params[:f] ||= cookies['issue_filter']
10 10 project_issues_path project, params
11 11 end
  12 +
  13 + def link_to_issue_assignee(issue)
  14 + project = issue.project
  15 +
  16 + tm = project.team_member_by_id(issue.assignee_id)
  17 + if tm
  18 + link_to issue.assignee_name, project_team_member_path(project, tm), :class => "author_link"
  19 + else
  20 + issue.assignee_name
  21 + end
  22 + end
  23 +
  24 + def link_to_issue_author(issue)
  25 + project = issue.project
  26 +
  27 + tm = project.team_member_by_id(issue.author_id)
  28 + if tm
  29 + link_to issue.author_name, project_team_member_path(project, tm), :class => "author_link"
  30 + else
  31 + issue.author_name
  32 + end
  33 + end
12 34 end
... ...
app/helpers/merge_requests_helper.rb
1 1 module MergeRequestsHelper
  2 + def link_to_merge_request_assignee(merge_request)
  3 + project = merge_request.project
  4 +
  5 + tm = project.team_member_by_id(merge_request.assignee_id)
  6 + if tm
  7 + link_to merge_request.assignee_name, project_team_member_path(project, tm), :class => "author_link"
  8 + else
  9 + merge_request.assignee_name
  10 + end
  11 + end
  12 +
  13 + def link_to_merge_request_author(merge_request)
  14 + project = merge_request.project
  15 +
  16 + tm = project.team_member_by_id(merge_request.author_id)
  17 + if tm
  18 + link_to merge_request.author_name, project_team_member_path(project, tm), :class => "author_link"
  19 + else
  20 + merge_request.author_name
  21 + end
  22 + end
2 23 end
... ...
app/helpers/projects_helper.rb
... ... @@ -17,11 +17,13 @@ module ProjectsHelper
17 17 end
18 18  
19 19 def project_tab_class
20   - [:show, :files, :team, :edit, :update, :info].each do |action|
  20 + [:show, :files, :team, :edit, :update].each do |action|
21 21 return "current" if current_page?(:controller => "projects", :action => action, :id => @project)
22 22 end
23 23  
24 24 if controller.controller_name == "snippets" ||
  25 + controller.controller_name == "hooks" ||
  26 + controller.controller_name == "deploy_keys" ||
25 27 controller.controller_name == "team_members"
26 28 "current"
27 29 end
... ... @@ -33,9 +35,26 @@ module ProjectsHelper
33 35 end
34 36  
35 37 def repository_tab_class
36   - if controller.controller_name == "repositories" ||
37   - controller.controller_name == "hooks"
38   - "current"
  38 + #if controller.controller_name == "repositories" ||
  39 + #controller.controller_name == "hooks" ||
  40 + #controller.controller_name == "deploy_keys"
  41 + #"current"
  42 + #end
  43 + end
  44 +
  45 + def commit_tab_class
  46 + if controller.controller_name == "commits" ||
  47 + controller.controller_name == "repositories" ||
  48 + controller.controller_name == "protected_branches"
  49 + "current"
  50 + end
  51 + end
  52 +
  53 + def branches_tab_class
  54 + if current_page?(branches_project_repository_path(@project)) ||
  55 + controller.controller_name == "protected_branches" ||
  56 + current_page?(project_repository_path(@project))
  57 + 'active'
39 58 end
40 59 end
41 60 end
... ...
app/helpers/wikis_helper.rb 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +module WikisHelper
  2 + def markdown_to_html(text)
  3 + RDiscount.new(text).to_html.html_safe
  4 + end
  5 +end
... ...
app/mailers/notify.rb
... ... @@ -27,8 +27,7 @@ class Notify &lt; ActionMailer::Base
27 27 @user = user
28 28 @note = note
29 29 @project = note.project
30   - @commit = @project.repo.commits(note.noteable_id).first
31   - return unless ( note.notify or ( note.notify_author and @commit.author.email == @user.email ) )
  30 + @commit = @note.target
32 31 mail(:to => @user.email, :subject => "gitlab | note for commit | #{@note.project.name} ")
33 32 end
34 33  
... ...
app/models/ability.rb
... ... @@ -5,6 +5,7 @@ class Ability
5 5 when "Issue" then issue_abilities(object, subject)
6 6 when "Note" then note_abilities(object, subject)
7 7 when "Snippet" then snippet_abilities(object, subject)
  8 + when "MergeRequest" then merge_request_abilities(object, subject)
8 9 else []
9 10 end
10 11 end
... ... @@ -14,31 +15,40 @@ class Ability
14 15  
15 16 rules << [
16 17 :read_project,
  18 + :read_wiki,
17 19 :read_issue,
18 20 :read_snippet,
19 21 :read_team_member,
20 22 :read_merge_request,
21   - :read_note
22   - ] if project.allow_read_for?(user)
23   -
24   - rules << [
  23 + :read_note,
25 24 :write_project,
26 25 :write_issue,
27   - :write_snippet,
28   - :write_merge_request,
29 26 :write_note
30   - ] if project.allow_write_for?(user)
  27 + ] if project.guest_access_for?(user)
  28 +
  29 + rules << [
  30 + :download_code,
  31 + :write_merge_request,
  32 + :write_snippet
  33 + ] if project.report_access_for?(user)
  34 +
  35 + rules << [
  36 + :write_wiki
  37 + ] if project.dev_access_for?(user)
31 38  
32 39 rules << [
33 40 :modify_issue,
34 41 :modify_snippet,
  42 + :modify_merge_request,
35 43 :admin_project,
36 44 :admin_issue,
37 45 :admin_snippet,
38 46 :admin_team_member,
39 47 :admin_merge_request,
40   - :admin_note
41   - ] if project.allow_admin_for?(user)
  48 + :admin_note,
  49 + :admin_wiki
  50 + ] if project.master_access_for?(user) || project.owner == user
  51 +
42 52  
43 53 rules.flatten
44 54 end
... ... @@ -53,6 +63,12 @@ class Ability
53 63 :"modify_#{name}",
54 64 :"admin_#{name}"
55 65 ]
  66 + elsif subject.respond_to?(:assignee) && subject.assignee == user
  67 + [
  68 + :"read_#{name}",
  69 + :"write_#{name}",
  70 + :"modify_#{name}",
  71 + ]
56 72 else
57 73 subject.respond_to?(:project) ?
58 74 project_abilities(user, subject.project) : []
... ...
app/models/activity_observer.rb 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +class ActivityObserver < ActiveRecord::Observer
  2 + observe :issue, :merge_request, :note
  3 +
  4 + def after_create(record)
  5 + Event.create(
  6 + :project => record.project,
  7 + :target_id => record.id,
  8 + :target_type => record.class.name,
  9 + :action => Event.determine_action(record)
  10 + )
  11 + end
  12 +end
... ...
app/models/commit.rb
1 1 class Commit
  2 + include ActiveModel::Conversion
  3 + extend ActiveModel::Naming
2 4  
3 5 attr_accessor :commit
4 6 attr_accessor :head
5 7 attr_accessor :refs
6 8  
7 9 delegate :message,
  10 + :authored_date,
8 11 :committed_date,
9 12 :parents,
10 13 :sha,
11 14 :date,
  15 + :committer,
12 16 :author,
13 17 :message,
14 18 :diffs,
... ... @@ -16,6 +20,10 @@ class Commit
16 20 :id,
17 21 :to => :commit
18 22  
  23 + def persisted?
  24 + false
  25 + end
  26 +
19 27 def initialize(raw_commit, head = nil)
20 28 @commit = raw_commit
21 29 @head = head
... ... @@ -34,10 +42,22 @@ class Commit
34 42 end
35 43  
36 44 def author_name
37   - author.name
  45 + author.name.force_encoding("UTF-8")
  46 + end
  47 +
  48 + def committer_name
  49 + committer.name
  50 + end
  51 +
  52 + def committer_email
  53 + committer.email
38 54 end
39 55  
40 56 def prev_commit
41 57 parents.first
42 58 end
  59 +
  60 + def prev_commit_id
  61 + prev_commit.id
  62 + end
43 63 end
... ...
app/models/event.rb 0 → 100644
... ... @@ -0,0 +1,70 @@
  1 +class Event < ActiveRecord::Base
  2 + Created = 1
  3 + Updated = 2
  4 + Closed = 3
  5 + Reopened = 4
  6 + Pushed = 5
  7 + Commented = 6
  8 +
  9 + belongs_to :project
  10 + belongs_to :target, :polymorphic => true
  11 +
  12 + serialize :data
  13 +
  14 + scope :recent, order("created_at DESC")
  15 +
  16 + def self.determine_action(record)
  17 + if [Issue, MergeRequest].include? record.class
  18 + Event::Created
  19 + elsif record.kind_of? Note
  20 + Event::Commented
  21 + end
  22 + end
  23 +
  24 + def push?
  25 + action == self.class::Pushed
  26 + end
  27 +
  28 + def new_branch?
  29 + data[:before] =~ /^00000/
  30 + end
  31 +
  32 + def commit_from
  33 + data[:before]
  34 + end
  35 +
  36 + def commit_to
  37 + data[:after]
  38 + end
  39 +
  40 + def branch_name
  41 + @branch_name ||= data[:ref].gsub("refs/heads/", "")
  42 + end
  43 +
  44 + def pusher
  45 + User.find_by_id(data[:user_id])
  46 + end
  47 +
  48 + def commits
  49 + @commits ||= data[:commits].map do |commit|
  50 + project.commit(commit[:id])
  51 + end
  52 + end
  53 +
  54 + delegate :id, :name, :email, :to => :pusher, :prefix => true, :allow_nil => true
  55 +end
  56 +# == Schema Information
  57 +#
  58 +# Table name: events
  59 +#
  60 +# id :integer not null, primary key
  61 +# target_type :string(255)
  62 +# target_id :integer
  63 +# title :string(255)
  64 +# data :text
  65 +# project_id :integer
  66 +# created_at :datetime not null
  67 +# updated_at :datetime not null
  68 +# action :integer
  69 +#
  70 +
... ...
app/models/key.rb
... ... @@ -14,6 +14,7 @@ class Key &lt; ActiveRecord::Base
14 14 before_save :set_identifier
15 15 after_save :update_repository
16 16 after_destroy :repository_delete_key
  17 + delegate :name, :email, :to => :user, :prefix => true
17 18  
18 19 def set_identifier
19 20 if is_deploy_key
... ...
app/models/mailer_observer.rb
... ... @@ -27,20 +27,25 @@ class MailerObserver &lt; ActiveRecord::Observer
27 27 end
28 28  
29 29 def new_note(note)
30   - return unless note.notify or note.notify_author
31   - note.project.users.reject { |u| u.id == current_user.id } .each do |u|
32   - case note.noteable_type
33   - when "Commit" then
34   - Notify.note_commit_email(u, note).deliver
35   - when "Issue" then
36   - Notify.note_issue_email(u, note).deliver
37   - when "MergeRequest" then
38   - Notify.note_merge_request_email(u, note).deliver
39   - when "Snippet"
40   - true
41   - else
42   - Notify.note_wall_email(u, note).deliver
  30 + # Notify whole team except author of note
  31 + if note.notify
  32 + note.project.users.reject { |u| u.id == current_user.id } .each do |u|
  33 + case note.noteable_type
  34 + when "Commit" then
  35 + Notify.note_commit_email(u, note).deliver
  36 + when "Issue" then
  37 + Notify.note_issue_email(u, note).deliver
  38 + when "MergeRequest" then
  39 + Notify.note_merge_request_email(u, note).deliver
  40 + when "Snippet"
  41 + true
  42 + else
  43 + Notify.note_wall_email(u, note).deliver
  44 + end
43 45 end
  46 + # Notify only author of resource
  47 + elsif note.notify_author
  48 + Notify.note_commit_email(note.commit_author, note).deliver
44 49 end
45 50 end
46 51  
... ...
app/models/note.rb
... ... @@ -58,21 +58,34 @@ class Note &lt; ActiveRecord::Base
58 58 nil
59 59 end
60 60  
61   - def line_file_id
62   - @line_file_id ||= line_code.split("_")[1].to_i if line_code
  61 + # Check if we can notify commit author
  62 + # with email about our comment
  63 + #
  64 + # If commit author email exist in project
  65 + # and commit author is not passed user we can
  66 + # send email to him
  67 + #
  68 + # params:
  69 + # user - current user
  70 + #
  71 + # return:
  72 + # Boolean
  73 + #
  74 + def notify_only_author?(user)
  75 + commit? && commit_author &&
  76 + commit_author.email != user.email
63 77 end
64 78  
65   - def line_type_id
66   - @line_type_id ||= line_code.split("_").first if line_code
  79 + def commit?
  80 + noteable_type == "Commit"
67 81 end
68 82  
69   - def line_number
70   - @line_number ||= line_code.split("_").last.to_i if line_code
71   - end
72   -
73   - def for_line?(file_id, old_line, new_line)
74   - line_file_id == file_id &&
75   - ((line_type_id == "NEW" && line_number == new_line) || (line_type_id == "OLD" && line_number == old_line ))
  83 + def commit_author
  84 + @commit_author ||=
  85 + project.users.find_by_email(target.author_email) ||
  86 + project.users.find_by_name(target.author_name)
  87 + rescue
  88 + nil
76 89 end
77 90 end
78 91 # == Schema Information
... ...
app/models/project.rb
1 1 require "grit"
2 2  
3 3 class Project < ActiveRecord::Base
4   - PROJECT_N = 0
5   - PROJECT_R = 1
6   - PROJECT_RW = 2
7   - PROJECT_RWA = 3
8   -
9 4 belongs_to :owner, :class_name => "User"
10 5  
  6 + has_many :events, :dependent => :destroy
11 7 has_many :merge_requests, :dependent => :destroy
12 8 has_many :issues, :dependent => :destroy, :order => "position"
13 9 has_many :users_projects, :dependent => :destroy
... ... @@ -16,6 +12,8 @@ class Project &lt; ActiveRecord::Base
16 12 has_many :snippets, :dependent => :destroy
17 13 has_many :deploy_keys, :dependent => :destroy, :foreign_key => "project_id", :class_name => "Key"
18 14 has_many :web_hooks, :dependent => :destroy
  15 + has_many :protected_branches, :dependent => :destroy
  16 + has_many :wikis, :dependent => :destroy
19 17  
20 18 acts_as_taggable
21 19  
... ... @@ -53,18 +51,14 @@ class Project &lt; ActiveRecord::Base
53 51 attr_protected :private_flag, :owner_id
54 52  
55 53 scope :public_only, where(:private_flag => false)
  54 + scope :without_user, lambda { |user| where("id not in (:ids)", :ids => user.projects.map(&:id) ) }
56 55  
57 56 def self.active
58 57 joins(:issues, :notes, :merge_requests).order("issues.created_at, notes.created_at, merge_requests.created_at DESC")
59 58 end
60 59  
61 60 def self.access_options
62   - {
63   - "Denied" => PROJECT_N,
64   - "Read" => PROJECT_R,
65   - "Report" => PROJECT_RW,
66   - "Admin" => PROJECT_RWA
67   - }
  61 + UsersProject.access_roles
68 62 end
69 63  
70 64 def repository
... ... @@ -96,21 +90,35 @@ class Project &lt; ActiveRecord::Base
96 90 [GIT_HOST['host'], code].join("/")
97 91 end
98 92  
99   - def execute_web_hooks(oldrev, newrev, ref)
  93 + def observe_push(oldrev, newrev, ref, author_key_id)
  94 + data = web_hook_data(oldrev, newrev, ref, author_key_id)
  95 +
  96 + Event.create(
  97 + :project => self,
  98 + :action => Event::Pushed,
  99 + :data => data
  100 + )
  101 + end
  102 +
  103 + def execute_web_hooks(oldrev, newrev, ref, author_key_id)
100 104 ref_parts = ref.split('/')
101 105  
102 106 # Return if this is not a push to a branch (e.g. new commits)
103 107 return if ref_parts[1] !~ /heads/ || oldrev == "00000000000000000000000000000000"
104 108  
105   - data = web_hook_data(oldrev, newrev, ref)
  109 + data = web_hook_data(oldrev, newrev, ref, author_key_id)
  110 +
106 111 web_hooks.each { |web_hook| web_hook.execute(data) }
107 112 end
108 113  
109   - def web_hook_data(oldrev, newrev, ref)
  114 + def web_hook_data(oldrev, newrev, ref, author_key_id)
  115 + key = Key.find_by_identifier(author_key_id)
110 116 data = {
111 117 before: oldrev,
112 118 after: newrev,
113 119 ref: ref,
  120 + user_id: key.user.id,
  121 + user_name: key.user_name,
114 122 repository: {
115 123 name: name,
116 124 url: web_url,
... ... @@ -137,6 +145,15 @@ class Project &lt; ActiveRecord::Base
137 145 data
138 146 end
139 147  
  148 + def open_branches
  149 + if protected_branches.empty?
  150 + self.repo.heads
  151 + else
  152 + pnames = protected_branches.map(&:name)
  153 + self.repo.heads.reject { |h| pnames.include?(h.name) }
  154 + end.sort_by(&:name)
  155 + end
  156 +
140 157 def team_member_by_name_or_email(email = nil, name = nil)
141 158 user = users.where("email like ? or name like ?", email, name).first
142 159 users_projects.find_by_user_id(user.id) if user
... ... @@ -182,11 +199,11 @@ class Project &lt; ActiveRecord::Base
182 199 # Should be rewrited for new access rights
183 200 def add_access(user, *access)
184 201 access = if access.include?(:admin)
185   - { :project_access => PROJECT_RWA }
  202 + { :project_access => UsersProject::MASTER }
186 203 elsif access.include?(:write)
187   - { :project_access => PROJECT_RW }
  204 + { :project_access => UsersProject::DEVELOPER }
188 205 else
189   - { :project_access => PROJECT_R }
  206 + { :project_access => UsersProject::REPORTER }
190 207 end
191 208 opts = { :user => user }
192 209 opts.merge!(access)
... ... @@ -199,38 +216,52 @@ class Project &lt; ActiveRecord::Base
199 216  
200 217 def repository_readers
201 218 keys = Key.joins({:user => :users_projects}).
202   - where("users_projects.project_id = ? AND users_projects.repo_access = ?", id, Repository::REPO_R)
  219 + where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::REPORTER)
203 220 keys.map(&:identifier) + deploy_keys.map(&:identifier)
204 221 end
205 222  
206 223 def repository_writers
207 224 keys = Key.joins({:user => :users_projects}).
208   - where("users_projects.project_id = ? AND users_projects.repo_access = ?", id, Repository::REPO_RW)
  225 + where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::DEVELOPER)
  226 + keys.map(&:identifier)
  227 + end
  228 +
  229 + def repository_masters
  230 + keys = Key.joins({:user => :users_projects}).
  231 + where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::MASTER)
209 232 keys.map(&:identifier)
210 233 end
211 234  
212 235 def readers
213   - @readers ||= users_projects.includes(:user).where(:project_access => [PROJECT_R, PROJECT_RW, PROJECT_RWA]).map(&:user)
  236 + @readers ||= users_projects.includes(:user).map(&:user)
214 237 end
215 238  
216 239 def writers
217   - @writers ||= users_projects.includes(:user).where(:project_access => [PROJECT_RW, PROJECT_RWA]).map(&:user)
  240 + @writers ||= users_projects.includes(:user).map(&:user)
218 241 end
219 242  
220 243 def admins
221   - @admins ||= users_projects.includes(:user).where(:project_access => PROJECT_RWA).map(&:user)
  244 + @admins ||= users_projects.includes(:user).where(:project_access => UsersProject::MASTER).map(&:user)
222 245 end
223 246  
224 247 def allow_read_for?(user)
225   - !users_projects.where(:user_id => user.id, :project_access => [PROJECT_R, PROJECT_RW, PROJECT_RWA]).empty?
  248 + !users_projects.where(:user_id => user.id).empty?
  249 + end
  250 +
  251 + def guest_access_for?(user)
  252 + !users_projects.where(:user_id => user.id).empty?
  253 + end
  254 +
  255 + def report_access_for?(user)
  256 + !users_projects.where(:user_id => user.id, :project_access => [UsersProject::REPORTER, UsersProject::DEVELOPER, UsersProject::MASTER]).empty?
226 257 end
227 258  
228   - def allow_write_for?(user)
229   - !users_projects.where(:user_id => user.id, :project_access => [PROJECT_RW, PROJECT_RWA]).empty?
  259 + def dev_access_for?(user)
  260 + !users_projects.where(:user_id => user.id, :project_access => [UsersProject::DEVELOPER, UsersProject::MASTER]).empty?
230 261 end
231 262  
232   - def allow_admin_for?(user)
233   - !users_projects.where(:user_id => user.id, :project_access => [PROJECT_RWA]).empty? || owner_id == user.id
  263 + def master_access_for?(user)
  264 + !users_projects.where(:user_id => user.id, :project_access => [UsersProject::MASTER]).empty? || owner_id == user.id
234 265 end
235 266  
236 267 def root_ref
... ... @@ -335,15 +366,19 @@ end
335 366 #
336 367 # Table name: projects
337 368 #
338   -# id :integer not null, primary key
339   -# name :string(255)
340   -# path :string(255)
341   -# description :text
342   -# created_at :datetime
343   -# updated_at :datetime
344   -# private_flag :boolean default(TRUE), not null
345   -# code :string(255)
346   -# owner_id :integer
347   -# default_branch :string(255) default("master"), not null
  369 +# id :integer not null, primary key
  370 +# name :string(255)
  371 +# path :string(255)
  372 +# description :text
  373 +# created_at :datetime
  374 +# updated_at :datetime
  375 +# private_flag :boolean default(TRUE), not null
  376 +# code :string(255)
  377 +# owner_id :integer
  378 +# default_branch :string(255) default("master"), not null
  379 +# issues_enabled :boolean default(TRUE), not null
  380 +# wall_enabled :boolean default(TRUE), not null
  381 +# merge_requests_enabled :boolean default(TRUE), not null
  382 +# wiki_enabled :boolean default(TRUE), not null
348 383 #
349 384  
... ...
app/models/protected_branch.rb 0 → 100644
... ... @@ -0,0 +1,29 @@
  1 +class ProtectedBranch < ActiveRecord::Base
  2 + belongs_to :project
  3 + validates_presence_of :project_id
  4 + validates_presence_of :name
  5 +
  6 + after_save :update_repository
  7 + after_destroy :update_repository
  8 +
  9 + def update_repository
  10 + Gitlabhq::GitHost.system.new.configure do |c|
  11 + c.update_project(project.path, project)
  12 + end
  13 + end
  14 +
  15 + def commit
  16 + project.commit(self.name)
  17 + end
  18 +end
  19 +# == Schema Information
  20 +#
  21 +# Table name: protected_branches
  22 +#
  23 +# id :integer not null, primary key
  24 +# project_id :integer not null
  25 +# name :string(255) not null
  26 +# created_at :datetime not null
  27 +# updated_at :datetime not null
  28 +#
  29 +
... ...
app/models/repository.rb
1 1 require File.join(Rails.root, "lib", "gitlabhq", "git_host")
2 2  
3 3 class Repository
4   - REPO_N = 0
5   - REPO_R = 1
6   - REPO_RW = 2
7   -
8 4 attr_accessor :project
9 5  
10 6 def self.default_ref
... ... @@ -12,11 +8,7 @@ class Repository
12 8 end
13 9  
14 10 def self.access_options
15   - {
16   - "Denied" => REPO_N,
17   - "Pull" => REPO_R,
18   - "Pull & Push" => REPO_RW
19   - }
  11 + {}
20 12 end
21 13  
22 14 def initialize(project)
... ... @@ -56,7 +48,7 @@ class Repository
56 48 end
57 49  
58 50 def path_to_repo
59   - GIT_HOST["base_path"] + path + ".git"
  51 + File.join(GIT_HOST["base_path"], "#{path}.git")
60 52 end
61 53  
62 54 def update_repository
... ...
app/models/user.rb
... ... @@ -2,7 +2,7 @@ class User &lt; ActiveRecord::Base
2 2 # Include default devise modules. Others available are:
3 3 # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
4 4 devise :database_authenticatable, :token_authenticatable,
5   - :recoverable, :rememberable, :trackable, :validatable
  5 + :recoverable, :rememberable, :trackable, :validatable, :omniauthable
6 6  
7 7 # Setup accessible (or protected) attributes for your model
8 8 attr_accessible :email, :password, :password_confirmation, :remember_me,
... ... @@ -62,6 +62,30 @@ class User &lt; ActiveRecord::Base
62 62 def last_activity_project
63 63 projects.first
64 64 end
  65 +
  66 + def self.generate_random_password
  67 + (0...8).map{ ('a'..'z').to_a[rand(26)] }.join
  68 + end
  69 +
  70 + def first_name
  71 + name.split(" ").first unless name.blank?
  72 + end
  73 +
  74 + def self.find_for_ldap_auth(omniauth_info)
  75 + name = omniauth_info.name
  76 + email = omniauth_info.email
  77 +
  78 + if @user = User.find_by_email(email)
  79 + @user
  80 + else
  81 + password = generate_random_password
  82 + @user = User.create(:name => name,
  83 + :email => email,
  84 + :password => password,
  85 + :password_confirmation => password
  86 + )
  87 + end
  88 + end
65 89 end
66 90 # == Schema Information
67 91 #
... ...
app/models/users_project.rb
1 1 class UsersProject < ActiveRecord::Base
  2 + GUEST = 10
  3 + REPORTER = 20
  4 + DEVELOPER = 30
  5 + MASTER = 40
  6 +
2 7 belongs_to :user
3 8 belongs_to :project
4 9  
... ... @@ -17,7 +22,6 @@ class UsersProject &lt; ActiveRecord::Base
17 22 UsersProject.transaction do
18 23 user_ids.each do |user_id|
19 24 users_project = UsersProject.new(
20   - :repo_access => repo_access,
21 25 :project_access => project_access,
22 26 :user_id => user_id
23 27 )
... ... @@ -27,11 +31,45 @@ class UsersProject &lt; ActiveRecord::Base
27 31 end
28 32 end
29 33  
  34 + def self.user_bulk_import(user, project_ids, project_access, repo_access)
  35 + UsersProject.transaction do
  36 + project_ids.each do |project_id|
  37 + users_project = UsersProject.new(
  38 + :project_access => project_access,
  39 + )
  40 + users_project.project_id = project_id
  41 + users_project.user_id = user.id
  42 + users_project.save
  43 + end
  44 + end
  45 + end
  46 +
  47 + def self.access_roles
  48 + {
  49 + "Guest" => GUEST,
  50 + "Reporter" => REPORTER,
  51 + "Developer" => DEVELOPER,
  52 + "Master" => MASTER
  53 + }
  54 + end
  55 +
  56 + def role_access
  57 + project_access
  58 + end
  59 +
30 60 def update_repository
31 61 Gitlabhq::GitHost.system.new.configure do |c|
32 62 c.update_project(project.path, project)
33 63 end
34 64 end
  65 +
  66 + def project_access_human
  67 + Project.access_options.key(self.project_access)
  68 + end
  69 +
  70 + def repo_access_human
  71 + ""
  72 + end
35 73 end
36 74 # == Schema Information
37 75 #
... ... @@ -42,7 +80,6 @@ end
42 80 # project_id :integer not null
43 81 # created_at :datetime
44 82 # updated_at :datetime
45   -# repo_access :integer default(0), not null
46 83 # project_access :integer default(0), not null
47 84 #
48 85  
... ...
app/models/wiki.rb 0 → 100644
... ... @@ -0,0 +1,47 @@
  1 +class Wiki < ActiveRecord::Base
  2 + belongs_to :project
  3 + belongs_to :user
  4 +
  5 + validates :content, :title, :user_id, :presence => true
  6 + validates :title, :length => 1..250
  7 +
  8 + before_update :set_slug
  9 +
  10 +
  11 + def to_param
  12 + slug
  13 + end
  14 +
  15 + protected
  16 +
  17 + def set_slug
  18 + self.slug = self.title.parameterize
  19 + end
  20 +
  21 + class << self
  22 + def regenerate_from wiki
  23 + regenerated_field = [:slug, :content, :title]
  24 +
  25 + new_wiki = Wiki.new
  26 + regenerated_field.each do |field|
  27 + new_wiki.send("#{field}=", wiki.send(field))
  28 + end
  29 + new_wiki
  30 + end
  31 +
  32 + end
  33 +end
  34 +# == Schema Information
  35 +#
  36 +# Table name: wikis
  37 +#
  38 +# id :integer not null, primary key
  39 +# title :string(255)
  40 +# content :text
  41 +# project_id :integer
  42 +# created_at :datetime not null
  43 +# updated_at :datetime not null
  44 +# slug :string(255)
  45 +# user_id :integer
  46 +#
  47 +
... ...
app/views/admin/projects/_form.html.haml
1 1 = form_for [:admin, @admin_project] do |f|
2 2 -if @admin_project.errors.any?
3   - #error_explanation
4   - %h2= "#{pluralize(@admin_project.errors.count, "error")} prohibited this admin_project from being saved:"
  3 + .alert-message.block-message.error
5 4 %ul
6 5 - @admin_project.errors.full_messages.each do |msg|
7 6 %li= msg
8 7  
9   - .form-row
  8 + .clearfix
10 9 = f.label :name
11   - %br
12   - = f.text_field :name
13   - .form-row
14   - = f.label :code
15   - %br
16   - = f.text_field :code
17   - .form-row
18   - = f.label :path
19   - %br
20   - = f.text_field :path
21   -
22   - .form-row
23   - = f.label :tag_list
24   - %br
25   - = f.text_area :tag_list, :placeholder => "project tags", :style => "height:50px", :id => :tag_field
26   -
27   - .form-row
  10 + .input= f.text_field :name
  11 + .clearfix
  12 + = f.label :path do
  13 + Path
  14 + .input
  15 + .input-prepend
  16 + %span.add-on= "git@#{GIT_HOST["host"]}:"
  17 + = f.text_field :path, :placeholder => "example_project", :disabled => !@admin_project.new_record?
  18 + .clearfix
  19 + = f.label :code do
  20 + Code
  21 + .input
  22 + .input-prepend
  23 + %span.add-on= "http://#{GIT_HOST["host"]}/"
  24 + = f.text_field :code, :placeholder => "example"
  25 +
  26 + - unless @admin_project.new_record?
  27 + .clearfix
  28 + = f.label :owner_id
  29 + .input= f.select :owner_id, User.all.map { |user| [user.name, user.id] }
  30 +
  31 + - unless @admin_project.heads.empty?
  32 + .clearfix
  33 + = f.label :default_branch, "Default Branch"
  34 + .input= f.select(:default_branch, @admin_project.heads.map(&:name), {}, :style => "width:210px;")
  35 +
  36 + .well
  37 + %h5 Features
  38 +
  39 + .clearfix
  40 + = f.label :issues_enabled, "Issues"
  41 + .input= f.check_box :issues_enabled
  42 +
  43 + .clearfix
  44 + = f.label :merge_requests_enabled, "Merge Requests"
  45 + .input= f.check_box :merge_requests_enabled
  46 +
  47 + .clearfix
  48 + = f.label :wall_enabled, "Wall"
  49 + .input= f.check_box :wall_enabled
  50 +
  51 + .clearfix
28 52 = f.label :description
29   - %br
30   - = f.text_area :description
  53 + .input= f.text_area :description, :class => "xxlarge"
31 54 .clear
32 55 %br
33 56 .actions
34   - = f.submit 'Save', :class => "grey-button"
  57 + = f.submit 'Save', :class => "btn primary"
  58 + = link_to 'Cancel', [:admin, @admin_project], :class => "btn"
  59 + = link_to 'Destroy', [:admin, @admin_project], :confirm => 'Are you sure?', :method => :delete, :class => "btn danger right"
35 60  
36 61 :javascript
37 62 $(function(){
38 63 taggifyForm();
  64 + $('#project_owner_id').chosen();
  65 + $('#project_default_branch').chosen();
39 66 })
... ...
app/views/admin/projects/edit.html.haml
1   -%h2= @admin_project.name
  1 +%h3= @admin_project.name
  2 +%hr
2 3 = render 'form'
3   -
4   -%br
5   -= link_to 'Back', admin_projects_path, :class => ""
6   -|
7   -= link_to 'Show', [:admin, @admin_project], :class => ""
... ...
app/views/admin/projects/index.html.haml
1   -%table
  1 +%h3
  2 + Projects
  3 + = link_to 'New Project', new_admin_project_path, :class => "btn small right"
  4 +%hr
  5 +%table.zebra-striped
2 6 %thead
3 7 %th Name
4   - %th Code
5 8 %th Path
6 9 %th Team Members
7 10 %th Last Commit
... ... @@ -11,12 +14,9 @@
11 14 - @admin_projects.each do |project|
12 15 %tr
13 16 %td= link_to project.name, [:admin, project]
14   - %td= project.code
15 17 %td= project.path
16 18 %td= project.users_projects.count
17 19 %td= last_commit(project)
18   - %td= link_to 'Edit', edit_admin_project_path(project), :id => "edit_#{dom_id(project)}"
19   - %td= link_to 'Destroy', [:admin, project], :confirm => 'Are you sure?', :method => :delete
20   -
  20 + %td= link_to 'Edit', edit_admin_project_path(project), :id => "edit_#{dom_id(project)}", :class => "btn small"
  21 + %td= link_to 'Destroy', [:admin, project], :confirm => 'Are you sure?', :method => :delete, :class => "btn small danger"
21 22 = paginate @admin_projects
22   -= link_to 'New Project', new_admin_project_path, :class => "grey-button"
... ...
app/views/admin/projects/show.html.haml
1   -- unless notice.nil?
2   - %p#notice= notice
  1 +%h3
  2 + = @admin_project.name
  3 + = link_to 'Edit', edit_admin_project_path(@admin_project), :class => "btn right small"
3 4  
  5 +%hr
4 6  
5   -%h2= @admin_project.name
6   -
7   -%table.round-borders
  7 +%table.zebra-striped
8 8 %tr
9 9 %td
10 10 %b
... ... @@ -29,14 +29,32 @@
29 29 Description:
30 30 %td
31 31 = @admin_project.description
32   - %tr
33   - %td{:colspan => 2}
34   - = link_to 'Edit', edit_admin_project_path(@admin_project), :class => "grey-button"
35 32  
36 33  
37 34 .span-14
38 35  
39   - %h2 Team
  36 + %h3
  37 + Team
  38 + %small
  39 + ( #{@admin_project.users_projects.count} )
  40 +
  41 + %hr
  42 +
  43 + %table.zebra-striped
  44 + %thead
  45 + %tr
  46 + %th Name
  47 + %th Project Access
  48 + %th Repository Access
  49 + %th
  50 +
  51 + - @admin_project.users_projects.each do |tm|
  52 + %tr
  53 + %td
  54 + = link_to tm.user_name, admin_users_path(tm.user)
  55 + %td= select_tag :tm_project_access, options_for_select(Project.access_options, tm.project_access), :class => "medium project-access-select", :disabled => :disabled
  56 + %td= link_to 'Edit Access', edit_admin_team_member_path(tm), :class => "btn small"
  57 + %td= link_to 'Remove from team', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete, :class => "btn danger small"
40 58  
41 59 = form_tag team_update_admin_project_path(@admin_project), :class => "bulk_import", :method => :put do
42 60 %table
... ... @@ -49,29 +67,9 @@
49 67 %tr
50 68 %td= select_tag :user_ids, options_from_collection_for_select(@users , :id, :name), :multiple => true
51 69 %td= select_tag :project_access, options_for_select(Project.access_options), :class => "project-access-select"
52   - %td= select_tag :repo_access, options_for_select(Repository.access_options), :class => "repo-access-select"
53   -
54   - %tr
55   - %td{ :colspan => 3 }
56   - = submit_tag 'Add', :class => "positive-button"
57 70  
58   - %table.round-borders
59   - %thead
60   - %tr
61   - %th Name
62   - %th Added
63   - %th Project Access
64   - %th Repository Access
65   - %th
66   -
67   - - @admin_project.users_projects.each do |tm|
68   - %tr
69   - %td
70   - = link_to tm.user_name, admin_team_member_path(tm)
71   - %td= time_ago_in_words(tm.updated_at) + " ago"
72   - %td= select_tag :tm_project_access, options_for_select(Project.access_options, tm.project_access), :class => "project-access-select", :disabled => :disabled
73   - %td= select_tag :tm_repo_access, options_for_select(Repository.access_options, tm.repo_access), :class => "repo-access-select", :disabled => :disabled
74   - %td= link_to 'Destroy', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete
  71 + .actions
  72 + = submit_tag 'Add', :class => "btn primary"
75 73  
76 74 :css
77 75 form select {
... ...
app/views/admin/team_members/_form.html.haml
1   -= 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|
  1 += form_for @admin_team_member, :as => :team_member, :url => admin_team_member_path(@admin_team_member) do |f|
2 2 -if @admin_team_member.errors.any?
3   - #error_explanation
4   - %h2= "#{pluralize(@admin_team_member.errors.count, "error")} prohibited this admin_project from being saved:"
  3 + .alert-message.block-message.error
5 4 %ul
6 5 - @admin_team_member.errors.full_messages.each do |msg|
7 6 %li= msg
8 7  
9   - - if @admin_team_member.new_record?
10   - .span-6
11   - = f.label :user_id
12   - .span-6
13   - = f.select :user_id, User.all.map { |user| [user.name, user.id] }
14   - .span-6
15   - = f.label :project_id
16   - .span-6
17   - = f.select :project_id, Project.all.map { |user| [user.name, user.id] }
  8 + .clearfix
  9 + %label Project Access:
  10 + .input
  11 + = f.select :project_access, options_for_select(Project.access_options, @admin_team_member.project_access), {}, :class => "project-access-select"
18 12  
19   - .span-6
20   - %b Project Access:
21   - .span-6
22   - = f.select :project_access, options_for_select(Project.access_options, @admin_team_member.project_access), {}, :class => "project-access-select"
23   -
24   - .span-6
25   - %b Repository Access:
26   - .span-6
27   - = f.select :repo_access, options_for_select(Repository.access_options, @admin_team_member.repo_access), {}, :class => "repo-access-select"
28 13 %br
29 14 .actions
30   - = f.submit 'Save', :class => "grey-button"
  15 + = f.submit 'Save', :class => "btn primary"
  16 + = link_to 'Cancel', :back, :class => "btn"
31 17  
32 18 :css
33 19 form select {
... ...
app/views/admin/team_members/edit.html.haml
1   -= render 'form'
  1 +%h3
  2 + Edit access
  3 + %small
  4 + = @admin_team_member.project.name
  5 + &ndash;
  6 + = @admin_team_member.user_name
2 7  
3   -%br
4   -= link_to 'Show', admin_team_member_path(@admin_team_member)
5   -\|
6   -= link_to 'Back', admin_team_members_path
  8 +%hr
  9 +%table.zebra-striped
  10 + %tr
  11 + %td User:
  12 + %td= @admin_team_member.user_name
  13 + %tr
  14 + %td Project:
  15 + %td= @admin_team_member.project.name
  16 + %tr
  17 + %td Since:
  18 + %td= @admin_team_member.updated_at.stamp("Nov 11, 2010")
  19 += render 'form'
... ...
app/views/admin/team_members/index.html.haml
... ... @@ -1,28 +0,0 @@
1   -- @admin_team_members.group_by(&:project).sort.each do |project, members|
2   - %h3= link_to project.name, [:admin, project]
3   - %table
4   - %thead
5   - %th Name
6   - %th Project Access
7   - %th Repo Access
8   - %th Added
9   - %th
10   - %th
11   - - members.each do |tm|
12   - - user = tm.user
13   - %tr
14   - %td.span-6
15   - = link_to tm.user_name, admin_team_member_path(tm)
16   - %br
17   - %br
18   - = tm.user_email
19   - %td.span-3= select_tag :project_access, options_for_select(Project.access_options, tm.project_access), :class => "project-access-select", :disabled => :disabled
20   - %td.span-3= select_tag :repo_access, options_for_select(Repository.access_options, tm.repo_access), :class => "repo-access-select", :disabled => :disabled
21   - %td.span-3= time_ago_in_words(tm.updated_at) + " ago"
22   - %td= link_to 'Edit', edit_admin_team_member_path(tm), :id => "edit_#{dom_id(tm)}"
23   - %td= link_to 'Destroy', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete
24   -
25   -%br
26   -
27   -= paginate @admin_team_members
28   -= link_to 'New Team Member', new_admin_team_member_path, :class => "grey-button"
app/views/admin/team_members/new.html.haml
... ... @@ -1,6 +0,0 @@
1   -%h1 New team member
2   -
3   -= render 'form'
4   -
5   -%br
6   -= link_to 'Back', admin_team_members_path