rails_admin 0.6.8 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rails_admin might be problematic. Click here for more details.

Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +17 -37
  3. data/README.md +1 -1
  4. data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +20 -5
  5. data/app/assets/javascripts/rails_admin/ra.filtering-select.js +13 -10
  6. data/app/assets/javascripts/rails_admin/ra.i18n.coffee +1 -1
  7. data/app/assets/javascripts/rails_admin/ra.remote-form.js +2 -2
  8. data/app/assets/javascripts/rails_admin/ra.widgets.coffee +1 -1
  9. data/app/assets/javascripts/rails_admin/ui.coffee +8 -0
  10. data/app/assets/stylesheets/rails_admin/base/theming.scss +37 -7
  11. data/app/assets/stylesheets/rails_admin/ra.widgets.scss +3 -2
  12. data/app/assets/stylesheets/rails_admin/themes/cerulean/theming.scss +95 -59
  13. data/app/assets/stylesheets/rails_admin/themes/cerulean/variables.scss +809 -120
  14. data/app/helpers/rails_admin/application_helper.rb +7 -2
  15. data/app/helpers/rails_admin/main_helper.rb +4 -2
  16. data/app/views/layouts/rails_admin/_navigation.html.haml +6 -1
  17. data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +1 -3
  18. data/app/views/rails_admin/main/_form_file_upload.html.haml +6 -2
  19. data/app/views/rails_admin/main/index.html.haml +2 -0
  20. data/config/locales/rails_admin.en.yml +3 -0
  21. data/lib/rails_admin/config.rb +4 -0
  22. data/lib/rails_admin/config/fields/association.rb +1 -1
  23. data/lib/rails_admin/config/fields/base.rb +3 -1
  24. data/lib/rails_admin/config/fields/factories/enum.rb +4 -0
  25. data/lib/rails_admin/config/fields/types/active_record_enum.rb +41 -0
  26. data/lib/rails_admin/config/fields/types/all.rb +1 -0
  27. data/lib/rails_admin/config/fields/types/file_upload.rb +8 -1
  28. data/lib/rails_admin/config/fields/types/serialized.rb +1 -1
  29. data/lib/rails_admin/config/fields/types/string.rb +6 -1
  30. data/lib/rails_admin/config/fields/types/text.rb +1 -0
  31. data/lib/rails_admin/engine.rb +1 -4
  32. data/lib/rails_admin/version.rb +2 -2
  33. metadata +4 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e0409337248747730f7ea1bfeecd3c8a87970b95
4
- data.tar.gz: a9a8e2ec8886981cdde444441df74ceaa5099e85
3
+ metadata.gz: 531cf0017e10c6ec70071cc36bf6f26bb022eb0a
4
+ data.tar.gz: 1660b6774fadf54a24b9d67a534305630727ccb1
5
5
  SHA512:
6
- metadata.gz: 65f95de98ec19d04476bf20a64c6d930c35d76e99c5499a939bb78e2207d277effb01807f63d2e6cffa301c0a79ef6f9ddd5cfc48a18f4fbe8f0470ed69c88f4
7
- data.tar.gz: ce24bd3ce10b5952c29ba58e0c25284bddb54abd0493328298750aa29c20c1ad878be3d2797ef2d462411b422c83e4f39cb1fb8876543540e26031367a803a96
6
+ metadata.gz: f2ca04cae79c6bfcdaab54dfadcbaa72b36bdc715ac37d15bbaa52d9ff383b27f7d514fd76537e466ebb6dd76ef1b5805c53dc73ade5abb6af717e1164e6a3a7
7
+ data.tar.gz: 39da0448e0b86dde4a980fa8444ec09007d9e095285d89a2329eb8c79bc03a2ec56dbed0c9c8da2503e50ba3391f36c4687f7995ce3a3c02b67f985f5d080674
data/Gemfile CHANGED
@@ -1,48 +1,28 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- case ENV['RAILS_VERSION']
4
- when '4.0'
5
- gem 'rails', '~> 4.0.0'
6
- gem 'devise', '>= 3.2'
7
- gem 'test-unit'
8
- when '4.1'
9
- gem 'rails', '~> 4.1.0'
10
- gem 'devise', '>= 3.2'
11
- else
12
- gem 'rails', '~> 4.2.0'
13
- gem 'sass-rails', '~> 5.0'
14
- gem 'devise', '>= 3.4'
15
- end
3
+ gem 'appraisal', '>= 2.0'
4
+ gem 'devise'
16
5
 
17
- case ENV['CI_ORM']
18
- when 'mongoid'
19
- gem 'mongoid', '~> 4.0.0.beta1'
6
+ group :mongoid do
7
+ gem 'mongoid', '~> 4.0.0'
20
8
  gem 'mongoid-paperclip', '>= 0.0.8', require: 'mongoid_paperclip'
21
9
  gem 'carrierwave-mongoid', '>= 0.6.3', require: 'carrierwave/mongoid'
22
- else
10
+ end
11
+
12
+ group :active_record do
23
13
  platforms :jruby do
24
- case ENV['CI_DB_ADAPTER']
25
- when 'mysql'
26
- gem 'activerecord-jdbcmysql-adapter', '>= 1.2'
27
- gem 'jdbc-mysql', '>= 5.1'
28
- when 'postgresql'
29
- gem 'activerecord-jdbcpostgresql-adapter', '>= 1.2'
30
- gem 'jdbc-postgres', '>= 9.2'
31
- else
32
- gem 'activerecord-jdbcsqlite3-adapter', '>= 1.3.0.beta1'
33
- gem 'jdbc-sqlite3', '>= 3.7'
34
- end
14
+ gem 'activerecord-jdbcmysql-adapter', '>= 1.2'
15
+ gem 'jdbc-mysql', '>= 5.1'
16
+ gem 'activerecord-jdbcpostgresql-adapter', '>= 1.2'
17
+ gem 'jdbc-postgres', '>= 9.2'
18
+ gem 'activerecord-jdbcsqlite3-adapter', '>= 1.3.0.beta1'
19
+ gem 'jdbc-sqlite3', '>= 3.7'
35
20
  end
36
21
 
37
22
  platforms :ruby, :mswin, :mingw do
38
- case ENV['CI_DB_ADAPTER']
39
- when 'mysql2'
40
- gem 'mysql2', '~> 0.3.14'
41
- when 'postgresql'
42
- gem 'pg', '>= 0.14'
43
- else
44
- gem 'sqlite3', '>= 1.3'
45
- end
23
+ gem 'mysql2', '~> 0.3.14'
24
+ gem 'pg', '>= 0.14'
25
+ gem 'sqlite3', '>= 1.3'
46
26
  end
47
27
 
48
28
  gem 'paper_trail', '~> 3.0'
@@ -64,7 +44,7 @@ group :test do
64
44
  gem 'generator_spec', '>= 0.8'
65
45
  gem 'launchy', '>= 2.2'
66
46
  gem 'mini_magick', '>= 3.4'
67
- gem 'paperclip', '>= 3.4'
47
+ gem 'paperclip', ['>= 3.4', '!= 4.3.0']
68
48
  gem 'poltergeist', '~> 1.5'
69
49
  gem 'rack-cache', require: 'rack/cache'
70
50
  gem 'rspec-rails', '>= 2.14'
data/README.md CHANGED
@@ -60,7 +60,7 @@ class Ball < ActiveRecord::Base
60
60
  end
61
61
  ```
62
62
 
63
- [Details](https://github.com/sferik/rails_admin/wiki/Railsadmin-DSL)
63
+ Details: [Models](https://github.com/sferik/rails_admin/wiki/Models), [Groups](https://github.com/sferik/rails_admin/wiki/Groups), [Fields](https://github.com/sferik/rails_admin/wiki/Fields)
64
64
 
65
65
  ## Documentation
66
66
  https://github.com/sferik/rails_admin/wiki
@@ -24,8 +24,7 @@
24
24
  chooseAll: "Choose all",
25
25
  chosen: "Chosen records",
26
26
  clearAll: "Clear all",
27
- remove: "Remove",
28
- selectChoice: "Select your choice(s) and click"
27
+ remove: "Remove"
29
28
  },
30
29
  searchDelay: 400,
31
30
  remote_source: null,
@@ -101,6 +100,13 @@
101
100
  this.selection.wrap('<div class="wrapper"/>');
102
101
 
103
102
  this.element.css({display: "none"});
103
+
104
+ this.tooManyObjectsPlaceholder = $('<option disabled="disabled" />').text(RailsAdmin.I18n.t("too_many_objects"));
105
+ this.noObjectsPlaceholder = $('<option disabled="disabled" />').text(RailsAdmin.I18n.t("no_objects"))
106
+
107
+ if(this.options.xhr){
108
+ this.collection.append(this.tooManyObjectsPlaceholder);
109
+ }
104
110
  },
105
111
 
106
112
  _bindEvents: function() {
@@ -164,13 +170,21 @@
164
170
  var widget = this;
165
171
  widget._query(val, function(matches) {
166
172
  var i;
167
- widget.collection.html('');
173
+ var filtered = [];
168
174
  for (i in matches) {
169
175
  if (matches.hasOwnProperty(i) && !widget.selected(matches[i].id)) {
176
+ filtered.push(i);
177
+ }
178
+ }
179
+ if (filtered.length > 0) {
180
+ widget.collection.html('');
181
+ for (i in filtered) {
170
182
  widget.collection.append(
171
183
  $('<option></option>').attr('value', matches[i].id).attr('title', matches[i].label).text(matches[i].label)
172
184
  );
173
185
  }
186
+ } else {
187
+ widget.collection.html(widget.noObjectsPlaceholder);
174
188
  }
175
189
  });
176
190
  },
@@ -209,10 +223,11 @@
209
223
  matches.push({id: i, label: this._cache[i]});
210
224
  }
211
225
  }
226
+ success.apply(this, [matches]);
227
+ } else {
228
+ this.collection.html(this.tooManyObjectsPlaceholder);
212
229
  }
213
230
 
214
- success.apply(this, [matches]);
215
-
216
231
  } else {
217
232
 
218
233
  if (this.options.xhr) {
@@ -39,7 +39,7 @@
39
39
  return { label: $(this).text(), value: this.value };
40
40
  }).toArray();
41
41
  }
42
- var filtering_select = $('<div class="input-append filtering-select" style="float:left"></div>')
42
+ var filtering_select = $('<div class="input-group filtering-select col-sm-2" style="float:left"></div>')
43
43
  var input = this.input = $('<input type="text">')
44
44
  .val(value)
45
45
  .addClass("form-control ra-filtering-select-input")
@@ -94,12 +94,11 @@
94
94
  input.data("ui-autocomplete")._renderItem = function(ul, item) {
95
95
  return $("<li></li>")
96
96
  .data("ui-autocomplete-item", item)
97
- .append( $( "<a></a>" ).html( item.label || item.id ) )
97
+ .append( $( "<a></a>" ).html( item.html || item.id ) )
98
98
  .appendTo(ul);
99
99
  };
100
100
 
101
- // replace with dropdown button once ready in twitter-bootstrap
102
- var button = this.button = $('<label class="add-on ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only" title="Show All Items" role="button"><span class="ui-button-icon-primary ui-icon ui-icon-triangle-1-s"></span><span class="ui-button-text">&nbsp;</span></label>')
101
+ var button = this.button = $('<span class="input-group-btn"><label class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-expanded="false" title="Show All Items" role="button"><span class="caret"></span><span class="ui-button-text">&nbsp;</span></label></span>')
103
102
  .click(function() {
104
103
  // close if already visible
105
104
  if (input.autocomplete("widget").is(":visible")) {
@@ -119,17 +118,21 @@
119
118
 
120
119
  _getResultSet: function(request, data, xhr) {
121
120
  var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
121
+ var highlighter = function(label, word){
122
+ if(word.length > 0){
123
+ return $.map(label.split(word), function(el, i){
124
+ return $('<span></span>').text(el).html();
125
+ }).join($('<strong></strong>').text(word)[0].outerHTML);
126
+ }else{
127
+ return $('<span></span>').text(label).html();
128
+ }
129
+ };
122
130
 
123
131
  return $.map(data, function(el, i) {
124
132
  // match regexp only for local requests, remote ones are already filtered, and label may not contain filtered term.
125
133
  if ((el.id || el.value) && (xhr || matcher.test(el.label))) {
126
134
  return {
127
- label: el.label ? el.label.replace(
128
- new RegExp(
129
- "(?![^&;]+;)(?!<[^<>]*)(" +
130
- $.ui.autocomplete.escapeRegex(request.term) +
131
- ")(?![^<>]*>)(?![^&;]+;)", "gi"
132
- ), "<strong>$1</strong>") : el.id,
135
+ html: highlighter(el.label || el.id, request.term),
133
136
  value: el.label || el.id,
134
137
  id: el.id || el.value
135
138
  };
@@ -2,5 +2,5 @@ class @RailsAdmin
2
2
  @RailsAdmin.I18n = class Locale
3
3
  @init: (@locale)->
4
4
  @t:(key) ->
5
- humanize = key.charAt(0).toUpperCase() + key.replace("_", " ").slice(1)
5
+ humanize = key.charAt(0).toUpperCase() + key.replace(/_/g, " ").slice(1)
6
6
  @locale[key] || humanize
@@ -19,7 +19,7 @@
19
19
 
20
20
  var edit_url = dom_widget.find('select').first().data('options') && dom_widget.find('select').first().data('options')['edit-url'];
21
21
  if(typeof(edit_url) != 'undefined' && edit_url.length) {
22
- dom_widget.on('dblclick', '.ra-multiselect option', function(e){
22
+ dom_widget.on('dblclick', '.ra-multiselect option:not(:disabled)', function(e){
23
23
  widget._bindModalOpening(e, edit_url.replace('__ID__', this.value))
24
24
  });
25
25
  }
@@ -109,7 +109,7 @@
109
109
  select.find('option[value=' + json.id + ']').text(json.label);
110
110
  multiselect.find('option[value= ' + json.id + ']').text(json.label);
111
111
  } else { // add
112
- select.prepend(option);
112
+ select.append(option);
113
113
  multiselect.find('select.ra-multiselect-selection').append(option);
114
114
  }
115
115
  }
@@ -46,7 +46,7 @@ $(document).on 'rails_admin.dom_ready', (e, content) ->
46
46
  input = this
47
47
  image_container = $("#" + input.id).parent().children(".preview")
48
48
  unless image_container.length
49
- image_container = $("#" + input.id).parent().prepend($('<img />').addClass('preview')).find('img.preview')
49
+ image_container = $("#" + input.id).parent().prepend($('<img />').addClass('preview').addClass('img-thumbnail')).find('img.preview')
50
50
  image_container.parent().find('img:not(.preview)').hide()
51
51
  ext = $("#" + input.id).val().split('.').pop().toLowerCase()
52
52
  if input.files and input.files[0] and $.inArray(ext, ['gif','png','jpg','jpeg','bmp']) != -1
@@ -92,3 +92,11 @@ $(document).on 'pjax:popstate', () ->
92
92
  return
93
93
  return
94
94
  return
95
+
96
+ #Remove all filter and then refresh
97
+ $(document).on 'click', "#remove_filter",(event) ->
98
+ event.preventDefault()
99
+ $("#filters_box").html("")
100
+ $("hr.filters_box").hide()
101
+ $(this).parent().siblings("input[type='search']").val("")
102
+ $(this).parents("form").submit()
@@ -3,6 +3,8 @@
3
3
  Keep it clean, people
4
4
  */
5
5
 
6
+ $avatar-size: 30px;
7
+
6
8
  body.rails_admin {
7
9
 
8
10
  .thumbnail {
@@ -12,12 +14,18 @@ body.rails_admin {
12
14
  /* room for upper navbar */
13
15
  padding-top: $navbar-height;
14
16
 
15
- /* Application name */
16
- .navbar .brand {
17
- small {
18
- color:#9d261d;
19
- font-weight:bold;
20
- line-height: 1;
17
+ .navbar {
18
+ .edit_user_root_link {
19
+ position: relative;
20
+
21
+ img {
22
+ position: absolute;
23
+ top: ((40px - $avatar-size) / 2);
24
+
25
+ & + span {
26
+ margin-left: ($avatar-size + 5px);
27
+ }
28
+ }
21
29
  }
22
30
  }
23
31
 
@@ -62,6 +70,18 @@ body.rails_admin {
62
70
  display:none;
63
71
  }
64
72
 
73
+ .control-group {
74
+ .img-thumbnail {
75
+ margin-bottom: 10px;
76
+ }
77
+
78
+ .btn-remove-image {
79
+ &.btn-info {
80
+ margin-top: 10px;
81
+ }
82
+ }
83
+ }
84
+
65
85
  legend {
66
86
  cursor:pointer;
67
87
  i {
@@ -114,6 +134,8 @@ body.rails_admin {
114
134
 
115
135
  /* nested forms */
116
136
  .tab-content {
137
+ clear: both;
138
+
117
139
  .tab-pane {
118
140
  @include clearfix;
119
141
  border-left: 5px solid #049cdb;
@@ -300,8 +322,16 @@ body.rails_admin {
300
322
  }
301
323
  }
302
324
 
303
- @media screen and (min-width: $screen-sm-min) {
325
+ @media screen and (min-width: $grid-float-breakpoint) {
304
326
  body.rails_admin {
327
+ .navbar {
328
+ .edit_user_root_link {
329
+ img {
330
+ top: (($navbar-height - $avatar-size) / 2);
331
+ }
332
+ }
333
+ }
334
+
305
335
  .sidebar-nav {
306
336
  position: fixed;
307
337
  top: $navbar-height;
@@ -2,7 +2,8 @@ iframe.wysihtml5-sandbox{
2
2
  height: 250px !important;
3
3
  width: 75% !important;
4
4
  }
5
+
5
6
  .controls img.preview{
6
- max-height: 100px;
7
- max-width: 100px;
7
+ max-height: 200px;
8
+ max-width: 300px;
8
9
  }
@@ -1,97 +1,133 @@
1
- // Bootswatch.less
2
- // Swatch: Cerulean
3
- // Version: 2.0.2
4
- // -----------------------------------------------------
5
-
6
- // TYPOGRAPHY
7
- // -----------------------------------------------------
1
+ // Cerulean 3.3.1
2
+ // Bootswatch
3
+ // .rails_admin .sidebar-nav added to prevent same link color
4
+ // ------------------------------------------------------------------
5
+
6
+ @mixin btn-shadow($color){
7
+ @include gradient-vertical-three-colors(lighten($color, 8%), $color, 60%, darken($color, 4%));
8
+ filter: none;
9
+ border-bottom: 1px solid darken($color, 10%);
10
+ }
8
11
 
9
- @import url(https://fonts.googleapis.com/css?family=Telex);
12
+ // Navbar =====================================================================
10
13
 
11
- .navbar, .subnav {
12
- font-family: $headingsFontFamily;
14
+ .navbar {
15
+ @include btn-shadow($navbar-default-bg);
16
+ filter: none;
17
+ @include box-shadow(0 1px 10px rgba(0, 0, 0, 0.1));
13
18
  }
14
19
 
15
- // NAVBAR
16
- // -----------------------------------------------------
20
+ .navbar.navbar-default .badge {
21
+ background-color: #fff;
22
+ color: $navbar-default-bg;
23
+ }
17
24
 
18
- .navbar-inner {
19
- @include gradient-vertical-three-colors($navbarBackground, $navbarBackground, 0.9, $navbarBackgroundHighlight);
20
- }
25
+ .navbar.navbar-inverse , .rails_admin .sidebar-nav {
26
+ @include gradient-vertical-three-colors(lighten($navbar-inverse-bg, 8%), lighten($navbar-inverse-bg, 4%), 60%, darken($navbar-inverse-bg, 2%));
27
+ filter: none;
28
+ border-bottom: 1px solid darken($navbar-inverse-bg, 10%);
29
+ }
21
30
 
22
- .navbar .nav .active > a,
23
- .navbar .nav .active > a:hover {
24
- background-color: $navbarBackground;
25
- background-color: rgba(0,0,0,.2);
26
- }
27
31
 
28
- .navbar .search-query {
29
- border: 1px solid darken($linkColor, 10%);
32
+ .navbar.navbar-inverse .badge {
33
+ background-color: #fff;
34
+ color: $navbar-inverse-bg;
30
35
  }
31
36
 
32
- // responsive menu colors
37
+ .navbar .navbar-nav > li > a,
38
+ .navbar .navbar-brand {
39
+ text-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
40
+ }
33
41
 
34
- .navbar .nav-collapse.in > .nav > li .dropdown-menu a {
35
- color: $white;
36
42
 
37
- &:hover {
38
- color: $white;
39
- }
40
- }
43
+ @media (max-width: $grid-float-breakpoint-max) {
41
44
 
42
- .navbar .nav-collapse.in .nav li > a {
43
- color: $white;
45
+ .navbar {
44
46
 
45
- &:hover {
46
- background-color: #2B7CAC;
47
- }
47
+ .dropdown-header {
48
+ color: #fff;
49
+ }
50
+ }
48
51
  }
49
52
 
50
- .btn-navbar:hover {
51
- background-color: darken($white, 20%);
53
+ // Buttons ====================================================================
54
+
55
+ .btn {
56
+
57
+ text-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);
58
+
59
+ .caret {
60
+ border-top-color: #fff;
61
+ }
52
62
  }
53
63
 
54
- // BUTTONS
55
- // -----------------------------------------------------
64
+ .btn-default {
65
+
66
+ @include btn-shadow($btn-default-bg);
56
67
 
57
- .btn {
58
- @include gradient-vertical-three-colors($white, $white, 0.05, darken($white, 0%));
59
- $shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
60
- @include box-shadow($shadow);
61
-
62
68
  &:hover {
63
- background-position: 0 0;
69
+ color: $btn-default-color;
70
+ }
71
+
72
+ .caret {
73
+ border-top-color: $text-color;
64
74
  }
65
75
  }
66
76
 
67
- .btn-primary {
68
- @include buttonBackground(lighten($btnPrimaryBackground, 5%), $btnPrimaryBackground);
77
+ .btn-default {
78
+ @include btn-shadow($btn-default-bg);
69
79
  }
70
80
 
71
- .btn-info {
72
- @include buttonBackground(lighten($btnInfoBackground, 5%), $btnInfoBackground);
81
+ .btn-primary {
82
+ @include btn-shadow($btn-primary-bg);
73
83
  }
74
84
 
75
85
  .btn-success {
76
- @include buttonBackground(lighten($btnSuccessBackground, 5%), $btnSuccessBackground);
86
+ @include btn-shadow($btn-success-bg);
87
+ }
88
+
89
+ .btn-info {
90
+ @include btn-shadow($btn-info-bg);
77
91
  }
78
92
 
79
93
  .btn-warning {
80
- @include buttonBackground(lighten($btnWarningBackground, 5%), $btnWarningBackground);
94
+ @include btn-shadow($btn-warning-bg);
81
95
  }
82
96
 
83
97
  .btn-danger {
84
- @include buttonBackground(lighten($btnDangerBackground, 5%), $btnDangerBackground);
98
+ @include btn-shadow($btn-danger-bg);
85
99
  }
86
100
 
87
- .btn-inverse {
88
- @include buttonBackground(lighten($btnInverseBackground, 5%), $btnInverseBackground);
101
+ // Typography =================================================================
102
+
103
+ // Tables =====================================================================
104
+ table,
105
+ .table {
106
+ > thead > tr > th {
107
+
108
+ color: $headings-color;
109
+ }
110
+
89
111
  }
90
112
 
91
- // ICONS
92
- // -----------------------------------------------------
113
+ // Forms ======================================================================
114
+
115
+ // Navs =======================================================================
116
+
117
+ // Indicators =================================================================
118
+
119
+ // Progress bars ==============================================================
93
120
 
94
- // Make icons gray
95
- i[class^="icon-"]{
96
- opacity: 0.8;
97
- }
121
+ // Containers =================================================================
122
+
123
+ .panel-primary,
124
+ .panel-success,
125
+ .panel-warning,
126
+ .panel-danger,
127
+ .panel-info {
128
+
129
+ .panel-heading,
130
+ .panel-title {
131
+ color: #fff;
132
+ }
133
+ }