sufia 4.3.1 → 5.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +8 -1
  3. data/Gemfile +10 -1
  4. data/History.md +14 -0
  5. data/LICENSE +15 -0
  6. data/README.md +7 -3
  7. data/SUFIA_VERSION +1 -1
  8. data/app/assets/javascripts/sufia.js +17 -1
  9. data/app/assets/javascripts/sufia/batch_edit.js +28 -43
  10. data/app/assets/javascripts/sufia/edit_metadata.js +14 -9
  11. data/app/assets/javascripts/sufia/manage_repeating_fields.js +74 -0
  12. data/app/assets/stylesheets/sufia.css.scss +1 -1
  13. data/app/assets/stylesheets/sufia/_batch-edit.scss +8 -0
  14. data/app/assets/stylesheets/sufia/_file-listing.scss +1 -1
  15. data/app/assets/stylesheets/sufia/_multi_value_fields.css.scss +67 -0
  16. data/app/controllers/concerns/sufia/breadcrumbs.rb +8 -3
  17. data/app/controllers/concerns/sufia/users_controller_behavior.rb +5 -1
  18. data/app/helpers/generic_file_helper.rb +0 -9
  19. data/app/helpers/sufia/records_helper_behavior.rb +0 -14
  20. data/app/inputs/multi_value_input.rb +84 -0
  21. data/app/views/batch/_metadata.html.erb +4 -16
  22. data/app/views/batch/edit.html.erb +1 -1
  23. data/app/views/batch_edits/edit.html.erb +6 -10
  24. data/app/views/collections/_edit_descriptions.html.erb +1 -1
  25. data/app/views/collections/_form.html.erb +3 -3
  26. data/app/views/generic_files/_descriptions.html.erb +9 -7
  27. data/app/views/generic_files/_field_form.html.erb +23 -8
  28. data/app/views/generic_files/edit.html.erb +0 -1
  29. data/app/views/records/_edit_field.html.erb +19 -17
  30. data/app/views/records/_rights_modal.html.erb +1 -0
  31. data/app/views/records/edit_fields/_default.html.erb +12 -6
  32. data/app/views/records/edit_fields/_description.html.erb +3 -6
  33. data/app/views/records/edit_fields/_resource_type.html.erb +5 -4
  34. data/app/views/records/edit_fields/_rights.html.erb +2 -5
  35. data/app/views/records/edit_fields/_suffix.html.erb +0 -11
  36. data/app/views/records/edit_fields/_type.html.erb +2 -8
  37. data/config/initializers/simple_form.rb +167 -0
  38. data/config/initializers/simple_form_bootstrap.rb +137 -0
  39. data/config/locales/simple_form.en.yml +31 -0
  40. data/config/locales/sufia.en.yml +2 -0
  41. data/lib/sufia/version.rb +1 -1
  42. data/spec/controllers/batch_edits_controller_spec.rb +1 -0
  43. data/spec/controllers/generic_files_controller_spec.rb +26 -0
  44. data/spec/controllers/users_controller_spec.rb +4 -3
  45. data/spec/features/collection_spec.rb +7 -0
  46. data/spec/helpers/records_helper_spec.rb +0 -13
  47. data/spec/lib/sufia/breadcrumbs_spec.rb +46 -8
  48. data/spec/views/collections/_form.html.erb_spec.rb +0 -2
  49. data/sufia-models/app/models/concerns/sufia/user.rb +5 -0
  50. data/sufia-models/lib/sufia/models/stats/user_stat_importer.rb +9 -5
  51. data/sufia-models/lib/sufia/models/version.rb +1 -1
  52. data/sufia.gemspec +1 -0
  53. metadata +29 -9
  54. data/LICENSE.md +0 -14
  55. data/app/assets/javascripts/sufia/multiForm.js +0 -67
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 202087176245b06ed3908752e6474c316fe2d669
4
- data.tar.gz: 46a3bf0c6206c0d76738b2e1092b310f793f02d6
3
+ metadata.gz: 0fd461554f395403414904f00dd90a78fb0537f2
4
+ data.tar.gz: 1d5831ea8387a489951180194b7180bd4d62a76d
5
5
  SHA512:
6
- metadata.gz: e9d2a4b2abc2ccbd14ecee1047f87c9f5ffc3cc93b9361fe7a5a3c651d601c014534230a8098e83aadb8ec078a071678257333816eb65a7874f767fab3398ae8
7
- data.tar.gz: f1e9781b0f053375be769c16c963b1702de618b471f9af9c2177ceba5262b091da4e24bb5b143c7476614aced26800ed559aa5e7e189ed4ecfa7ba8d35e33798
6
+ metadata.gz: 442d9714f6a6791d4d8d0f1bb04b2343c205dc763833431887d6021b6d5fa21ea2098e534ea7ed783e8ed9009858f5302a44c459bb834e084aa466609340679b
7
+ data.tar.gz: 79104ad39beb8ceeecf6e509dd38cffa5b1cf0b59b2420028fed6539bd00747ac872facce84c6987fad8681f01e378b7143933a6b3f2004ceb3f06e1c42ecaf1
@@ -1,10 +1,17 @@
1
1
  language: ruby
2
+ cache: bundler
3
+ sudo: false
2
4
  rvm:
3
5
  - 2.1
4
- - 2.0
5
6
  env:
6
7
  global:
7
8
  - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
9
+ matrix:
10
+ - "RAILS_VERSION=4.1.8"
11
+ - "RAILS_VERSION=4.2.0"
12
+ matrix:
13
+ allow_failures:
14
+ - env: "RAILS_VERSION=4.2.0"
8
15
  notifications:
9
16
  email:
10
17
  recipients:
data/Gemfile CHANGED
@@ -6,7 +6,7 @@ gemspec
6
6
  # Required for doing pagination inside an engine. See https://github.com/amatsuda/kaminari/pull/322
7
7
  gem 'kaminari', github: 'harai/kaminari', branch: 'route_prefix_prototype'
8
8
  gem 'sufia-models', path: './sufia-models'
9
- gem 'sass-rails', '~> 4.0.3'
9
+ gem 'slop', '~> 3.6.0' # This just helps us generate a valid Gemfile.lock when Rails 4.2 is installed (which requires byebug which has a dependency on slop)
10
10
 
11
11
  group :development, :test do
12
12
  gem "simplecov", require: false
@@ -17,4 +17,13 @@ file = File.expand_path("Gemfile", ENV['ENGINE_CART_DESTINATION'] || ENV['RAILS_
17
17
  if File.exists?(file)
18
18
  puts "Loading #{file} ..." if $DEBUG # `ruby -d` or `bundle -v`
19
19
  instance_eval File.read(file)
20
+ else
21
+ gem 'rails', ENV['RAILS_VERSION'] if ENV['RAILS_VERSION']
22
+
23
+ if ENV['RAILS_VERSION'] and ENV['RAILS_VERSION'] !~ /^4.2/
24
+ gem 'sass-rails', "< 5.0"
25
+ else
26
+ gem 'responders', "~> 2.0"
27
+ gem 'sass-rails', ">= 5.0"
28
+ end
20
29
  end
data/History.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # History of Sufia releases
2
2
 
3
+ ## 5.0.0
4
+
5
+ * Update README to be more specific about dependency versions [Michael J. Giarlo]
6
+ * Pulled in code from curate to manage add/remove fields on edit forms. Also story #3978 [Carolyn Cole]
7
+ * Changing the file query to be a solr query for loading the file id, so we do not wait large file content to load. This speed up the runs significantly on systems with large file. [Carolyn Cole]
8
+ * Users controller should not call an undefined method. Fixes #532. [Michael J. Giarlo]
9
+ * Fix problem where batch edit forms weren't expanding. Fixes #820 [Carolyn Cole]
10
+ * Update and rename LICENSE.md to LICENSE per community convention. [Michael J. Giarlo]
11
+ * Brings some of the fixes in fedora-4/master into master. [Michael J. Giarlo]
12
+ * Adds condition to make the version of sass-rails dependent on the value of RAILS_VERSION [Michael J. Giarlo]
13
+ * Merge travis config change to speed up the build [Michael J. Giarlo]
14
+ * Adding the browse view link into the bread crumbs so it shows on both the edit and the stats page. [Carolyn Cole]
15
+
16
+
3
17
  ## 4.3.1
4
18
 
5
19
  * Adds an ORCID field to the user model. [Michael J. Giarlo]
data/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ ##########################################################################
2
+ # Copyright 2012 Penn State University
3
+ # Additional copyright may be held by others, as reflected in the commit log
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
data/README.md CHANGED
@@ -48,7 +48,8 @@ We'd love to accept your contributions. Please see our guide to [contributing t
48
48
  1. A SQL RDBMS (MySQL, SQLite)
49
49
  1. [Redis](http://redis.io/) key-value store
50
50
  1. [ImageMagick](http://www.imagemagick.org/)
51
- 1. Ruby
51
+ 1. Ruby (*latest 2.1 recommended*)
52
+ 2. Rails (*latest 4.1 recommended*)
52
53
 
53
54
  #### !! Ensure that you have all of the above components installed before you continue. !!
54
55
 
@@ -60,12 +61,15 @@ If you have questions or need help, please email [the Hydra community developmen
60
61
 
61
62
  ### Generate base Rails install
62
63
 
63
- ```rails new my_app```
64
+ ```
65
+ gem install rails -v 4.1.8
66
+ rails new my_app
67
+ ```
64
68
 
65
69
  ### Add gems to Gemfile
66
70
 
67
71
  ```
68
- gem 'sufia'
72
+ gem 'sufia', '4.3.1'
69
73
  gem 'kaminari', github: 'harai/kaminari', branch: 'route_prefix_prototype' # required to handle pagination properly in dashboard. See https://github.com/amatsuda/kaminari/pull/322
70
74
  ```
71
75
 
@@ -1 +1 @@
1
- 4.3.1
1
+ 5.0.0.rc1
@@ -35,7 +35,7 @@
35
35
  //= require sufia/trophy
36
36
  //= require sufia/featured_works
37
37
  //= require sufia/batch_select_all
38
- //= require sufia/multiForm
38
+ //= require sufia/manage_repeating_fields
39
39
  //= require sufia/edit_metadata
40
40
  //= require sufia/single_use_link
41
41
  //= require sufia/audio
@@ -82,6 +82,22 @@ function notify_update_link() {
82
82
  }
83
83
 
84
84
  Blacklight.onLoad(function() {
85
+ // Multi-value fields on forms
86
+ $('body').on('keypress', '.multi-text-field', function(event) {
87
+ var $activeField = $(event.target).parents('.field-wrapper'),
88
+ $activeFieldControls = $activeField.children('.field-controls'),
89
+ $addControl=$activeFieldControls.children('.add'),
90
+ $removeControl=$activeFieldControls.children('.remove');
91
+
92
+ // If user hits the "Enter" key (keyCode 13), it should add another input for the multi-value field.
93
+ // Unless it's a textarea field (since users might want multi-line input in a textarea).
94
+ if (event.keyCode == 13 && !($activeField.context.type == "textarea")) {
95
+ event.preventDefault();
96
+ $addControl.click()
97
+ $removeControl.click()
98
+ }
99
+ });
100
+ $('.multi_value.form-group').manage_fields();
85
101
 
86
102
  // set up global batch edit options to override the ones in the gem
87
103
  window.batch_edits_options = { checked_label: "",unchecked_label: "",progress_label: "",status_label: "",css_class: "batch_toggle"};
@@ -3,17 +3,6 @@ function batch_edit_init () {
3
3
  // initialize popover helpers
4
4
  $("a[rel=popover]").popover({ html: true });
5
5
 
6
- $("tr.expandable").click(function () {
7
- $(this).next("ul").slideToggle();
8
-
9
- $(this).find('i.toggle').toggleClass("glyphicon glyphicon-chevron-down");
10
- });
11
-
12
- $("tr.expandable_new").click(function () {
13
- $(this).find('i').toggleClass("glyphicon glyphicon-chevron-down");
14
- });
15
-
16
-
17
6
  function deserialize(Params) {
18
7
  var Data = Params.split("&");
19
8
  var i = Data.length;
@@ -116,31 +105,45 @@ function batch_edit_init () {
116
105
 
117
106
  ajaxManager.run();
118
107
 
108
+ function formButtons(form_id) {
109
+ return $('#' + form_id + ' .btn')
110
+ }
111
+
112
+ function formFields(form_id) {
113
+ return $('#' + form_id + ' .form-group > *')
114
+ }
115
+
116
+ function formRightPanel(form_id) {
117
+ return $('#' + form_id + ' .form-group')
118
+ }
119
+
120
+ function disableForm(form_id) {
121
+ formButtons(form_id).attr("disabled", "disabled");
122
+ formRightPanel(form_id).addClass("loading");
123
+ formFields(form_id).addClass('invisible')
124
+ }
125
+
126
+ function enableForm(form_id) {
127
+ formButtons(form_id).removeAttr("disabled");
128
+ formRightPanel(form_id).removeClass("loading");
129
+ formFields(form_id).removeClass('invisible')
130
+ }
131
+
119
132
  function after_ajax(form_id) {
120
133
  var key = form_id.replace("form_", "");
121
- var save_button = "#" + key + "_save";
122
- var outer_div = "#detail_" + key;
123
134
  $("#status_" + key).html("Changes Saved");
124
- $(save_button).removeAttr("disabled");
125
- $(outer_div).removeClass("loading");
126
- $('#' + form_id).children([".form-group"]).removeClass('hidden')
135
+ enableForm(form_id);
127
136
  }
128
137
 
129
138
  function before_ajax(form_id) {
130
- var key = form_id.replace("form_", "");
131
- var save_button = "#" + key + "_save";
132
- var outer_div = "#detail_" + key;
133
- $(save_button).attr("disabled", "disabled");
134
- $(outer_div).addClass("loading");
135
- $('#' + form_id).children([".form-group"]).addClass('hidden')
139
+ disableForm(form_id);
136
140
  }
137
141
 
138
-
139
142
  function runSave(e) {
140
143
  e.preventDefault();
141
144
  var button = $(this);
142
- var form = $(button.parent().parent()[0]);
143
- var form_id = form[0].id
145
+ var form = button.closest('form');
146
+ var form_id = form[0].id;
144
147
  before_ajax(form_id);
145
148
 
146
149
  ajaxManager.addReq({
@@ -162,26 +165,8 @@ function batch_edit_init () {
162
165
  setTimeout(ajaxManager.runNow(), 100);
163
166
  }
164
167
 
165
- function enable_show_hide_links() {
166
- // Show/hide field details when clicking on a link with ID "expand_link_XXX".
167
- // We expect to find an element named detail_XXX in addition to the expand_link_XXX.
168
- // The "detail_XXX" element has the chevron icon.
169
- $('.glyphicon-chevron-right-helper').on('click', function() {
170
- var array = this.id.split("expand_link_");
171
- if (array.length > 1) {
172
- var docId = array[1];
173
- $("#detail_" + docId + " .expanded-details").slideToggle();
174
- var button = $("#expand_" + docId);
175
- button.toggleClass('glyphicon-chevron-right glyphicon-chevron-down');
176
- }
177
- return false;
178
- });
179
- }
180
-
181
168
  $("#permissions_save").click(runSave);
182
169
  $(".field-save").click(runSave);
183
- enable_show_hide_links();
184
-
185
170
  }
186
171
 
187
172
 
@@ -58,8 +58,8 @@ Blacklight.onLoad(function() {
58
58
  for (var i=0; i < autocomplete_vocab.url_var.length; i++) {
59
59
  autocomplete_vocab.field_name.push('generic_file_' + autocomplete_vocab.url_var[i]);
60
60
  autocomplete_vocab.add_btn_id.push('additional_' + autocomplete_vocab.url_var[i] + '_submit');
61
- // autocompletes
62
- $("#" + autocomplete_vocab.field_name[i])
61
+ // add autocompletes to all inputs created
62
+ $(".form-group.multi_value." + autocomplete_vocab.field_name[i]).find('input[type=text]')
63
63
  // don't navigate away from the field on tab when selecting an item
64
64
  .bind( "keydown", function( event ) {
65
65
  if ( event.keyCode === $.ui.keyCode.TAB &&
@@ -72,15 +72,20 @@ Blacklight.onLoad(function() {
72
72
  }
73
73
 
74
74
 
75
- function setup_autocomplete(obj, cloneElem) {
76
- // should we attach an auto complete based on the input
77
- if (obj.id == 'additional_based_near_submit') {
78
- cloneElem.find('input[type=text]').autocomplete(cities_autocomplete_opts);
75
+ function setup_autocomplete(event) {
76
+ var class_name = $.grep(event.target.className.split(" "),function( c ) {
77
+ return c.indexOf('generic_file') == 0;
78
+ })[0];
79
+ // attach auto complete for location
80
+ if (class_name == 'generic_file_based_near') {
81
+ $(event.target).find('input[type=text]').autocomplete(get_autocomplete_opts("location"));
79
82
  }
80
- else if ( (index = $.inArray(obj.id, autocomplete_vocab.add_btn_id)) != -1 ) {
81
- cloneElem.find('input[type=text]').autocomplete(get_autocomplete_opts(autocomplete_vocab.url_var[index]));
83
+ // attach other auto completes
84
+ else if ( (index = $.inArray(class_name, autocomplete_vocab.field_name)) != -1 ) {
85
+ $(event.target).find('input[type=text]').autocomplete(get_autocomplete_opts(autocomplete_vocab.url_var[index]));
82
86
  }
83
87
  }
84
88
 
85
- $('form').multiForm({afterAdd: setup_autocomplete});
89
+ // add setup for autocompletes to multi value forms
90
+ $('.multi_value.form-group').manage_fields({ add: setup_autocomplete });
86
91
  });
@@ -0,0 +1,74 @@
1
+ // This widget manages the adding and removing of repeating fields.
2
+ // There are a lot of assumptions about the structure of the classes and elements.
3
+ // These assumptions are reflected in the MultiValueInput class.
4
+
5
+ (function($){
6
+ $.widget( "curate.manage_fields", {
7
+ options: {
8
+ change: null,
9
+ add: null,
10
+ remove: null
11
+ },
12
+
13
+ _create: function() {
14
+ this.element.addClass("managed");
15
+ $('.field-wrapper', this.element).addClass("input-group input-append");
16
+
17
+ this.controls = $("<span class=\"input-group-btn field-controls\">");
18
+ this.remover = $("<button class=\"btn btn-danger remove\"><i class=\"icon-white glyphicon-minus\"></i><span>Remove</span></button>");
19
+ this.adder = $("<button class=\"btn btn-success add\"><i class=\"icon-white glyphicon-plus\"></i><span>Add</span></button>");
20
+
21
+ $('.field-wrapper', this.element).append(this.controls);
22
+ $('.field-wrapper:not(:last-child) .field-controls', this.element).append(this.remover);
23
+ $('.field-controls:last', this.element).append(this.adder);
24
+
25
+ this._on( this.element, {
26
+ "click .remove": "remove_from_list",
27
+ "click .add": "add_to_list"
28
+ });
29
+ },
30
+
31
+ add_to_list: function( event ) {
32
+ event.preventDefault();
33
+
34
+ var $activeField = $(event.target).parents('.field-wrapper'),
35
+ $activeFieldControls = $activeField.children('.field-controls'),
36
+ $removeControl = this.remover.clone(),
37
+ $newField = $activeField.clone(),
38
+ $listing = $('.listing', this.element),
39
+ $warningMessage = $("<div class=\'message has-warning\'>cannot add new empty field</div>");
40
+ if ($activeField.children('input').val() === '') {
41
+ $listing.children('.has-warning').remove();
42
+ $listing.append($warningMessage);
43
+ }
44
+ else{
45
+ $listing.children('.has-warning').remove();
46
+ $('.add', $activeFieldControls).remove();
47
+ $activeFieldControls.prepend($removeControl);
48
+ $newChildren = $newField.find('input');
49
+ $newChildren.
50
+ val('').
51
+ removeProp('required');
52
+ $listing.append($newField);
53
+ $newChildren.first().focus();
54
+ this._trigger("add",$newChildren);
55
+ }
56
+ },
57
+
58
+ remove_from_list: function( event ) {
59
+ event.preventDefault();
60
+
61
+ $(event.target)
62
+ .parents('.field-wrapper')
63
+ .remove();
64
+
65
+ this._trigger("remove");
66
+ },
67
+
68
+ _destroy: function() {
69
+ this.actions.remove();
70
+ $('.field-wrapper', this.element).removeClass("input-append");
71
+ this.element.removeClass( "managed" );
72
+ }
73
+ });
74
+ })(jQuery);
@@ -16,7 +16,7 @@
16
16
  // Use import here instead of require so we can use the Sass variables defined in Bootstrap and Blacklight
17
17
  // TODO: Probably should use import throughout and move all of Sufia's stylesheets into a single named directory.
18
18
  @import 'sufia/settings','sufia/header','sufia/styles','sufia/file-listing','sufia/collections','sufia/batch-edit',
19
- 'sufia/dashboard','sufia/home-page','sufia/featured','sufia/tagcloud','sufia/usage-stats','sufia/catalog','sufia/buttons','sufia/proxy-rights';
19
+ 'sufia/dashboard','sufia/home-page','sufia/featured','sufia/tagcloud','sufia/usage-stats','sufia/catalog','sufia/buttons','sufia/proxy-rights', 'sufia/multi_value_fields';
20
20
 
21
21
  #browse-everything {
22
22
  top:10%;
@@ -19,3 +19,11 @@
19
19
  padding-top: 5px;
20
20
  }
21
21
 
22
+ .glyphicon-chevron-right-helper.collapsed .chevron {
23
+ @extend .glyphicon-chevron-right;
24
+ }
25
+ .glyphicon-chevron-right-helper .chevron {
26
+ @extend .glyphicon;
27
+ @extend .glyphicon-chevron-down;
28
+ }
29
+
@@ -41,7 +41,7 @@ h4 .small {
41
41
  }
42
42
 
43
43
  .file_listing_thumbnail {
44
- @extend .media-object;
44
+ @extend .media-object !optional;
45
45
  width: 64px;
46
46
  }
47
47
 
@@ -0,0 +1,67 @@
1
+ .multi_value, .single_value {
2
+ .field-wrapper {
3
+ list-style-type:none;
4
+ }
5
+
6
+ .listing {
7
+ margin-left: 0;
8
+ max-width: 40em;
9
+ padding-left: 0px;
10
+ .input-group {
11
+ margin-bottom: 1px;
12
+ }
13
+ }
14
+
15
+ .field-controls span {
16
+ margin-left:.2em;
17
+ }
18
+
19
+ .field-controls {
20
+ margin-left: 2em;
21
+ }
22
+
23
+ .message{
24
+ background-size: 40px 40px;
25
+ background-image: linear-gradient(135deg, rgba(255, 255, 255, .05) 25%, transparent 25%,
26
+ transparent 50%, rgba(255, 255, 255, .05) 50%, rgba(255, 255, 255, .05) 75%,
27
+ transparent 75%, transparent);
28
+ box-shadow: inset 0 -1px 0 rgba(255,255,255,.4);
29
+ width: 100%;
30
+ border: 1px solid;
31
+ color: #fff;
32
+ padding: 10px;
33
+ text-shadow: 0 1px 0 rgba(0,0,0,.5);
34
+ animation: animate-bg 5s linear infinite;
35
+ border-radius: $border-radius-base;
36
+ }
37
+
38
+ .has-error{
39
+ background-color: #de4343;
40
+ border-color: #c43d3d;
41
+ }
42
+
43
+ .has-warning{
44
+ background-color: #eaaf51;
45
+ border-color: #d99a36;
46
+ }
47
+ }
48
+
49
+ // The contributor listing needs some normalization
50
+ #contributors .listing {
51
+ max-width:20em;
52
+ }
53
+
54
+ #collection_title.listing {
55
+ max-width:37em;
56
+ }
57
+
58
+ .collection_description .listing {
59
+ max-width:35.5em;
60
+ }
61
+
62
+ #descriptions_display {
63
+ .form-group, .batch-group {
64
+ margin-left: 0;
65
+ margin-bottom: 0.5em;
66
+ }
67
+ }