sufia 4.3.1 → 5.0.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }