sufia 7.0.0 → 7.1.0

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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -7
  3. data/app/assets/javascripts/sufia.js +3 -4
  4. data/app/assets/javascripts/sufia/app.js +8 -0
  5. data/app/assets/javascripts/sufia/relationships.js +2 -0
  6. data/app/assets/javascripts/sufia/relationships/table.es6 +206 -0
  7. data/app/assets/javascripts/sufia/relationships/table_row.es6 +79 -0
  8. data/app/assets/javascripts/sufia/save_work/save_work_control.es6 +3 -0
  9. data/app/assets/javascripts/sufia/save_work/uploaded_files.es6 +5 -0
  10. data/app/forms/sufia/forms/batch_edit_form.rb +2 -2
  11. data/app/forms/sufia/forms/work_form.rb +13 -1
  12. data/app/presenters/sufia/work_show_presenter.rb +11 -0
  13. data/app/views/curation_concerns/base/_form_child_work_relationships.html.erb +65 -0
  14. data/app/views/curation_concerns/base/_form_progress.html.erb +3 -1
  15. data/app/views/curation_concerns/base/_form_relationships.html.erb +11 -2
  16. data/app/views/curation_concerns/base/_metadata.html.erb +2 -2
  17. data/app/views/curation_concerns/base/_relationships.html.erb +7 -22
  18. data/app/views/curation_concerns/base/_relationships_member_rows.html.erb +24 -0
  19. data/app/views/curation_concerns/base/_relationships_parent_row.html.erb +16 -0
  20. data/app/views/curation_concerns/base/_relationships_parent_row_empty.html.erb +6 -0
  21. data/app/views/curation_concerns/base/_relationships_parent_rows.html.erb +23 -0
  22. data/app/views/curation_concerns/file_sets/_actions.html.erb +1 -1
  23. data/app/views/curation_concerns/file_sets/_show_actions.html.erb +8 -9
  24. data/app/views/curation_concerns/file_sets/_single_use_link_rows.html.erb +19 -0
  25. data/app/views/curation_concerns/file_sets/_single_use_links.html.erb +10 -0
  26. data/app/views/curation_concerns/file_sets/show.html.erb +1 -0
  27. data/app/views/records/edit_fields/_in_works_ids.html.erb +59 -0
  28. data/config/locales/sufia.en.yml +22 -3
  29. data/lib/generators/sufia/templates/config/sufia.rb +5 -0
  30. data/lib/sufia/configuration.rb +6 -0
  31. data/lib/sufia/engine.rb +0 -2
  32. data/lib/sufia/version.rb +1 -1
  33. data/spec/features/search_spec.rb +7 -2
  34. data/spec/forms/sufia/forms/work_form_spec.rb +20 -0
  35. data/spec/javascripts/helpers/test_fixtures.js.coffee +9 -0
  36. data/spec/javascripts/helpers/test_responses.js +10 -5
  37. data/spec/javascripts/relationships_table_spec.js.coffee +83 -0
  38. data/spec/javascripts/save_work_spec.js +4 -2
  39. data/spec/javascripts/support/jasmine.yml +1 -1
  40. data/spec/javascripts/uploaded_files_spec.js +23 -0
  41. data/spec/views/batch_edits/edit.html.erb_spec.rb +1 -1
  42. data/spec/views/catalog/index.html.erb_spec.rb +0 -4
  43. data/spec/views/curation_concerns/base/_form_child_work_relationships.html.erb_spec.rb +113 -0
  44. data/spec/views/curation_concerns/base/_relationships.html.erb_spec.rb +89 -3
  45. data/spec/views/curation_concerns/file_sets/_single_use_links.html.erb_spec.rb +32 -0
  46. data/spec/views/curation_concerns/file_sets/show.html.erb_spec.rb +4 -0
  47. data/spec/views/records/edit_fields/_in_works_ids.html.erb_spec.rb +113 -0
  48. data/sufia.gemspec +1 -2
  49. metadata +35 -21
  50. data/app/assets/javascripts/sufia/single_use_link.js +0 -30
  51. data/spec/javascripts/single_use_link_spec.js.coffee +0 -21
@@ -26,9 +26,9 @@ module Sufia
26
26
  def initialize_combined_fields(batch)
27
27
  combined_attributes = {}
28
28
  permissions = []
29
- # For each of the files in the batch, set the attributes to be the concatination of all the attributes
29
+ # For each of the files in the batch, set the attributes to be the concatenation of all the attributes
30
30
  batch.each do |doc_id|
31
- work = model_class.load_instance_from_solr(doc_id)
31
+ work = model_class.find(doc_id)
32
32
  terms.each do |key|
33
33
  combined_attributes[key] ||= []
34
34
  combined_attributes[key] = (combined_attributes[key] + work[key]).uniq
@@ -34,7 +34,19 @@ module Sufia::Forms
34
34
  :visibility_after_embargo, :visibility_during_lease,
35
35
  :lease_expiration_date, :visibility_after_lease, :visibility,
36
36
  :thumbnail_id, :representative_id, :ordered_member_ids,
37
- :collection_ids]
37
+ :collection_ids, :in_works_ids]
38
+ end
39
+
40
+ # The ordered_members which are FileSet types
41
+ # @return [Array] All of the file sets in the ordered_members
42
+ def ordered_fileset_members
43
+ model.ordered_members.to_a.select { |m| m.model_name.singular.to_sym == :file_set }
44
+ end
45
+
46
+ # The ordered_members which are not FileSet types
47
+ # @return [Array] All of the non file sets in the ordered_members
48
+ def ordered_work_members
49
+ model.ordered_members.to_a.select { |m| m.model_name.singular.to_sym != :file_set }
38
50
  end
39
51
 
40
52
  def self.multiple?(term)
@@ -17,6 +17,17 @@ module Sufia
17
17
  end
18
18
  end
19
19
 
20
+ def presenter_types
21
+ CurationConcerns.config.registered_curation_concern_types.map(&:underscore) + ["collection"]
22
+ end
23
+
24
+ def grouped_presenters(filtered_by: nil, except: nil)
25
+ grouped = collection_presenters.group_by(&:model_name).transform_keys { |key| key.to_s.underscore }
26
+ grouped.select! { |obj| obj.downcase == filtered_by } unless filtered_by.nil?
27
+ grouped.except!(*except) unless except.nil?
28
+ grouped
29
+ end
30
+
20
31
  def display_feature_link?
21
32
  user_can_feature_works? && solr_document.public? && FeaturedWork.can_create_another? && !featured?
22
33
  end
@@ -0,0 +1,65 @@
1
+ <%# Form UI behavior code and details;
2
+ Code:
3
+ app/assets/javascripts/sufia/relationships
4
+ CSS:
5
+ table.relationships-ajax-enabled : Used by sufia JS app as selector to wire up the UI functionality
6
+ tr.new-row : The basic template row for cloning when user clicks "Add"
7
+ .btn-remove-row : Button to remove its parent TR from the table
8
+ .btn-add-row : Button to clone its parent TR and inject a new row into the table
9
+ input.new-form-control : Input field for client client side validation and additional features
10
+ .message.has-warning : Used to display UI errors related to input values and server errors
11
+ HTML Properties:
12
+ table:
13
+ data-query-url : URL base to append newly added work ID to for querying details (title, href)
14
+ %>
15
+ <div class="form-group multi_value optional managed">
16
+ <%= link_to "Attach New Work", polymorphic_path([main_app, :new, :curation_concerns, :parent, curation_concern.model_name.singular], parent_id: params[:id]), target: "_blank", class: 'btn btn-primary' %>
17
+
18
+ <table class="table table-striped related-files relationships-ajax-enabled"
19
+ data-query-url="<%= polymorphic_path([main_app, :curation_concerns, curation_concern.model_name.singular], id: '$id') %>">
20
+ <thead>
21
+ <tr>
22
+ <th>Child Work</th>
23
+ <th>Actions</th>
24
+ </tr>
25
+ </thead>
26
+ <tbody>
27
+ <tr class="hidden">
28
+ <td>
29
+ <% f.object.ordered_fileset_members.each do |fileset| %>
30
+ <input class="related_works_ids work_filesets_ids" name="<%= f.object.model_name.param_key %>[ordered_member_ids][]" type="hidden" value="<%= fileset.id %>">
31
+ <% end %>
32
+ </td>
33
+ <td></td>
34
+ </tr>
35
+ <% f.object.ordered_work_members.each do |member| %>
36
+ <tr>
37
+ <td>
38
+ <%= link_to member.title.first, [main_app, member] %>
39
+ <input class="string multi_value optional form-control related_works_ids work_child_members_ids form-control multi-text-field hidden" value="<%= member.id %>" id="work_child_members_ids" aria-labelledby="work_child_members_ids_label" name="<%= f.object.model_name.param_key %>[ordered_member_ids][]" type="text">
40
+ </td>
41
+ <td>
42
+ <div class="child-actions">
43
+ <%= link_to "Edit", [main_app, :edit, member], target: "_blank", class: 'btn btn-default' %>
44
+ <a class="btn btn-danger btn-remove-row">Remove</a>
45
+ </div>
46
+ </td>
47
+ </tr>
48
+ <% end %>
49
+ <tr class="new-row">
50
+ <td>
51
+ <a href="" class="title hidden"></a>
52
+ <input class="new-form-control string multi_value optional related_works_ids work_child_members_ids form-control multi-text-field" value="" id="work_child_members_ids" aria-labelledby="work_child_members_ids_label" name="<%= f.object.model_name.param_key %>[ordered_member_ids][]" type="text">
53
+ <div class="message has-warning hidden"></div>
54
+ </td>
55
+ <td>
56
+ <div class="child-actions">
57
+ <a href="" class="edit hidden btn btn-default" target="_blank">Edit</a>
58
+ <a class="btn btn-danger btn-remove-row hidden">Remove</a>
59
+ <a class="btn btn-primary btn-add-row">Add</a>
60
+ </div>
61
+ </td>
62
+ </tr>
63
+ </tbody>
64
+ </table>
65
+ </div>
@@ -8,7 +8,9 @@
8
8
  <legend class="legend-save-work">Requirements</legend>
9
9
  <ul class="requirements">
10
10
  <li class="incomplete" id="required-metadata">Enter required metadata</li>
11
- <li class="incomplete" id="required-files">Add files</li>
11
+ <% if Sufia.config.work_requires_files %>
12
+ <li class="incomplete" id="required-files">Add files</li>
13
+ <% end %>
12
14
  </ul>
13
15
  </fieldset>
14
16
  </div>
@@ -1,6 +1,15 @@
1
+ <%= render 'form_in_works', f: f %>
1
2
  <h2><%= t("sufia.works.#{action_name}.in_collections") %></h2>
2
3
  <div id="collection-widget">
3
4
  <%= f.input :collection_ids, as: :select,
4
- collection: available_collections(nil),
5
- input_html: { class: 'form-control', multiple: true } %>
5
+ collection: available_collections(nil),
6
+ input_html: { class: 'form-control', multiple: true } %>
6
7
  </div>
8
+
9
+ <% if params[:id] %>
10
+ <h3><%= t("sufia.works.#{action_name}.in_this_work") %></h3>
11
+ <%= render 'form_child_work_relationships', f: f %>
12
+
13
+ <h3><%= t("sufia.works.#{action_name}.in_other_works") %></h3>
14
+ <%= render_edit_field_partial(:in_works_ids, f: f) %>
15
+ <% end %>
@@ -5,8 +5,8 @@
5
5
  </thead>
6
6
  <tbody>
7
7
  <%= render 'attribute_rows', presenter: presenter %>
8
- <%= presenter.attribute_to_html(:embargo_release_date) %>
9
- <%= presenter.attribute_to_html(:lease_expiration_date) %>
8
+ <%= presenter.attribute_to_html(:embargo_release_date, render_as: :date) %>
9
+ <%= presenter.attribute_to_html(:lease_expiration_date, render_as: :date) %>
10
10
  <%= presenter.attribute_to_html(:rights, render_as: :rights) %>
11
11
  </tbody>
12
12
  </table>
@@ -1,22 +1,7 @@
1
- <h2><%= t('.header') %></h2>
2
- <% collection_presenters = presenter.collection_presenters %>
3
- <% if collection_presenters.blank? %>
4
- <p><%= t('.empty', type: presenter.human_readable_type) %></p>
5
- <% else %>
6
- <table class="table table-striped relationships">
7
- <tbody>
8
- <tr>
9
- <th><%= t('.collections', type: presenter.human_readable_type) %></th>
10
- <td>
11
- <% collection_presenters.each do |collection| %>
12
- <ul class="tabular">
13
- <li class='attribute title'>
14
- <%= link_to collection.to_s, main_app.collection_path(collection) %>
15
- </li>
16
- </ul>
17
- <% end %>
18
- </td>
19
- </tr>
20
- </tbody>
21
- </table>
22
- <% end %>
1
+ <h2><%= t('.header') %></h2>
2
+ <table class="table table-striped relationships">
3
+ <tbody>
4
+ <%= render 'relationships_parent_rows', presenter: presenter %>
5
+ <%= render 'relationships_member_rows', presenter: presenter %>
6
+ </tbody>
7
+ </table>
@@ -0,0 +1,24 @@
1
+ <% member_presenters = presenter.member_presenters.group_by(&:model_name).transform_keys{|key| key.to_s.singularize.underscore}.select{ |k,v| k.to_sym != :file_set } %>
2
+ <% if member_presenters.blank? %>
3
+ <tr>
4
+ <th><%= t(".label", type: presenter.human_readable_type) %></th>
5
+ <td>
6
+ <p><%= t('.empty', type: presenter.human_readable_type) %></p>
7
+ </td>
8
+ </tr>
9
+ <% else %>
10
+ <% member_presenters.each_pair do |model_name, members| %>
11
+ <tr>
12
+ <th><%= t(".label", type: presenter.human_readable_type) %></th>
13
+ <td>
14
+ <ul class="tabular">
15
+ <% members.each do |member| %>
16
+ <li class='attribute title'>
17
+ <%= link_to member.title.first, [main_app, member] %>
18
+ </li>
19
+ <% end %>
20
+ </ul>
21
+ </td>
22
+ </tr>
23
+ <% end %>
24
+ <% end %>
@@ -0,0 +1,16 @@
1
+ <tr>
2
+ <th><%= t(".label", type: type.humanize) %></th>
3
+ <td>
4
+ <% if items.blank? %>
5
+ <p><%= t('.empty', type: type.humanize) %></p>
6
+ <% else %>
7
+ <ul class="tabular">
8
+ <% items.each do |item| %>
9
+ <li class='attribute title'>
10
+ <%= link_to item.title.first, [main_app, item] %>
11
+ </li>
12
+ <% end %>
13
+ </ul>
14
+ <% end %>
15
+ </td>
16
+ </tr>
@@ -0,0 +1,6 @@
1
+ <tr>
2
+ <th><%= t(".label", type: type.humanize) %></th>
3
+ <td>
4
+ <p><%= t(".empty", type: type.humanize) %></p>
5
+ </td>
6
+ </tr>
@@ -0,0 +1,23 @@
1
+ <% presenters = presenter.collection_presenters %>
2
+ <% if presenters.blank? %>
3
+ <% presenter.presenter_types.each do |type| %>
4
+ <%= render 'relationships_parent_row_empty', type: type, presenter: presenter %>
5
+ <% end %>
6
+ <% else %>
7
+
8
+ <%# Render presenters which aren't specified in the 'presenter_types' %>
9
+ <% presenter.grouped_presenters(except: presenter.presenter_types).each_pair do |model_name, items| %>
10
+ <%= render 'relationships_parent_row', type: model_name, items: items, presenter: presenter %>
11
+ <% end %>
12
+
13
+ <%# Render grouped presenters showing rows or an 'empty' row if there are none for that type %>
14
+ <% presenter.presenter_types.each do |type| %>
15
+ <% if presenter.grouped_presenters(filtered_by: type).blank? %>
16
+ <%= render 'relationships_parent_row_empty', type: type, presenter: presenter %>
17
+ <% else %>
18
+ <% presenter.grouped_presenters(filtered_by: type).each_pair do |model_name, items| %>
19
+ <%= render 'relationships_parent_row', type: type, items: items, presenter: presenter %>
20
+ <% end %>
21
+ <% end %>
22
+ <% end %>
23
+ <% end %>
@@ -20,7 +20,7 @@
20
20
  </li>
21
21
 
22
22
  <li role="menuitem" tabindex="-1">
23
- <%= link_to t('sufia.single_use_link'), '#',
23
+ <%= link_to t('sufia.single_use_links.button'), '#',
24
24
  class: "copypaste",
25
25
  title: "Single-Use Link to File",
26
26
  data: { generate_single_use_link_url: curation_concerns.generate_show_single_use_link_url(file_set.id) },
@@ -6,17 +6,16 @@
6
6
  <%= link_to "Citations", sufia.citations_work_path(@presenter), id: 'citations', class: 'btn btn-default' %>
7
7
  <% end %>
8
8
  <% if @presenter.editor? %>
9
- <%= link_to "Edit This #{@presenter.human_readable_type}", edit_polymorphic_path([main_app, @presenter]), class: 'btn btn-default' %>
10
- <%= link_to "Delete This #{@presenter.human_readable_type}", [main_app, @presenter], class: 'btn btn-danger', data: { confirm: "Delete this #{@presenter.human_readable_type}?" }, method: :delete %>
11
-
12
- <%= button_tag t('sufia.single_use_link'),
13
- class: "copypaste btn btn-default",
14
- title: "Single-Use Link to File",
15
- data: { generate_single_use_link_url: curation_concerns.generate_show_single_use_link_url(@presenter.id) },
16
- id: "copy_link_#{@presenter.id}" %>
9
+ <%= link_to "Edit This #{@presenter.human_readable_type}", edit_polymorphic_path([main_app, @presenter]),
10
+ class: 'btn btn-default' %>
11
+ <%= link_to "Delete This #{@presenter.human_readable_type}", [main_app, @presenter],
12
+ class: 'btn btn-danger', data: { confirm: "Delete this #{@presenter.human_readable_type}?" },
13
+ method: :delete %>
14
+ <%= link_to t('sufia.single_use_links.button'),
15
+ curation_concerns.generate_download_single_use_link_path(@presenter),
16
+ class: 'btn btn-default generate-single-use-link' %>
17
17
  <% end %>
18
18
 
19
-
20
19
  <%= render 'social_media' %>
21
20
  </div>
22
21
 
@@ -0,0 +1,19 @@
1
+ <% single_use_links.each do |presenter| %>
2
+ <tr>
3
+ <td>
4
+ <%= t('sufia.single_use_links.expiration_message', link: presenter.short_key,
5
+ time: presenter.human_readable_expiration) %>
6
+ </td>
7
+ <td>
8
+ <button class="btn btn-xs btn-default copy-single-use-link"
9
+ data-clipboard-text="<%= curation_concerns.send(presenter.url_helper, presenter.downloadKey) %>"
10
+ data-toggle="tooltip" data-placement="bottom"
11
+ title="<%= t('curation_concerns.single_use_links.copy.tooltip') %>">
12
+ <%= t('curation_concerns.single_use_links.copy.button') %>
13
+ </button>
14
+ <%= link_to t('curation_concerns.single_use_links.delete'),
15
+ curation_concerns.delete_single_use_link_path(params[:id], presenter),
16
+ class: 'btn btn-xs btn-danger delete-single-use-link' %>
17
+ </td>
18
+ </tr>
19
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <h3><%= t('curation_concerns.single_use_links.title') %></h3>
2
+ <table class="table table-striped table-condensed <%= dom_class(presenter) %> single-use-links">
3
+ <tbody data-url="<%= curation_concerns.generated_single_use_links_path(presenter) %>">
4
+ <% if presenter.single_use_links.empty? %>
5
+ <tr><td><%= t('curation_concerns.single_use_links.table.no_links') %></td></tr>
6
+ <% else %>
7
+ <%= render 'single_use_link_rows', single_use_links: presenter.single_use_links %>
8
+ <% end %>
9
+ </tbody>
10
+ </table>
@@ -5,6 +5,7 @@
5
5
  <div class="col-xs-12 col-sm-4">
6
6
  <%= media_display @presenter %>
7
7
  <%= render 'show_actions', presenter: @presenter %>
8
+ <%= render 'single_use_links', presenter: @presenter if @presenter.editor? %>
8
9
  </div>
9
10
  <div itemscope itemtype="<%= @presenter.itemtype %>" class="col-xs-12 col-sm-8">
10
11
  <header>
@@ -0,0 +1,59 @@
1
+ <%# Form UI behavior code and details;
2
+ Code:
3
+ app/assets/javascripts/sufia/relationships
4
+ CSS:
5
+ table.relationships-ajax-enabled : Used by sufia JS app as selector to wire up the UI functionality
6
+ tr.new-row : The basic template row for cloning when user clicks "Add"
7
+ .btn-remove-row : Button to remove its parent TR from the table
8
+ .btn-add-row : Button to clone its parent TR and inject a new row into the table
9
+ input.new-form-control : Input field for client client side validation and additional features
10
+ .message.has-warning : Used to display UI errors related to input values and server errors
11
+ HTML Properties:
12
+ table:
13
+ data-query-url : URL base to append newly added work ID to for querying details (title, href)
14
+ %>
15
+ <% if f.object.class.multiple? key %>
16
+ <div class="form-group multi_value optional work_in_works_ids managed">
17
+ <table class="table table-striped related-files relationships-ajax-enabled"
18
+ data-query-url="<%=polymorphic_path([main_app, :curation_concerns, curation_concern.model_name.singular], id: '$id') %>">
19
+ <thead>
20
+ <tr>
21
+ <th>Parent Work</th>
22
+ <th>Actions</th>
23
+ </tr>
24
+ </thead>
25
+ <tbody>
26
+ <% curation_concern.in_works.each do |parent| %>
27
+ <tr>
28
+ <td>
29
+ <%= link_to "#{parent.title.first}", polymorphic_path([main_app, :curation_concerns, curation_concern.model_name.singular], id: parent.id) %>
30
+ <input class="string multi_value optional form-control related_works_ids form-control multi-text-field hidden" name="<%= curation_concern.model_name.param_key %>[in_works_ids][]" value="<%= parent.id %>" id="work_in_works_ids" aria-labelledby="work_in_works_ids_label" type="text">
31
+ </td>
32
+ <td>
33
+ <div class="child-actions">
34
+ <%= link_to "Edit", edit_polymorphic_path([main_app, :curation_concerns, curation_concern.model_name.singular], id: parent.id), target: "_blank", class: 'btn btn-default' %>
35
+ <a class="btn btn-danger btn-remove-row">Remove</a>
36
+ </div>
37
+ </td>
38
+ </tr>
39
+ <% end %>
40
+ <tr class="new-row">
41
+ <td>
42
+ <a href="" class="title hidden"></a>
43
+ <input class="new-form-control string multi_value optional related_works_ids form-control multi-text-field" name="<%= curation_concern.model_name.param_key %>[in_works_ids][]" value="" aria-labelledby="work_in_works_ids_label" type="text">
44
+ <div class="message has-warning hidden"></div>
45
+ </td>
46
+ <td>
47
+ <div class="child-actions">
48
+ <a href="" class="edit hidden btn btn-default" target="_blank">Edit</a>
49
+ <a class="btn btn-danger btn-remove-row hidden">Remove</a>
50
+ <a class="btn btn-primary btn-add-row">Add</a>
51
+ </div>
52
+ </td>
53
+ </tr>
54
+ </tbody>
55
+ </table>
56
+ </div>
57
+ <% else %>
58
+ <%= f.input key, required: f.object.required?(key) %>
59
+ <% end %>
@@ -14,7 +14,9 @@ en:
14
14
  share_button: "Share Your Work"
15
15
  view_profile: "View Profile"
16
16
  edit_profile: "Edit Profile"
17
- single_use_link: "Single-Use Link to File"
17
+ single_use_links:
18
+ button: "Single-Use Link to File"
19
+ expiration_message: "Link %{link} expires %{time}"
18
20
  directory:
19
21
  suffix: "@example.org"
20
22
  search:
@@ -210,10 +212,14 @@ en:
210
212
  new:
211
213
  header: Add New Work
212
214
  in_collections: This Work in Collections
215
+ in_this_work: Other Works in this Work
216
+ in_other_works: This Work in Other Works
213
217
  after_create_html: "Your files are being processed by %{application_name} in the background. The metadata and access controls you specified are being applied. Files will be marked <span class=\"label label-danger\" title=\"Private\">Private</span> until this process is complete (shouldn't take too long, hang in there!). You may need to refresh this page to see these updates."
214
218
  edit:
215
219
  header: Edit Work
216
220
  in_collections: This Work in Collections
221
+ in_this_work: Other Works in this Work
222
+ in_other_works: This Work in Other Works
217
223
  additional_fields: "Additional fields"
218
224
  tab:
219
225
  metadata: "Descriptions"
@@ -228,6 +234,8 @@ en:
228
234
  new:
229
235
  header: Batch Create New Works
230
236
  in_collections: These Works in Collections
237
+ in_this_work: Other Works in this Work
238
+ in_other_works: This Work in Other Works
231
239
  progress:
232
240
  header: Save Works
233
241
  files:
@@ -340,8 +348,15 @@ en:
340
348
  base:
341
349
  relationships:
342
350
  header: Relationships
343
- empty: "This %{type} is not currently in any collections."
344
- collections: "In collections:"
351
+ empty: "This %{type} is not currently in any collections."
352
+ relationships_parent_row:
353
+ label: "In %{type}:"
354
+ relationships_parent_row_empty:
355
+ label: "In %{type}:"
356
+ empty: "There are no %{type} relationships."
357
+ relationships_member_rows:
358
+ label: "Has related %{type}:"
359
+ empty: "This %{type} does not have any related works."
345
360
  metadata:
346
361
  header: Descriptions
347
362
  attribute_name_label: Attribute Name
@@ -362,12 +377,16 @@ en:
362
377
  label_html: Lease
363
378
  private:
364
379
  label_html: Private
380
+ single_use_links:
381
+ copy:
382
+ button: Copy
365
383
  blacklight:
366
384
  search:
367
385
  fields:
368
386
  show:
369
387
  keyword: Keyword
370
388
 
389
+
371
390
  helpers:
372
391
  action:
373
392
  cancel: "Cancel"