hyrax 2.3.3 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +1 -1
- data/.github/stale.yml +19 -0
- data/README.md +2 -2
- data/app/actors/hyrax/actors/apply_permission_template_actor.rb +2 -4
- data/app/actors/hyrax/actors/create_with_files_ordered_members_actor.rb +45 -0
- data/app/actors/hyrax/actors/create_with_remote_files_ordered_members_actor.rb +96 -0
- data/app/actors/hyrax/actors/file_set_ordered_members_actor.rb +16 -0
- data/app/actors/hyrax/actors/ordered_members_actor.rb +28 -0
- data/app/assets/javascripts/hyrax/collections.js +2 -0
- data/app/assets/stylesheets/hyrax/_file-listing.scss +2 -1
- data/app/assets/stylesheets/hyrax/_work-show.scss +4 -0
- data/app/controllers/concerns/hyrax/embargoes_controller_behavior.rb +1 -1
- data/app/controllers/concerns/hyrax/works_controller_behavior.rb +5 -2
- data/app/controllers/hyrax/dashboard/nest_collections_controller.rb +2 -9
- data/app/helpers/hyrax/batch_edits_helper.rb +0 -1
- data/app/helpers/hyrax/hyrax_helper_behavior.rb +1 -0
- data/app/helpers/hyrax/iiif_helper.rb +12 -0
- data/app/jobs/attach_files_to_work_with_ordered_members_job.rb +41 -0
- data/app/presenters/hyrax/work_show_presenter.rb +29 -2
- data/app/services/hyrax/permission_template_applicator.rb +48 -0
- data/app/views/hyrax/admin/collection_types/_form_settings.html.erb +1 -1
- data/app/views/hyrax/admin/collection_types/index.html.erb +1 -1
- data/app/views/hyrax/base/_form_rendering.html.erb +7 -5
- data/app/views/hyrax/base/_form_representative.html.erb +4 -2
- data/app/views/hyrax/base/_form_thumbnail.html.erb +4 -2
- data/app/views/hyrax/base/_member.html.erb +1 -1
- data/app/views/hyrax/base/_representative_media.html.erb +1 -4
- data/app/views/hyrax/base/_show_actions.html.erb +6 -4
- data/app/views/hyrax/base/iiif_viewers/_universal_viewer.html.erb +4 -0
- data/app/views/hyrax/base/show.html.erb +2 -2
- data/app/views/hyrax/dashboard/works/_default_group.html.erb +1 -1
- data/app/views/hyrax/file_sets/_file_set_title.erb +2 -2
- data/app/views/hyrax/homepage/_featured.html.erb +0 -3
- data/app/views/hyrax/my/_collection_action_menu.html.erb +1 -0
- data/app/views/hyrax/my/collections/_default_group.html.erb +1 -9
- data/app/views/hyrax/my/collections/_list_collections.html.erb +1 -1
- data/app/views/hyrax/users/_activity_log.html.erb +1 -1
- data/config/locales/hyrax.de.yml +2 -0
- data/config/locales/hyrax.en.yml +2 -0
- data/config/locales/hyrax.es.yml +2 -0
- data/config/locales/hyrax.fr.yml +2 -0
- data/config/locales/hyrax.it.yml +2 -0
- data/config/locales/hyrax.pt-BR.yml +2 -0
- data/config/locales/hyrax.zh.yml +2 -0
- data/hyrax.gemspec +1 -0
- data/lib/generators/hyrax/templates/config/initializers/hyrax.rb +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.de.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.en.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.es.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.fr.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.it.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.zh.yml +1 -1
- data/lib/hyrax/configuration.rb +1 -1
- data/lib/hyrax/transactions.rb +23 -0
- data/lib/hyrax/transactions/container.rb +63 -0
- data/lib/hyrax/transactions/create_work.rb +47 -0
- data/lib/hyrax/transactions/steps/apply_permission_template.rb +29 -0
- data/lib/hyrax/transactions/steps/ensure_admin_set.rb +23 -0
- data/lib/hyrax/transactions/steps/ensure_permission_template.rb +27 -0
- data/lib/hyrax/transactions/steps/save_work.rb +35 -0
- data/lib/hyrax/transactions/steps/set_default_admin_set.rb +25 -0
- data/lib/hyrax/transactions/steps/set_modified_date.rb +25 -0
- data/lib/hyrax/transactions/steps/set_uploaded_date.rb +28 -0
- data/lib/hyrax/version.rb +1 -1
- data/spec/actors/hyrax/actors/create_with_files_ordered_members_actor_spec.rb +41 -0
- data/spec/actors/hyrax/actors/create_with_remote_files_ordered_members_actor_spec.rb +49 -0
- data/spec/actors/hyrax/actors/file_set_ordered_members_actor_spec.rb +35 -0
- data/spec/actors/hyrax/actors/ordered_members_actor_spec.rb +59 -0
- data/spec/controllers/hyrax/embargoes_controller_spec.rb +2 -0
- data/spec/controllers/hyrax/generic_works_controller_spec.rb +6 -1
- data/spec/factories/generic_works.rb +6 -0
- data/spec/features/collection_multi_membership_spec.rb +6 -6
- data/spec/features/work_show_spec.rb +58 -5
- data/spec/helpers/hyrax/batch_edits_helper_spec.rb +4 -2
- data/spec/helpers/hyrax/iiif_helper_spec.rb +44 -0
- data/spec/hyrax/transactions/create_work_spec.rb +155 -0
- data/spec/hyrax/transactions/steps/apply_permission_template_spec.rb +72 -0
- data/spec/hyrax/transactions/steps/ensure_admin_set_spec.rb +25 -0
- data/spec/hyrax/transactions/steps/ensure_permission_template_spec.rb +33 -0
- data/spec/hyrax/transactions/steps/save_work_spec.rb +32 -0
- data/spec/hyrax/transactions/steps/set_default_admin_set_spec.rb +38 -0
- data/spec/hyrax/transactions/steps/set_modified_date_spec.rb +22 -0
- data/spec/hyrax/transactions/steps/set_uploaded_date_spec.rb +32 -0
- data/spec/jobs/attach_files_to_work_with_ordered_members_job_spec.rb +13 -0
- data/spec/presenters/hyrax/presenter_renderer_spec.rb +4 -2
- data/spec/presenters/hyrax/work_show_presenter_spec.rb +46 -2
- data/spec/services/hyrax/permission_template_applicator_spec.rb +69 -0
- data/spec/spec_helper.rb +13 -2
- data/spec/views/catalog/index.html.erb_spec.rb +7 -4
- data/spec/views/hyrax/admin/admin_sets/_show_actions.html.erb_spec.rb +2 -0
- data/spec/views/hyrax/admin/admin_sets/_show_document_list_row.html.erb_spec.rb +4 -1
- data/spec/views/hyrax/admin/admin_sets/index.html.erb_spec.rb +6 -2
- data/spec/views/hyrax/admin/admin_sets/index.json.erb_spec.rb +1 -2
- data/spec/views/hyrax/admin/collection_types/_form_metadata_admin_set.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/admin/collection_types/_form_settings.html.erb_spec.rb +5 -26
- data/spec/views/hyrax/admin/collection_types/index.html.erb_spec.rb +26 -5
- data/spec/views/hyrax/admin/stats/show.html.erb_spec.rb +1 -0
- data/spec/views/hyrax/base/_attribute_rows.html.erb_spec.rb +5 -1
- data/spec/views/hyrax/base/_attributes.html.erb_spec.rb +1 -0
- data/spec/views/hyrax/base/_form_rendering.html.erb_spec.rb +5 -1
- data/spec/views/hyrax/base/_items.html.erb_spec.rb +2 -0
- data/spec/views/hyrax/base/_relationships.html.erb_spec.rb +2 -1
- data/spec/views/hyrax/base/_show_actions.html.erb_spec.rb +71 -0
- data/spec/views/hyrax/base/file_manager.html.erb_spec.rb +11 -14
- data/spec/views/hyrax/base/show.html.erb_spec.rb +2 -2
- data/spec/views/hyrax/base/show.json.jbuilder_spec.rb +3 -1
- data/spec/views/hyrax/collections/_show_document_list_row.html.erb_spec.rb +6 -1
- data/spec/views/hyrax/collections/_show_parent_collections.html.erb_spec.rb +5 -5
- data/spec/views/hyrax/collections/_subcollection_list.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/collections/show.html.erb_spec.rb +3 -2
- data/spec/views/hyrax/dashboard/collections/_form_share.erb_spec.rb +1 -1
- data/spec/views/hyrax/dashboard/collections/_form_share_table.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/dashboard/collections/_show_document_list_row.html.erb_spec.rb +6 -1
- data/spec/views/hyrax/dashboard/collections/_subcollection_list.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/dashboard/collections/edit.html.erb_spec.rb +3 -1
- data/spec/views/hyrax/dashboard/profiles/show.html.erb_spec.rb +2 -3
- data/spec/views/hyrax/file_sets/_show_characterization_details.html.erb_spec.rb +1 -2
- data/spec/views/hyrax/file_sets/_single_use_links.html.erb_spec.rb +1 -2
- data/spec/views/hyrax/homepage/_sortable_featured.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/my/_collection_action_menu.html.erb_spec.rb +5 -5
- data/spec/views/hyrax/my/collections/_list_collections.html.erb_spec.rb +11 -8
- data/spec/views/hyrax/users/index.html.erb_spec.rb +1 -0
- data/spec/views/hyrax/users/show.html.erb_spec.rb +3 -0
- data/template.rb +1 -1
- metadata +65 -3
- data/app/views/hyrax/dashboard/collections/_form_default_group_delt.html.erb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d34c51d077dddcd6a5932d22a633104906b17e30
|
4
|
+
data.tar.gz: f61e880d0705b2863c0edf50e0066b8cf4df41c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bcda312829b2581af6d701b0a57cc11e99d26e12c4405fc5f8ecb814328cdc94a5ed74cb5deb0583b995b8ffd64127f806c4b7fb64a37372610ddf2d0e477d44
|
7
|
+
data.tar.gz: 70e85336f1286e3749f22f8cd4ee8d3607a4f06bc9dda48429cf37f53041b7d9012ddb1628bc97ae1de8d17622019e6f20d37f66bd920adb272fe1996a96954c
|
data/.circleci/config.yml
CHANGED
@@ -12,7 +12,7 @@ jobs:
|
|
12
12
|
- image: ualbertalib/docker-fcrepo4:4.7
|
13
13
|
environment:
|
14
14
|
CATALINA_OPTS: "-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms512m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"
|
15
|
-
- image: solr:7
|
15
|
+
- image: solr:7-alpine
|
16
16
|
command: bin/solr -cloud -noprompt -f -p 8985
|
17
17
|
|
18
18
|
# Specify service dependencies here if necessary
|
data/.github/stale.yml
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Number of days of inactivity before an issue becomes stale
|
2
|
+
daysUntilStale: 30
|
3
|
+
# Number of days of inactivity before a stale issue is closed
|
4
|
+
daysUntilClose: 14
|
5
|
+
# Issues with these labels will never be considered stale
|
6
|
+
exemptLabels:
|
7
|
+
- pinned
|
8
|
+
- security
|
9
|
+
# Label to use when marking an issue as stale
|
10
|
+
staleLabel: stale
|
11
|
+
# Comment to post when marking an issue as stale. Set to `false` to disable
|
12
|
+
markComment: >
|
13
|
+
This issue has been automatically marked as stale because it has not had
|
14
|
+
activity for 30 days. It will be closed if no further activity occurs within 14 days. Thank you
|
15
|
+
for your contributions.
|
16
|
+
# Comment to post when closing a stale issue. Set to `false` to disable
|
17
|
+
closeComment: false
|
18
|
+
# Limit to only `issues` or `pulls`
|
19
|
+
only: pulls
|
data/README.md
CHANGED
@@ -64,7 +64,7 @@ The Samvera community is here to help. Please see our [support guide](./.github/
|
|
64
64
|
# Getting started
|
65
65
|
|
66
66
|
This document contains instructions specific to setting up an app with __Hyrax
|
67
|
-
v2.
|
67
|
+
v2.4.0__. If you are looking for instructions on installing a different
|
68
68
|
version, be sure to select the appropriate branch or tag from the drop-down
|
69
69
|
menu above.
|
70
70
|
|
@@ -163,7 +163,7 @@ NOTE: The steps need to be done in order to create a new Hyrax based app.
|
|
163
163
|
Generate a new Rails application using the template.
|
164
164
|
|
165
165
|
```
|
166
|
-
rails _5.1.6_ new my_app -m https://raw.githubusercontent.com/samvera/hyrax/v2.
|
166
|
+
rails _5.1.6_ new my_app -m https://raw.githubusercontent.com/samvera/hyrax/v2.4.0/template.rb
|
167
167
|
```
|
168
168
|
|
169
169
|
Generating a new Rails application using Hyrax's template above takes cares of a number of steps for you, including:
|
@@ -31,10 +31,8 @@ module Hyrax
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def set_curation_concern_access(env, template)
|
34
|
-
|
35
|
-
|
36
|
-
env.curation_concern.read_users += template.agent_ids_for(agent_type: 'user', access: 'view')
|
37
|
-
env.curation_concern.read_groups += template.agent_ids_for(agent_type: 'group', access: 'view')
|
34
|
+
PermissionTemplateApplicator
|
35
|
+
.apply(template).to(model: env.curation_concern)
|
38
36
|
end
|
39
37
|
end
|
40
38
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Hyrax
|
2
|
+
module Actors
|
3
|
+
# When adding member FileSets to a Work, Hyrax saves
|
4
|
+
# and reloads the work for each new member FileSet.
|
5
|
+
# This can significantly slow down ingest for Works
|
6
|
+
# with many member FileSets. The saving and reloading
|
7
|
+
# happens in FileSetActor#attach_to_work.
|
8
|
+
#
|
9
|
+
# This is a 'swappable' alternative approach. It will
|
10
|
+
# be of most value to Hyrax applications dealing with
|
11
|
+
# works with many filesets. Anecdotally, a work with
|
12
|
+
# 600 filesets can be processed in ~15 mins versus
|
13
|
+
# > 3 hours with the standard approach.
|
14
|
+
#
|
15
|
+
# The tradeoff is that the ordered members are now added in a
|
16
|
+
# single step after the creation of all the FileSets, thus
|
17
|
+
# introducing a slight risk of orphan filesets if the upload
|
18
|
+
# fails before the addition of the ordered members. This
|
19
|
+
# has not been observed in practice.
|
20
|
+
#
|
21
|
+
# Swapping out the actors can be achieved thus:
|
22
|
+
#
|
23
|
+
# In `config/initializers/hyrax.rb`:
|
24
|
+
# ```
|
25
|
+
# Hyrax::CurationConcern.actor_factory.swap(Hyrax::Actors::CreateWithFilesActor,
|
26
|
+
# Hyrax::Actors::CreateWithFilesOrderedMembersActor)
|
27
|
+
# ```
|
28
|
+
# Alternatively, in `config/application.rb`:
|
29
|
+
# ```
|
30
|
+
# config.to_prepare
|
31
|
+
# Hyrax::CurationConcern.actor_factory.swap(Hyrax::Actors::CreateWithFilesActor,
|
32
|
+
# Hyrax::Actors::CreateWithFilesOrderedMembersActor)
|
33
|
+
# end
|
34
|
+
# ```
|
35
|
+
# Creates a work and attaches files to the work
|
36
|
+
class CreateWithFilesOrderedMembersActor < CreateWithFilesActor
|
37
|
+
# @return [TrueClass]
|
38
|
+
def attach_files(files, env)
|
39
|
+
return true if files.blank?
|
40
|
+
AttachFilesToWorkWithOrderedMembersJob.perform_later(env.curation_concern, files, env.attributes.to_h.symbolize_keys)
|
41
|
+
true
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module Hyrax
|
2
|
+
module Actors
|
3
|
+
# When adding member FileSets to a Work, Hyrax saves
|
4
|
+
# and reloads the work for each new member FileSet.
|
5
|
+
# This can significantly slow down ingest for Works
|
6
|
+
# with many member FileSets. The saving and reloading
|
7
|
+
# happens in FileSetActor#attach_to_work.
|
8
|
+
#
|
9
|
+
# This is a 'swappable' alternative approach. It will
|
10
|
+
# be of most value to Hyrax applications dealing with
|
11
|
+
# works with many filesets. Anecdotally, a 600 fileset
|
12
|
+
# can be processed in ~15 mins versus >3 hours
|
13
|
+
# with the standard approach.
|
14
|
+
#
|
15
|
+
# The tradeoff is that the ordered members are now added in a
|
16
|
+
# single step after the creation of all the FileSets, thus
|
17
|
+
# introducing a slight risk of orphan filesets if the upload
|
18
|
+
# fails before the addition of the ordered members. This
|
19
|
+
# has not been observed in practice.
|
20
|
+
#
|
21
|
+
# Swapping out the actors can be achieved thus:
|
22
|
+
#
|
23
|
+
# In `config/initializers/hyrax.rb`:
|
24
|
+
# ```
|
25
|
+
# Hyrax::CurationConcern.actor_factory.swap(Hyrax::Actors::CreateWithFilesActor,
|
26
|
+
# Hyrax::Actors::CreateWithRemoteFilesOrderedMembersActor)
|
27
|
+
# ```
|
28
|
+
# Alternatively, in `config/application.rb`:
|
29
|
+
# ```
|
30
|
+
# config.to_prepare
|
31
|
+
# Hyrax::CurationConcern.actor_factory.swap(Hyrax::Actors::CreateWithFilesActor,
|
32
|
+
# Hyrax::Actors::CreateWithRemoteFilesOrderedMembersActor)
|
33
|
+
# end
|
34
|
+
# ```
|
35
|
+
#
|
36
|
+
# If there is a key `:remote_files' in the attributes, it attaches the files at the specified URIs
|
37
|
+
# to the work. e.g.:
|
38
|
+
# attributes[:remote_files] = filenames.map do |name|
|
39
|
+
# { url: "https://example.com/file/#{name}", file_name: name }
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# Browse everything may also return a local file. And although it's in the
|
43
|
+
# url property, it may have spaces, and not be a valid URI.
|
44
|
+
class CreateWithRemoteFilesOrderedMembersActor < CreateWithRemoteFilesActor
|
45
|
+
attr_reader :ordered_members
|
46
|
+
|
47
|
+
# @param [HashWithIndifferentAccess] remote_files
|
48
|
+
# @return [TrueClass]
|
49
|
+
def attach_files(env, remote_files)
|
50
|
+
return true unless remote_files
|
51
|
+
@ordered_members = env.curation_concern.ordered_members.to_a
|
52
|
+
remote_files.each do |file_info|
|
53
|
+
next if file_info.blank? || file_info[:url].blank?
|
54
|
+
# Escape any space characters, so that this is a legal URI
|
55
|
+
uri = URI.parse(Addressable::URI.escape(file_info[:url]))
|
56
|
+
unless validate_remote_url(uri)
|
57
|
+
Rails.logger.error "User #{env.user.user_key} attempted to ingest file from url #{file_info[:url]}, which doesn't pass validation"
|
58
|
+
return false
|
59
|
+
end
|
60
|
+
auth_header = file_info.fetch(:auth_header, {})
|
61
|
+
create_file_from_url(env, uri, file_info[:file_name], auth_header)
|
62
|
+
end
|
63
|
+
add_ordered_members(env.user, env.curation_concern)
|
64
|
+
true
|
65
|
+
end
|
66
|
+
|
67
|
+
# Generic utility for creating FileSet from a URL
|
68
|
+
# Used in to import files using URLs from a file picker like browse_everything
|
69
|
+
def create_file_from_url(env, uri, file_name, auth_header = {})
|
70
|
+
::FileSet.new(import_url: uri.to_s, label: file_name) do |fs|
|
71
|
+
actor = file_set_actor_class.new(fs, env.user)
|
72
|
+
actor.create_metadata(visibility: env.curation_concern.visibility)
|
73
|
+
actor.attach_to_work(env.curation_concern)
|
74
|
+
fs.save!
|
75
|
+
ordered_members << fs
|
76
|
+
if uri.scheme == 'file'
|
77
|
+
# Turn any %20 into spaces.
|
78
|
+
file_path = CGI.unescape(uri.path)
|
79
|
+
IngestLocalFileJob.perform_later(fs, file_path, env.user)
|
80
|
+
else
|
81
|
+
ImportUrlJob.perform_later(fs, operation_for(user: actor.user), auth_header)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Add all file_sets as ordered_members in a single action
|
87
|
+
def add_ordered_members(user, work)
|
88
|
+
actor = Hyrax::Actors::OrderedMembersActor.new(ordered_members, user)
|
89
|
+
actor.attach_ordered_members_to_work(work)
|
90
|
+
end
|
91
|
+
|
92
|
+
class_attribute :file_set_actor_class
|
93
|
+
self.file_set_actor_class = Hyrax::Actors::FileSetOrderedMembersActor
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hyrax
|
4
|
+
module Actors
|
5
|
+
class FileSetOrderedMembersActor < FileSetActor
|
6
|
+
# Adds representative and thumbnail to work; sets file_set visibility
|
7
|
+
# @param [ActiveFedora::Base] work the parent work
|
8
|
+
# @param [Hash] file_set_params
|
9
|
+
def attach_to_work(work, file_set_params = {})
|
10
|
+
file_set.visibility = work.visibility unless assign_visibility?(file_set_params)
|
11
|
+
work.representative = file_set if work.representative_id.blank?
|
12
|
+
work.thumbnail = file_set if work.thumbnail_id.blank?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Hyrax
|
4
|
+
module Actors
|
5
|
+
class OrderedMembersActor < FileSetActor
|
6
|
+
include Lockable
|
7
|
+
attr_reader :ordered_members, :user
|
8
|
+
|
9
|
+
def initialize(ordered_members, user)
|
10
|
+
@ordered_members = ordered_members
|
11
|
+
@user = user
|
12
|
+
end
|
13
|
+
|
14
|
+
# Adds FileSets to the work using ore:Aggregations.
|
15
|
+
# Locks to ensure that only one process is operating on the list at a time.
|
16
|
+
# @param [ActiveFedora::Base] work the parent work
|
17
|
+
def attach_ordered_members_to_work(work)
|
18
|
+
acquire_lock_for(work.id) do
|
19
|
+
work.ordered_members = ordered_members
|
20
|
+
work.save
|
21
|
+
ordered_members.each do |file_set|
|
22
|
+
Hyrax.config.callback.run(:after_create_fileset, file_set, user)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -289,6 +289,7 @@ Blacklight.onLoad(function () {
|
|
289
289
|
parentId = $modal.find('[name="parent_id"]').val(),
|
290
290
|
data = {
|
291
291
|
parent_id: parentId,
|
292
|
+
// source parameter is used by NestCollectionsController#redirect_path
|
292
293
|
source: $self.data('source')
|
293
294
|
};
|
294
295
|
if (url.length === 0) {
|
@@ -308,6 +309,7 @@ Blacklight.onLoad(function () {
|
|
308
309
|
childId = $(this).closest('.modal').find('[name="child_id"]').val(),
|
309
310
|
data = {
|
310
311
|
child_id: childId,
|
312
|
+
// source parameter is used by NestCollectionsController#redirect_path
|
311
313
|
source: $(this).data('source')
|
312
314
|
};
|
313
315
|
if (url.length === 0) {
|
@@ -127,13 +127,16 @@ module Hyrax
|
|
127
127
|
|
128
128
|
def manifest
|
129
129
|
headers['Access-Control-Allow-Origin'] = '*'
|
130
|
-
|
130
|
+
respond_to do |wants|
|
131
|
+
wants.json { render json: manifest_builder.to_h }
|
132
|
+
wants.html { render json: manifest_builder.to_h }
|
133
|
+
end
|
131
134
|
end
|
132
135
|
|
133
136
|
private
|
134
137
|
|
135
138
|
def user_collections
|
136
|
-
collections_service.search_results(:deposit)
|
139
|
+
collections_service.search_results(:deposit)
|
137
140
|
end
|
138
141
|
|
139
142
|
def collections_service
|
@@ -91,15 +91,8 @@ module Hyrax
|
|
91
91
|
|
92
92
|
# determine appropriate redirect location depending on specified source
|
93
93
|
def redirect_path(item:)
|
94
|
-
|
95
|
-
|
96
|
-
when "my"
|
97
|
-
my_collections_path
|
98
|
-
when "show"
|
99
|
-
dashboard_collection_path(item)
|
100
|
-
else
|
101
|
-
dashboard_collection_path(item)
|
102
|
-
end
|
94
|
+
return my_collections_path if params[:source] == 'my'
|
95
|
+
dashboard_collection_path(item)
|
103
96
|
end
|
104
97
|
end
|
105
98
|
end
|
@@ -11,6 +11,7 @@ module Hyrax
|
|
11
11
|
include Hyrax::CollectionsHelper
|
12
12
|
include Hyrax::ChartsHelper
|
13
13
|
include Hyrax::DashboardHelperBehavior
|
14
|
+
include Hyrax::IiifHelper
|
14
15
|
|
15
16
|
# Which translations are available for the user to select
|
16
17
|
# @return [Hash<String,String>] locale abbreviations as keys and flags as values
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Hyrax
|
2
|
+
module IiifHelper
|
3
|
+
def iiif_viewer_display(work_presenter, locals = {})
|
4
|
+
render iiif_viewer_display_partial(work_presenter),
|
5
|
+
locals.merge(presenter: work_presenter)
|
6
|
+
end
|
7
|
+
|
8
|
+
def iiif_viewer_display_partial(work_presenter)
|
9
|
+
'hyrax/base/iiif_viewers/' + work_presenter.iiif_viewer.to_s
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Converts UploadedFiles into FileSets and attaches them to works.
|
2
|
+
class AttachFilesToWorkWithOrderedMembersJob < AttachFilesToWorkJob
|
3
|
+
attr_reader :ordered_members, :uploaded_files
|
4
|
+
|
5
|
+
# @param [ActiveFedora::Base] work - the work object
|
6
|
+
# @param [Array<Hyrax::UploadedFile>] uploaded_files - an array of files to attach
|
7
|
+
def perform(work, uploaded_files, **work_attributes)
|
8
|
+
@uploaded_files = uploaded_files
|
9
|
+
validate_files!(uploaded_files)
|
10
|
+
@ordered_members = work.ordered_members.to_a # Build array of ordered members
|
11
|
+
depositor = proxy_or_depositor(work)
|
12
|
+
user = User.find_by_user_key(depositor)
|
13
|
+
metadata = visibility_attributes(work_attributes)
|
14
|
+
add_uploaded_files(user, metadata, work)
|
15
|
+
add_ordered_members(user, work)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def add_uploaded_files(user, metadata, work)
|
21
|
+
work_permissions = work.permissions.map(&:to_hash)
|
22
|
+
uploaded_files.each do |uploaded_file|
|
23
|
+
actor = file_set_actor_class.new(FileSet.create, user)
|
24
|
+
actor.create_metadata(metadata)
|
25
|
+
actor.create_content(uploaded_file)
|
26
|
+
actor.attach_to_work(work)
|
27
|
+
actor.file_set.permissions_attributes = work_permissions
|
28
|
+
ordered_members << actor.file_set
|
29
|
+
uploaded_file.update(file_set_uri: actor.file_set.uri)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Add all file_sets as ordered_members in a single action
|
34
|
+
def add_ordered_members(user, work)
|
35
|
+
actor = Hyrax::Actors::OrderedMembersActor.new(ordered_members, user)
|
36
|
+
actor.attach_ordered_members_to_work(work)
|
37
|
+
end
|
38
|
+
|
39
|
+
class_attribute :file_set_actor_class
|
40
|
+
self.file_set_actor_class = Hyrax::Actors::FileSetOrderedMembersActor
|
41
|
+
end
|
@@ -55,8 +55,8 @@ module Hyrax
|
|
55
55
|
Hyrax::Engine.routes.url_helpers.download_url(representative_presenter, host: request.host)
|
56
56
|
end
|
57
57
|
|
58
|
-
# @return [Boolean] render
|
59
|
-
def
|
58
|
+
# @return [Boolean] render a IIIF viewer
|
59
|
+
def iiif_viewer?
|
60
60
|
representative_id.present? &&
|
61
61
|
representative_presenter.present? &&
|
62
62
|
representative_presenter.image? &&
|
@@ -64,6 +64,26 @@ module Hyrax
|
|
64
64
|
members_include_viewable_image?
|
65
65
|
end
|
66
66
|
|
67
|
+
alias universal_viewer? iiif_viewer?
|
68
|
+
deprecation_deprecate universal_viewer?: "use iiif_viewer? instead"
|
69
|
+
|
70
|
+
# @return [Symbol] the name of the IIIF viewer partial to render
|
71
|
+
# @example A work presenter with a custom iiif viewer
|
72
|
+
# module Hyrax
|
73
|
+
# class GenericWorkPresenter < Hyrax::WorkShowPresenter
|
74
|
+
# def iiif_viewer
|
75
|
+
# :my_iiif_viewer
|
76
|
+
# end
|
77
|
+
# end
|
78
|
+
# end
|
79
|
+
#
|
80
|
+
# Custom iiif viewer partial at app/views/hyrax/base/iiif_viewers/_my_iiif_viewer.html.erb
|
81
|
+
# <h3>My IIIF Viewer!</h3>
|
82
|
+
# <a href=<%= main_app.polymorphic_url([main_app, :manifest, presenter], { locale: nil }) %>>Manifest</a>
|
83
|
+
def iiif_viewer
|
84
|
+
:universal_viewer
|
85
|
+
end
|
86
|
+
|
67
87
|
# @return FileSetPresenter presenter for the representative FileSets
|
68
88
|
def representative_presenter
|
69
89
|
return nil if representative_id.blank?
|
@@ -204,6 +224,13 @@ module Hyrax
|
|
204
224
|
metadata
|
205
225
|
end
|
206
226
|
|
227
|
+
# determine if the user can add this work to a collection
|
228
|
+
# @param collections <Collections> list of collections to which this user can deposit
|
229
|
+
# @return true if the user can deposit to at least one collection OR if the user can create a collection; otherwise, false
|
230
|
+
def show_deposit_for?(collections:)
|
231
|
+
collections.present? || current_ability.can?(:create_any, Collection)
|
232
|
+
end
|
233
|
+
|
207
234
|
private
|
208
235
|
|
209
236
|
# list of item ids to display is based on ordered_ids
|