sufia 7.0.0 → 7.1.0

Sign up to get free protection for your applications and to get access to all the features.
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"